#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 сверху