Как построить массив временных рядов с отображенными доверительными интервалами в python? - PullRequest
0 голосов
/ 03 мая 2018

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

[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)] 

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

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

enter image description here

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

enter image description here

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

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

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

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

time_series_df = pd.DataFrame(time_series_array)
smooth_path    = time_series_df.rolling(20).mean()
path_deviation = 2 * 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)

С помощью приведенного выше кода вы получите что-то вроде этого: enter image description here

0 голосов
/ 30 июля 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)
0 голосов
/ 03 мая 2018

Вы можете создать плавную кривую различными способами.

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

Другой подход заключается в том, чтобы подогнать модель к данным и использовать ее для создания сглаженной кривой. Например, вы можете сделать это с помощью гауссовского процесса. Эта модель также может дать желаемую доверительную полосу для каждой точки. См. Пример Scikit-learn для получения дополнительной информации.

...