熊猫秒取总和

时间:2018-08-29 15:41:14

标签: python pandas

我具有以下数据结构(json)

select sku.*, tn.tradename, tn.manual
from sku join
     tradenames as tn
     on instr(sku.description, tn.tradename) > 0;

在测试场景中,它的固定间隔为10,即500个元素的成功=正确比500个成功的=假

我需要每秒绘制单个图形总和的成功率和失败率 首先,我有以下代码:

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

我认为应该画出与X平行的线,并带有每秒的数据事件数(在我的情况下为〜100)

但是我要跟随图片

[![在此处输入图片描述] [1]] [1]

  1. 在分组阶段或绘图中我错了吗?
  2. 如何将基于成功字段的图形拆分为2条单独的线?

2 个答案:

答案 0 :(得分:1)

这里发生了几件事。第一个是,我相信您想使用python布尔型True而不是python中的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

答案 1 :(得分:1)

要绘制2条线:我很确定熊猫.plot()函数会清除以前的所有图,因此两次调用.plot()仅会显示第二条。

那么,您有2个选择。

  1. 将数据透视一下,因此在一行上是带有时间戳的成功计数与失败计数

  2. 直接通过plotly模块访问matplotlib

第一个选择将意味着转换数据,以便单行看起来像: timestamp | success_metric | failure_metric。然后,您可以使用一次plot()来绘制两条线。

第二种选择涉及从熊猫数据框中将相关数据作为2个数组拉出,导入matplotlib.plotly,然后直接绘制它们。