#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