dataframe.resample(‘4T’).mean() выдает неверный первый результат, но последующие результаты непротиворечивы

#python #pandas #dataframe

#python #pandas #dataframe

Вопрос:

«df.resample(‘4T’).mean()» выдает свой первый результат перед четвертым значением фрейма данных. Он продолжает точно находить среднее значение следующих четырех значений, но поскольку начальное значение отключено, я не получаю значения там, где они мне нужны, в dataframe. Фактически ‘7T’, ‘8T’ и ‘9T’ выдают свои первые результаты в неправильной позиции, в то время как ‘3T’, ‘5T’ и ’10T’ работают, как ожидалось.

Код:

 import csv
import datetime
from datetime import datetime
import pandas as pd 

df = pd.read_csv('stockPrices/closingPrices-mar29b.csv',index_col='date',parse_dates=True)
df['close'] = df['close'].shift(1)
df['4ma'] = df.resample('4T').mean().shift(1)
print(df.tail())
  

csv-файл, с которым я работаю:
https://docs.google.com/spreadsheets/d/1HzKrwcDM233uqlNZI_TdLmewJLIuKM-mKLiRtTlNauc/edit?usp=sharing

Текущим результатом:

                         close        4ma
date                                    
2019-03-25 09:34:00  279.1300        NaN
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500  278.72875
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675        NaN
  

Желаемым результатом:

                         close        4ma
date                                    
2019-03-25 09:34:00  279.1300   278.8094
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500        NaN
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675        NaN
  

Попытки исправить:

1. Использовал ‘loffset’ =’2T’ следующим образом, но средние значения были неточными:

 df['4ma loffset'] = df['close'].resample('4T',loffset='-2T').mean().shift(1)
  

2. Изменен порядок фрейма данных:

 df = df.sort_index(ascending=True)
  

3. Устранено все смещение столбцов в коде. ‘5T’ вводит первое среднее значение за 5 минут в первую минуту фрейма данных и после этого был согласованным, но ‘4T’ все равно выдал свой первый результат до четвертой минуты.

** Обратите внимание на использование ‘shift’ в моем коде. Я сдвигаю свой столбец ‘close’ в исходном фрейме данных, а затем сдвигаю столбец ‘ma’, как только я его создаю. Исходные данные, которые я получаю, начинаются в 9: 31 и заканчиваются в 16: 00. Цена 9:31 изначально является ценой закрытия минуты 9:30:01-9:31:00. Поскольку я хочу, чтобы скользящие средние были равны MM: SS (например, 5-минутное скользящее среднее в 9: 35: 00), я должен сдвинуть (1) в моем исходном фрейме данных, чтобы поместить число в пустой индекс 9: 30:00. Мне также приходится сдвигать столбец ‘ma’, иначе я получаю значения в начале временного блока следующим образом:

 2019-03-25 09:34:00  279.1300        NaN
2019-03-25 09:33:00  278.9300        NaN
2019-03-25 09:32:00  278.8500        NaN
2019-03-25 09:31:00  278.6900        NaN
2019-03-25 09:30:00  278.7675  278.87350
  

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

1. Я также пробовал использовать разные csv-файлы с похожим шаблоном данных и получил те же результаты

Ответ №1:

Решение: Используйте любой из следующих столбцов, чтобы получить точную повторную выборку:

 df['4ma'] = df.resample('4T', base=2).mean().shift(1)
df['7ma'] = df.resample('7T', base=3).mean().shift(1)
df['8ma'] = df.resample('8T', base=2).mean().shift(1)
df['9ma'] = df.resample('9T', base=1).mean().shift(1)
  

Следующий поток на GitHub предлагает использовать «base = x» для решения этой проблемы в Pandas:
https://github.com/pandas-dev/pandas/issues/4197

По сути, при уменьшении выборки в Pandas с минимальными данными Pandas пытается «вывести» разные отправные точки. Изменение базы изменяет место начала выборки.

Я не понимаю логики, лежащей в основе предполагаемой функции Pandas, но настройка базы решает эту проблему.