[英]Find moving average of the smallest n values in m sized window
我有這樣的個人股票價值數據:
UserId Stock Value Time
1 APL 20 '2019-01-01'
1 MCR 40 '2019-01-01'
1 ADX 60 '2019-01-01'
3 AGL 10 '2019-01-01'
...
我必須按用戶分組,對於每只股票 x,我必須在股票 x 之前找到該用戶最近 20 只股票中 10 只最有價值股票的價值的平均值。 因此,我首先按 userId 分組,然后遍歷每只股票 x 執行以下操作:選擇用戶在股票 x 之前最近的 20 只股票,進一步從該窗口中選擇 10 只最有價值的股票,取平均值並將其添加到股票 x 的新列。 我的數據集將如下所示:
UserId Stock Value Time MovingAverage
1 APL 20 '2019-01-01' 20
1 MCR 40 '2019-01-01' 30
1 ADX 60 '2019-01-01' 40
3 AGL 10 '2019-01-01' 10
...
到目前為止,我一直在嘗試在 Python 中使用滾動,如下所示:
df = df.sort_values(['userId','time'], ascending=['true','false'])
df['roll'] = df.groupby('userId')['Value'].transform(lambda x: x.rolling(20,1).mean())
我不知道如何獲得窗口中 10 個最高值的平均值! 我並不反對使用滾壓以外的其他技術,這似乎是最流行的方法。
另一個問題是,某些股票之前的股票數量將少於 20 只,但我認為使用滾動 (20,1) 可以緩解該問題。 但是,在少於 10 只股票的情況下,例如 8 只股票,我只需要獲得最后 8 只股票的平均值。
弄清楚了。 發帖以防其他人處於類似情況。 我定義了自己的函數,然后簡單地使用了rolling.apply()。 最終變得相當簡單。
首先,我定義了執行上述帖子中描述的行為的函數。
def gm(arr):
if (arr.size > 10):
x = np.partition(arr, 9).mean()
else:
x = arr.mean()
return x
然后,rolling.apply() 發揮了它的魔力:
newcol = df.groupby('userId')['value'].rolling(20,1).apply(lambda x: gm(x), raw=True)
df['roll'] = newcol.reset_index(level=0, drop=True)
我仍然不確定最后的索引,但結果似乎是我想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.