Python関連
の編集
Top
/
Python関連
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
島部/menu/template
[[技術メモ]] #contents *欠損値,発散値の処理 [#jbe86d00] **NaN値の除去 [#t127bceb] -fillnaを使用してNaN値を含む"行"を削除する df0 = df0.fillna("N") #NaNを文字Nに置き換えの行が削除される for col in df0.columns.tolist(): if 'N' in df0[col].values.tolist(): #各列でNaN値がないか見ていく df0 = df0[df0[flipdesc] != 'N'] #Nがある行が削除される **発散値の除去 [#nc4b9be3] -発散値があるか確認する(float64型だと上手く見れる) np.any(np.isfinite(df0.astype("float64"))) -Falseの場合float型infが入っている可能性があるので削除 FeatureDF2 = FeatureDF2.replace([np.inf, -np.inf], "N") --後はNaN値処理のfor文と同様Nがある行を削除する ** ValueError: Input contains NaN, infinity or a value too large for dtype('float32')への対処 [#l42a7f83] -float32が取りうる値の範囲[-3.4e+38,3.4e+38]を超える値がある場合に発生(主に決定木の分類問題で発生) -データフレーム内の最大値を確認 df.max.max() #最初のmaxで各行の最大,次のmaxでその中の最大 -超える値をNan値にするか3.4e+38に置き換えるなりを行う(ここではNaN値に) df = df[df<np.finfo(np.float32).max] #範囲内の値だけ取り出す(それ以外はNaNに) --後はNaN値除去と同様 *データフレーム [#ye019583] **行番号とカラム名で要素抽出(カラムも番号にしてilocの方が手っ取り早いが,名前で抽出したい場合) [#n18b4f0d] 参考~ https://qiita.com/monokeshi6/items/453d1549db62442a5588 df.at[df.index[行番号],'列名'] *リストに別のリストを追加する [#i16684ee] **append()メソッド [#d598bcc2] メソッドを実行するインスタンスはリストである必要がある~ (失敗例) slist = ['str1','str2','str3','str4','str5','str6'] adlist = ['details1','details2'] →slist[0].append(adlist)を実行すると AttributeError: 'str' object has no attribute 'append'が表示 (成功例) [slist[0]].append(adlist) **extend()メソッド [#d68437a9] appendでは入れ子になるのを防げる In: slist.append(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', ['details1', 'details2']] In: slist.extend(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', 'details1', 'details2'] *内包表記 [#g3b54f52] -インタプリタ型のpythonではforループのi,j,k呼び出しに時間がかかるので,それを短縮したもの -可読性に欠けるので,通常のループを作ってから実装するほうが望ましい **基本形 [#a0386aba] [[【append()のカッコ内の要素】【内側for文j】【if文】]【外側for文i】] (配列の次元+1ごとに外に[ 【for文】])を追加する [[挿入要素 for j in range(len(df)) if(i != j)] for i in range(len(df))] **if分岐を入れるときのルール [#i089b4a2] if~,else~のときは【if文】【else文】【for文】の並びにする [[挿入要素 if(i != j) else 0 for j in range(len(df)) ]for i in range(len(df))] **for文のルール [#ra7cf60f] 【for文】【for文】と続けるときは【外側for】【内側for】で逆にする [挿入要素 for i in range(len(df)) for j in range(len(df))] **その他 [#t86a57e9] 元のfor文でappend()がないforは,1つ内側のforとつなげて【該当for文】【内側for文】となる *配列の次元削減(append(内包表記)時によく起こるケースへの対処法) [#jf65696a] **2次元配列から1次元配列に落とす [#v8ef1273] ***1要素づつappendすればOK(今回は要素の型が辞書形式) [#zb8e2b91] 問題(n×1)型の配列 In: t =[[{'a':1}],[{'a':2}],[{'a':3}],[{'a':4}],[{'a':5}]] Out: [[{'a': 1}], [{'a': 2}], [{'a': 3}], [{'a': 4}], [{'a': 5}]] データフレーム時,aで一まとめにしてくれない appendで新しい1次元配列に入れ直していく(内包表記で表現) In: c = [t[i][0] for i in range(len(t))] Out: [{'a': 1}, {'a': 2}, {'a': 3}, {'a': 4}, {'a': 5}] データフレーム時,Columnsをaとしてまとめてくれる **3次元配列から2次元配列に落とす [#d5c0982b] ***データフレームに[]が入り込むときなどの対処 [#u029566b] 参考:~ https://human-blog.com/hairetsu/ 例:i×j×k = 6×1×3 配列(2次元配列が6つ)の場合 trilist = [[['a', 'b', 'c']], [['d', 'e', 'f']], [['g', 'h', 'i']], [['j', 'k', 'l']], [['m', 'n', 'o']], [['p', 'q', 'r']]] *** 参考先を元にした内包表記 [#r135c31e] dilist = [[trilist[i][j][k] for j in range(len(trilist[i])) for k in range(len(trilist[i][j]))] for i in range(len(trilist))] -外のiを6,中のjを1,内のkを3回まわす -j,kのappendで['a', 'b', 'c'],[・・・],・・・の1次元のリストを作った後,iのappendでリストを1個ずつ入れている -↓に比べて内の[]が外れている ***3次元配列作成の際の内包表記 [#zf74ce67] maketrilist = [[[trilist[i][j][k] for k in range(len(trilist[i][j]))] for j in range(len(trilist[i]))] for i in range(len(trilist))] *python処理高速化(for文を使わない書き方集) [#y13537a0] pythonのfor文は処理が呼び出し関係で時間がかかるらしい~ →なるべくforを使わずに書くことが時間短縮になる **N重ループ短縮 [#m3ce9417] -例1. リスト内(1行)にある同じ要素を検索してカウントする処理 [#vcdbd759] for i in range(len(df12)): if(i%200 ==0): print(i) for j in range(len(df12)): if(i != j): for k in range(len(df12.iloc[i,:])): if(df12.iloc[i,k]==""): break for l in range(len(df12.iloc[j,:])): if(df12.iloc[i,k] == df12.iloc[j,l]): admatrix.iloc[i,j] +=1 16時間(200要素)*40 = 640時間(26.7日:Core i7-9700K)超非効率!! -例2. 2次元配列の要素1つ1つに代入(集合型の演算を使って4重ループ→2重ループに減量) [#b714a5b7] for i in range(len(df12)): if(i%200 ==0): print(i) for j in range(len(df12)): if(i != j): #print(len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""}))) admatrix.iloc[i,j] =len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""})) O(n^2)、n=8100で約6.67時間(200要素(10分)*40)かかる -例3. 内包表記(たぶんこれが一番速い)
タイムスタンプを変更しない
[[技術メモ]] #contents *欠損値,発散値の処理 [#jbe86d00] **NaN値の除去 [#t127bceb] -fillnaを使用してNaN値を含む"行"を削除する df0 = df0.fillna("N") #NaNを文字Nに置き換えの行が削除される for col in df0.columns.tolist(): if 'N' in df0[col].values.tolist(): #各列でNaN値がないか見ていく df0 = df0[df0[flipdesc] != 'N'] #Nがある行が削除される **発散値の除去 [#nc4b9be3] -発散値があるか確認する(float64型だと上手く見れる) np.any(np.isfinite(df0.astype("float64"))) -Falseの場合float型infが入っている可能性があるので削除 FeatureDF2 = FeatureDF2.replace([np.inf, -np.inf], "N") --後はNaN値処理のfor文と同様Nがある行を削除する ** ValueError: Input contains NaN, infinity or a value too large for dtype('float32')への対処 [#l42a7f83] -float32が取りうる値の範囲[-3.4e+38,3.4e+38]を超える値がある場合に発生(主に決定木の分類問題で発生) -データフレーム内の最大値を確認 df.max.max() #最初のmaxで各行の最大,次のmaxでその中の最大 -超える値をNan値にするか3.4e+38に置き換えるなりを行う(ここではNaN値に) df = df[df<np.finfo(np.float32).max] #範囲内の値だけ取り出す(それ以外はNaNに) --後はNaN値除去と同様 *データフレーム [#ye019583] **行番号とカラム名で要素抽出(カラムも番号にしてilocの方が手っ取り早いが,名前で抽出したい場合) [#n18b4f0d] 参考~ https://qiita.com/monokeshi6/items/453d1549db62442a5588 df.at[df.index[行番号],'列名'] *リストに別のリストを追加する [#i16684ee] **append()メソッド [#d598bcc2] メソッドを実行するインスタンスはリストである必要がある~ (失敗例) slist = ['str1','str2','str3','str4','str5','str6'] adlist = ['details1','details2'] →slist[0].append(adlist)を実行すると AttributeError: 'str' object has no attribute 'append'が表示 (成功例) [slist[0]].append(adlist) **extend()メソッド [#d68437a9] appendでは入れ子になるのを防げる In: slist.append(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', ['details1', 'details2']] In: slist.extend(adlist) Out: ['str1', 'str2', 'str3', 'str4', 'str5', 'str6', 'details1', 'details2'] *内包表記 [#g3b54f52] -インタプリタ型のpythonではforループのi,j,k呼び出しに時間がかかるので,それを短縮したもの -可読性に欠けるので,通常のループを作ってから実装するほうが望ましい **基本形 [#a0386aba] [[【append()のカッコ内の要素】【内側for文j】【if文】]【外側for文i】] (配列の次元+1ごとに外に[ 【for文】])を追加する [[挿入要素 for j in range(len(df)) if(i != j)] for i in range(len(df))] **if分岐を入れるときのルール [#i089b4a2] if~,else~のときは【if文】【else文】【for文】の並びにする [[挿入要素 if(i != j) else 0 for j in range(len(df)) ]for i in range(len(df))] **for文のルール [#ra7cf60f] 【for文】【for文】と続けるときは【外側for】【内側for】で逆にする [挿入要素 for i in range(len(df)) for j in range(len(df))] **その他 [#t86a57e9] 元のfor文でappend()がないforは,1つ内側のforとつなげて【該当for文】【内側for文】となる *配列の次元削減(append(内包表記)時によく起こるケースへの対処法) [#jf65696a] **2次元配列から1次元配列に落とす [#v8ef1273] ***1要素づつappendすればOK(今回は要素の型が辞書形式) [#zb8e2b91] 問題(n×1)型の配列 In: t =[[{'a':1}],[{'a':2}],[{'a':3}],[{'a':4}],[{'a':5}]] Out: [[{'a': 1}], [{'a': 2}], [{'a': 3}], [{'a': 4}], [{'a': 5}]] データフレーム時,aで一まとめにしてくれない appendで新しい1次元配列に入れ直していく(内包表記で表現) In: c = [t[i][0] for i in range(len(t))] Out: [{'a': 1}, {'a': 2}, {'a': 3}, {'a': 4}, {'a': 5}] データフレーム時,Columnsをaとしてまとめてくれる **3次元配列から2次元配列に落とす [#d5c0982b] ***データフレームに[]が入り込むときなどの対処 [#u029566b] 参考:~ https://human-blog.com/hairetsu/ 例:i×j×k = 6×1×3 配列(2次元配列が6つ)の場合 trilist = [[['a', 'b', 'c']], [['d', 'e', 'f']], [['g', 'h', 'i']], [['j', 'k', 'l']], [['m', 'n', 'o']], [['p', 'q', 'r']]] *** 参考先を元にした内包表記 [#r135c31e] dilist = [[trilist[i][j][k] for j in range(len(trilist[i])) for k in range(len(trilist[i][j]))] for i in range(len(trilist))] -外のiを6,中のjを1,内のkを3回まわす -j,kのappendで['a', 'b', 'c'],[・・・],・・・の1次元のリストを作った後,iのappendでリストを1個ずつ入れている -↓に比べて内の[]が外れている ***3次元配列作成の際の内包表記 [#zf74ce67] maketrilist = [[[trilist[i][j][k] for k in range(len(trilist[i][j]))] for j in range(len(trilist[i]))] for i in range(len(trilist))] *python処理高速化(for文を使わない書き方集) [#y13537a0] pythonのfor文は処理が呼び出し関係で時間がかかるらしい~ →なるべくforを使わずに書くことが時間短縮になる **N重ループ短縮 [#m3ce9417] -例1. リスト内(1行)にある同じ要素を検索してカウントする処理 [#vcdbd759] for i in range(len(df12)): if(i%200 ==0): print(i) for j in range(len(df12)): if(i != j): for k in range(len(df12.iloc[i,:])): if(df12.iloc[i,k]==""): break for l in range(len(df12.iloc[j,:])): if(df12.iloc[i,k] == df12.iloc[j,l]): admatrix.iloc[i,j] +=1 16時間(200要素)*40 = 640時間(26.7日:Core i7-9700K)超非効率!! -例2. 2次元配列の要素1つ1つに代入(集合型の演算を使って4重ループ→2重ループに減量) [#b714a5b7] for i in range(len(df12)): if(i%200 ==0): print(i) for j in range(len(df12)): if(i != j): #print(len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""}))) admatrix.iloc[i,j] =len((set(df12.iloc[i,1:])&set(df12.iloc[j,1:])-{""})) O(n^2)、n=8100で約6.67時間(200要素(10分)*40)かかる -例3. 内包表記(たぶんこれが一番速い)
テキスト整形のルールを表示する