dataframe.resample ('4T'). mean () дает неверный первый результат, но последующие результаты согласуются - PullRequest
0 голосов
/ 31 марта 2019

"df.resample ('4T'). Mean ()" дает свой первый результат перед четвертым значением кадра данных. Он продолжает точно находить среднее значение для следующих четырех значений, но поскольку исходное значение выключено, я не получаю значения там, где они мне нужны в кадре данных. Фактически, «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 Ответ

0 голосов
/ 01 апреля 2019

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

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 пытается "вывести" различные начальные точки.Изменение базы меняет место, где начинается выборка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...