路径依赖切片

可能有必要以下一个元素或下一行依赖于先前选择的元素或行的方式遍历一系列元素或数据帧的行。这称为路径依赖。

考虑以下时间序列 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 文档