看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本例的业务背景是对直播间带货场景进行分析,需要计算直播中峰值人数和出现峰值的时间。我们来看看如何用 pandas 完成这个需求。
以下是某个直播间的用户进入直播间与退出直播间的表:
import pandas as pd
data = {
'ID': [1001, 1003, 1004, 1002, 1005, 1001, 1006, 1007],
'START': ['2021-06-14 12:12:12', '2021-06-14 13:12:12',
'2021-06-14 13:15:12', '2021-06-14 15:12:12',
'2021-06-14 15:18:12', '2021-06-14 20:12:12',
'2021-06-14 21:12:12', '2021-06-14 22:12:12'],
'END': ['2021-06-14 18:12:12', '2021-06-14 16:12:12',
'2021-06-14 20:12:12', '2021-06-14 16:12:12',
'2021-06-14 20:12:12', '2021-06-14 23:12:12',
'2021-06-14 23:15:12', '2021-06-14 23:10:12']
}
df = pd.DataFrame(data)
df
'''
ID START END
0 1001 2021-06-14 12:12:12 2021-06-14 18:12:12
1 1003 2021-06-14 13:12:12 2021-06-14 16:12:12
2 1004 2021-06-14 13:15:12 2021-06-14 20:12:12
3 1002 2021-06-14 15:12:12 2021-06-14 16:12:12
4 1005 2021-06-14 15:18:12 2021-06-14 20:12:12
5 1001 2021-06-14 20:12:12 2021-06-14 23:12:12
6 1006 2021-06-14 21:12:12 2021-06-14 23:15:12
7 1007 2021-06-14 22:12:12 2021-06-14 23:10:12
'''
ID 是用户,START 和 END 分别为此用户进入和离开直播间的时间,如何用 pandas 计算人数峰值呢?
正确结果是出现在 2021-06-14 15:18:12 人数为 5 人。
我们有两个思路:
根据思路,代码如下:
# 遇到数据量大的时间性能可能差些
(
df.set_index('ID')
.apply(lambda x: pd.date_range(x.START, x.END, freq='s'),
axis=1)
.explode()
.pipe(lambda s: s.groupby(s))
.size()
.pipe(lambda g: (str(g.idxmax()), int(g.max())))
)
# ('2021-06-14 15:18:12', 5)
思路二的代码如下:
# 略
这样就完成了需求。
如果数据量大,性能太差,可以考虑用其他大数据解决方案,如 polars。
(完)
更新时间:2024-10-23 08:24:08 标签:pandas python 直播间