基于不规则时间序列数据计算规则周期平均值的最佳方法
Posted
技术标签:
【中文标题】基于不规则时间序列数据计算规则周期平均值的最佳方法【英文标题】:Best way to compute regular period averages based on irregular timeseries data 【发布时间】:2021-12-16 02:34:55 【问题描述】:问题:
我有一个不规则间隔的时间序列数据集,我想计算每个固定时间间隔的平均值。
在 Python 中执行此操作的最佳方法是什么?
示例:
下面是作为 Pandas 系列的简化数据集:
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)
返回:
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 分钟来做到这一点:
series.resample('S').ffill().resample('15T').mean()
返回:
2021-01-01 12:00:00 8.200000
2021-01-01 12:15:00 6.003328
在采样到所需的间隔之前先重新采样到一个小的间隔并不像 Python 那样。而且我预计对于需要高精度的大型数据集,它也会变得很慢。 有更好的方法吗?
P.S.如果您想知道:如果您立即重新采样到 15 分钟,您不会得到想要的结果:
series.resample('15T').mean()
返回:
2021-01-01 12:00:00 8.25
2021-01-01 12:15:00 8.00
【问题讨论】:
在您的示例中,第一行是否暗示从2021-01-01 12:00:00
到 2021-01-01 12:05:00
的值是 5,从 2021-01-01 12:05:00
到 2021-01-01 12:07:00
等的值是 10,即您的数据描述时刻时间还是间隔?
是的,你是对的,所以它是在描述区间。
【参考方案1】:
如果您的数据中的时间戳表示区间之间的断点,那么您的数据描述了一个阶跃函数。您可以使用基于pandas
和numpy
的名为staircase 的包进行阶跃函数分析。
使用您提供的设置代码,从series
创建一个staircase.Stairs
对象。这些对象表示步进函数到staircase
,就像Series
到pandas
。
import staircase as sc
sf = sc.Stairs.from_values(initial_value=0, values=series)
您可以使用 Stairs 对象做很多事情,包括绘图
sf.plot(style="hlines")
接下来创建你的 15 分钟垃圾箱,例如
bins = pd.date_range(base, periods=5, freq="15min")
bins
看起来像这样
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')
接下来,我们将 stepfunction 与 bin 一起切片并取平均值。这类似于在 pandas 中对数据框进行分组应用。
means = sf.slice(bins).mean()
means
是一个 pandas.Series
,由具有平均值的 bin (a pandas.IntervalIndex
) 索引
[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
如果您只想将区间的起点作为索引,那么您可以这样做
means.index = means.index.left
或者类似地,使用端点。如果您将此数据输入到 ML 算法中,请使用端点来避免数据泄漏。
总结
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()
【讨论】:
谢谢 Riley,这正是我想要的!以上是关于基于不规则时间序列数据计算规则周期平均值的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章