我有一個(gè)數(shù)據(jù)框。這是一個(gè)非常有限的例子。userID scoreMetric timeStamp 123 5 2020-05-16 22:03:19313 1 2020-05-16 22:03:20123 4 2020-05-16 22:13:20313 2 2020-05-16 22:13:20123 2 2020-05-16 22:32:20555 5 2020-05-16 22:32:20123 2 2020-05-16 22:32:56這是測試代碼import pandas as pdfrom datetime import datetimedata = { '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 )我想要的是每個(gè)用戶的平均值除以一個(gè)時(shí)間段內(nèi)的用戶數(shù)量。讓我們以 22:00:01-22:30:00 作為我們的時(shí)間段。我們這里有 2 個(gè)用戶 (123, 313),每個(gè)用戶都有兩個(gè)時(shí)間戳。所以我想要 [ (5+4)/2 + (1+2)/2 ] / 2 = [ 4.5 + 1.5 ] / = 3 作為我的返回值?,F(xiàn)在我們?nèi)?22:30:01 到 23:00:00。我們這里又有 2 個(gè)用戶 (123, 555),其時(shí)間戳可變。所以我想要 [ (2+2)/2 + (5)/1 ] / 2 = [ 2 + 5 ] / 2 = 3.5我認(rèn)為應(yīng)該有一種有效的方法通過重采樣來做到這一點(diǎn)。例如,當(dāng)我只計(jì)算平均值時(shí)我可以做df.set_index('timeStamp').scoreMetric.resample('30M').mean().fillna(0)然后給出 30 分鐘內(nèi)所有得分指標(biāo)的平均值。我已經(jīng)嘗試了一些方法,但似乎沒有什么可以解決采樣問題,然后首先在每個(gè)用戶的基礎(chǔ)上進(jìn)行計(jì)算。有沒有方便的方法可以像這樣簡單的聲明來做到這一點(diǎn)?我是否需要手動將時(shí)間序列分塊,然后分段進(jìn)行平均值等?
2 回答

隔江千里
TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊
IIUC,用于pd.Grouper按 30 分鐘分組并userID獲取每個(gè) ID 的平均值,另一個(gè)groupby按時(shí)間僅獲取每次平均值:
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

皈依舞
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果我理解正確的話,您可以執(zhí)行以下操作:
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 ')]
進(jìn)而:
data.groupby('userID')['scoreMetric'].mean().mean()
輸出:
3
添加回答
舉報(bào)
0/150
提交
取消