python - pandas.DataFrame.rolling() 与基于时间的窗口的有效使用
问题描述
我需要在一些稀疏的日期时间索引 DataFrame 的滚动窗口上应用一个函数(行之间的时间间隔是不同的)。窗口大小由偏移量指定:
def value_diff(x):
return (x[-1] - x[0]) / x[0] * 100
diff = df['value'].rolling(window='10min').apply(value_diff)
我需要结果的第一个值基于至少 10 分钟的数据。
不幸的是,该rolling()
函数的 min_periods 参数不接受偏移量,只接受点的数量,并且我无法为其指定固定值,因为一个窗口中的元素数量会有所不同。
运行此代码后,我得到一个 Series 对象,该对象value_diff()
从 DataFrame 列的最开始应用函数的结果开始,而窗口仅包含 1 个元素,然后是 2 个元素,3 个元素等等。
我可以跑步diff = duff.truncate(before=diff.index[0] + timedelta(minutes=10), copy=False)
,但如果对我来说感觉有些低效。有没有办法避免在开始时将滚动功能应用于不完整的窗口,然后截断不可靠的数据,而无需完全重写rolling()
?
解决方案
我认为您必须重建丢失的时间戳才能应用具有固定长度的滚动函数,例如:
# build an irregular ts
series = pd.Series(np.ones(60))
series.index = pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min')
series = series.sample(20, random_state=33).sort_index()
# reconstruct the series with every timestamp and apply a rolling function
series = series.reindex(pd.date_range(datetime(2010, 1, 1, 13, 0), periods=60, freq='1min'), fill_value=0)
series.rolling(10).sum() # 10 min function
推荐阅读
- swift - Swift UITapRecognizer 从 UITableView 窃取水龙头
- azure-devops - azurepipelines-coverage.yml 的架构,用于为 PR 配置新发布的代码覆盖率指标功能
- javascript - 在导航栏中为每个父 li 添加每个类
- c - 但是,当使用 %d 而不是 %p 时,究竟打印了什么?
- hadoop - YARN 报 java.net.NoRouteToHostException: No route to host (Host unreachable)
- excel - 如何让每行中的复选框在相应行中输入值
- java - 如何修复 hdfs 附加异常:已经是当前的租约持有人
- sql - 如何以最佳方式修改此 BiqQuery 查询以检索最新的可用数据
- javascript - 将县的路径添加到我预测的州
- maven - 在詹金斯工作中构建成功后无法部署简单的 JSP Web 应用程序