Функция скользящей средней для временного ряда

Для решения этой задачи читал статью , посвященную временным рядам. Для нахождения аномалий в первую очередь выбрал функцию скользящей средней, изложенной в этой статье.

Часть датасета:
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 шт):

Автор решения: passant

Не смотря на обсуждение в комментариях, я так и не понял, что именно вы хотите и что не устраивает в ваших результатах. Поэтому публикую свой вариант решения, где и данные есть, и скользящее видно, и двойного наложения графика нет. Естественно, это пример - на искусственных данных и без вызова функции. Но надеюсь, это не помешает вам подогнать код под свои нужды. (Кстати, никакого поиска аномалий ни у вас в функции ни в моем коде, естественно, нет. Но тут уже не график рисовать надо, а соответвтующие алгоритмы применять. Кстати, можно и без всякого графика обойтись.).

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") 

Результат введите сюда описание изображения

Оно?

→ Ссылка
Автор решения: Stan

Этом можно сделать еще и другим способом. Для скользящего среднего нам нужно взять определенный размер окна. Здесь мы взяли размер окна = 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()  
  

moving average

Но для лучшего внешнего вида графика, лучше сделать аггрегацию данных, ибо данных много.

→ Ссылка