アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

2017,18年で便利だったpython, sql,linuxとかのコマンド・コードまとめ

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で表を作ったとき、特定の列の値を最後に移動させる方法。

例:下の図だとt列を最後に移動させる


A.除外してあとで付け加える

参考=>pandasのデータフレームの列を入れ替える

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で出す。


・指定期間は5年間
・1時間ごとの単語数をcountする
・1列で1時間分の「単語数、その時、ワード」の3行分のマトリックスを作成

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' AND20170610' # 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


AWSコマンド


Q14.s3にファイルのアップロード

# tar cf - ディレクトリ名 | gzip --best | aws s3 cp - s3://バケット/ファイル名

# ex
$ tar cf - model_tar | gzip —best | aws s3 cp - s3://sage/model.tar.gz