Pandas повторная выборка с перекрытием - PullRequest
0 голосов
/ 09 марта 2020

Я хотел бы повторно сэмплировать свой индексированный по времени DataFrame с некоторым перекрытием.

Например:

>>> df
                     data
date                     
2018-03-09 12:00:00     1
2018-03-09 12:00:01     1
2018-03-09 12:00:02     1
2018-03-09 12:00:03     1
2018-03-09 12:00:04     1
2018-03-09 12:00:05     1
2018-03-09 12:00:06     1
2018-03-09 12:00:07     1
2018-03-09 12:00:08     1
2018-03-09 12:00:09     1
2018-03-09 12:00:10     1
2018-03-09 12:00:11     2
2018-03-09 12:00:12     2
2018-03-09 12:00:13     2
2018-03-09 12:00:14     2
2018-03-09 12:00:15     2
2018-03-09 12:00:16     2
2018-03-09 12:00:17     2
2018-03-09 12:00:18     2
2018-03-09 12:00:19     2
2018-03-09 12:00:20     2
2018-03-09 12:00:21     3
2018-03-09 12:00:22     3
2018-03-09 12:00:23     3
2018-03-09 12:00:24     3
2018-03-09 12:00:25     3
2018-03-09 12:00:26     3
2018-03-09 12:00:27     3
2018-03-09 12:00:28     3
2018-03-09 12:00:29     3
2018-03-09 12:00:30     3

Результат должен выглядеть следующим образом после повторной выборки с перекрытием 10 секунд и 2 секунд:

>>> df
                     data
date                     
2018-03-09 12:00:10     14
2018-03-09 12:00:20     28
2018-03-09 12:00:30     34

Я пробовал это с группировкой, но это очень и очень медленно на больших наборах данных.

Есть ли быстрый и эффективный способ сделать это? 1012 *?

1 Ответ

2 голосов
/ 09 марта 2020

Предполагая, что ваши данные регулярно располагаются, вы можете concat смещенную серию и затем взять сумму.

N = 10  # Every 10 seconds from first row
ov = 2  # 2s overlap on either side

pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1).sum(1)

date
2018-03-09 12:00:00     3.0
2018-03-09 12:00:10    15.0
2018-03-09 12:00:20    28.0
2018-03-09 12:00:30    34.0
dtype: float64

Для нескольких столбцов превратить это в groupby вдоль оси столбцов:

df['data2'] = df['data']+1  # Another column

(pd.concat([df.shift(i).iloc[::N] for i in range(-ov, N+ov)], axis=1)
   .groupby(level=0, axis=1).sum())

                     data  data2
date                            
2018-03-09 12:00:00   3.0    6.0
2018-03-09 12:00:10  15.0   28.0
2018-03-09 12:00:20  28.0   42.0
2018-03-09 12:00:30  34.0   46.0
...