2015-12-31 53 views
1

我想了解滚动统计信息。我创建了一个数据帧为:时间序列大熊猫的滚动平均值

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

为:

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() 

现在我试图找到一系列的滚动平均值在上一个数据帧新列的最后3小时。我试图首先找到滚动平均值:

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

我对吗?但结果看起来并不意味着什么。有人可以解释我这一个请。

+0

你是什么意思 “的结果并不像意味着”?你可以说得更详细点吗? – Alexander

+0

我有前3列的NaN – Sarah

+0

列或行? – Alexander

回答

0

我重新运行您的代码并找不到任何问题。它似乎工作。 如果你想在过去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

+0

我很困惑,看到南的意思。 Tats为什么要求验证。谢谢:) – Sarah

+0

这是因为滚动平均值的定义。由于时间序列不具有x_ {t-2}和x_ {t(t),因此对于t = 1和t = 2,您无法从(x_ {t-2} + x_ {t-1} + x_t)/ 3获取值-1}。这就是他们如何将NaN作为输出返回的方式。 – sy2

1

只要你的指数是一个时间戳(因为它目前是),你可以使用重采样:

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