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