Обработка данных и визуализация временных рядов с использованием Python
t.me/python_job_interviewВ этой статье я извлеку и визуализирую значимую статистику из данных временных рядов. Чтобы понять основные концепции, связанные с анализом временных рядов, я буду работать с временными рядами Open Power System Data (OPSD) для Германии. Набор данных состоит из ежедневного потребления электроэнергии и производства солнечной и ветровой энергии в период с 2006 по 2017 год.
Начну анализ временных рядов с импорта необходимых библиотек:
import pandas as pd import seaborn as sns import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates
Затем загрузите набор данных
data="https://raw.githubusercontent.com/jenfly/opsd/master/opsd_germany_daily.csv" opsd= pd.read_csv(data)
Используя функцию .head(), я загляну в свои наборы данных, чтобы увидеть, как они выглядят. На рис. 1 показаны первые 5 строк набора данных. Вы также можете использовать .tail(), чтобы увидеть последние 5 строк набора данных.

Затем я проверю типы данных каждого из столбцов, используя:
opsd.dtypes
Date object Consumption float64 Wind float64 Solar float64 Wind+Solar float64 dtype: object
Мы видим, что столбец Date имеет объектный тип данных. Нам нужно будет преобразовать его в значения даты/времени. Я преобразую его в тип данных даты/времени, используя метод pandas to_datetime.
opsd[‘Date’]= pd.to_datetime(opsd[‘Date’])
Как только дата будет преобразована в тип даты и времени, я установлю дату как индекс фрейма данных.
opsd= opsd.set_index("Date")
Визуализация данных временных рядов
Я буду использовать plot()метод для просмотра временных рядов consumption, solar и wind.
cols= ["Consumption", "Solar", "Wind"]
axes= opsd[cols].plot (marker=".", alpha=0.5, linestyle="None", figsize=(15,9), subplots= True)
for ax in axes:
ax.set_ylabel("Daily Total (GWh");

Из графика мы можем наблюдать тенденции в анализе временных рядов.
Далее я визуализирую, как общее производство соотносится с общим потреблением.
plt.figure(figsize=(19,9))
plt.plot(opsd["Consumption"], linewidth= 0.5)
plt.plot(opsd["Wind+Solar"], linewidth=0.5)
plt.title("Consumption vs Production")
plt.xlabel("Year")
plt.ylabel("GWh")
plt.show()

Чтобы более внимательно изучить наборы данных, я построю временные ряды за один год.
Я буду визуализировать для 2017 года. Сначала мы построим график для consumption за 1 год 2017–2018. Мы лучше наблюдаем, разбивая данные на год, месяц и т. д.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017": "2018", "Consumption"].plot()
ax.set_ylabel("Consumption")
ax.set_title("Consumption in 2017");
ax.set_xlabel("Month");

Мы можем видеть недельную картину на данных о потреблении. Во вторую неделю с января по февраль наблюдается увеличение потребления электроэнергии. И резкое снижение потребления электроэнергии в конце декабря.
Далее я построю график производства энергии ветра в 2017–2018 годах.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017": "2018", "Wind"].plot()
ax.set_ylabel(" Production")
ax.set_title("Wind Production in 2017");
ax.set_xlabel("Month");

На графике видно, что производство ветра максимально с сентября до середины января. И самый низкий летом.
Я также заговор для производства солнечной энергии в течение года.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017": "2018", "Solar"].plot()
ax.set_ylabel("Production ")
ax.set_title("Solar Production in 2017");
ax.set_xlabel("Month");

Производство солнечной энергии является самым высоким летом, а пик падает после сентября. Я увеличу масштаб и посмотрю только на сентябрь.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-10-01", "Consumption"].plot()
ax.set_ylabel("Consumption")
ax.set_title("Consumption in Sept");
# Set x-axis major ticks to weekly interval
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=mdates.MONDAY))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b%d'));

Судя по графику, потребление в будние дни выше, чем в выходные. Я увеличу масштаб и посмотрю на неделю, чтобы понять месячную и еженедельную структуру. Прежде чем увеличить масштаб, я поищу месячную выработку энергии ветра и солнца в сентябре.
# Monthy Production 2017-09: 2017-10
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-10-01", "Wind"].plot()
ax.set_ylabel("Production")
ax.set_title("Wind Production in Sept");
# Set x-axis major ticks to weekly interval
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=mdates.MONDAY))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b%d'));

Здесь мы видим, что производство ветра было высоким в течение первой недели сентября и постепенно уменьшалось после 14 сентября.
# Monthy Production 2017-09: 2017-10
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-10-01", "Solar"].plot()
ax.set_ylabel("Production")
ax.set_title("Solar Production in Sept");
# Set x-axis major ticks to weekly interval
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=mdates.MONDAY))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b%d'));

Из графика видно, что производство солнечной энергии было высоким в первую неделю сентября по сравнению с другими неделями сентября.
Чтобы понять дневной тренд, я возьму данные за 1 неделю.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-09-08", "Consumption"].plot()
ax.set_ylabel("Consumption")
ax.set_title("Consumption in first week of Sept");
# Set x-axis major ticks to weekly interval
# import constants for the days of the week
from matplotlib.dates import MO, TU, WE, TH, FR, SA, SU
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(MO, SU)))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%A'));

Мы видим, что с понедельника по вторник потребление электроэнергии снизилось, а в среду произошло резкое увеличение потребления электроэнергии.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-09-08", "Wind"].plot()
ax.set_ylabel("Production")
ax.set_title("Production of Wind in first week of Sept");
# Set x-axis major ticks to weekly interval
# import constants for the days of the week
from matplotlib.dates import MO, TU, WE, TH, FR, SA, SU
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(MO, SU)))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%A'));

Производство ветра было низким до пятницы.
plt.figure(figsize=(19,9))
ax= opsd.loc["2017-09-01": "2017-09-08", "Solar"].plot()
ax.set_ylabel("Production")
ax.set_title("Production of Solar in first week of Sept");
# Set x-axis major ticks to weekly interval
# import constants for the days of the week
from matplotlib.dates import MO, TU, WE, TH, FR, SA, SU
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(MO, SU)))
ax.set_xlabel("Date");
ax.xaxis.set_major_formatter(mdates.DateFormatter('%A'));

Если мы сравним производство энергии ветра и солнца, мы увидим обратный эффект. Производство энергии ветра выше зимой из-за сильного ветра, и мы почти не получаем солнечной энергии, и наоборот.
Повторяющиеся окна
Прокручивающиеся окна разбивают данные на временные окна. Прокручивающееся окно оценивает стабильность модели во времени. Компьютер сворачивает окна на неделю
plt.figure (figsize= (12,8))
plt.plot(opsd["Consumption"], label= "Consumption")
plt.plot(opsd["Consumption"].rolling("30D").mean(), label= " Rolling mean")
plt.legend()
plt.show()
Вывод
В этой статье я рассмотрел основы исследования временных рядов. Не забудьте проверить мой Github для получения полного кода.
t.me/ai_machinelearning_big_data