我有以下数据结构(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]
- 我在分组阶段或绘图时错了?
- 如何将基于成功字段的图表拆分为 2 条单独的线?
最佳答案
这里发生了一些事情。首先,我相信你想在 python 中使用 python boolean True
而不是 javascript true
,后者将被读取为字符串,当你尝试分组和求和您的数据 此列将被删除,因为它无法求和。
其次,当您按时间戳对数据进行分组时,您不需要使用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()
关于python - pandas 按秒计算总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081387/