82 KiB
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from statsmodels.tsa.holtwinters import ExponentialSmoothing
Определим функцию сглаживания временного ряда, она понадобится позже.
Например:
Метод скользящего окна. Параметр window задает ширину окна усреднения значений.
return ts.rolling(window=5).mean()
Метод экспоненциального сглаживания (метод Хольта-Уинтерса)
варианты для параметра trend: "add", "mul", "additive", "multiplicative", None
варианты для параметра seasonal: "add", "mul", "additive", "multiplicative", None
seasonal_periods задает для модели предполагаемый интервал сезонности, когда ВР будет иметь похожие уровни и тенденции
model = ExponentialSmoothing(ts, trend="additive", seasonal="additive", seasonal_periods=5)
return model.fit().fittedvalues
def smooth_time_series(ts):
model = ExponentialSmoothing(ts, trend="additive", seasonal="additive", seasonal_periods=5)
return model.fit().fittedvalues
Для чтения из файла необходимо взять временные ряды из предложенных наборов и сохранить в csv файл как показано в примере, сформировав датасет
dataset = pd.read_csv("ts2.csv", delimiter=";")
после того как файл был прочтен, можно вывести содержимое временных рядов в консоль
print(dataset)
Для выполнения первой части задания необходимо подобрать метод и параметры сглаживания временного ряда. Для этого выше реализован пример функции smooth_time_series
sds = dataset.apply(smooth_time_series)
plt.plot(sds)
plt.plot(dataset)
plt.legend(['sm first', 'sm second', 'sm third', 'first', 'second', 'third'])
plt.show()
Выполним нормализацию. Варианты: MinMaxScaler; MaxAbsScaler; RobustScaler; StandardScaler
df = pd.DataFrame(MinMaxScaler().fit_transform(sds), columns=sds.columns)
print(df)
Расчет степени корреляции между сглаженными временными рядами
matrix = df.corr()
print(matrix)
Для примера сравним корреляцию для несглаженных временных рядов
matrix2 = dataset.corr()
print(matrix2)
Визуализация матрицы корреляции:
plt.imshow(matrix, cmap='Blues')
plt.colorbar()
variables = []
for i in matrix.columns:
variables.append(i)
plt.xticks(range(len(matrix)), variables, rotation=45, ha='right')
plt.yticks(range(len(matrix)), variables)
plt.show()