Проблема с повторной выборкой временных рядов панд от 1 минуты до 5 минут данных

#python #pandas #datetime #pandas-resample

Вопрос:

У меня есть данные о внутридневных запасах с интервалом в 1 минуту, которые выглядят следующим образом:

 import yfinance as yf import pandas as pd n = yf.download('^nsei', period= '5d', interval= '1m')  

Я пытаюсь повторно сопоставить его с данными «5 м», как это:

 n = n.resample('5T').agg(dict(zip(n.columns, ['first', 'max', 'min', 'last', 'last', 'sum'])))  

Но он пытается повторно сопоставить информацию о времени и дате, которой нет в моих данных. Рыночные данные доступны только до 03:30 вечера, но когда я смотрю на кадр данных с пересчетом, я нахожу, что его пытались пересчитать в течение целых 24 часов.
Как мне остановить повторную выборку до 03:30 вечера и перейти к следующей дате?
Прямо сейчас фрейм данных имеет в основном значения NaN из-за этого. Любые предложения будут приветствоваться.

Ответ №1:

Я не уверен, чего вы пытаетесь достичь с помощью этой agg() функции. Предполагая 'first' , что относится к первому квантилю и 'last' к последнему квантилю, и вы хотите рассчитать некоторую статистику по столбцу, я предлагаю вам сделать следующее:

Получите свои данные:

 import yfinance as yf import pandas as pd n = yf.download('^nsei', period= '5d', interval= '1m')  

Повторите выборку ваших данных:

Примечание: ваш результат такой же, как и при повторной выборке, n.resample('5T').first() но это означает, что каждое значение во фрейме данных равно первому значению из 5-минутного интервала, состоящего из 5 значений. Более логичным методом повторной выборки является использование функции mean() или sum() , как показано ниже.

Если это данные о ценах на акции, то имеет больше смысла использовать mean() :

 resampled_df = n.resample('5T').mean()  

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

Вариант 1: отбросьте значения na:

 filtered_df = resampled_df.dropna()  

Примечание: это не сработает, если вы используете sum (), так как результат будет содержать не пропущенные значения, а нули.

Вариант 2 фильтр на основе часа начала и окончания

Получите минимальное и максимальное время суток, когда данные доступны в виде datetime.time объекта:

 start = n.index.min().time() # 09:15 as datetime.time object end = n.index.max().time() # 15:29 as datetime.time object  

Фильтр фрейма данных на основе времени начала и окончания:

 filtered_df = resampled_df.between_time(start, end)  

Получите статистику:

 statistics = filtered_df.describe() statistics  

Обратите внимание, что describe() это не будет содержать сумму, поэтому для того, чтобы добавить ее, вы могли бы сделать:

 statistics = pd.concat([statistics, filtered_df.agg(['sum'])]) statistics  

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

Ответ №2:

Agg() заключается в применении индивидуального метода работы для каждого столбца, я использовал это, чтобы увидеть формирование «свечи», как оно называется в техническом анализе акций.
Я смог устранить проблему, сбросив значения NaN.