pythonで距離関数DTWを使用したk-means法を実装したのですが,実行するのにすごく時間がかかってしまうため,実用的ではないのですが、どこを変えれば処理内容は変わらず処理速度を上げることができるのかアドバイスいただきたいと思っております。
python
1import numpy as np 2import pandas as pd 3from scipy.spatial.distance import euclidean 4from fastdtw import fastdtw 5import glob 6import random 7 8d = glob.glob('*_m.csv') 9df = pd.DataFrame() 10df7 = pd.DataFrame() 11df8 = pd.DataFrame() 12df9 = pd.DataFrame() 13df11 = pd.DataFrame() 14v = 3 15k = 546 16l = k*v 17r = np.random.randint(0,v,k) 18print(r) 19for n in range(v): 20 n += 1 21 for x in range(k): 22 x += 1 23 a = d[x-1] 24 df1 = pd.read_csv(f'{a}',index_col=0) 25 df1 = df1.groupby(df1.index // 60).mean() 26 for i in range(24): 27 i += 1 28 df7.loc[i-1,x] = df1.iloc[i-1,0] + df1.iloc[i-1,1] 29 df11.loc[i-1,0] = i-1 30 df11.loc[i-1,1] = df1.iloc[i-1,0] + df1.iloc[i-1,1] 31 if r[x-1] == n-1: 32 df8.loc[i-1,x-1] = df7.iloc[i-1,x-1] 33 df9.loc[i-1,0] = i-1 34 df9['1'] = df8.mean(axis=1) 35 distance, path = fastdtw(df11,df9,dist=euclidean) 36 df.loc[n-1,x-1] = distance 37 d1 = [] 38 d1 = df.idxmin(axis=0) 39 for s in range(10): 40 for i in range(24): 41 i += 1 42 df7.loc[i-1,x] = df1.iloc[i-1,0] + df1.iloc[i-1,1] 43 df11.loc[i-1,0] = i-1 44 df11.loc[i-1,1] = df1.iloc[i-1,0] + df1.iloc[i-1,1] 45 if d1[x-1] == n-1: 46 df8.loc[i-1,x-1] = df7.iloc[i-1,x-1] 47 df9.loc[i-1,0] = i-1 48 df9['1'] = df8.mean(axis=1) 49 distance, path = fastdtw(df11,df9,dist=euclidean) 50 df.loc[n-1,x-1] = distance 51 d1 = [] 52 d1 = df.idxmin(axis=0) 53for n in range (v): 54 df12 = pd. DataFrame() 55 n += 1 56 for x in range(k): 57 x += 1 58 if d1[x-1] == n-1: 59 for i in range(24): 60 i += 1 61 df12.loc[i-1,x-1] = df7.iloc[i-1,x-1] 62 df12.to_csv(f'dtw20070701_{n-1}_{v}.csv') 63
乱数を使っているためたまにエラーは出ますが,基本的には正常に動作します。
ちなみに使用しているデータは,546軒分の1分値のデータです。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。