У меня есть фрейм данных python df
, содержащий значения даты, открытия, максимума, минимума, закрытия и объема.
Я пытаюсь построить свечной график акции. По какой-то причине я не могу заставить matplotlib.finance.candlestick2_ochl()
правильно отображать дни, когда цена закрытой акции self.df['closep']
была выше, чем цена открытой акции self.df['openp']
. В эти положительные (зеленые) дни matplotlib либо отображает доджи, либо вообще ничего.
Не совсем уверен, почему у меня такое поведение. Я подозреваю, что это как-то связано с тем, как моя программа получает доступ к данным акций из моего Pandas DataFrame self.df
.
Вот мой код:
# Visualize my stock data
import pandas as pd
import datetime
import time
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.finance import candlestick2_ochl
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
class MyStock:
def __init__(self, stock):
self.stock = stock
self.pullData()
def pullData(self):
try:
print('Currently pulling', self.stock)
print(str(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')))
urlToVisit = 'http://chartapi.finance.yahoo.com/instrument/1.0/' + self.stock + '/chartdata;type=quote;range=5d/csv'
self.df = pd.read_csv(urlToVisit, header=None, names=['date', 'closep', 'highp', 'lowp', 'openp', 'volume'],
skiprows=22, dtype=float)
print('Pulled', self.stock, '\n')
except Exception as e:
print('main loop', str(e))
print('Constucting DataFrame\n')
self.df['date'] = pd.to_datetime(self.df['date'], unit='s')
self.df = self.df.set_index('date').tz_localize('UTC').tz_convert('US/Eastern').reset_index()
self.df['date'] = self.df['date'].dt.strftime('%Y-%m-%d %H:%M:%S')
print(self.df.tail())
def CandleStick(self):
self.fig = plt.figure()
ax1 = plt.subplot2grid((6, 4), (1, 0), rowspan=4, colspan=4, axisbg='w')
candlestick2_ochl(ax1, opens=self.df['openp'], closes=self.df['closep'], highs=self.df['highp'], lows=self.df['lowp'], width=.75, colorup='k', colordown='r', alpha=0.75)
plt.ylabel('Stock Price')
ax1.grid(True)
for label in ax1.xaxis.get_ticklabels():
label.set_rotation(90)
plt.subplots_adjust(left=.10, bottom=.19, right=.93, top=.95, wspace=.20, hspace=0)
plt.suptitle(self.stock + ' Stock Price')
plt.show()
amd = MyStock('AMD')
amd.CandleStick()
и снимок экрана вывода вместе со связанным разделом DataFrame:
На этой крышке экрана четко видно, что положительные дни (зеленый цвет) отображаются неправильно. Я уверен, что мне здесь не хватает чего-то очень очевидного.
Любая помощь приветствуется.