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

时间:2019-07-12 13:33:04

标签: python pandas dataframe lambda

在我的数据框中,我有这些列。

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

我想做的是在“高”列中找到最大值,然后在继续的“低”列中找到最小值。

采用这种差异,从本质上讲是“高-低”,然后将其传递给新的列

“如果'High'.max在7:20行中,而low在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.max之后才找到Low.min?

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

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

我可以找到范围,但是需要在找到High.max之后再为每个日期找到Low.min,然后按时间找到范围。

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

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

2 个答案:

答案 0 :(得分:0)

就像我已经评论的那样,第一个最大值出现在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

答案 1 :(得分:0)

要获得之后的最低,您可以过滤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