プロクラシスト

今日の寄り道 明日の近道

pythonでのデータ分析時、死ぬほど調べるTipsをまとめておく。


スポンサーリンク

f:id:imslotter:20190117213706p:plain

こんにちは、ほけきよです。

pythonでデータを取り扱っているとき「あれ、これどうやるんだっけ??」 ってなること、ありませんか?僕は10分に1回程度なります。

いや、覚えろと自分でも思うんですが、覚えられないんですよね。100回くらい同じコマンドを調べてたりする。 物覚えが良くないので、ココを見れば絶対大丈夫なようにしておこうと思い、まとめてみました。

jupyterで最初に開くときに読み込むモジュールたち

どうせ色々やっておくと、これらは必要になってくるので、もうはじめにコピペしておけばいい。

%matplotlib inline
import json
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy 
import datetime

datetime

日付⇔文字列の変換

これ、100回くらい調べている。

  • string ⇨ datetime フォーマットに気をつける。
from datetime import datetime as dt
tstr1 = '2019-01-01 00:00:00'
tdatetime = dt.strptime(tstr, '%Y-%m-%d %H:%M:%S')
tstr2 = '2019/01/01 00:00:00'
tdatetime = dt.strptime(tstr, '%Y/%m/%d %H:%M:%S')
  • datetime ⇨ string
from datetime import datetime as dt
tdatetime = dt.now()
tstr1 = tdatetime.strftime('%Y-%m-%d') # 2018-1-18
tstr2 = tdatetime.strftime('%Y/%m/%d %H:%M:%S') # 2018/1/18 12:34:56

datetimeの足し算引き算

now = datetime.now()
tomorrow = now + datetime.timedelta(days = 1) #今より1日後
nextweek = now + datetime.timedelta(weeks = 1) #今より一週間後

引数はseconds, minutes, days, weeks

json

dict型⇔json

import json
orig_data = {"a":1,"b":2,"c":3}
json_data = json.dumps(orig_data) # dict -> json
dict_data = json.loads(json_data) # json -> dict

jsonファイルの入出力

# ファイルを開く
with open('input.json') as f:
    json_data = json.load(f)
# ファイルを保存(辞書形式のデータ)
with open('output.json', 'w') as f:
    json.dump(dict_data, f, indent=4)

datetimeをjsonにする時、エラーが出る

どうやるんだっけ

import datetime
import json
time_data = {"now":datetime.datetime.now()}
json_data = json.dumps(time_data) # dict -> json

TypeError: Object of type 'datetime' is not JSON serializable

解決策 : default引数に下記関数を与え、対応していない方に対するフォーマットを指定。

from datetime import datetime 
import json
time_data = {"now":datetime.now()}
def support_datetime_default(o):
    if isinstance(o, datetime):
        return o.isoformat()
    raise TypeError(repr(o) + " is not JSON serializable")
    
json_data = json.dumps(time_data, default=support_datetime_default) 
print(json_data)

{"now": "2019-01-17T21:09:03.966641"}

pandas

~以外を表すやつ

df[df.a > 0]  # aというカラムが0より大きいものを抽出
df[~df.a > 0] # aというカラムが0より大きいもの"以外"を抽出

andとor

pythonの文法と違うので、注意。&, |を使うのと、カッコでくくっておくことが大事

df[(df.a>0) & (df.b>0)] # and
df[(df.a>0) | (df.b>0)] # or

inf弾く

df.replace([np.inf, -np.inf], np.nan)

リストをdfにサクッと変換

列の名前は必須

import pandas as pd
import numpy as np
A_23 = np.linspace(0,5,6).reshape(2,3) #2行3列
"""
array([[0., 1., 2.],
       [3., 4., 5.]])
"""
df_ = pd.DataFrame(A_23,columns=["a","b","c"]) #列をcolumnに合わす.index=は任意
"""
  a   b   c
0 0.0 1.0 2.0
1 3.0 4.0 5.0
"""

datetimeとして読み込み

  • フォーマットはきちんと合わせておく
df.date=pd.to_datetime(df.date,format="%Y/%m/%d %H:%M:%S")

読み込み時にcodecのエラーが出る

import codec が必要になることに注意

with codecs.open("file.csv", "r", "Shift-JIS", "ignore") as file:
    df = pd.read_table(file, delimiter=",")

DataFrameのfor文

色々あるけど、一番使うのはiterrowな気がする。各rowの0番目はindex, 1番目にはまとめてデータテーブルが入っている

A_23 = np.linspace(0,5,6).reshape(2,3) #2行3列
df_ = pd.DataFrame(A_23,columns=["a","b","c"]) #列をcolumnに合わす.index=は任意
"""
  a   b   c
0 0.0 1.0 2.0
1 3.0 4.0 5.0
"""
for row in df_.iterrows():
    print(row[0],row[1]["a"]) #取り出し方の癖に注意
"""
0 0.0
1 3.0
"""

numpy

linspaceとarangeの違い

  • linspace : 範囲の指定を重視
  • arange : 幅の指定を重視

numpyでサクっと配列確保

np.zeros(N) #N次元のゼロ配列
np.zeros((N,M)) #(N, M)のゼロ配列

nanの判定

np.isnan(A)

最大値と、その引数

A = np.array([1,2,10,4,5])
print(A.max(),A.argmax())
"""
10 2
"""

ゼロ除算の回避

a = [1, 0, 2]
b = [0, 0, 4]
c = np.divide(a, b, out=np.zeros_like(a), where=b!=0) # 

条件を満たすものだけ抽出

b = a[np.where(a>3)]
  • コンボ : nanを除外した要素だけ抽出することもできる
A[np.where(~np.isnan(A))]

matplotlib

種々の調整

www.procrasist.com

まとめ

まだある気がするのですが、とりあえず本当にいつも調べる者たちだけでもということでまとめておきました。随時メモ代わりに更新すると思います。

是非ご参考に!ではではっ

PROCRASIST