実行時間に関してコードを最適化したい。コードは約300,000のエントリを含むデータフレームalldata
で実行されますが、計算には非常に長い時間がかかります(約10時間程度)。実行時間に関してネストされたfor-loopsを最適化する
計算ロジックは以下の通りである:
リストlist_of_NA_features
で指定されたデータフレームの列の各欠落(ナン)値について、最も類似する行を検索fill_missing_values
機能(コサイン類似度は、列に基づいて計算されリスト内ではlist_of_non_nan_features
は空ではありません)、現在の列と行の値をalldata
に返します。
from scipy import spatial
def fill_missing_values(param_nan,current_row,df):
df_non_nan = df.dropna(subset=[param_nan])
list_of_non_nan_features = ["f1","f2","f3","f4","f5"]
max_val = 0
searched_val = 0
vector1 = current_row[list_of_non_nan_features].values
for index, row in df_non_nan.iterrows():
vector2 = row[list_of_non_nan_features].values
sim = 1 - spatial.distance.cosine(vector1, vector2)
if (sim>max_val):
max_val = sim
searched_val = row[param_nan]
return searched_val
list_of_NA_features = df_train.columns[df_train.isnull().any()]
for feature in list_of_NA_features:
for index,row in alldata.iterrows():
if (pd.isnull(row[feature]) == True):
missing_value = fill_missing_values(feature,row,alldata)
alldata.ix[index,feature] = missing_value
コードを最適化することは可能ですか?例えば、私はlambda
関数でfor
ループの置換について考えています。出来ますか?代わりにlambdas
であなたのforループを置換する
for-loopsの 'lambda'関数はどのように役立ちますか?そしてなぜ 'lambda'が通常の関数の代わりに機能するのですか? –
@ juanpa.arrivillaga私が読んでいたのは、 'apply(lambda x:...)'がforループより速いことを読んでいたからです。 – Dinosaurius
※もちろんありません。 'pandas.DataFrame.apply'は、フードの下のPython for-loopです。 –