簡體   English   中英

在 m 大小的窗口中查找最小 n 值的移動平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM