找到最大值后,在单独的列中找到后续的最小值

2024-04-26 07:38:22 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的数据框中,我有这些列。你知道吗

日期 时间-(5分钟7:00、7:05、7:10等…) 高 低

我想做的是在“高”列中找到最大值,然后在“低”列中找到最小值。你知道吗

把这个差异,从本质上说是高到低,传递给一个新的专栏,就是

“如果‘高’。最大值在7:20行,低值在7:50行,有什么区别,把这个区别放在7:20旁边的行上”

最后,我想用“时间”来计算所有“高”-“低”差异的平均值或中位数

例如(从大数据帧)

           Date   Time   Ticker     High      Low    Range
0      01/02/18   7:05  USD/JPY  112.170  112.150
1      01/02/18   7:10  USD/JPY  112.175  112.140
2      01/02/18   7:15  USD/JPY  112.185  112.170
3      01/02/18   7:20  USD/JPY  112.180  112.155   112.180-112.080 = .10
4      01/02/18   7:25  USD/JPY  112.160  112.145
5      01/02/18   7:30  USD/JPY  112.160  112.155
6      01/02/18   7:35  USD/JPY  112.160  112.120
7      01/02/18   7:40  USD/JPY  112.145  112.100
8      01/02/18   7:45  USD/JPY  112.120  112.085
9      01/02/18   7:50  USD/JPY  112.155  112.080
10     01/02/18   7:55  USD/JPY  112.150  112.130
32898  07/05/19  11:35  USD/JPY  108.545  108.525
32899  07/05/19  11:40  USD/JPY  108.550  108.535
32900  07/05/19  11:45  USD/JPY  108.560  108.530   108.560-108.525 = .035
32901  07/05/19  11:50  USD/JPY  108.550  108.540
32902  07/05/19  11:55  USD/JPY  108.535  108.525
32903  07/05/19  12:00  USD/JPY  108.550  108.530
32904  07/05/19  12:05  USD/JPY  108.555  108.530
32905  07/05/19  12:10  USD/JPY  108.560  108.540
32906  07/05/19  12:15  USD/JPY  108.560  108.540

期望输出

Time    Range (median or avg for all of the instances where the Max High was 7:20 ect)
7:20    .10
11:45   .035

我用Lamdba来确定我只找到了最低在找到最大值高每一天?你知道吗

我知道我可以按“日期”分组,找到每个日期的最大值。你知道吗

#High grouped by Date
df2 = df.loc[df.groupby('Date')['High'].idxmax()]

我能找到射程,但找到目标后需要射程最大值高然后找到最低每个日期,然后按时间。你知道吗

#Difference between High and Low
range = (df['High']-df['Low'])

但是我不知道如何在找到最大值并将差值返回到最大时间发生的地方之后找到最小值


Tags: the数据dfdatetime时间range差异
2条回答

要在最大值之后获得最小值,可以过滤groupby组中的行:

df.groupby('Date').apply(lambda x: x.High.max() - x[x.index > x.High.idxmax()].Low.min())

结果:

Date
01/02/18    0.105
07/05/19    0.035

为了验证这是否正确,您必须将第一行的下限设置为112.000,即使一天的绝对最小值出现在最大值之前。


如果您也需要时间信息,请将其转换为数据帧并插入时间列:

res = df.groupby('Date').apply(lambda x: x.High.max() - x[x.index > x.High.idxmax()].Low.min()).to_frame('Range')
res.insert(0,'Time',df.loc[df.groupby('Date')['High'].idxmax(),'Time'].values)

最终结果:

           Time  Range
Date                  
01/02/18   7:15  0.105
07/05/19  11:45  0.035


更新
如果您希望将范围作为新列插入原始数据帧中:

df.loc[df.groupby('Date')['High'].idxmax().values,'Range']=df.groupby('Date').apply(lambda x: x.High.max() - x[x.index > x.High.idxmax()].Low.min()).values

输出:

           Date   Time   Ticker     High      Low  Range
0      01/02/18   7:05  USD/JPY  112.170  112.000    NaN
1      01/02/18   7:10  USD/JPY  112.175  112.140    NaN
2      01/02/18   7:15  USD/JPY  112.185  112.170  0.105
3      01/02/18   7:20  USD/JPY  112.180  112.155    NaN
4      01/02/18   7:25  USD/JPY  112.160  112.145    NaN
5      01/02/18   7:30  USD/JPY  112.160  112.155    NaN
6      01/02/18   7:35  USD/JPY  112.160  112.120    NaN
7      01/02/18   7:40  USD/JPY  112.145  112.100    NaN
8      01/02/18   7:45  USD/JPY  112.120  112.085    NaN
9      01/02/18   7:50  USD/JPY  112.155  112.080    NaN
10     01/02/18   7:55  USD/JPY  112.150  112.130    NaN
32898  07/05/19  11:35  USD/JPY  108.545  108.525    NaN
32899  07/05/19  11:40  USD/JPY  108.550  108.535    NaN
32900  07/05/19  11:45  USD/JPY  108.560  108.530  0.035
32901  07/05/19  11:50  USD/JPY  108.550  108.540    NaN
32902  07/05/19  11:55  USD/JPY  108.535  108.525    NaN
32903  07/05/19  12:00  USD/JPY  108.550  108.530    NaN
32904  07/05/19  12:05  USD/JPY  108.555  108.530    NaN
32905  07/05/19  12:10  USD/JPY  108.560  108.540    NaN
32906  07/05/19  12:15  USD/JPY  108.560  108.540    NaN

就像我已经说过的,第一个max出现在7:15,而不是7:20。总之,我的方法是:

new_df = df.groupby('Date').agg({'High': 'idxmax', 'Low':'min'})

# copy the time
new_df['Time'] = df.loc[new_df.High, 'Time'].values

# compute the range
new_df['Range'] = df.loc[new_df.High, 'High'].values - new_df.Low

new_df.drop(['High','Low'], axis=1)

提供:

           Time  Range
Date                  
01/02/18   7:15  0.105
07/05/19  11:45  0.035

相关问题 更多 >