Панды повторно пробуют пропустить неполные группы в начале - PullRequest
0 голосов
/ 27 июня 2018

У меня есть 15-минутные данные OHLC, поступающие непрерывно из API, и я хочу пересчитать их до 30 минут 1H и т. Д.

+----------------------+----------+----------+----------+----------+------------+
|      time            |  open    |  high    |   low    |  close   |  volumeto  |
+----------------------+----------+----------+----------+----------+------------+
|                      |          |          |          |          |            |
| 2018-06-26 03:30:00  | 6244.56  | 6250.54  | 6243.55  | 6247.34  | 1801280.76 |
| 2018-06-26 03:45:00  | 6247.34  | 6257.61  | 6246.43  | 6248.23  | 2551368.76 |
| 2018-06-26 04:00:00  | 6248.53  | 6248.53  | 6238.11  | 6239.83  | 2148705.55 |
| 2018-06-26 04:15:00  | 6239.83  | 6240.93  | 6232.14  | 6239.00  | 1906012.45 |
| 2018-06-26 04:30:00  | 6239.78  | 6269.14  | 6239.67  | 6260.96  | 3869709.59 |
| 2018-06-26 04:45:00  | 6261.16  | 6263.50  | 6249.46  | 6260.19  | 2236911.26 |
| 2018-06-26 05:00:00  | 6260.19  | 6284.27  | 6257.97  | 6263.73  | 5131896.24 |
| 2018-06-26 05:15:00  | 6263.73  | 6272.73  | 6263.59  | 6270.30  | 1589515.40 |
| 2018-06-26 05:30:00  | 6270.30  | 6286.36  | 6268.78  | 6270.69  | 2859640.60 |
| 2018-06-26 05:45:00  | 6271.75  | 6274.69  | 6259.29  | 6261.20  | 2448639.24 |
+----------------------+----------+----------+----------+----------+------------+

В соответствии с моим вариантом использования я округляю 3:45 и 4:00 с 15 минут до 4:00 при 30 минутах и ​​т. Д.

agg = { 'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volumeto': 'sum'}
df.resample('30min', closed='right', label='right').agg(agg)

Исходные данные за 15 минут enter image description here

30 минут после округления enter image description here

Как вы заметили на 30-минутном таймфрейме, первая свеча генерируется только из 1 15-минутной свечи вместо 2.

Как пропустить незавершенные свечи только в начале моего вычисления вместо конца? Я хотел бы пропустить 1 час и т. Д. Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

IIUC, вы могли бы сделать это таким образом. Добавьте счетчик к вашему требованию агрегации, затем отфильтруйте ваш фрейм данных на основе счетчика, например:

agg = { 'open': ['first','count'], 'high': 'max', 'low': 'min', 'close': 'last', 'volumeto': 'sum'}
df_out = df.resample('30min', closed='right', label='right').agg(agg)
df_out.columns = df_out.columns.map('_'.join)
df_out[df_out['open_count']>1]

Выход:

                     open_first  open_count  high_max  low_min  close_last  volumeto_sum
time                                                                                    
2018-06-26 04:00:00     6247.34           2   6257.61  6238.11     6239.83    4700074.31
2018-06-26 04:30:00     6239.83           2   6269.14  6232.14     6260.96    5775722.04
2018-06-26 05:00:00     6261.16           2   6284.27  6249.46     6263.73    7368807.50
2018-06-26 05:30:00     6263.73           2   6286.36  6263.59     6270.69    4449156.00

Или исключить только первую неполную группу

df_out[~(df_out['open_count'] < 2).cumprod().astype(bool)]

Выход:

                     open_first  open_count  high_max  low_min  close_last  volumeto_sum
time                                                                                    
2018-06-26 04:00:00     6247.34           2   6257.61  6238.11     6239.83    4700074.31
2018-06-26 04:30:00     6239.83           2   6269.14  6232.14     6260.96    5775722.04
2018-06-26 05:00:00     6261.16           2   6284.27  6249.46     6263.73    7368807.50
2018-06-26 05:30:00     6263.73           2   6286.36  6263.59     6270.69    4449156.00
2018-06-26 06:00:00     6271.75           1   6274.69  6259.29     6261.20    2448639.24
...