如何解决Python-在Pandas中平均重采样的最佳方法
我有一个数据框。这是一个非常有限的示例。
userID scoreMetric timeStamp
123 5 2020-05-16 22:03:19
313 1 2020-05-16 22:03:20
123 4 2020-05-16 22:13:20
313 2 2020-05-16 22:13:20
123 2 2020-05-16 22:32:20
555 5 2020-05-16 22:32:20
123 2 2020-05-16 22:32:56
这里是测试代码
import pandas as pd
from datetime import datetime
data = { 'userID': [123,313,123,555,123],'scoreMetric': [5,1,4,2,5,2],'timeStamp': ['2020-05-16 22:03:19','2020-05-16 22:03:20','2020-05-16 22:13:20','2020-05-16 22:32:20','2020-05-16 22:32:56'] }
df = pd.DataFrame( data,columns=['userID','scoreMetric','timeStamp'])
df.timeStamp = list( map( lambda x: datetime.strftime( datetime.strptime( x,'%Y-%m-%d %H:%M:%S'),'%Y-%m-%d %H:%M:%S' ),df.timeStamp ) )
df.timeStamp = pd.to_datetime( df.timeStamp )
我想要的是每个用户的平均数,除以时间段内的用户数。
让我们以22:00:01-22:30:00作为我们的时间段。
我们这里有2个用户(123,313),每个用户都有两个时间戳。所以我要 [(5 + 4)/ 2 +(1 + 2)/ 2] / 2 = [4.5 + 1.5] / = 3作为我的返回值。
现在我们从22:30:01到23:00:00。 我们这里又有2个用户(123、555)带有可变的时间戳。所以我要 [(2 + 2)/ 2 +(5)/ 1] / 2 = [2 + 5] / 2 = 3.5
我认为应该有一种通过重采样来做到这一点的有效方法。
例如,当我只计算平均值时,就可以做到
df.set_index('timeStamp').scoreMetric.resample('30M').mean().fillna(0)
然后给我30分钟内所有得分指标的平均值。
我已经尝试过一些方法,但是似乎没有任何工作可用于进行采样,但是首先要针对每个用户进行计算。
作为这样的简单语句,没有方便的方法吗?我需要手动分块时间序列,然后对平均值进行分段吗?
谢谢!
解决方法
IIUC,使用Program.exe
进行30分钟分组,还使用pd.Grouper
来获取每个ID的平均值,而另一个userID
则只能在时间上获取每次的平均值:
groupby
,
如果我理解正确,则可以执行以下操作:
import numpy as np
df.set_index('timeStamp',inplace=True)
在这里您可以过滤日期:
data=df[(df.index > '2020-05-16 22:00:01') & (df.index < '2020-05-16 22:30:00 ')]
然后:
data.groupby('userID')['scoreMetric'].mean().mean()
输出:
3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。