こんにちは、ほけきよです。
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
種々の調整
まとめ
まだある気がするのですが、とりあえず本当にいつも調べる者たちだけでもということでまとめておきました。随時メモ代わりに更新すると思います。
是非ご参考に!ではではっ