熊猫滚动平均值不适用于我的时间数据系列
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() 影响)和其他值的滚动平均值。以上是关于熊猫滚动平均值不适用于我的时间数据系列的主要内容,如果未能解决你的问题,请参考以下文章