Python 获取数据帧,其中数值不大于/小于前一个值的5%

Python 获取数据帧,其中数值不大于/小于前一个值的5%,python,pandas,dataframe,slice,Python,Pandas,Dataframe,Slice,我目前的解决方案如下: slices = [] for idx in range(0, dataset.size): slice = dataset[idx:idx+4] if len(slice) < 4: break; # ---> check = [] for val in slice[column].values: delta_pos

我目前的解决方案如下:

    slices = []
    
    for idx in range(0, dataset.size):
        slice = dataset[idx:idx+4]

        if len(slice) < 4:
            break;

        # ---> check = []
        for val in slice[column].values: 
            delta_pos = round(slice[column].iloc[0] * 0.0005, 2)
            delta_neg = round(slice[column].iloc[0] * 0.0005, 2)
            check.append(delta_neg <= round(val, 2) - round(slice[column].iloc[0], 2) <= delta_pos)

        if(all(v == True for v in check)):
            slices.append(slice) # <----
                
    return slices

您可以使用
rolling
创建包含4个连续值的所有组。要应用逻辑,需要将其重写为一个函数,该函数接受一系列(4个值中的一个)


使用
shift
和一些索引,您可以在两行代码中优雅地实现这一点。假设我们有一个数据帧
df
定义为:

df=pd.DataFrame({'VALUE':{0:194.72,1:194.76,2:195.05,3:194.95,4:195.08,5:195.17,
6:195.07, 7:195.22, 8:195.2, 9:195.21, 10:195.25,11:195.16,
12:194.62,13:194.64,14:194.9,15:194.82,16:194.8,17:194.64,
18:194.78,19:194.66,20:194.7,21:194.63}})
我们可以将所有值的位置移动一,以获得“先前”值:

df\u shift=df.shift(1,fill\u value=df.value[0])
现在,我们可以在原始数据框中选择公差为5%的值:

df_in_5percent=df[abs(df.VALUE-df_.VALUE)<0.05]

就这样
df_in_5percent
包含前一个值在5%公差范围内的值。

是的,我只是想把我想简化的代码片段变成粗体,好吗。粗体代码在代码环境中不起作用,我通常会添加一个
#您能否共享
数据集的一个小示例
,以便我们自己运行代码?您希望我如何共享一个示例?dropmefiles是否为您提供服务?只需打印并共享
dataset.iloc[:10,:]
即可获得前10行和所有列。我谦虚地认为,它没有比这更优雅的了
VALUE
194.7200000
194.7600000
195.0500000
194.9500000
195.0800000
195.1700000
195.0700000
195.2200000
195.2000000
195.2100000
195.2500000
195.1600000
194.6200000
194.6400000
194.9000000
194.8200000
194.8000000
194.6400000
194.7800000
194.6600000
194.7000000
194.6300000
...

In [17]: def select_slices(s): 
    ...:     for val in s.values: 
    ...:         delta =  round(s.iloc[0] * 0.0005, 2) 
    ...:         if not (-delta <= round(val, 2) - round(s.iloc[0], 2) <= delta): 
    ...:             return 1 
    ...:     slices.append(s) 
    ...:     return 0 
    ...:                                                                                                                                                                                                           
In [18]: s.rolling(4).apply(select_slices)  
In [19]: slices                                                                                                                                                                                                    
Out[19]: 
[5    195.17
 6    195.07
 7    195.22
 8    195.20
 dtype: float64,
 7     195.22
 8     195.20
 9     195.21
 10    195.25
 dtype: float64,
 8     195.20
 9     195.21
 10    195.25
 11    195.16
 dtype: float64]