Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas/Numpy:基于二进制信号计算当前状态序列_Python_Numpy_Pandas_Time Series - Fatal编程技术网

Python Pandas/Numpy:基于二进制信号计算当前状态序列

Python Pandas/Numpy:基于二进制信号计算当前状态序列,python,numpy,pandas,time-series,Python,Numpy,Pandas,Time Series,我有两个二进制“信号”的时间序列,让我们称它们为“进入”和“停留” Entry==1表示将1添加到当前状态(最长时间),stay==0表示将当前状态设置为0 entry: 0 1 1 0 1 0 stay: 1 1 1 1 0 1 我的代码现在计算组合的当前状态: state: 0 1 2 2 0 1 目前我使用以下代码,不幸的是(取决于最长时间)非常慢(状态/停留/进入是时间序列): 你知道如何将代码矢量化以获得更好的性能吗?非常感谢 现在终于找到了解决方案,使用了一些NumPy函数:

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

Entry==1表示将1添加到当前状态(最长时间),stay==0表示将当前状态设置为0

entry:
0
1
1
0
1
0

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

state:
0
1
2
2
0
1
目前我使用以下代码,不幸的是(取决于最长时间)非常慢(状态/停留/进入是时间序列):


你知道如何将代码矢量化以获得更好的性能吗?非常感谢

现在终于找到了解决方案,使用了一些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)

我设法避免了循环,这个解决方案(取决于最长时间)比我快了100倍——但可能还有进一步优化的潜力。

什么是
max\u time
?此外,where does does
copy.deepcopy
come from.max_time是条目==1之后的时段数,对于该时段,状态应增加1(但同时存在停留==0的情况除外)。copy是python stdlib模块,deepcopy是复制对象的函数。
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)