【问题标题】:Rolling integral over pandas dataframe with time index使用时间索引在 pandas 数据帧上滚动积分
【发布时间】:2018-12-18 14:19:04
【问题描述】:

我想用时间索引捕获我的数据框列的积分。这适用于每个时间间隔发生的分组。

from scipy import integrate
>>> df

Time                      A
2017-12-18 19:54:40   -50187.0
2017-12-18 19:54:45   -60890.5
2017-12-18 19:54:50   -28258.5
2017-12-18 19:54:55    -8151.0
2017-12-18 19:55:00    -9108.5
2017-12-18 19:55:05   -12047.0
2017-12-18 19:55:10   -19418.0
2017-12-18 19:55:15   -50686.0
2017-12-18 19:55:20   -57159.0
2017-12-18 19:55:25   -42847.0

>>> integral_df = df.groupby(pd.Grouper(freq='25S')).apply(integrate.trapz)

Time                       A
2017-12-18 19:54:35   -118318.00
2017-12-18 19:55:00   -115284.75
2017-12-18 19:55:25         0.00
Freq: 25S, Name: A, dtype: float64

编辑:

scipy 积分函数自动使用时间索引来计算它的结果。

这不是真的。您必须明确地将转换传递给 np datetime 以便 scipy.integrate.trapz 使用时间正确集成。请参阅我对这个问题的评论。

但是,我想取一个滚动积分。我试过Using rolling functions found on SO,但是当我试图锻炼我对集成函数的输入时,代码变得很乱,因为这些滚动函数不返回数据帧。

如何对我的数据框列之一的函数进行滚动积分?

【问题讨论】:

  • 什么对我有用:df.rolling(10).apply(lambda g: integrate.trapz(g, g.index.astype(np.int64) / 10**9), raw=False)

标签: pandas numpy scipy pandas-groupby


【解决方案1】:

将时间设置为索引,并与df.rolling一起使用应用

df.Time = pd.to_datetime(df.Time)
df = df.set_index('Time')
df.rolling('25S').apply(integrate.trapz)

#outputs:

2017-12-18 19:54:40         0.00
2017-12-18 19:54:45    -55538.75
2017-12-18 19:54:50   -100113.25
2017-12-18 19:54:55   -118318.00
2017-12-18 19:55:00   -126947.75
2017-12-18 19:55:05    -81986.75
2017-12-18 19:55:10    -53144.75
2017-12-18 19:55:15    -69992.00
2017-12-18 19:55:20   -115284.75
2017-12-18 19:55:25   -154710.00

这是A和A-rolling-integrated的情节:

【讨论】:

  • 我认为我的问题是我使用了 .rolling.apply(raw=True),它将滚动更改为 numpy 数组而不是 pandas 系列。作为一个系列,scipy 知道如何使用时间计算积分。
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2015-03-22
  • 2018-07-05
  • 2020-10-09
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多