逆日歩速報のデータはpythonを使っています。
最速の逆日歩情報更新の時こそ、速度重視でおこなっていますが、その他のデータ更新は、速度より確実性を重視しています。
そんな、pythonコード、よく行っている作業をご紹介です。
pythonでpandasを扱ううえで便利なテクニック
panda歴は3年以上ですが、使えば使うほど、奥が深い!底がない!どっぷりpythonの沼にはまっています!
カラム名の一括変更
#カラム名を一括して変更する column_name = ['type','name','code','jp_code','Date'] df.set_axis(column_name, axis=1, inplace=True)#一括カラム名の変更
inplace=Trueを入れる事で、元データの変更が可能です。
1つの列の中にあるデータを基準にフィルタリングする
この技は結構使える!
df = df.loc[df['type'].isin(['A','J','K','B','M','C','F'])]
簡単に説明すると、typeという列の中に’A’や’J’や’K’や’B’や’M’や’C’や’F’などが、ある行だけを残すという事です。
証券情報で、’A’や’J’や’K’や’B’などがわかる方は、なかなかの業界通ですね。
isin()メソッドは、指定した値のいずれかに一致する行を抽出します。しかし、isin([‘A’])は’A’と完全に一致する値のみを抽出するので、注意です。
一部の文字でデータを残したい場合は、str.contains()メソッドを使うのが便利です。
import pandas as pd import re # サンプルのDataFrameを作成 data = {'Text': ['abc', 'defA', 'aaA', 'bbAaa']} df = pd.DataFrame(data) # 正規表現を使って'A'が含まれる行を抽出 df = df[df['Text'].str.contains('A', regex=True)] # 結果を表示 print(df)
このコードでは、str.contains()メソッドを使用して正規表現パターン’A’を含む行を抽出しています。regex=Trueを指定することで、正規表現を使用することができます。
上記のコードを実行すると、’A’が含まれる行が抽出されます。結果として、’aaA’と’bbAaa’の行が残ります。
もしデータに空白が含まれている場合、正規表現を使って空白を無視する方法を使用することができます。以下に例を示します。
import pandas as pd import re # サンプルのDataFrameを作成 data = {'Text': ['abc', 'defA', 'aaA', 'bbAaa', ' ', 'xyz']} df = pd.DataFrame(data) # 正規表現を使って'A'が含まれる行を抽出(空白を無視) df = df[df['Text'].str.contains('A', regex=True, na=False)] # 結果を表示 print(df)
このコードでは、str.contains()メソッドにregex=Trueを指定して正規表現を使用し、na=Falseを指定して空白を無視しています。
上記のコードを実行すると、’A’が含まれる行が抽出されます。結果として、’defA’、’aaA’、’bbAaa’の行が残ります。空白行はna=Falseによって無視されます。
正規表現パターンを調整することで、さまざまな条件に対応することができます。例えば、’A’を’A+’に変更すると、1つ以上の’A’が連続する場合も対象となります。必要に応じてパターンをカスタマイズしてください。
条件指定するが、高速処理も行いたい
例えば、1つ前の行との差分をおこなうdiff()関数ですが、通常利用では、全ての行が対象です。
でも、5回毎にや、特定の条件の場合などで、使いたい場合、通常はforループやイテレータにして、applyやinsertを使う事でしょう。
わかりやすくて良いのですが、1行ずつ処理するので、ちょっとスピード感は悪いです。
そんな場合、.locとの組み合わせが、便利です。
for c in colum_list: tmp_df.loc[tmp_df['rank'] != 7, c+'_new'] = tmp_df[c].diff(-1) tmp_df[c+'_new'] = tmp_df[c+'_new'].fillna(tmp_df[c])
上記コードは、diff(-1)を使って、次のデータとの差分計算をおこなっていますが、tmp_df[‘rank’] != 7を加える事によって、rankという列に7が入っていたら、計算しないでねとしています。
計算しない場合は、何も値がないので、nanが入ります。
次に計算しないのなら、元データを入れてと、次の行で指定しています。
これが早いんです。
for文にしているので、カラムを作った分だけ対応可能です。
応用で、次のようなコードも可能!
df.loc[((df['month'] < s) & (duble_check)), 'm'+i] = np.nan
大事なのは、条件を入れる時、きちんと()でくくる、そうすれば、大抵エラーはでません。
1つ注意するとすれば、型をきちんとそろえておくこと。
次のコードで確認可能なので、常に意識しておくことが大事です。
df.dtypes