2017〜2018年で頻繁に使ったコードのまとめで、個人的備忘録。
これからも追記はしてきます。
pandas
Q1.pandasで特定の列だけ演算をする場合
下のようなDataFrame(df)で、特定の列('c')を-1する場合。
# df a, b, c, d, e 0 1 2 3 2 2 1 2 2 3 2 1 2 3 3 3 4 4 3 2 4 5 3 1
A.apply()を使う
new_df['c'] = df['c'].apply(lambda x:x-1)
Q2.pandasのdataframeをリストの中に辞書を挿入した形式にする方法
>>> import pandas as pd >>> df = pd.DataFrame({"A":[1,2,3], "B":[4,5,6], "C":[7,8,9]}) >>> df A B C 0 1 4 7 1 2 5 8 2 3 6 9 >>> tmp = df.to_dict(orient="index") >>> [tmp[i] for i in df.index] [{'B': 4, 'A': 1, 'C': 7}, {'B': 5, 'A': 2, 'C': 8}, {'B': 6, 'A': 3, 'C': 9}] # 例 factrization machines [ {'user_id': '23', 'movie_id': '12', 'occupation':'11', 'zip_code': '11'}, {'user_id': '34', 'movie_id': '22', 'occupation':'22', 'zip_code': '33'}, {'user_id': '445', 'movie_id': '33', 'occupation':'44', 'zip_code': '22'}, ]
Q3.列の内容が同じDataFrame同士を連結する方法
A.pandas.merge()を使う
pandas.DataFrameを結合するmerge, join
Q4.pandasでDataFrameの特定の列の値の重複数を入れた新たな列を作成する方法
# df x y # 0 AA 100 # 1 AA 200 # 2 AA 200 # 3 BB 100 # 4 BB 200 # 5 CC 300
そこからdfの列xの該当する値に重複数を入れた新たな重複数の列(z)を含んだ行列(dff)を作る。
# dff x y z 0 AA 100 3 1 AA 200 3 2 AA 200 3 3 BB 100 2 4 BB 200 2 5 CC 300 1
A.groupby().transform('count')
重複数のカウントが簡単にできる
import pandas as pd df = pd.DataFrame({ 'x':['AA','AA','AA','BB','BB','CC'], 'y':[100,200,200,100,200,300]}) df['z'] = df.groupby('x').transform('count') print(df) x y z 0 AA 100 3 1 AA 200 3 2 AA 200 3 3 BB 100 2 4 BB 200 2 5 CC 300 1
Q5.行数の合わない2つのlistをpandasのDataFrameで表にする方法
listA = ['A', 'B', 'C', 'D', 'E', 'F'] listB = ['a', 'b', 'c', 'd'] pd.DataFrame([listA, listB], columns=list(‘ABCDEF'))
Q6.pandasの欠損値以外を1に変える方法
pandasのリスト(図)を作成し、欠損値以外は文字が表示されている。
欠損値を0に変えたあと、文字を全て1に変える処理をしたい場合。
A.notnull()で欠損値以外を検索し、.fillna()で欠損値を指定した値で埋め込む
下記の例は欠損値以外を1に置き換えた後、欠損値を0に置き換えてる
import pandas as pd from numpy import nan df = pd.DataFrame([['a', nan], [nan, 'b']]) df[df.notnull()] = 1 df.fillna(0, inplace=True)
Q7.pandasの特定の列を最後に移動させる方法
pandasで表を作ったとき、特定の列の値を最後に移動させる方法。
A.除外してあとで付け加える
col = df.columns.tolist() # 列名のリスト col.remove('t') # 't'を削除 ※列名は重複していないものとする col.append('t') # 末尾に`t`を追加 df = df.ix[:,col] #df = df[col] でもよい
Gitコマンド
Q8.githubにcommitする方法
# 既存レポジトリ対象のcommand git clone URL cd jupyter_note(cloneしたフォルダ) mkdir detecting_trend_words cd detecting_trend_words #ファイル移動 cp change_detection.ipynb detecting_trend_words/change_detection.ipynb git add . git commit -m "コメント” git push origin master
# 特定のファイルの削除 git reset git rm 'ファイル名' git commit -m "コメント” git push origin master
SQL
Q9.Bigquery(SQL)で5年間分の検索単語数を1日おきに抽出する方法
google bigquery で検索ワードを以下の条件でSQLで出す。LSTM用には時系列データとしてshape=(365×5×24,)(例:batch,time_window,dim=365×5,3,21)
の形で抽出するのが目的。
ちなみに、5年分の単語抽出のSQLは以下の通り。
# original_keywords:単語 # time:検索ワードが入力された時間 SELECT original_keywords, time AS t from TABLE_DATE_RANGE(search_logs.search_log_, TIMESTAMP ('2012-6-10'), TIMESTAMP ('2017-6-10') ) WHERE original_keywords IS NOT NULL
A.集計関数を利用すれば可能
timeがTIMESTAMP型ならこんな感じ。
#standardSQL SELECT original_keywords, format_time("%Y%m%d%H", time) AS hours, COUNT(*) AS cnt # ワード、時間、ワード数 fROM search_logs.search_log_* WHERE original_keywords IS NOT NULL AND _TABLE_SUFFIX BETWEEN '20120610' AND ‘20170610' # 5年間でワードがある場合の条件指定 GROUP BY original_keywords, format_timestamp("%Y%m%d%H", time) # ワードと時間で一まとめにする
BIG Queryで使うSQLの例
WHERE句の条件指定では「WHERE al._TABLE_SUFFIX BETWEEN」
を使う。
#standardSQL select al.id, ial.id, al.id2 al.id3 FROM `reco.log_*` al JOIN `action.log_*` ial ON al.id=ial.id WHERE al._TABLE_SUFFIX BETWEEN '20180610' AND '20180611' group by al.id, ial.id, al.id2, al.id3
Tips
Q10.if __name__ == ‘__main__':の意味
「python コード.py」などと直接実行された場合、if __name__ == '__main__':以下が実行される。
Q11.for文でリスト内の要素を辞書に格納する方法
下の用のfor文を使ってdicに自動で格納したい場合。cat=[['b', 'a1'], ['b', 'a2'], ['c', 'b1'], ['c', 'b2'], ['c', 'b3'], ['d', 'c1'], ['d', 'c2'], ['d', 'c3']] dic={'b': (['a1', 'a2']), 'c': ['b1','b2','b3'], ‘d':['c1','c2','c3']}
A.setdefaultを使う
cat = [['b', 'a1'], ['b', 'a2'], ['c', 'b1'], ['c', 'b2'], ['c', 'b3'], ['d', 'c1'], ['d', 'c2'], ['d', 'c3']] dic = {} for k,v in cat: dic.setdefault(k, []).append(v) print(dic) # => {'b': ['a1', 'a2'], 'c': ['b1', 'b2', 'b3'], 'd': ['c1', 'c2', 'c3']}
Linux
Q12.末尾の名前が0~Nまでのディレクトリを作成する
$ for i in $(seq 0 199); do mkdir "label_$i"; done
$(seq 0 199)で0~199までの数字を返し、末尾がその数字のディレクトを作成してる
Q13.ファイルの拡張子の最後を.jpgに変換する
$ for i in $(ls); do mv $i "$i.jpg"; done
例:dog.jpeg.jmg →dog.jpg
Q14.別フォルダ(fAとfB)同士の同名ファイルを削除する
# fB内で実行 for i in *.gz; do rm "/*/*/downloads/*/fA/$i"; done
tensorboard
Tensorboardの表示方法
qiita.com$ tensorboard --logdir=[ファイルがあるdir名] ex: $ tensorboard --gdir=/Users/〜/Downloads # 「http://localhost:6006」にaccess