gpt4 book ai didi

python - 在 Python 中确定重叠时间序列的最有效方法

转载 作者:太空狗 更新时间:2023-10-29 20:19:47 25 4
gpt4 key购买 nike

我正在尝试使用 python 的 pandas 库确定两个时间序列重叠的时间百分比。数据是非同步的,因此每个数据点的时间不对齐。这是一个例子:

时间序列 1

2016-10-05 11:50:02.000734    0.50
2016-10-05 11:50:03.000033 0.25
2016-10-05 11:50:10.000479 0.50
2016-10-05 11:50:15.000234 0.25
2016-10-05 11:50:37.000199 0.50
2016-10-05 11:50:49.000401 0.50
2016-10-05 11:50:51.000362 0.25
2016-10-05 11:50:53.000424 0.75
2016-10-05 11:50:53.000982 0.25
2016-10-05 11:50:58.000606 0.75

时间序列 2

2016-10-05 11:50:07.000537    0.50
2016-10-05 11:50:11.000994 0.50
2016-10-05 11:50:19.000181 0.50
2016-10-05 11:50:35.000578 0.50
2016-10-05 11:50:46.000761 0.50
2016-10-05 11:50:49.000295 0.75
2016-10-05 11:50:51.000835 0.75
2016-10-05 11:50:55.000792 0.25
2016-10-05 11:50:55.000904 0.75
2016-10-05 11:50:57.000444 0.75

假设系列在下一次更改之前保持其值,确定它们具有相同值的时间百分比的最有效方法是什么?

示例

让我们计算这些系列重叠的时间,从 11:50:07.000537 开始到 2016-10-05 11:50:57.000444 0.75 结束,因为我们有该时期两个系列的数据。重叠时间:

  • 11:50:10.000479 - 11:50:15.000234(均为 0.5)4.999755 秒
  • 11:50:37.000199 - 11:50:49.000295(均为 0.5)12.000096 秒
  • 11:50:53.000424 - 11:50:53.000982(均为 0.75)0.000558 秒
  • 11:50:55.000792 - 11:50:55.000904(均为 0.25)0.000112 秒

结果 (4.999755+12.000096+0.000558+0.000112)/49.999907 = 34%

其中一个问题是我的实际时间序列有更多数据,例如 1000 - 10000 个观测值,我需要运行更多对。我考虑过向前填充一个系列,然后简单地比较行并将匹配项总数除以总行数,但我认为这不会非常有效。

最佳答案

设置
创建 2 个时间序列

from StringIO import StringIO
import pandas as pd


txt1 = """2016-10-05 11:50:02.000734 0.50
2016-10-05 11:50:03.000033 0.25
2016-10-05 11:50:10.000479 0.50
2016-10-05 11:50:15.000234 0.25
2016-10-05 11:50:37.000199 0.50
2016-10-05 11:50:49.000401 0.50
2016-10-05 11:50:51.000362 0.25
2016-10-05 11:50:53.000424 0.75
2016-10-05 11:50:53.000982 0.25
2016-10-05 11:50:58.000606 0.75"""

s1 = pd.read_csv(StringIO(txt1), sep='\s{2,}', engine='python',
parse_dates=[0], index_col=0, header=None,
squeeze=True).rename('s1').rename_axis(None)

txt2 = """2016-10-05 11:50:07.000537 0.50
2016-10-05 11:50:11.000994 0.50
2016-10-05 11:50:19.000181 0.50
2016-10-05 11:50:35.000578 0.50
2016-10-05 11:50:46.000761 0.50
2016-10-05 11:50:49.000295 0.75
2016-10-05 11:50:51.000835 0.75
2016-10-05 11:50:55.000792 0.25
2016-10-05 11:50:55.000904 0.75
2016-10-05 11:50:57.000444 0.75"""

s2 = pd.read_csv(StringIO(txt2), sep='\s{2,}', engine='python',
parse_dates=[0], index_col=0, header=None,
squeeze=True).rename('s2').rename_axis(None)

TL;DR

df = pd.concat([s1, s2], axis=1).ffill().dropna()
overlap = df.index.to_series().diff().shift(-1) \
.fillna(0).groupby(df.s1.eq(df.s2)).sum()
overlap.div(overlap.sum())

False 0.666657
True 0.333343
Name: duration, dtype: float64

解释

构建基础 pd.DataFrame df

  • 使用pd.concat对齐索引
  • 使用ffill让值向前传播
  • 使用 dropna 在一个系列开始之前删除一个系列的值

df = pd.concat([s1, s2], axis=1).ffill().dropna()
df

enter image description here

计算'duration'
从当前时间戳到下一个

df['duration'] = df.index.to_series().diff().shift(-1).fillna(0)
df

enter image description here

计算重叠

  • df.s1.eq(df.s2) 给出 s1s2 重叠时的 bool 序列
  • 使用 groupby 上面的 bool 系列来聚合当 TrueFalse 时的总持续时间

overlap = df.groupby(df.s1.eq(df.s2)).duration.sum()
overlap

False 00:00:33.999548
True 00:00:17.000521
Name: duration, dtype: timedelta64[ns]

具有相同值的时间百分比

overlap.div(overlap.sum())

False 0.666657
True 0.333343
Name: duration, dtype: float64

关于python - 在 Python 中确定重叠时间序列的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com