路徑依賴切片

可能有必要以下一個元素或下一行依賴於先前選擇的元素或行的方式遍歷一系列元素或資料幀的行。這稱為路徑依賴。

考慮以下時間序列 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();

StackOverflow 文件

讓我們假設一個路徑依賴條件。從系列的第一個成員開始,我想抓住每個後續元素,使得該元素與當前元素之間的絕對差值大於或等於 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)

StackOverflow 文件

資料幀的模擬將是:

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)

StackOverflow 文件