Повторная выборка временных рядов pandas с прямыми данными

#python #pandas #time-series

#python #pandas #временные ряды

Вопрос:

Мой 30-минутный интервал времени выглядит следующим образом:

                          open      high      low     close    volume
t
2020-08-24 09:30:00  514.7900  515.1400  502.240  507.3700  12123388
2020-08-24 10:00:00  507.3200  513.9800  500.000  502.8899   6652496
2020-08-24 10:30:00  502.8190  503.7700  495.745  496.4879   5925417
2020-08-24 11:00:00  496.7865  504.4000  495.750  501.3500   4460389
2020-08-24 11:30:00  501.3400  508.6300  501.250  508.0800   3743261
2020-08-24 12:00:00  508.1100  514.7809  506.550  507.7000   3415871
2020-08-24 12:30:00  507.7000  507.9000  504.240  504.8050   2864729
2020-08-24 13:00:00  504.7250  508.0000  504.000  505.1700   2374089
2020-08-24 13:30:00  505.1707  506.7220  503.120  506.0150   2207964
2020-08-24 14:00:00  506.0700  507.0800  503.670  504.1742   2227575
2020-08-24 14:30:00  504.1800  514.6800  501.100  501.7300   2676025
2020-08-24 15:00:00  501.7100  503.4200  498.620  503.2265   3971955
2020-08-24 15:30:00  503.2330  504.5150  501.546  503.7900   4239235
  

Я использую метод повторной выборки для почасовых данных. И agg для поиска открытых и закрытых значений, высоких и низких значений, а также объема.

 df = df.resample('H', loffset='30Min').agg({'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'})
  

Дает мне:

                          open      high      low     close    volume
t
2020-08-24 09:30:00  512.7500  515.9800  502.240  507.3700  12628715
2020-08-24 10:30:00  507.3200  513.9800  495.745  496.4879  12577913
2020-08-24 11:30:00  496.7865  508.6300  495.750  508.0800   8203650
2020-08-24 12:30:00  508.1100  514.7809  504.240  504.8050   6280600
2020-08-24 13:30:00  504.7250  508.0000  503.120  506.0150   4582053
2020-08-24 14:30:00  506.0700  514.6800  501.100  501.7300   4903600
2020-08-24 15:30:00  501.7100  504.5150  498.620  503.7900   8211190
  

df.resample берет данные 10:00 и 10:30 и создает строку как данные 10: 30.

Например, для вновь сгенерированной строки: 2020-08-24 10:30:00 507.3200 513.9800 495.745 496.4879 12577913

цена открытия 507.32 равна цене 2020-08-24 10:00:00. Должно быть сопоставлено, как показано на рисунке ниже

введите описание изображения здесь

Желаемый df должен быть таким, как показано ниже: как видно, все 2 раза объединены, кроме данных 15:30:00.

                          open      high      low     close    volume
t
2020-08-24 09:30:00  514.7900  515.1400  500.000  502.8899  18775884
2020-08-24 10:30:00  502.8190  504.4000  495.745  501.3500  10385806
2020-08-24 11:30:00  501.3400  514.7809  501.250  507.7000   7159132
2020-08-24 12:30:00  507.7000  508.0000  504.000  505.1700   5238818
2020-08-24 13:30:00  505.1707  507.0800  503.120  504.1742   4435539
2020-08-24 14:30:00  504.1800  514.6800  498.620  503.2265   6647980
2020-08-24 15:30:00  503.2330  504.5150  501.546  503.7900   4239235
  

Любой псевдокод поможет, спасибо

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

1. Можете ли вы объяснить больше логики вычислений и сопоставления, пожалуйста?

2. Конечно, пожалуйста, посмотрите изображение. Все строки связаны со следующей строкой, кроме последней строки (15:30). Давайте возьмем в качестве примера строку 12:30: для создания новой строки 12:30 фокусируются только строки 12:30 и 13:00. Получите исходную строку 12: 30 для открытия и исходную строку 13:00 для закрытия. Объем будет равен сумме объемов 12:30 и 13:00. Сравните высокие и низкие значения 12:30 и 13:00, чтобы получить более высокие и более низкие значения.

Ответ №1:

Вы должны использовать параметр offset в методе pd.resample вместо loffset :

 df2 = df.resample('1H', offset='30Min').agg({'open': 'first', 
                                       'high': 'max', 
                                       'low': 'min', 
                                       'close': 'last',
                                       'volume': 'sum'})
  

КСТАТИ, loffset устарел с версии 1.1.0. Может потребоваться обновление pandas.

Результат df2 :

                          open      high      low     close    volume
t                                                                   
2020-08-24 09:30:00  514.7900  515.1400  500.000  502.8899  18775884
2020-08-24 10:30:00  502.8190  504.4000  495.745  501.3500  10385806
2020-08-24 11:30:00  501.3400  514.7809  501.250  507.7000   7159132
2020-08-24 12:30:00  507.7000  508.0000  504.000  505.1700   5238818
2020-08-24 13:30:00  505.1707  507.0800  503.120  504.1742   4435539
2020-08-24 14:30:00  504.1800  514.6800  498.620  503.2265   6647980
2020-08-24 15:30:00  503.2330  504.5150  501.546  503.7900   4239235