Pandasで漸化式
PythonのPandasで漸化式の計算をしようとしたら,いろいろはまって勉強になったので,メモ。
変数が定義されているか否かの確認
locals()
: ローカルスコープで宣言されているシンボル一覧(変数等)を辞書化して返すglobals()
: グローバルスコープで宣言されているシンボル一覧(変数等)を辞書化して返す
'hoge' in locals() # 変数`hoge`がローカルスコープにあればTrue
'hoge' in globals() # 変数`hoge`がグローバルスコープにあればTrue
参考URL: Python Tips:変数が定義されたかどうかを調べたい
Pandasで前列の情報を参照してデータ更新
新規列のデータを,事前に計算済みのデータに基づいて計算する場合
shift()
を使うと簡単
新規列のデータを前列のデータから逐次的に計算する場合
Pandasで漸化式[x_{n+1}=x_n]のように,ある列のデータに基づいて次の列のデータを作るのは少し面倒。
C言語のように,DataFrame.iatで位置指定してfor
文で要素を書き換えていくのが嫌で,良い方法がないか調べたらdecoratorを使う方法が
Stackoverflowに紹介されていた。
import pandas as pd
df = pd.DataFrame({'a':[0,1,2], 'b':[0,10,20]})
new_col = 'c'
def apply_func_decorator(func):
prev_row = {}
def wrapper(curr_row, **kwargs):
val = func(curr_row, prev_row)
prev_row.update(curr_row)
prev_row[new_col] = val
return val
return wrapper
@apply_func_decorator
def running_total(curr_row, prev_row):
return curr_row['a'] + curr_row['b'] + prev_row.get('c', 0)
df[new_col] = df.apply(running_total, axis=1)
print(df)
# Output will be:
# a b c
# 0 0 0 0
# 1 1 10 11
# 2 2 20 33
1行前の値を参照したいだけなのに,使い慣れないデコレータの勉強からすることになってしまった。。。
参考URL