python - 在熊猫中使用滚动函数,其中时间索引非常稀疏
问题描述
我有一个时间序列,其中索引以毫秒为单位并且非常稀疏。您可以有许多条目相隔几毫秒,而几秒钟内什么也没有。
我想计算滚动最小值/最大值,但我无法让它工作。
索引是这样构建的:
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
首先我尝试了这个:
df['rolling_low'] = df['price'].rolling('1m').min()
但后来我得到这个错误:
窗口必须是整数
看着各种帖子,我试过这个:
df['rolling_low'] = df.rolling('1m', on='timestamp')['price'].min()
出于某种原因,它的语法与第一次尝试不同,但无论如何,它给了我:
时间戳必须是单调的
在 SO 上的另一个搜索,我添加了这个:
df = df.sort_index()
但它仍然是同样的问题。
这个问题对我来说似乎很不清楚:我不太理解错误消息,我也不理解我发现的两种语法之间的区别,除了几个有同样问题的在线帖子,没有适合我的解决方案。
错误的确切含义是什么?而且,另外,我该如何解决它:)
解决方案
当您执行以下操作时:df['rolling_low'] = df['price'].rolling('1m').min()
您必须确保您的时间戳是数据帧的索引。这是在df = df.set_index("timestamp")
以下代码示例中完成的,否则会ValueError: window must be an integer
出错。我同意在这种情况下这个错误非常模糊。这是一个工作示例:)
import pandas as pd
df = pd.DataFrame(
{
"timestamp": [
"2020-04-20 12:00:00.123",
"2020-04-20 12:00:00.126",
"2020-04-20 12:00:00.128",
"2020-04-20 12:00:05.126",
"2020-04-20 12:00:05.140",
"2020-04-20 12:00:05.156",
"2020-04-20 12:00:12.126",
"2020-04-20 12:00:12.129",
],
"price": range(8),
}
)
df["timestamp"] = pd.to_datetime(df["timestamp"])
df = df.set_index("timestamp")
df["rolling_low"] = df["price"].rolling("1s").min()
输出:
price rolling_low
timestamp
2020-04-20 12:00:00.123 0 0.0
2020-04-20 12:00:00.126 1 0.0
2020-04-20 12:00:00.128 2 0.0
2020-04-20 12:00:05.126 3 3.0
2020-04-20 12:00:05.140 4 3.0
2020-04-20 12:00:05.156 5 3.0
2020-04-20 12:00:12.126 6 6.0
2020-04-20 12:00:12.129 7 6.0
如果要进行 1 分钟聚合,请使用“60s”作为 arg 到rolling
.
推荐阅读
- java - spring批量从命令行读取jobParameters并在作业配置中使用它
- google-apps-script - Google Script - 如何将文档图像附加在一起?
- javascript - 为什么本地存储正在更改任务列表中的每个条目
- python-3.x - 我在 python3.8 中使用生成器生成斐波那契数列为什么这段代码没有给出任何输出?
- javascript - 循环遍历 Typescript 中的键值对
- angular - 管道中的多个 POST 调用未执行
- python - ValueError:int() 以 10 为底的无效文字:'[2,7,11,15]'
- css - 带列的角度材料选择
- excel-formula - SUM-IF 公式问题:跨和向下拖动公式时不显示结果
- macos - 允许 Visual Studio for Mac 使用桌面吗?