Pandas / Numpy:根据二进制信号计算当前状态序列

时间:2014-10-08 13:58:53

标签: python numpy pandas time-series

我有两个二进制“信号”的时间序列,我们称之为“入口”和“停留”。

条目== 1表示将1添加到当前状态(最长时间)和保持== 0表示将当前状态设置为0。

entry:
0
1
1
0
1
0

stay:
1
1
1
1
0
1

我的代码现在计算组合的当前状态:

state:
0
1
2
2
0
1

目前我使用以下代码,不幸的是它(取决于最大时间)相当慢(状态/逗留/条目是熊猫时间序列):

state=copy.deepcopy(entry)
state[stay==0]=0
#first iteration
state[(entry.shift(1)==1) & (stay==1)]+=1
#2nd iteration to max time
for lag in range(2,max_time+1):
    state[(entry.shift(lag)==1) & (pd.rolling_mean(stay,lag)==1)]+=1

知道如何对此代码进行矢量化以获得更好的性能吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

现在终于找到了一个解决方案,使用了一些NumPy函数:

def calc_state_series(entry,stay, max_time=5):
    reduce=(copy.deepcopy(entry)*0).fillna(0) #just for initalization
    reduce[(entry.shift(max_time)==1) & (pd.rolling_mean(stay,max_time)==1)]-=1
    entry=(entry+stay.shift(1)).fillna(0) #reduce state after max_time
    x=entry.values
    x = np.concatenate(([0], x))
    y=stay.values
    y=np.concatenate(([0], y))
    nans = y==0
    x = np.array(x)
    x[nans] = 0
    reset_idx = np.zeros(len(x), dtype=int)
    reset_idx[nans] = np.arange(len(x))[nans]
    reset_idx = np.maximum.accumulate(reset_idx)
    cumsum = np.cumsum(x)
    cumsum = cumsum - cumsum[reset_idx]
    return pd.Series(cumsum[1:], index=entry.index)

我设法避免循环,这个解决方案(取决于max_time)对我来说快了100倍 - 但仍有可能进一步优化。