DataFrame.groupby().apply()
にて関数を呼び出し、その関数内でグループ毎のクラスタ数・クラスタ間距離を求めて pandas.Series()
データとして返すことで実現できます。
クラスター間距離を求めるコードがありませんでしたので、下のコードでは しきい値として使った値をクラスター間距離として扱っております。
Python
1import pandas as pd
2import io
3from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
4import numpy as np
5
6data = """
7id,time,feature1,feature2,feature3
8a,2019-01-04 16:03:00,14,32,88
9a,2019-01-04 16:03:00,12,21,16
10a,2019-01-04 16:03:00,13,15,44
11a,2019-01-04 16:04:00,11,36,45
12a,2019-01-04 16:04:00,13,15,44
13a,2019-01-04 16:04:00,18,35,53
14b,2019-01-04 16:04:00,17,21,36
15b,2019-01-04 16:04:00,19,93,23
16b,2019-01-04 16:04:00,25,27,55
17"""
18
19df = pd.read_csv(io.StringIO(data),parse_dates=['time'])
20
21def f(d):
22 linkage_result = linkage(d, method='ward', metric='euclidean')
23 # クラスタ分けのためのしきい値の設定
24 threshold = 0.8 * np.max(linkage_result[:, 2])
25 # クラスタリング結果の値を取得
26 clustered = fcluster(linkage_result, threshold, criterion='distance')
27 # 結果をSeriesデータとして返す(クラスタ間距離はしきい値で良いの??)
28 return pd.Series({'クラスタ数': np.max(clustered), 'クラスタ間距離': threshold})
29
30
31# groupby.apply() にて関数 f() を呼び出す
32r = df.groupby(['id','time'])[['feature1','feature2','feature3']].apply(f)
33print(r)
34# クラスタ数 クラスタ間距離
35#id time
36#a 2019-01-04 16:03:00 2.0 55.134260
37# 2019-01-04 16:04:00 2.0 19.541409
38#b 2019-01-04 16:04:00 2.0 67.068125
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/30 23:36 編集
2019/10/31 01:05
2019/10/31 01:34
2019/10/31 01:36
2019/10/31 02:58 編集
2019/10/31 02:51
2019/10/31 02:59