0

我有一个数据框。这是一个非常有限的例子。

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, 313, 123, 555, 123], 'scoreMetric': [5,1,4,2,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:13:20', '2020-05-16 22:32: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 分钟内所有得分指标的平均值。

我已经尝试了一些事情,但是对于进行采样似乎没有任何效果,但是首先在每个用户的基础上进行计算。

有没有方便的方法可以像这样简单的语句来做到这一点?我是否需要手动分割时间序列,然后分段计算平均值等?

谢谢!

4

2 回答 2

2

IIUC,用于pd.Grouper按 30 分钟分组并userID获得每个 ID 的平均值,另一个groupby按时间仅获得每个时间的平均值:

print (df.groupby([pd.Grouper(key="timeStamp", freq="1800s"), "userID"])
         .mean()["scoreMetric"].groupby(level=0).mean())

timeStamp
2020-05-16 22:00:00    3.0
2020-05-16 22:30:00    3.5
于 2020-09-11T12:58:03.913 回答
0

如果我理解正确,您可以执行以下操作:

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
于 2020-09-11T13:05:45.247 回答