熊猫滚动平均值不适用于我的时间数据系列

Posted

技术标签:

【中文标题】熊猫滚动平均值不适用于我的时间数据系列【英文标题】:pandas rolling mean didn't work for my time data series 【发布时间】:2018-06-20 09:57:57 【问题描述】:

我正在写一个关于时间序列的移动平均函数:

def  datedat_moving_mean(datedat,window):

    #window is the average length

    datedatF = pandas.DataFrame(datedat)
    return (datedatF.rolling(window).mean()).values

以上代码抄自Moving Average- Pandas

我将这个函数应用于这个时间序列:

datedat1 = numpy.array(
[ pandas.date_range(start=datetime.datetime(2015, 1, 30),periods=17),
numpy.random.rand(17)]).T

但是,datedat_moving_mean(datedat1,4) 只返回原始的datedat1。它移动平均没有!怎么了?

【问题讨论】:

如果你只做datedatF[1].rolling(4).mean(),它会给你一个数字结果。由于您在整个数据帧上调用rolling.mean,并且由于第一列不是数字,我相信它会返回输入而不做任何事情。 我相信这与数据框中的第一列是 Timestamp 对象列(不同于 datetime 列)这一事实有关,因此 pandas 会静默返回而不会引发任何错误(如果该列是日期时间列,它会完成)。 Err...我如何将Timestamp 转换为日期时间列?我尝试datedat_moving_mean([i.to_pydatetime() for i in datedat1[:,0]],4),它仍然返回ops for Rolling for this dtype datetime64[ns] are not implemented datedatF[1] = pd.to_datetime(datedatF[1]) 它会抛出错误而不是错误的输出。 datedat1F=pandas.DataFrame(datedat1)pandas.to_datetime(datedat1F[1]).values 仍然返回一个带有dtype='datetime64[ns]' 的数组,它不能用于平均... 【参考方案1】:

您构建的 DataFrame 没有索引(默认为整数),并且有一列 Timestamp 和一列浮点数。

我想您想使用时间戳作为索引,但即使没有,您也需要在框架上使用 .rolling()。

我建议您对原始 DataFrame 的初始化应该更像这样

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.rand(17), index=pd.date_range(start=datetime.datetime(2015, 1, 30),periods=17))

如果您不这样做,并且您很高兴数据框未编入索引,则可以通过临时将索引设置为 Timestamp 列来解决滚动问题

import pandas as pd
import numpy as np
import datetime

datedat1 = np.array([ pd.date_range(start=datetime.datetime(2015, 1, 30),periods=17),np.random.rand(17)]).T
datedatF = pd.DataFrame(datedat1)

# We can temporarily set the index, compute the rolling mean, and then 
# return the values of the entire DataFrame
vals = datedatF.set_index(0).rolling(5).mean().reset_index().values

return vals

不过,我建议使用索引创建的 DataFrame 会更好(考虑一下如果日期时间未排序并且您调用数据帧滚动时会发生什么?

【讨论】:

rolling(5).mean() 在您的代码中不起作用。 vals 返回与 datedat1 相同的数据。 抱歉,我忘记了.T,现在已经编辑过了,应该可以了。 所以时间戳实际上不是平均的? set_index(0) 保护第一列? set_index 将列从“数据框值”移动到数据框的索引中。操作 .rolling() 仅适用于数据框中的列。一旦数据框中的值仅为数字,就可以应用 .rolling() 方法。在我们应用它之后,我们然后重置数据帧的索引,将时间戳列“移动”到数据帧中。然后,我们返回数据帧的所有值、时间戳(未受 .rolling() 影响)和其他值的滚动平均值。

以上是关于熊猫滚动平均值不适用于我的时间数据系列的主要内容,如果未能解决你的问题,请参考以下文章

如何用滚动平均窗口总结多个熊猫数据框?

为啥熊猫滚动意味着居中窗口

熊猫滚动加权平均值

熊猫滚动适用于可变窗口长度

具有时间偏移熊猫的滚动平均值

如何在特定小时的滚动平均值的熊猫数据框中添加一列