首页 > 解决方案 > 在熊猫中使用滚动函数,其中时间索引非常稀疏

问题描述

我有一个时间序列,其中索引以毫秒为单位并且非常稀疏。您可以有许多条目相隔几毫秒,而几秒钟内什么也没有。

我想计算滚动最小值/最大值,但我无法让它工作。

索引是这样构建的:

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

但它仍然是同样的问题。

这个问题对我来说似乎很不清楚:我不太理解错误消息,我也不理解我发现的两种语法之间的区别,除了几个有同样问题的在线帖子,没有适合我的解决方案。

错误的确切含义是什么?而且,另外,我该如何解决它:)

标签: pythonpandas

解决方案


当您执行以下操作时: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.


推荐阅读