Python-在大熊猫中平均重采样的最佳方法

Python-在大熊猫中平均重采样的最佳方法,python,pandas,dataframe,pandas-resample,Python,Pandas,Dataframe,Pandas Resample,我有一个数据帧。这是一个非常有限的例子 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

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

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个用户(123313),每个用户都有两个时间戳。所以我想要 [(5+4)/2+(1+2)/2]/2=[4.5+1.5]/=3作为我的返回值

现在我们从22:30:01到23:00:00。 我们这里又有2个用户(123555)具有可变时间戳。所以我想要 [(2+2)/2+(5)/1]/2=[2+5]/2=3.5

我认为应该有一种通过重新采样来实现这一点的有效方法

例如,当我只计算平均值时,我可以

df.set_index('timeStamp').scoreMetric.resample('30M').mean().fillna(0)
然后给出30分钟内所有得分指标的平均值

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

像这样一个简单的陈述,难道没有方便的方法可以做到这一点吗?我是否需要手动分割时间序列,然后逐段进行平均值等操作


谢谢

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

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

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

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 ')]
输出:

3

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

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 ')]
输出:

3

重采样,按时间和用户分组,取平均值。采取行动,按时间分组,采取行动,我似乎无法使这一点发挥作用。例如-df.set_index('timeStamp').scoreMetric.resample('30T').mean()可以正常工作,但df.set_index('timeStamp').scoreMetric.resample('30T').groupby('userID')会给出一个类型错误。答案如下,但您可以尝试:df.set_index('timeStamp').scoreMetric.resample('30T').reset_index().groupby('timeStamp','userID'))resample,按时间和用户分组,取平均值。采取行动,按时间分组,采取行动,我似乎无法使这一点发挥作用。例如-df.set_index('timeStamp').scoreMetric.resample('30T').mean()工作正常,但df.set_index('timeStamp').scoreMetric.resample('30T').groupby('userID')给出了一个类型错误。答案如下,但您可以尝试:df.set_index('timeStamp').scoreMetric.resample('30T').reset_index().groupby(['timeStamp','userID'))有趣!这似乎是我所期望的结果。你介意我解释一下看我是否明白吗?因此,您可以使用groupby将时间戳和用户ID一起分组。首先使用pd.gropper将时间戳拆分。然后取应用于每个得分指标的平均值。那么groupby(level=0)。mean()表示它除以唯一条目的数量?我在上面@Jibril.interest添加了解释!这似乎是我所期望的结果。你介意我解释一下看我是否明白吗?因此,您可以使用groupby将时间戳和用户ID一起分组。首先使用pd.gropper将时间戳拆分。然后取应用于每个得分指标的平均值。然后groupby(level=0)。mean()表示它除以唯一条目的数量?我在上面的@Jibril中添加了解释。