панды рисуют сумму за секунду - PullRequest
0 голосов
/ 29 августа 2018

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

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

В тестовом сценарии он имеет фиксированный интервал 10, 500 элементов успеха = Истина, чем 500 успеха = Ложь

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

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. как разбить графики на основе поля успеха на 2 отдельные строки?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

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

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

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

  2. Доступ к plotly напрямую через модуль matplotlib.

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

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

0 голосов
/ 29 августа 2018

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

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

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

enter image description here

Построить линии истинного и ложного значений немного сложнее. Если бы вы знали, что число всегда будет равно 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...