Функция скользящей средней для временного ряда
Для решения этой задачи читал статью , посвященную временным рядам. Для нахождения аномалий в первую очередь выбрал функцию скользящей средней, изложенной в этой статье.
Часть датасета:
Time, dB
0,-117
0.0001,46
0.0002,-478
0.000300001,2
..............
59.9998,-208
59.9999,-95
60,-169
Сперва прочитал файл
df = pd.read_csv("data.csv", sep=',')
df.columns = ['Time, seconds', 'Series values, dB']
Написал функцию для отрисовки графика, исходя с данных датасета:
def plotMovingAverage(series, n):
rolling_mean = series.rolling(window=n).mean()
plt.figure(figsize=(15,5))
plt.title("Moving average\n window size = {}".format(n))
plt.plot(rolling_mean, "g", label="Rolling mean trend")
plt.plot(series[n:], label="Actual values")
plt.legend(loc="upper left")
plt.grid(True)
И потом вызвал эту функцию:
plotMovingAverage(df, 60) #60 секунд
plt.show()
ПРОБЛЕМА:
Но данный график выражает зависимость значение-колво строк(600000), а мне нужен график время-значение. Так же не получается выделить на рисунке саму скользящую среднюю. Посоветуйте, пожалуйста, как можно это сделать?
Как вообще в данном случае правильно будет написать эту функцию?
Ответы (2 шт):
Не смотря на обсуждение в комментариях, я так и не понял, что именно вы хотите и что не устраивает в ваших результатах. Поэтому публикую свой вариант решения, где и данные есть, и скользящее видно, и двойного наложения графика нет. Естественно, это пример - на искусственных данных и без вызова функции. Но надеюсь, это не помешает вам подогнать код под свои нужды. (Кстати, никакого поиска аномалий ни у вас в функции ни в моем коде, естественно, нет. Но тут уже не график рисовать надо, а соответвтующие алгоритмы применять. Кстати, можно и без всякого графика обойтись.).
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
sr=pd.Series(np.random.randn(1000))
n=100
############################################
rolling_mean = sr.rolling(window=n).mean()
plt.plot(sr[n:], label="Actual values",color='blue')
plt.plot(rolling_mean, color="red", lw=3, label="Rolling mean trend")
plt.legend(loc="upper left")
Оно?
Этом можно сделать еще и другим способом. Для скользящего среднего нам нужно взять определенный размер окна. Здесь мы взяли размер окна = 3600, т.е. скользящее среднее значение 1 час.
df['1hour_rolling_avg'] = df['Series values, dB'].rolling(60*60).mean()
строим график
plt.figure( figsize = (12, 10))
sns.lineplot(x='Time, seconds', y='Series values, dB', data=df)
sns.lineplot( x = 'Time, seconds',
y = '1hour_rolling_avg',
data = df,
label = 'Rollingavg')
plt.title('Full Series')
plt.xlabel('Seconds')
plt.ylabel('Values')
plt.show()
Но для лучшего внешнего вида графика, лучше сделать аггрегацию данных, ибо данных много.



