Я следую структуре данных (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]
Здесь есть пара вещей. Во-первых, я считаю, что вы хотите использовать python boolean True
а не javascript true
в python, последний будет считан как строка, и когда вы попытаетесь сгруппировать и суммировать свои данные, этот столбец будет удален, поскольку он не может быть суммируется.
Во-вторых, когда вы группируете свои данные по метке времени, вам не нужно использовать unstack
просто укажите столбец, который вы хотите построить.
df.groupby([df['timestamp'].dt.second]).sum().plot(y='success')
Построение строк 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()
Для построения двух строк: я уверен, что .plot()
pandas .plot()
очищает любые предыдущие графики, поэтому вызов .plot()
дважды показывает только второй.
Тогда у вас есть 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
их.