首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于不规则时间序列数据计算规则周期平均值的最佳方法

基于不规则时间序列数据计算规则周期平均值的最佳方法
EN

Stack Overflow用户
提问于 2021-11-01 10:28:29
回答 1查看 165关注 0票数 1

问题:

我有一个具有不规则间隔的timeseries数据集,我希望计算每个规则时间间隔的平均值。

用Python做这件事的最好方法是什么?

示例:

下面是一个简化的数据集,作为Pandas系列:

代码语言:javascript
运行
复制
base = pd.to_datetime('2021-01-01 12:00')

mydict = {
    base: 5,
    base + timedelta(minutes=5): 10,
    base + timedelta(minutes=7): 12,
    base + timedelta(minutes=12): 6,
    base + timedelta(minutes=25): 8
}

series = pd.Series(mydict)

返回:

代码语言:javascript
运行
复制
2021-01-01 12:00:00     5
2021-01-01 12:05:00    10
2021-01-01 12:07:00    12
2021-01-01 12:12:00     6
2021-01-01 12:25:00     8

我的解决方案:

我想把这个重采样到15分钟的间隔,然后取平均值。我可以先重采样到非常小的间隔(秒),然后重采样到15分钟:

代码语言:javascript
运行
复制
series.resample('S').ffill().resample('15T').mean()

返回:

代码语言:javascript
运行
复制
2021-01-01 12:00:00    8.200000
2021-01-01 12:15:00    6.003328

在取样到所需的间隔之前,先重采样到一个小的间隔,这感觉不像毕多诺。而且我预计,对于需要高精度的大型数据集,它也会变得非常慢。有更好的方法吗?

P.S.,如果您想知道:如果您立即重采样到15分钟,您将无法得到预期的结果:

代码语言:javascript
运行
复制
series.resample('15T').mean()

返回:

代码语言:javascript
运行
复制
2021-01-01 12:00:00    8.25
2021-01-01 12:15:00    8.00
EN

回答 1

Stack Overflow用户

发布于 2021-11-01 10:52:35

如果数据中的时间戳表示间隔之间的断点,则数据描述一个step函数。您可以使用一个名为楼梯的包,它构建在pandasnumpy的基础上,用于使用step函数进行分析。

使用您提供的设置代码,从staircase.Stairs创建一个series对象。这些对象将step函数表示为staircaseSeries表示为pandas

代码语言:javascript
运行
复制
import staircase as sc

sf = sc.Stairs.from_values(initial_value=0, values=series)

对于楼梯对象,你可以做很多事情,包括绘图。

代码语言:javascript
运行
复制
sf.plot(style="hlines")

然后创建15分钟的回收箱,如

代码语言:javascript
运行
复制
bins = pd.date_range(base, periods=5, freq="15min")

bins看起来像这样

代码语言:javascript
运行
复制
DatetimeIndex(['2021-01-01 12:00:00', '2021-01-01 12:15:00',
            '2021-01-01 12:30:00', '2021-01-01 12:45:00',
            '2021-01-01 13:00:00'],
            dtype='datetime64[ns]', freq='15T')

接下来,我们把分步函数和回收箱分成几个部分,然后取平均值。这类似于熊猫群对数据的应用。

代码语言:javascript
运行
复制
means = sf.slice(bins).mean()

means是一个pandas.Series,它由带有平均值的回收箱( pandas.IntervalIndex)索引。

代码语言:javascript
运行
复制
[2021-01-01 12:00:00, 2021-01-01 12:15:00)    8.200000
[2021-01-01 12:15:00, 2021-01-01 12:30:00)    6.666667
[2021-01-01 12:30:00, 2021-01-01 12:45:00)    8.000000
[2021-01-01 12:45:00, 2021-01-01 13:00:00)    8.000000
dtype: float64

如果您只想将间隔的起点作为索引,那么可以这样做。

代码语言:javascript
运行
复制
means.index = means.index.left

或者类似地,使用端点。如果要将这些数据输入到ML算法中,则使用端点来避免数据泄漏。

摘要

代码语言:javascript
运行
复制
import staircase as sc

sf = sc.Stairs.from_values(initial_value=0, values=series)
bins = pd.date_range(base, periods=5, freq="15min")
means = sf.slice(bins).mean()

注意:我是楼梯的创造者。如果您有任何反馈或问题,请随时与您联系。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69795625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档