Python 从使用条件定义的可变行范围中获取本地最大/最小值?

Python 从使用条件定义的可变行范围中获取本地最大/最小值?,python,pandas,time-series,max,local,Python,Pandas,Time Series,Max,Local,我有以下问题。我正在研究熊猫的一个时间序列,它有一个带有直方图的列,其中的值有时是正的,有时是负的。我需要为数据帧的一个新列填充每个不断变化的时间或范围窗口的本地最大/最小值,因为它是从正变为负的那一刻到最后一次从负变为正的那一刻的行号之间的差值,反之亦然。我还需要使用pandas或numpy方法来提高效率 我一直在尝试用df.loc填充上一次的行位置,使辅助列从正变为负,反之亦然,如下所示: df.loc[(df.Histogram.shift(1) > 0) & (df.His

我有以下问题。我正在研究熊猫的一个时间序列,它有一个带有直方图的列,其中的值有时是正的,有时是负的。我需要为数据帧的一个新列填充每个不断变化的时间或范围窗口的本地最大/最小值,因为它是从正变为负的那一刻到最后一次从负变为正的那一刻的行号之间的差值,反之亦然。我还需要使用pandas或numpy方法来提高效率

我一直在尝试用df.loc填充上一次的行位置,使辅助列从正变为负,反之亦然,如下所示:

df.loc[(df.Histogram.shift(1) > 0) & (df.Histogram < 0), 'LOC'] = df.index.get_loc(df.Histogram)
df.LOC.fillna(method='ffill')

有解决办法吗?提前感谢。

这里有一种简便的方法,可以将直方图数据分成正负值组。每次
grp
列递增时,直方图列都会更改符号,并且具有相同
grp
值的所有行都属于两个符号更改之间的相同间隔

df['grp']=(df.Histogram>0).astype(int).diff().abs().cumsum().fillna(0)
测向头(10)
日期直方图
0   01/02/2021        0.2  0.0
1   02/02/2021        0.3  0.0
2   03/02/2021        0.7  0.0
3   04/02/2021        0.2  0.0
4   05/02/2021       -0.2  1.0
5   06/02/2021       -0.5  1.0
6   07/02/2021       -0.1  1.0
7   08/02/2021        0.4  2.0
8   09/02/2021        0.3  2.0
9   10/02/2021       -0.2  3.0
(df.Histogram>0)
的选择是任意的,并将零计为负值。直方图序列
0.2,0,0.4,0.3
将产生组
[0,1,2,2]
,序列
-0.2,0,-0.4,-0.3
将产生单个组。你必须确定这是否适合你的问题

.fillna(0)
用于填充
.diff()
返回的第一行将出现的
NaN
。请注意,选择零替换值是合理的:如果符号从第一行更改为第二行,
grp
将在第2行中为1,正确地将第1行放入其自己的组中。如果符号没有变化,
grp
第2行将为0,并将其与第1行正确分组

现在,您可以使用
groupby
计算每个组的最小/最大值,如下所示

minmax=df.groupby('grp',as_index=False)['Histogram'].agg(
{'hist_min':min'hist_max':max})
df=df.merge(minmax,on='grp')
测向头(10)
日期直方图grp历史最小历史最大值
0  01/02/2021        0.2  0.0       0.2       0.7
1  02/02/2021        0.3  0.0       0.2       0.7
2  03/02/2021        0.7  0.0       0.2       0.7
3  04/02/2021        0.2  0.0       0.2       0.7
4  05/02/2021       -0.2  1.0      -0.5      -0.1
5  06/02/2021       -0.5  1.0      -0.5      -0.1
6  07/02/2021       -0.1  1.0      -0.5      -0.1
7  08/02/2021        0.4  2.0       0.3       0.4
8  09/02/2021        0.3  2.0       0.3       0.4
9  10/02/2021       -0.2  3.0      -0.2      -0.2
最后,可以使用布尔索引组合所需的值

df['minmax']=df.hist\u min
df.loc[df.Histogram>0,'minmax']=df.hist_max[df.Histogram>0]
测向头(10)
日期直方图grp历史最小历史最大最小
0  01/02/2021        0.2  0.0       0.2       0.7     0.7
1  02/02/2021        0.3  0.0       0.2       0.7     0.7
2  03/02/2021        0.7  0.0       0.2       0.7     0.7
3  04/02/2021        0.2  0.0       0.2       0.7     0.7
4  05/02/2021       -0.2  1.0      -0.5      -0.1    -0.5
5  06/02/2021       -0.5  1.0      -0.5      -0.1    -0.5
6  07/02/2021       -0.1  1.0      -0.5      -0.1    -0.5
7  08/02/2021        0.4  2.0       0.3       0.4     0.4
8  09/02/2021        0.3  2.0       0.3       0.4     0.4
9  10/02/2021       -0.2  3.0      -0.2      -0.2    -0.2
整个过程尽可能的矢量化,所以性能应该是不错的

Date             Histogram     Max/Min Value
01/02/2021         0.2            0.7
02/02/2021         0.3            0.7
03/02/2021         0.7            0.7
04/02/2021         0.2            0.7
05/02/2021        -0.2           -0.5
06/02/2021        -0.5           -0.5
07/02/2021        -0.1           -0.5
08/02/2021         0.4            0.4
09/02/2021         0.3            0.4
10/02/2021        -0.2           -0.2 
11/02/2021         0.2            0.7 
12/02/2021         0.7            0.7
13/02/2021         0.2            0.7
14/02/2021         0.3            0.7
15/02/2021         0.6            0.7
16/02/2021         0.2            0.7
17/02/2021        -0.2           -0.5
18/02/2021        -0.5           -0.5
19/02/2021        -0.1           -0.5
20/02/2021         0.4            0.4
21/02/2021         0.3            0.4
22/02/2021        -0.2           -0.3
23/02/2021        -0.1           -0.3 
24/02/2021        -0.3           -0.3
25/02/2021        -0.1           -0.3 
16/02/2021         0.2            0.3
27/02/2021         0.1            0.3    
28/02/2021         0.3            0.3