#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.