ось x графика не отображается правильно для скользящего среднего - PullRequest
0 голосов
/ 05 сентября 2018

Я, очевидно, совершаю очень простую ошибку, добавляя скользящий средний график к своей фигуре.

Базовый график цен закрытия работает нормально, но как только я добавляю скользящее среднее к графику, даты по оси X облажаются, и я не вижу, что он пытается сделать.

Вот код:

import pandas as pd
import matplotlib.pyplot as plot

df = pd.read_csv('historical_price_data.csv')
df['Date'] = pd.to_datetime(df.Date, infer_datetime_format=True) 
df.sort_index(inplace=True)

ax = df[['Date', 'Close']].plot(figsize=(14, 7), x='Date', color='black')

rolling_mean = df.Close.rolling(window=7).mean()
plot.plot(rolling_mean, color='blue', label='Rolling Mean')

plot.show()

С этим примером набора данных Я получаю эту цифру:

Rolling Mean plot - broken x-axis

Учитывая эту простоту этого кода, я, очевидно, совершаю очень простую ошибку, я просто не могу понять, что это такое.

РЕДАКТИРОВАТЬ: Интересно, хотя предложение @ AndreyPortnoy установить индекс на Date приводит к странной ошибке, что Date отсутствует в индексе, когда я использую встроенные в его предложении, рисунок больше не полный беспорядок, но по какой-то причине ось x перевернута, и отметки больше не являются датами, а, по-видимому, целыми числами (?), хотя df.types показывает, что Date is datetime64 [нс]

enter image description here

@ Sandipan \ Dey: Вот как выглядит набор данных. В приведенном выше коде я использую pd.to_datetime () для преобразования в datetime64, и попытался df [:: - 1], чтобы решить проблему, когда она обращена, когда 2-й график (mov_avg) добавляется к рисунку (но не перевернуто, когда фигура имеет только 1 участок.) ​​

csv columns

1 Ответ

0 голосов
/ 05 сентября 2018

Тот факт, что ваши даты для скользящих средних начинаются с 1970 года, предполагает использование целочисленного индекса диапазона. Он был сгенерирован по умолчанию при чтении в CSV-файле. Попробуйте вставить

df.set_index('Date', inplace=True)

до

df.sort_index(inplace=True)

Тогда вы можете сделать

ax = df['Close'].plot(figsize=(14, 7), color='black')
rolling_mean = df.Close.rolling(window=7).mean()
plot.plot(rolling_mean, color='blue', label='Rolling Mean')

Обратите внимание, что я не передаю x явно, позволяя pandas и matplotlib сделать вывод.

Вы можете упростить свой код, используя встроенные средства построения графиков, например:

df['mov_avg'] = df['Close'].rolling(window=7).mean()
df[['Close', 'mov_avg']].plot(figsize=(14, 7))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...