在我的数据框中,我有这些列。
日期时间-(5 分钟时间段 7:00、7:05、7:10 等......)高低
我想要做的是在“高”列中找到最大值,然后在继续它的“低”列中找到最小值。
采取这种差异,基本上是高低,并将其传递给一个新的专栏,上面说
“如果 'High'.max 在 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.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'])
但是我不知道如何在找到最大值并将该差异返回到最大时间发生的位置后找到最小值
要获得最大值之后的最小值,您可以过滤 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句