如何使用df.rolling(window,min_periods,win_type ='exponential')。sum()

时间:2019-08-16 03:23:37

标签: pandas

我想用df.rolling().mean()计算滚动指数加权平均值。我陷在win_type = 'exponential'上了。

我尝试了其他* win_type,例如'gaussian'。我认为这与“指数”有点不同。

dfTemp.rolling(window=21, min_periods=10, win_type='gaussian').mean(std=1)
# works fine

但是涉及到“指数”,

dfTemp.rolling(window=21, min_periods=10, win_type='exponential').mean(tau=10)
# ValueError: The 'exponential' window needs one or more parameters -- pass a tuple.

如何使用win_type='exponential' ...谢谢~~~

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,asked it on Russian SO

the following answer

x.rolling(window=(2,10), min_periods=1, win_type='exponential').mean(std=0.1)

您应该将tau值直接传递给window=(2, 10)参数,其中10是tau的值。

我希望它会有所帮助!感谢@MaxU

答案 1 :(得分:2)

通过定义内核函数,可以轻松实现任何类型的窗口。

这是一个向后看的指数平均值的例子:

import pandas as pd
import numpy as np

# Kernel function ( backward-looking exponential )
def K(x): 
    return np.exp(-np.abs(x)) * np.where(x<=0,1,0)

# Exponenatial average function
def exp_average(values):
    N = len(values)
    exp_weights = list(map(K, np.arange(-N,0) / N ))
    return values.dot(exp_weights) / N

# Create a sample DataFrame
df = pd.DataFrame({
    'date': [pd.datetime(2020,1,1)]*50 + [pd.datetime(2020,1,2)]*50,
    'x'   : np.random.randn(100)
})

# Finally, compute the exponenatial moving average using `rolling` and `apply`
df['mu'] = df.groupby(['date'])['x'].rolling(5).apply(exp_average, raw=True).values
df.head(10)

请注意,如果N是固定的,则可以通过保持权重不变来显着减少执行时间:

N = 10
exp_weights = list(map(K, np.arange(-N,0) / N ))

def exp_average(values):
    return values.dot(exp_weights) / N

答案 2 :(得分:0)

简短答案:您应该将tau传递给所应用的函数,例如rolling(d, win_type='exponential').sum(tau=10)请注意mean函数未达到预期的指数范围,因此您可能需要使用sum(tau=10)/window_size来计算指数均值。这是当前版本的熊猫(1.0.5)的错误。

完整示例:

# To calculate the rolling exponential mean
import numpy as np
import pandas as pd

window_size = 10
tau = 5
a = pd.Series(np.random.rand(100))
rolling_mean_a = a.rolling(window_size, win_type='exponential').sum(tau=tau) / window_size

@ИльяМитусов的答案不正确。使用pandas 1.0.5,运行以下代码将引发ValueError: exponential window requires tau

import pandas as pd
import numpy as np

pd.Series(np.arange(10)).rolling(window=(4, 10), min_periods=1, win_type='exponential').mean(std=0.1)

此代码有很多问题。首先,window=(4, 10)中的10不是tau,这将导致错误的答案。其次,exponential窗口不需要参数std -仅gaussian窗口需要。最后,tau应该提供给mean(尽管mean不尊重win_type)。