[英]Pandas exponentially weighted moving average over fixed time window
我正在嘗試使用 pandas ewm 函數進行指數加權移動平均值,其中衰減是根據日期時間列上的半衰期指定的。 Pandas ewm 函數的工作原理與 pandas expand 函數類似,因為它滾動整個數據幀。 但是,在我的情況下,我需要指定一個固定的時間窗口或偏移量,在該時間窗口或偏移量上應用 ewm 函數。 換句話說,一個帶有截止或“max_periods”參數的 ewma。
我對此的解決方案如下:
df = pd.DataFrame({'a': np.random.randint(5, size=24),
'b': ["S", "A"] * 12,
'c': pd.date_range(start='1/1/2018', end='12/12/2018', freq='15D')})
df.groupby('b').rolling('60d', on='c')['a'].apply(lambda x: x.ewm(halflife='15d', times=x.index).mean().tail(1))
我的解決方案非常低效。 尋找更快的東西。
我想出了以下方法,但是當我計時時它只會稍微快一點。 我很想知道是否有更好的解決方案。
WEIGHTS = [pow(2, i) for i in range(10)] # at least as many as the size of your window
def weighted_avg(df):
weights = WEIGHTS[0:len(df)]
return df.mul(weights).sum() / sum(weights)
df.groupby('b').rolling('60d', on='c')['a'].apply(weighted_avg)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.