Обработка данных и визуализация временных рядов с использованием Python

Обработка данных и визуализация временных рядов с использованием 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()метод для просмотра временных рядов consumptionsolar и 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

источник


Report Page