每组5秒钟间隔的熊猫数据帧滚动值差异

时间:2018-10-25 14:57:00

标签: python pandas dataframe time-series window-functions

我有一个Pandas数据帧,其中包含时间戳记(不均匀间隔),序列号,类别和百分比形成。序列号仅用于在存在多个具有相同时间戳和类别的行的情况下对行进行排序,并在排序后删除。

|----------------------------------------------------------------|
|                        | seq_no   | category   | pct_formation |
|----------------------------------------------------------------|
|ts_timestamp            |          |            |               |
|----------------------------------------------------------------|
|2018-10-22 10:13:44.043 | 6839262  | in_petr    | 37.070000     |
|2018-10-22 10:17:09.527 | 7257908  | in_petr    | 36.970000     |
|2018-10-22 10:17:43.977 | 7319000  | in_dsh     | 36.950000     |
|2018-10-22 10:17:43.963 | 7318885  | in_dsh     | 36.960000     |
|2018-10-22 10:17:09.527 | 7257918  | in_petr    | 32.960000     |
|2018-10-22 10:19:44.040 | 7585354  | out_petr   | 36.890000     |
|2018-10-22 10:19:44.043 | 7585461  | out_petr   | 36.900000     |
|2018-10-22 10:19:37.267 | 7563817  | sync       | 33.910000     |
|2018-10-22 10:19:44.057 | 7586045  | sync       | 36.960000     |
|2018-10-22 10:19:16.750 | 7516841  | out_petr   | 36.880000     |
|2018-10-22 10:20:03.160 | 7637889  | sync       | 36.980000     |
|2018-10-22 10:20:32.350 | 7691592  | sync       | 37.000000     |
|2018-10-22 10:23:03.150 | 8008804  | sync       | 34.580000     |
|2018-10-22 10:22:18.633 | 7907782  | in_dsh     | 36.980000     |
|2018-10-22 10:25:39.557 | 8290932  | in_dsh     | 36.970000     |
|----------------------------------------------------------------|

我想在每天的10:00:00和11:00:00之间每五秒钟更改每个类别的pct_formation。

到目前为止,我已经尝试过:

df.sort_index()[['category', 'pct_formation']] \
.groupby(['category', df.index.date])
.rolling('5s').pct_formation.mean()

我按日期使用分组依据,是因为我怀疑是否按原样使用时间戳,因为时间戳的间隔不均匀且非常精细,所以分组结果没有多大意义。

如何在10:00:00和11:00:00(例如:10:00:00到10:00:05、10:00:01到10:00)之间获得等间隔的5秒窗口: 06,依此类推)。而且,如何获得每个5秒窗口的开始和结束之间的pct_formation差异?

如果在rolling()之后使用min()和max()之类的函数,则会出现一些错误:

ValueError: could not convert string to float: 'out_petr'
TypeError: cannot handle this type -> object

请指导我如何进行,非常感谢。 TIA。

编辑:根据评论的反馈添加详细信息。

我想要一个滚动窗口,因此10:00:00到10:00:05之后的下一个窗口将是10:00:01到10:00:06,然后是10:00:02到10:00 :07,依此类推。

我想查看pct_formation值从一个窗口更改为另一个窗口的多少,因此,如果在相同间隔内有多个值,我将使用mean()

我认为我必须每天使用.resample()来获取上午10点到上午11点之间的均匀间隔,但是我发现很难理解如何使用。

我意识到我可以创建规则间隔的时间窗口,例如:

pd.date_range(start=df.index.min().replace(hour=10, minute=0, second=0, microsecond=0),
              end=df.index.max().replace(hour=11, minute=0, second=0, microsecond=0),
              freq='5S')

但是,我不知道如何更改数据框以使其符合每个类别的这些时间。

1 个答案:

答案 0 :(得分:2)

IIUC,您可以使用resample()rolling()

df['ts_timestamp'] = pd.to_datetime(df['ts_timestamp'], format='%Y-%m-%d %H:%M:%S')

resampled = df.groupby('category').apply(lambda x: x.drop_duplicates('ts_timestamp').set_index('ts_timestamp').resample('1S').ffill())

resampled['pct_formation'].rolling(5).apply(lambda x: x[0]-x[-1], raw=True)

收益率(简短示例):

category  ts_timestamp       
in_dsh    2018-10-22 10:17:43    NaN
          2018-10-22 10:17:44    NaN
          2018-10-22 10:17:45    NaN
          2018-10-22 10:17:46    NaN
          2018-10-22 10:17:47    NaN
          2018-10-22 10:17:48    0.0
          2018-10-22 10:17:49    0.0
          2018-10-22 10:17:50    0.0
          2018-10-22 10:17:51    0.0
          2018-10-22 10:17:52    0.0
          2018-10-22 10:17:53    0.0
          2018-10-22 10:17:54    0.0
          2018-10-22 10:17:55    0.0
...

暂时,我只是使用ffill()来填充相对稀疏的数据,但您也可以考虑进行插值等。