【问题标题】:Rolling mean of Time series Pandas时间序列 Pandas 的滚动平均值
【发布时间】:2015-12-31 15:41:45
【问题描述】:

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

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

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

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

我说的对吗?但结果看起来并不平均。有人可以解释一下吗?

【问题讨论】:

  • 你的意思是“结果看起来不像意思”?你能说得具体点吗?
  • 我的前 3 列有 NaN

标签: python numpy pandas dataframe


【解决方案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()

【讨论】:

  • 我很困惑地认为 Nan 是卑鄙的。 Tats 为什么要求验证。谢谢:)
  • 这是因为滚动均值的定义。由于时间序列没有 x_{t-2} 和 x_{t -1}。这就是他们返回 NaN 作为输出的方式。
【解决方案2】:

只要您的索引是时间戳(目前是这样),您就可以使用 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2018-01-30
    • 2017-08-03
    相关资源
    最近更新 更多