在我的数据框中,我有这些列。
日期 时间-(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'])
但是我不知道在找到最大值并将该差值返回到最大时间发生的地方之后如何找到最小值
答案 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