python - pandas 按秒计算总和

标签 python pandas

我有以下数据结构(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. 如何将基于成功字段的图表拆分为 2 条单独的线?

最佳答案

这里发生了一些事情。首先,我相信你想在 python 中使用 python boolean True 而不是 javascript true ,后者将被读取为字符串,当你尝试分组和求和您的数据 此列将被删除,因为它无法求和。

其次,当您按时间戳对数据进行分组时,您不需要使用unstack,只需指定您想要绘制的列即可。

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

enter image description here

绘制 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()

enter image description here

关于python - pandas 按秒计算总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081387/

相关文章:

python - 查找给定区间的最近值

python - Pandas Dataframe nan 值不替换

python - 如何绘制股票数据的滚动平均值?

python - 将数据插入两列 csv

python - 运行 setup.py 时以 '\xff' 开头的非 UTF-8 代码

python - 在python中查找二进制矩阵的零空间

python - 如何在 Python f 字符串中跳过十进制的尾随零?

python - 如何将 pandas 数据框转换为没有列标题的字典?

python - Pandas - 随机用其他行替换 10% 的行

python - 从 apache 中的 python 脚本关闭计算机