панды рисуют сумму за секунду

1

Я следую структуре данных (json)

[
{"uid":0,"success":true,"timestamp":10, ....someotherfields },
{"uid":1,"success":true,"timestamp":20, ....someotherfields },
.....
]

В тестовом сценарии он имеет фиксированный интервал 10, 500 элементов success = True, чем 500 success = False

Мне нужно добиться успеха и скорости неудачи на единицу графа в секунду. Для начала я следую следующему коду:

import json
import pandas as pd

with open("data.json") as f:
    data = json.load(f)


df = pd.DataFrame(data)
df['timestamp'] = pd.to_datetime(df['timestamp'], unit="ms")
plot =  df.groupby([df['timestamp'].dt.second]).sum().unstack().plot()

fig = plot.get_figure()

fig.savefig("data.png")

Который, на мой взгляд, должен провести линию параллельно X с количеством событий данных в секунду (~ 100 в моем случае)

но я получаю следующее изображение

[! [введите описание изображения здесь] [1]] [1]

  1. я ошибаюсь в фазе группировки или в графике?
  2. как разделить графики на основе поля успеха на две отдельные строки?
Теги:
pandas

2 ответа

1
Лучший ответ

Здесь есть пара вещей. Во-первых, я считаю, что вы хотите использовать python boolean True а не javascript true в python, последний будет считан как строка, и когда вы попытаетесь сгруппировать и суммировать свои данные, этот столбец будет удален, поскольку он не может быть суммируется.

Во-вторых, когда вы группируете свои данные по метке времени, вам не нужно использовать unstack просто укажите столбец, который вы хотите построить.

df.groupby([df['timestamp'].dt.second]).sum().plot(y='success')

Изображение 174551

Построение строк True и False немного сложнее. Если бы вы знали, что подсчеты всегда равны 100, вы можете просто вычесть успех из 100, чтобы получить сбои, но более безопасный способ похож на то, что делал оригинальный пост:

Создайте несколько примеров данных:

df = pd.DataFrame({'timestamp': list(range(0, 10000, 10)), 
                   'uid': list(range(0, 1000))})
df['success'] = np.random.choice([True, False], 1000)

Выделите данные:

df.groupby([df['timestamp'].dt.second, 'success']).size().unstack(fill_value=0).plot()

Изображение 174551

  • 0
    Я проверяю данные и фрейм данных в отладчике, и успех это python. True / False. Я думаю, что пакет json делает это при чтении.
  • 0
    Если данные хранятся как логические значения, указанная выше команда должна работать для вас, но если нет, пожалуйста, прокомментируйте, что не работает, чтобы я мог лучше понять проблему
Показать ещё 3 комментария
1

Для построения двух строк: я уверен, что .plot() pandas .plot() очищает любые предыдущие графики, поэтому вызов .plot() дважды показывает только второй.

Тогда у вас есть 2 варианта.

  1. Поверните данные так, чтобы на одной строке были подсчеты успеха против сбоев с отметкой времени

  2. Получите plotly непосредственно через модуль matplotlib.

Первый выбор будет означать преобразование ваших данных, чтобы одна строка выглядела так: timestamp | success_metric | failure_metric timestamp | success_metric | failure_metric timestamp | success_metric | failure_metric. Затем вы можете использовать один вызов plot() для построения обеих строк.

Второй выбор включает в себя вытягивание соответствующих данных в виде 2 массивов из matplotlib.plotly данных pandas, импорта matplotlib.plotly и прямой matplotlib.plotly их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню