Python:よく使うコードまとめ

Posted on October 22nd, 2021Updated on November 16th, 2023
Python:よく使うコードまとめ

どんな記事

Pythonで今後も絶対使うだろうな、でも忘れちゃうだろうな、というコードの備忘録です。自分のためのまとめ。

記事の更新

2023年11月16日
新しいコードを追加しました。

Pandas

df.apply()の中で変数を使う

「1行前の値」を変数に格納しながら処理する等。rowは処理中の行、row.nameはその行のindex。

import pandas as pd

def b4_day_close( df ) :
  b4_date, b4_close, day_close = None, None, None
  def apply_logic( row ):
    nonlocal b4_date, b4_close, day_close
    today, hour = row.name, row.name.hour
    diff_seconds = ( today - b4_date ).seconds if b4_date else None
    if diff_seconds and diff_seconds > 60 and hour == 16 :
      day_close = b4_close
    b4_date, b4_close = today, row["c"]
    return day_close
  return apply_logic

df['b4_day_c'] = df.apply( b4_day_close( df ), axis=1 )

df.apply()で複数列を返す

ちょっとしたバックテストならループ処理を作成しなくても解決できる。

import pandas as pd

dt={ "x": [ 1100, 1200, 1300 ],
     "y": [ 2100, 2200, 2300 ], }
df = pd.DataFrame(dt)

def fnc( df ) :
    return df["x"]+1,df["x"]+2

df[["a","b"]] = df.apply( fnc( df ), axis=1, result_type='expand' )

複数の条件でデータを抽出

import pandas as pd
symbol = 7203
df.loc[ 
  ( df['銘柄コード'] == symbol ) & ( df['項目'] == '修正1株益 前年同期比' ), 
  [ '年月', '数値' ] 
].sort_values( [ '年月' ], ascending=[ True ] )
058b1b71dd11c9f0c4d9528d35abd53c

上記のテーブルから、以下のようなデータを抽出できる。

19a81bc7fb65ca42dc491f9bc22bea82

pandas datetimeのnativeをawareに変換

pandasの時系列データのタイムゾーンを処理(tz_convert, tz_localize) | note.nkmk.me

pandasにおいて時系列データのタイムゾーンを処理するにはtz_convert(), tz_localize()を使う。pandas.Series.tz_convert — pandas 1.0.3 documentation pandas.Series.tz_localize — pandas 1.0.3 documentation タイムゾーン情報が設定されている(awareな)データのタイムゾーンを別のタイムゾーンに変換(変更)する...

note.nkmk.me

pandasの時系列データのタイムゾーンを処理(tz_convert, tz_localize) | note.nkmk.me

2つのDFを結合する

横方向に結合

import pandas as pd

df_l = _get_df( "N225f", year )
df_r = _get_df( "Topixf", year )
df = df_l.join( df_r, lsuffix="_n", rsuffix="_t" )

上下に結合

df_append = pd.DataFrame( {
  'item1' : [ item1 ],
  'item2' : [ item2 ],
  'item3' : [ item3 ],
} )
df_target = pd.concat( [ df_target, df_append ], axis=0 ) 

pickleでのデータの保存

データの保存

df.to_pickle( BASE_DIR + file_name )

データの読み込み

df = pd.read_pickle( BASE_DIR + file_name )

df.plot()

日時のフォーマット

時系列データの可視化:datetime型のx軸操作 - Qiita

はじめにデータをより良く理解したい/伝えたいということで可視化を頑張ってたんですが、時系列のx軸の操作でハマりました。これまでもpandasやseabornを使ってましたが、matplotlibの…

qiita.com

時系列データの可視化:datetime型のx軸操作 - Qiita

pandas_datareader

yahoo financeのデータを取得

from pandas_datareader import data as pdr
pdr.get_data_yahoo("^GSPC","1980-1-1").dropna()

FREDのデータを取得

from pandas_datareader import data as pdr
pdr.get_data_fred( 'USSLIND', '1980-1-1' ).dropna()

pandas-ta

ta-libでnumpyのエラーが出るようになってしまった。代わりに、pandas_taを用いることにする。

!pip install pandas_ta
https://qiita.com/katafuchix/items/2c7a93579111c423b374

Numpy

複数のnp.arrayを組み合わせた条件に応じたnp.arrayを作成する

def calc_stg( s, m, l ) :
  return np.array( list( map(
    lambda s, m, l :
    1 if s > m and m > l else \
    2 if m > s and s > l else \
    3 if m > l and l > s else \
    4 if l > m and m > s else \
    5 if l > s and s > m else \
    6 if s > l and l > m else \
    np.nan, s, m, l ) ) )

def calc_stg_span( stg ) :
  result = []
  for i in range( len( stg ) ) :
    if i == 0 :
      result.append( np.nan )
    else :
      s   = stg[ i ]
      b4s = stg[ i - 1 ]
      result.append(
        0 if ( b4s != 1 and b4s != 2 ) and ( s == 1 or s == 2 ) else\
        0 if ( b4s != 4 and b4s != 5 ) and ( s == 4 or s == 5 ) else\
        0 if ( b4s == 1 or b4s == 2 ) and ( s != 1 and s != 2 ) else\
        0 if ( b4s == 4 or b4s == 5 ) and ( s != 4 and s != 5 ) else\
        result[ i - 1 ] + 1 if s == 1 or s == 2 or s == 4 or s == 5 else\
        result[ i - 1 ] - 1 )
  return np.array( result )

Datetime

日付と時刻の列からDatetimeを作成する

import pandas as pd
import datetime as dt

def _get_df( symbol, year ) :
  df = pd.read_excel( f'{BASEDIR}/{symbol}_{year}.xlsx',
                     names=("date","time","open","high","low","close","volume"),
                     sheet_name='1min' )
  df["time"] = df["time"].astype( str )
  df["Datetime"] = pd.to_datetime( df["date"].dt.strftime("%x ") + df["time"] )
  # Datetime:取引日(営業日) → カレンダーの調整
  df.loc[ df["time"]>="16:30:00", "Datetime" ] = df.loc[ df["time"]>="16:30:00", "Datetime" ] + dt.timedelta( days=-1 )
  df = df.set_index("Datetime")

Datetimeの加算・減算

import datetime as dt
sample_datetime + dt.timedelta( days=-1 )

Datetimeの差分を求める

import pandas as pd
diff_seconds = ( this_datetime - b4_datetime ).seconds

よく読み返すPython関連の記事

Python:EDINET企業データの自動取得・スクリーニングを5分ではじめる

EDINETという金融庁が運用している企業情報の開示システム(無料でつかえる企業データ)から、「PER、ROE、配当」などのデータを取得してスクリーニングをする方法。1.無料で取得できるデータ 2.Google Colab をつかえば5分で導入・実行できる 3.全上場銘柄のデータを取得する

programming/google-colab-edinet-screening

Python:EDINET企業データの自動取得・スクリーニングを5分ではじめる

Python:投資の「期待値」と 単利・複利の「損益分岐点」を算出、グラフ化

この記事では、以下の手順とコードを紹介しています。 1.投資の「期待値」の算出 2.投資の「単利・複利の『損益分岐点』」の算出 3.算出結果をもとにグラフを描画

programming/google-colab-calculate-trading-edge

Python:投資の「期待値」と 単利・複利の「損益分岐点」を算出、グラフ化

Python:TA-Libでテクニカル分析、Plotlyでローソク足の描画

Python でテクニカル分析ができるライブラリ「TA-Lib」を、Google Colab で使用する方法の備忘録。pandas_datareader で価格データを取得、TA-Lib でテクニカル分析をして、Plotly でローソク足のチャートを出力する手順。

programming/google-colab-install-ta-lib

Python:TA-Libでテクニカル分析、Plotlyでローソク足の描画

Python:「破産の確率」の計算とグラフ化(コピペするだけ!)

Google Colab および Python で「『破産の確率』を算出する方法」「破産確率表の作成」「破産確率表のグラフ化」「破産の確率の計算式とコードの解説」などを備忘録としてメモ。コードを公開しているので、Google Colab にコピペして実行すれば1分で計算することができます。

programming/google-colab-calc-ruin-probability

Python:「破産の確率」の計算とグラフ化(コピペするだけ!)

Python:Plotlyでアニメーショングラフを作成する

この記事では、以下の手順とコードをご紹介しています。 1.3DのSurfaceグラフのアニメーション 2.Contour(等高線)グラフのアニメーション

programming/google-colab-plotly-animation-graph-surface-contour

Python:Plotlyでアニメーショングラフを作成する

開発を承っています

  • Pineスクリプト(インジケーターやストラテジー)
  • Google Apps Script
  • Python
  • MQL4

などの開発を承っています。とくに投資関連が得意です。過去の事例は「実績ページ(不定期更新)」でご確認ください。ご相談は「お問い合わせ」からお願いします。

同じタグの記事
yuya takahashi

タカハシ / 11年目の兼業投資家

投資やプログラミング、動画コンテンツの撮影・制作・編集などが得意。更新のお知らせは、LINE、メールで行っています。

このブログと筆者についてご質問はこちら

  • 記事をシェア
© Investment Tech Hack 2023.