ゆっくりと増加する時系列がいくつかありますが、短期間では非常に波打っています。たとえば、時系列は次のようになります。
[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でそれを行うためのエレガントな方法はありますか?
pandas
関数rolling(n)
を使用して、n
連続点の平均値と標準偏差値を生成できます。
信頼区間の陰影(標準偏差間のスペースで表される)には、_matplotlib.pyplot
_の関数fill_between()
を使用できます。詳細については、次のコードからヒントを得た here を参照してください。
_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.
_
どうやら、stdを2倍にしているようです。私はそれがこのようになるはずだと思います:
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)
さまざまな方法で滑らかな曲線を生成できます。
単純なアプローチは、移動平均(スライディングウィンドウ内のポイントの平均値)を使用することです。データをPandasデータフレームに保存する場合、これは非常に簡単にプロットできます。各ポイントの標準誤差を計算して信頼帯を取得することもできます。
別のアプローチは、モデルをデータに適合させ、それを使用して平滑化された曲線を生成することです。たとえば、ガウス過程を使用してそれを行うことができます。このモデルは、各ポイントに望ましい信頼帯を生成することもできます。詳細については、この Scikit-learnの例 を参照してください。