Ошибка даты (pandas dataframe, numpy, matplotlib)
Я вытащил цены акций из Yahoo, а затем я хотел бы наметить их, используя Matplotlib. Это одна строка фрейма данных, которая имеет дату, открытие, закрытие, максимум, минимум, прил. Закрытие и объем ([метка времени ('2016-08-01 00:00:00') 31.299999 31.389999 31.129999 31.25 31.25 13129900])
ОШИБКА: сбой данных времени основного цикла "[Метка времени ('2016-08-01' не соответствует формату)%Y-%m-%d %H:%M:%S
Ваша помощь будет высоко ценится.
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
from matplotlib.finance import _candlestick as candlestick
import matplotlib
matplotlib.rcParams.update({'font.size': 9})
import pylab
def graphData(stock, MA1, MA2):
try:
try:
print 'Pulling data on ', stock
yf.pdr_override()
stockData = pdr.get_data_yahoo(
stock, start='2016-08-01', end='2017-08-01')
stockData.reset_index(level=0, inplace=True)
print stockData.head()
print stockData.values
except Exception, e:
print str(e), 'Failed to pull price data'
date, openp, highp, lowp, closep, adjclose, volume = np.loadtxt(
stockData.values, delimiter=' ', unpack=True, converters={0: mdates.strpdate2num('%Y-%m-%d %H:%M:%S')})
x = 0
y = len(date)
newAr = []
while x < y:
appendLine = date[x], openp[x], closep[x], highp[x], lowp[x], volume[x]
newAr.append(appendLine)
x += 1
Av1 = movingAverage(closep, MA1)
Av2 = movingAverage(closep, MA2)
SP = len(date[MA2 - 1:])
fig = plt.figure(facecolor='#07000d')
#ax1 = plt.subplot(2, 1, 1)
ax1 = plt.subplot2grid((6, 4), (1, 0), rowspan=4,
colspan=4, axisbg='#07000d')
candlestick(ax1, newAr[-SP:], width=.75,
colorup='#9eff15', colordown='#ff1717') # colorup = '#53C156, colordown='#ff1717
label1 = str(MA1) + ' SMA'
label2 = str(MA2) + ' SMA'
ax1.plot(date[-SP:], Av1[-SP:], '#5998ff',
label=label1, linewidth=1.5) # eledf9
ax1.plot(date[-SP:], Av2[-SP:], '#e1edf9',
label=label2, linewidth=1.5) # 4ee6fd
#ax1.plot(date, openp)
#ax1.plot(date, highp)
#ax1.plot(date, lowp)
#ax1.plot(date, closep)
ax1.grid(True, color='w')
ax1.xaxis.set_major_locator(mticker.MaxNLocator(10))
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().yaxis.set_major_locator(mticker.MaxNLocator(prune='upper'))
ax1.yaxis.label.set_color('w')
ax1.spines['bottom'].set_color('#5998ff')
ax1.spines['top'].set_color('#5998ff')
ax1.spines['left'].set_color('#5998ff')
ax1.spines['right'].set_color('#5998ff')
ax1.tick_params(axis='y', colors='w')
ax1.tick_params(axis='x', colors='w')
plt.ylabel('Stock Price and Volume')
maLeg = plt.legend(loc=9, ncol=2, prop={'size': 7},
fancybox=True, borderaxespad=0.)
maLeg.get_frame().set_alpha(0.4)
textEd = pylab.gca().get_legend().get_texts()
pylab.setp(textEd[0:5], color='w')
ax0 = plt.subplot2grid((6, 4), (0, 0), sharex=ax1, rowspan=1,
colspan=4, axisbg='#07000d')
rsi = rsiFunc(closep)
rsiCol = '#1a8782'
posCol = '#386d13'
negCol = '#8f2020'
ax0.plot(date[-SP:], rsi[-SP:], rsiCol, linewidth=1.5)
ax0.axhline(70, color=negCol)
ax0.axhline(30, color=posCol)
ax0.fill_between(date[-SP:], rsi[-SP:], 70, where=(rsi[-SP:]
>= 70), facecolor=negCol, edgecolor=negCol)
ax0.fill_between(date[-SP:], rsi[-SP:], 30, where=(rsi[-SP:]
<= 30), facecolor=posCol, edgecolor=posCol)
#ax0.set_ylim(0, 100)
ax0.spines['bottom'].set_color('#5998ff')
ax0.spines['top'].set_color('#5998ff')
ax0.spines['left'].set_color('#5998ff')
ax0.spines['right'].set_color('#5998ff')
ax0.text(0.015, 0.95, 'RSI (14)', va='top',
color='w', transform=ax0.transAxes)
ax0.tick_params(axis='x', colors='w')
ax0.tick_params(axis='y', colors='w')
ax0.set_yticks([30, 70])
ax0.yaxis.label.set_color('w')
# plt.gca().yaxis.set_major_locator(mticker.MaxNLocator(prune='lower'))
# plt.ylabel('RSI')
volumeMin = 0
'''
#ax2 = plt.subplot(4, 1, 4, sharex=ax1)
ax2 = plt.subplot2grid(
(5, 4), (4, 0), sharex=ax1, rowspan=1, colspan=4, axisbg='#07000d')
#ax2.bar(date, volume)
ax2.plot(date, volume, '#00ffe8', linewidth=.8)
ax2.fill_between(date, volumeMin, volume,
facecolor='#00ffe8', alpha=.5)
ax2.axes.yaxis.set_ticklabels([])
ax2.grid(False)
ax2.spines['bottom'].set_color('#5998ff')
ax2.spines['top'].set_color('#5998ff')
ax2.spines['left'].set_color('#5998ff')
ax2.spines['right'].set_color('#5998ff')
ax2.tick_params(axis='x', colors='w')
ax2.tick_params(axis='y', colors='w')
plt.ylabel('Volume', color='w')
for label in ax2.xaxis.get_ticklabels():
label.set_rotation(45)
'''
ax1v = ax1.twinx()
ax1v.fill_between(date[-SP:], volumeMin, volume[-SP:],
facecolor='#00ffe8', alpha=.5)
ax1v.axes.yaxis.set_ticklabels([])
ax1v.grid(False)
ax1v.spines['bottom'].set_color('#5998ff')
ax1v.spines['top'].set_color('#5998ff')
ax1v.spines['left'].set_color('#5998ff')
ax1v.spines['right'].set_color('#5998ff')
ax1v.set_ylim(0, 2 * volume.max())
ax1v.tick_params(axis='x', colors='w')
ax1v.tick_params(axis='y', colors='w')
ax2 = plt.subplot2grid((6, 4), (5, 0), sharex=ax1,
rowspan=1, colspan=4, axisbg='#07000d')
fillcolor = '#00ffe8'
nslow = 26
nfast = 12
nema = 9
emaslow, emafast, macd = computeMACD(closep)
ema9 = expMovingAverage(macd, nema)
ax2.plot(date[-SP:], macd[-SP:], color='#4ee6fd', lw=2)
ax2.plot(date[-SP:], ema9[-SP:], color='#e1edf9', lw=1)
ax2.fill_between(date[-SP:], macd[-SP:] - ema9[-SP:], 0, alpha=0.5,
facecolor=fillcolor, edgecolor=fillcolor)
ax2.text(0.015, 0.95, 'MACD 12,26,9', va='top',
color='w', transform=ax2.transAxes)
ax2.spines['bottom'].set_color('#5998ff')
ax2.spines['top'].set_color('#5998ff')
ax2.spines['left'].set_color('#5998ff')
ax2.spines['right'].set_color('#5998ff')
ax2.tick_params(axis='x', colors='w')
ax2.tick_params(axis='y', colors='w')
#plt.ylabel('MACD', color='w')
# plt.gca().yaxis.set_major_locator(mticker.MaxNLocator(prune='upper'))
ax2.yaxis.set_major_locator(
mticker.MaxNLocator(nbins=5, prune='upper'))
for label in ax2.xaxis.get_ticklabels():
label.set_rotation(45)
# plt.xlabel('Date')
plt.suptitle(stock.upper(), color='w')
plt.setp(ax0.get_xticklabels(), visible=False)
plt.setp(ax1.get_xticklabels(), visible=False)
plt.subplots_adjust(left=.09, bottom=.14, right=.94,
top=.95, wspace=.20, hspace=0)
plt.show()
# fig.savefig('Example.png', facecolor=fig.get_facecolor())
except Exception, e:
print 'Failed Main Loop', str(e)
while True:
stockToUse = raw_input('Stock to chart: ')
graphData(stockToUse, 12, 26) # 20,200
1 ответ
Судя по ошибке, оскорбительная строка выглядит так:
np.loadtxt(stockData.values, delimiter=' ', unpack=True, converters={0: mdates.strpdate2num('%Y-%m-%d %H:%M:%S')})
При условии stockData
является DataFrame Pandas, что на самом деле здесь происходит, можно увидеть,
>>> import pandas as pd
>>> stockData = pd.DataFrame([[pd.Timestamp('2016-08-01 00:00:00'), 31.299999, 31.389999, 31.129999, 31.25, 31.25, 13129900]])
>>> stockData.values
array([[Timestamp('2016-08-01 00:00:00'), 31.299999, 31.389999, 31.129999,
31.25, 31.25, 13129900]], dtype=object)
>>> str(stockData.values)
"[[Timestamp('2016-08-01 00:00:00') 31.299999 31.389999 31.129999 31.25\n 31.25 13129900]]"
Итак, в основном, вы неявно приводите свой фрейм данных к строке, а затем пытаетесь выполнить повторный анализ.
Намного лучше просто использовать stockData.values
или же stockData.as_matrix()
>>> stockData.values
array([[Timestamp('2016-08-01 00:00:00'), 31.299999, 31.389999, 31.129999,
31.25, 31.25, 13129900]], dtype=object)
>>> stockData.as_matrix()
array([[Timestamp('2016-08-01 00:00:00'), 31.299999, 31.389999, 31.129999,
31.25, 31.25, 13129900]], dtype=object)
если вам нужно найти более подходящий способ обработки метки времени, вы можете попробовать что-то вроде:
>>> stockData = pd.DataFrame([[pd.Timestamp('2016-08-01 00:00:00'), 31.299999, 31.389999, 31.129999, 31.25, 31.25, 13129900]],
... columns=['date', 'open', 'close', 'high', 'low', 'adj close', 'volume'])
>>> stockData['date'] = stockData['date'].map(lambda d: d.day)
>>> stockData['date']
0 1
Name: date, dtype: int64
>>> stockData.values
array([[ 1.00000000e+00, 3.12999990e+01, 3.13899990e+01,
3.11299990e+01, 3.12500000e+01, 3.12500000e+01,
1.31299000e+07]])