按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图

Posted

技术标签:

【中文标题】按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图【英文标题】:Resampling Pandas DataFrame by hour and plotting a stacked bar chart using Plotly 【发布时间】:2021-09-12 21:54:59 【问题描述】:

我有一个如下的熊猫数据框

MAC Address ts Parameter1 Parameter2
af3d116c 2021-05-05 21:58:45 20 50
bffe479a 2021-05-05 21:58:48 22 52
c3a8fe37 2021-05-05 21:58:52 21 53
af3d116c 2021-05-05 21:58:58 27 50
bffe479a 2021-05-05 21:59:16 23 51
c3a8fe37 2021-05-05 21:59:50 28 52
af3d116c 2021-05-05 22:08:32 30 49
af3d116c 2021-05-05 22:16:30 27 55
bffe479a 2021-05-05 22:31:37 20 53
c3a8fe37 2021-05-05 22:52:49 32 52
af3d116c 2021-05-05 23:22:02 41 58
bffe479a 2021-05-05 23:44:31 37 62
bffe479a 2021-05-05 23:45:12 29 58
bffe479a 2021-05-05 23:49:28 34 41
c3a8fe37 2021-05-05 23:52:47 47 56

我想重新采样数据框,最后绘制堆叠条形图(最好使用 plotly),表示每小时记录的总行数,并根据 MA​​C 地址进行颜色编码。

下面是我希望它如何可视化的表示。 (抱歉,它没有使用上面列出的数据,但表明我希望它是怎样的。每个条形代表一个小时,例如:22:00 到 23:00,用代表 MAC 地址的颜色分隔。)

【问题讨论】:

你能解释一下'resample'是什么意思吗?你的意思是分组吗? 我不介意重采样是如何完成的。它可以使用 groupby 或 pandas 中的 resample 方法或其他方法。我的目标是得到如前所述的堆积条形图。 【参考方案1】:

您可以使用 pd.Grouper(key='ts', freq='1h') 进行 groupby 以按小时“重新采样”数据帧。 size 将为您提供 MAC 地址的频率计数:

import pandas as pd
import plotly.express as px

data = 'MAC Address': 1: 'af3d116c', 2: 'bffe479a', 3: 'c3a8fe37', 4: 'af3d116c', 5: 'bffe479a', 6: 'c3a8fe37', 7: 'af3d116c', 8: 'af3d116c', 9: 'bffe479a', 10: 'c3a8fe37', 11: 'af3d116c', 12: 'bffe479a', 13: 'bffe479a', 14: 'bffe479a', 15: 'c3a8fe37', 'ts': 1: '2021-05-05 21:58:45', 2: '2021-05-05 21:58:48', 3: '2021-05-05 21:58:52', 4: '2021-05-05 21:58:58', 5: '2021-05-05 21:59:16', 6: '2021-05-05 21:59:50', 7: '2021-05-05 22:08:32', 8: '2021-05-05 22:16:30', 9: '2021-05-05 22:31:37', 10: '2021-05-05 22:52:49', 11: '2021-05-05 23:22:02', 12: '2021-05-05 23:44:31', 13: '2021-05-05 23:45:12', 14: '2021-05-05 23:49:28', 15: '2021-05-05 23:52:47', 'Parameter1': 1: 20, 2: 22, 3: 21, 4: 27, 5: 23, 6: 28, 7: 30, 8: 27, 9: 20, 10: 32, 11: 41, 12: 37, 13: 29, 14: 34, 15: 47, 'Parameter2': 1: 50, 2: 52, 3: 53, 4: 50, 5: 51, 6: 52, 7: 49, 8: 55, 9: 53, 10: 52, 11: 58, 12: 62, 13: 58, 14: 41, 15: 56
df = pd.DataFrame(data)
df['ts'] = pd.to_datetime(df['ts'])

plot_df = df.groupby([pd.Grouper(key='ts', freq='1h'), 'MAC Address']).size().reset_index().rename(columns=0: "count")

这将导致:

ts MAC Address count
0 2021-05-05 21:00:00 af3d116c 2
1 2021-05-05 21:00:00 bffe479a 2
2 2021-05-05 21:00:00 c3a8fe37 2
3 2021-05-05 22:00:00 af3d116c 2
4 2021-05-05 22:00:00 bffe479a 1
5 2021-05-05 22:00:00 c3a8fe37 1
6 2021-05-05 23:00:00 af3d116c 1
7 2021-05-05 23:00:00 bffe479a 3
8 2021-05-05 23:00:00 c3a8fe37 1

然后,您可以根据需要进行绘制。例如:

fig = px.bar(plot_df, x="ts", y="count", color="MAC Address", title="MAC Addresses per hour")
fig.show()

【讨论】:

完美。非常感谢。我习惯于 groupby 操作,但对 pd.Grouper 很陌生。感谢您向我介绍这个概念。

以上是关于按小时重新采样 Pandas DataFrame 并使用 Plotly 绘制堆积条形图的主要内容,如果未能解决你的问题,请参考以下文章

pandas DataFrame 从不规则时间序列索引中重新采样

使用“bin size”/“frequency”重新采样 Pandas Dataframe

根据日期创建每月重新采样的 Pandas DataFrame

重新采样 MultiIndexed Pandas DataFrame 并将不同的函数应用于列

如何将 pandas Dataframe 时间序列数据从 8hz 重新采样到 16hz?

Pandas 在日期列上重新采样