路径依赖切片
可能有必要以下一个元素或下一行依赖于先前选择的元素或行的方式遍历一系列元素或数据帧的行。这称为路径依赖。
考虑以下时间序列 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)