Python 3.6.4およびtslearnを使用して、経時データのK-Shapeによるクラスタリングを行っています。 一つのグラフ中の複数のサンプルの凡例を示したいです。 グラフの呼び出し元ファイルはcsvで、各サンプル名、時間とその時のデータの値を3列で表記しています。 csv中のNameを凡例として表示したいです。 csv例 Name Time Value 1 12 0.5 1 18 1.2 2 12 0.8 2 18 2.2 ・・・・・ ### 該当のソース
def read_file_to_dataframe(filenames): dfs = [] for filename in filenames: original_df = pd.read_csv(filename, index_col=None, header=0) dfs.append(original_df) return dfs def time_series_data_to_array(dataframes, target_col=''): tsdata = [] for i, df in enumerate(dataframes): tsdata.append(df[target_col].values.tolist()[:]) len_max = 0 for ts in tsdata: if len(ts) > len_max: len_max = len(ts) for i, ts in enumerate(tsdata): len_add = len_max - len(ts) tsdata[i] = ts + [ts[-1]] * len_add tsdata = np.array(tsdata) return tsdata def transform_vector(time_series_array): stack_list = [] for j in range(len(time_series_array)): data = np.array(time_series_array[j]) data = data.reshape((1, len(data))).T stack_list.append(data) stack_data = np.stack(stack_list, axis=0) return stack_data
df2=read_1file_to_dataframe('sample_data.csv')
tsdata = time_series_data_to_array(dataframes=df2, target_col='data') stack_data = transform_vector(time_series_array=tsdata)
plt.figure(figsize=(16,9)) for yi in range(2): plt.subplot(2, 1, 1 + yi) for xx in stack_data[y_pred == yi]: plt.plot(xx.ravel(),"-k", alpha=.2) plt.title("Cluster %d" % (yi + 1)) plt.legend(loc="upper right") plt.tight_layout() plt.show()
以上、宜しくお願い致します。
コードは<code>機能を使って書いてもらえると、読みやすくなって回答が集まるかと。
親切に教えて頂き有難うございます。
修正させて頂きました。
グラフの描画に使用されております stack_data がどのような形式のデータかを教えていただけませんか。
有難うございます。
追記した部分で判断可能でしょうか?
せっかく追加していただいたのですが、
plt.figure(figsize=(16,9))
の前の行あたりで
print(stack_data)
を行ってみて、その結果を貼っていただけると助かります。
(データの形式が知りたいだけなので、途中省略をしたり、見せたくないデータを加工しても構いません
)
承知致しました。
以下の通り実行致しました。
seed = 0
np.random.seed(seed)
stack_data = TimeSeriesScalerMeanVariance(mu=0.0, std=1.0).fit_transform(stack_data)
ks = KShape(n_clusters=3, n_init=10, verbose=True, random_state=seed)
y_pred = ks.fit_predict(stack_data)
print(stack_data)
plt.figure(figsize=(16,9))
for yi in range(3):
plt.subplot(3, 1, 1 + yi)
for xx in stack_data[y_pred == yi]:
plt.plot(xx.ravel(),"-k", alpha=.2)
plt.title("Cluster %d" % (yi + 1))
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()
<結果>
Init 1
0.009 --> Resumed because of empty cluster
Init 1
0.008 --> 0.009 -->
Init 2
0.015 --> Resumed because of empty cluster
Init 2
0.010 --> 0.009 --> 0.016 -->
Init 3
Resumed because of empty cluster
Init 3
Resumed because of empty cluster
Init 3
0.004 --> 0.007 -->
Init 4
Resumed because of empty cluster
Init 4
No handles with labels found to put in legend.
0.007 --> 0.003 --> 0.007 -->
Init 5
0.009 --> Resumed because of empty cluster
[[[ 1.00893576]
[ 2.30745985]
[ 2.95674218]
[ 2.30745985]
......(以下同様の数列)
+グラフ
回答2件
あなたの回答
tips
プレビュー