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]