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