逆日歩速報の裏側技術③

スポンサーリンク

逆日歩速報のデータは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

 

タイトルとURLをコピーしました