Пользовательский форматтер делений для временного ряда

Beginner

This tutorial is from open-source community. Access the source code

Введение

При построении графиков ежедневных данных, таких как финансовые временные ряды, часто хочется пропустить дни, когда нет данных, таких как выходные. Это позволяет построить данные с регулярными интервалами без дополнительных пробелов для дней без данных. В этом практикуме мы узнаем, как использовать «форматтер индекса», чтобы получить желаемый график.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Ноутбук, чтобы приступить к практике в Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортируем необходимые библиотеки и данные

Сначала нам нужно импортировать необходимые библиотеки, которые это matplotlib, numpy и matplotlib.cbook. Также нам нужно загрузить массив записей numpy из данных CSV Yahoo с полями date, open, high, low, close, volume, adj_close из директории mpl-data/sample_data. В массиве записей дата хранится в виде np.datetime64 с единицей измерения день ('D') в столбце date. Мы будем использовать эти данные для построения финансового временного ряда.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook

## Загружаем данные из директории sample_data
r = cbook.get_sample_data('goog.npz')['price_data'].view(np.recarray)
r = r[:9]  ## берём первые 9 дней

Построение графика с стандартными пропусками в выходные дни

Сначала построим график с стандартными пропусками в выходные дни с использованием функции plot из библиотеки matplotlib. Также выделим пропуски в ежедневных данных белыми пунктирными линиями.

## Plot data with gaps on weekends
fig, ax1 = plt.subplots(figsize=(6, 3))
ax1.plot(r.date, r.adj_close, 'o-')

## Highlight gaps in daily data
gaps = np.flatnonzero(np.diff(r.date) > np.timedelta64(1, 'D'))
for gap in r[['date', 'adj_close']][np.stack((gaps, gaps + 1)).T]:
    ax1.plot(gap.date, gap.adj_close, 'w--', lw=2)
ax1.legend(handles=[ml.Line2D([], [], ls='--', label='Gaps in daily data')])

ax1.set_title("Plotting Data with Default Gaps on Weekends")
ax1.xaxis.set_major_locator(DayLocator())
ax1.xaxis.set_major_formatter(DateFormatter('%a'))

Создание пользовательского форматтера индекса

Для построения графика данных по индексу, который идет от 0, 1,... до длины данных (len(data)), мы создадим пользовательский форматтер индекса. Этот форматтер будет форматировать деления на шкале времени вместо целых чисел.

## Create custom index formatter
fig, ax2 = plt.subplots(figsize=(6, 3))
ax2.plot(r.adj_close, 'o-')

## Format x-axis as times
def format_date(x, _):
    try:
        ## convert datetime64 to datetime, and use datetime's strftime:
        return r.date[round(x)].item().strftime('%a')
    except IndexError:
        pass

ax2.set_title("Creating Custom Index Formatter")
ax2.xaxis.set_major_formatter(format_date)  ## internally creates FuncFormatter

Использование вызываемого объекта для форматтера

Вместо передачи функции в .Axis.set_major_formatter, мы можем использовать любой другой вызываемый объект, такой как экземпляр класса, который реализует __call__. В этом шаге мы создадим класс MyFormatter, который будет форматировать деления на шкале времени.

## Use a callable for formatter
class MyFormatter(Formatter):
    def __init__(self, dates, fmt='%a'):
        self.dates = dates
        self.fmt = fmt

    def __call__(self, x, pos=0):
        """Return the label for time x at position pos."""
        try:
            return self.dates[round(x)].item().strftime(self.fmt)
        except IndexError:
            pass

ax2.xaxis.set_major_formatter(MyFormatter(r.date, '%a'))

Отображение графика

Теперь мы отобразим график с использованием функции show из библиотеки matplotlib.

plt.show()

Резюме

В этом практическом занятии мы узнали, как использовать пользовательский форматтер индекса для построения графиков финансовых временных рядов без пропусков в выходные дни. Мы также узнали, как использовать вызываемый объект для форматтера вместо функции. Используя эти методы, мы можем создавать более наглядные графики ежедневных данных.