路徑依賴切片
可能有必要以下一個元素或下一行依賴於先前選擇的元素或行的方式遍歷一系列元素或資料幀的行。這稱為路徑依賴。
考慮以下時間序列 s
,頻率不規則。
#starting python community conventions
import numpy as np
import pandas as pd
# n is number of observations
n = 5000
day = pd.to_datetime(['2013-02-06'])
# irregular seconds spanning 28800 seconds (8 hours)
seconds = np.random.rand(n) * 28800 * pd.Timedelta(1, 's')
# start at 8 am
start = pd.offsets.Hour(8)
# irregular timeseries
tidx = day + start + seconds
tidx = tidx.sort_values()
s = pd.Series(np.random.randn(n), tidx, name='A').cumsum()
s.plot();
讓我們假設一個路徑依賴條件。從系列的第一個成員開始,我想抓住每個後續元素,使得該元素與當前元素之間的絕對差值大於或等於 x
。
我們將使用 python 生成器解決這個問題。
發電機功能
def mover(s, move_size=10):
"""Given a reference, find next value with
an absolute difference >= move_size"""
ref = None
for i, v in s.iteritems():
if ref is None or (abs(ref - v) >= move_size):
yield i, v
ref = v
然後我們可以像這樣定義一個新系列 moves
moves = pd.Series({i:v for i, v in mover(s, move_size=10)},
name='_{}_'.format(s.name))
繪製它們兩者
moves.plot(legend=True)
s.plot(legend=True)
資料幀的模擬將是:
def mover_df(df, col, move_size=2):
ref = None
for i, row in df.iterrows():
if ref is None or (abs(ref - row.loc[col]) >= move_size):
yield row
ref = row.loc[col]
df = s.to_frame()
moves_df = pd.concat(mover_df(df, 'A', 10), axis=1).T
moves_df.A.plot(label='_A_', legend=True)
df.A.plot(legend=True)