あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

PandasでWindow関数(行移動:lagなどを再現したい(shift()を使う)

Pandasでlag,lead,first_value,last_valueなどを再現します。

lag(col,1) over(order by sort_col)
,first_value(col) over(order by sort_col)

lag,lead系

shiftを使います。
shiftはwindow関数のorder by句のような変数はないため、先にソートして使う必要があります。

import pandas as pd
import numpy as np

# 適当なデータをつくる
d = {
    'random_values':np.random.rand(7),
    'id':np.arange(1,8)
}
idx = pd.date_range(start='2020-01-01',periods=7)
df = pd.DataFrame(d,index=idx)

#一つ下にずらす
df.shift(1)
#一つ上にずらす
df.shift(-1)

#indexを一つ下にずらす
df.tshift(1)


#もしランダムで並べてひとつずらしたいなら
df.sort_values('random_values').shift(1)

first_value,last_value

pandasにもfirst,lastはありますが、これもindexがあり、さらにそのindexがソートされている場合に使います。
単に最初の値をとりたいなら、スライスを使います。

#first_value
df.id[0]

#last_value
#スライスのリバースソートを使う
df.id[0::-1]

#ソートが必要なら
df.sort_values('random_values').id[0]

first,lastはperiodsを渡す必要があります。

#最初から1日をとる
df.first('1D)

#最初から三日分をとる
#このとき、indexの日付に存在しない日がある場合はそれを加味して、最初から3日をとる
df.first('3D')

#これはうまく動かない
df.sort_values(`random_values).first('1D')