Как построить массив временных рядов с отображаемыми доверительными интервалами в python?

У меня есть некоторые временные ряды, которые медленно увеличиваются, но в течение короткого периода времени они очень волнистые. Например, временной ряд может выглядеть так:

[10 + np.random.rand() for i in range(100)] + [12 + np.random.rand() for i in range(100)] + [14 + np.random.rand() for i in range(100)] 

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

Простой сюжет будет выглядеть так:

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

График, который я хотел бы, с доверительными интервалами выглядел бы так:

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

Есть ли элегантный способ сделать это в Python?


person Ștefan    schedule 03.05.2018    source источник


Ответы (2)


Вы можете использовать pandas функцию rolling(n) для получения значений среднего значения и стандартного отклонения для n последовательных точек.

Для оттенка доверительных интервалов (представленных пространством между стандартными отклонениями) вы можете использовать функцию fill_between() из matplotlib.pyplot. Для получения дополнительной информации вы можете просмотреть здесь, из которого взят следующий код.

import numpy             as np
import pandas            as pd
import matplotlib.pyplot as plt

#Declare the array containing the series you want to plot. 
#For example:
time_series_array = np.sin(np.linspace(-np.pi, np.pi, 400)) + np.random.rand((400))
n_steps           = 15 #number of rolling steps for the mean/std.

#Compute curves of interest:
time_series_df = pd.DataFrame(time_series_array)
smooth_path    = time_series_df.rolling(n_steps).mean()
path_deviation = 2 * time_series_df.rolling(n_steps).std()

under_line     = (smooth_path-path_deviation)[0]
over_line      = (smooth_path+path_deviation)[0]

#Plotting:
plt.plot(smooth_path, linewidth=2) #mean curve.
plt.fill_between(path_deviation.index, under_line, over_line, color='b', alpha=.1) #std curves.

С приведенным выше кодом вы получите что-то вроде этого: введите здесь описание изображения

person Ștefan    schedule 04.05.2018

Похоже, вы дважды удваиваете стандартное значение. Я думаю, это должно быть так:

time_series_df = pd.DataFrame(time_series_array)
smooth_path = time_series_df.rolling(20).mean()
path_deviation = time_series_df.rolling(20).std()
plt.plot(smooth_path, linewidth=2)
plt.fill_between(path_deviation.index, (smooth_path-2*path_deviation)[0], (smooth_path+2*path_deviation)[0], color='b', alpha=.1)
person flrndttrch    schedule 30.07.2018