Как построить график только по рабочим дням, используя подсвечник Python для matplotlib?
Я не могу построить matplotlib.finance.candlestick без выходных (пробелы между каждыми 5 свечами). Пример с сайта Matplotlib также не исключает выходных, и способ исключения выходных на других участках, похоже, не применим к CandleSticks.
Кто-нибудь сталкивался с этим раньше?
пс. по запросу, вот пример:
#!/usr/bin/env python
from pylab import *
from matplotlib.dates import DateFormatter, WeekdayLocator, HourLocator, \
DayLocator, MONDAY
from matplotlib.finance import quotes_historical_yahoo, candlestick,\
plot_day_summary, candlestick2
# (Year, month, day) tuples suffice as args for quotes_historical_yahoo
date1 = ( 2004, 2, 1)
date2 = ( 2004, 4, 12 )
mondays = WeekdayLocator(MONDAY) # major ticks on the mondays
alldays = DayLocator() # minor ticks on the days
weekFormatter = DateFormatter('%b %d') # Eg, Jan 12
dayFormatter = DateFormatter('%d') # Eg, 12
quotes = quotes_historical_yahoo('INTC', date1, date2)
fig = figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)
#plot_day_summary(ax, quotes, ticksize=3)
candlestick(ax, quotes, width=0.6)
ax.xaxis_date()
ax.autoscale_view()
setp( gca().get_xticklabels(), rotation=45, horizontalalignment='right')
show()
1 ответ
После вашей строки "цитаты":
weekday_quotes = [tuple([i]+list(quote[1:])) for i,quote in enumerate(quotes)]
затем
candlestick(ax, weekday_quotes, width=0.6)
При этом данные будут отображаться без разрывов между днями недели, теперь вам нужно поменять символы обратно на даты, предпочтительно на понедельники. Предполагая, что ваша первая цитата была понедельником:
import matplotlib.dates as mdates
ax.set_xticks(range(0,len(weekday_quotes),5))
ax.set_xticklabels([mdates.num2date(quotes[index][0]).strftime('%b-%d') for index in ax.get_xticks()])
Это довольно грубо, но похоже, что работа сделана - удачи!
Хотя ответ @JMJR работает, я считаю, что это более надежно:
def plot(x):
plt.figure()
plt.title("VIX curve")
def idx(val=[0]):
val[0] = val[0] + 1
return val[0]
d = collections.defaultdict(idx)
# give each date an index
[d[t] for t in sorted(x.index.get_level_values('baropen_datetime').unique())]
# use the index
x['idx'] = [d[t] for t in x.index.get_level_values('baropen_datetime')]
# plot using index
x.groupby('code').apply(lambda y: plt.plot(y.idx.values,
y.close.values,
label=y.index.get_level_values('code')[0]))
plt.legend()
plt.show()
plt.close()