按小时重新采样 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),表示每小时记录的总行数,并根据 MAC 地址进行颜色编码。
下面是我希望它如何可视化的表示。 (抱歉,它没有使用上面列出的数据,但表明我希望它是怎样的。每个条形代表一个小时,例如: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 并将不同的函数应用于列