时间序列熊猫的滚动平均值

时间:2015-12-31 04:49:04

标签: python numpy pandas dataframe

我正在尝试了解滚动统计信息。我创建了一个数据框:

d = date_range('1/1/2011', periods=72, freq='H')
s = Series(randn(len(rng)), index=rng)

as:

import numpy as np
from numpy.random import randn
import time
r = date_range('1/1/2011', periods=72, freq='H')
r
len(r)
[r[i] for i in range(len(r))]
s = Series(randn(len(r)), index=r)
s
s.plot()
df_new = DataFrame(data = s, columns=['Random Number Generated'])
df_new.diff().hist()

现在,我试图在DataFrame的新列中查找过去3小时内该系列的滚动平均值。我试图先找到滚动的意思:

df_new['mean'] = rolling_mean(df_new, window=3)

我说错了吗?但结果并不像是卑鄙的。有人可以解释一下这个。

2 个答案:

答案 0 :(得分:1)

我重新运行了您的代码,但未发现任何问题。它似乎工作。 如果您想在过去3小时内采用滚动均值,rolling_mean(df_new, window=5)应为rolling_mean(df_new, window=3)

以下是我的验证代码。

import numpy as np

window = 3
mean_list = []
val_list = []
for i, val in enumerate(s):
    val_list.append(val)
    if i < window - 1:
        mean_list.append(np.nan)
    else:
        mean_list.append(np.mean(np.array(val_list)))
        val_list.pop(0)
df_new['mean2'] = mean_list
print(df_new)

输出:

                     Random Number Generated      mean     mean2
2011-01-01 00:00:00                 1.457483       NaN       NaN
2011-01-01 01:00:00                 0.009979       NaN       NaN
2011-01-01 02:00:00                 0.581128  0.682864  0.682864
2011-01-01 03:00:00                 1.905528  0.832212  0.832212
2011-01-01 04:00:00                 2.221040  1.569232  1.569232
2011-01-01 05:00:00                 0.696211  1.607593  1.607593
2011-01-01 06:00:00                -0.854759  0.687497  0.687497
2011-01-01 07:00:00                -0.033226 -0.063925 -0.063925
2011-01-01 08:00:00                 0.097187 -0.263599 -0.263599
2011-01-01 09:00:00                -1.579210 -0.505083 -0.505083
...

rolling_mean的结果与手动计算的滚动平均值一致。

确认有效性的另一种方法是查看计算的滚动平均值的图。 pandas.DataFrame准备plot方法来轻松绘制图形。

 from matplotlib import pyplot 
 df_new.plot()
 pyplot.show()

enter image description here

答案 1 :(得分:1)

只要你的索引是时间戳(就像现在这样),你就可以使用resample:

s.resample('3H')

使用随机数时,最好设置种子值,以便其他人可以复制结果。

np.random.seed(0)
s = pd.Series(np.random.randn(72), pd.date_range('1/1/2011', periods=72, freq='H'))
s.plot();s.resample('3H').plot()

enter image description here

相关问题