Как я могу получить движущийся std dev количества строк в скользящем периоде с помощью pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть такие данные (индекс — это временная метка, поэтому это тип datetime):

 timestamp                price        quantity   direction    aggregated
2020-09-04 00:00:00.000  381.501760     3.000         s        True
2020-09-04 00:00:00.212  381.530000     3.225         s       False
2020-09-04 00:00:00.560  381.346627   207.477         s        True
2020-09-04 00:00:00.590  381.450000     2.586         s       False
2020-09-04 00:00:00.652  381.540000     0.030         b       False
...

**Notice that the timestamps are not evenly spaced.**


I would like to calculate the rolling std dev of the number of rows inside the rolling period.

For example, if I have a period of 300ms, the rolling window would return:

- row 0 returns 1 (itself)
- row 1 returns 2 (itself and row 0 since it's less than 300ms away)
- row 2 returns 1 (itself, row 0 and 1 are more than 300ms away and is not included)
- row 3 returns 2 (itself and row 2 since it's the only one close enough)
- row 4 returns 3 (itself and row 2 and 3 since they're both within 300ms)

and I'd like to get the std dev of that.

How can I calculate this?
  

Комментарии:

1. вы пробовали rolling.std ?

2. @RichieV, но это не будет учитывать количество строк?

3. итак , вы хотите получить стандартную версию [1, 2, 1, 2, 3] ?

4. да, но вопрос в том, как мне создать скользящее окно, которое вычисляет количество строк, подходящих для этого окна, поскольку индекс нерегулярен, а окно основано на дате и времени

5. order_count_std = (df.rolling(period, min_periods=1).count()).rolling(period, min_periods=1).std()

Ответ №1:

Вы можете получить количество строк в окне с помощью rolling.count . Используйте его как в:

 df['rowct_stdev'] = (
    df.price
    .rolling('300ms', min_periods=1).count()
    .rolling('300ms', min_periods=1).std()
)
  

Комментарии:

1. Мне нужна скользящая std-версия, поэтому мне нужно добавить еще одну .rolling(…) после

2. @Thomas что-то вроде второй производной?

3. первое скользящее окно предназначено для подсчета элементов в окне, второе — для создания скользящего std dev сверху