我有一个类似于以下内容的数据框:
df = pd.DataFrame({'ticker':['A', 'A', 'A', 'A', 'A',
'B', 'B', 'B', 'B', 'B'],
'date':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00',
'2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'],
'datetime':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00',
'2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'],
'low':[10.00, 11.00, 12.00, 11.00, 11.50,
15.00, 14.00, 13.00, 12.00, 12.50],
'high':[10.25, 11.25, 12.25, 11.25, 11.75,
15.25, 14.25, 13.25, 12.25, 12.75],
'close':[10.20, 11.20, 12.20, 11.20, 11.70,
15.20, 14.20, 13.20, 12.20, 12.75]})
df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M')
df = df.set_index(['ticker', 'date'])
我试图弄清楚如何在给定的时间点在数据框中创建具有最低报价和最高报价的列。也就是说,在当天的第一时间到给定行的当前时间之间。
我尝试了各种不同的.groupby和.loc语句,但似乎找不到正确的语句。
任何帮助将不胜感激!
答案 0 :(得分:2)
您要与.min()
和.max()
结合使用.expanding()
,例如:
df.groupby('ticker')[['low', 'high', 'close']].expanding().min()
low high close
ticker ticker date
A A 2020-05-01 09:30:00 10.0 10.25 10.2
2020-05-01 09:31:00 10.0 10.25 10.2
2020-05-01 09:32:00 10.0 10.25 10.2
2020-05-01 09:33:00 10.0 10.25 10.2
2020-05-01 09:34:00 10.0 10.25 10.2
B B 2020-05-01 09:30:00 15.0 15.25 15.2
2020-05-01 09:31:00 14.0 14.25 14.2
2020-05-01 09:32:00 13.0 13.25 13.2
2020-05-01 09:33:00 12.0 12.25 12.2
2020-05-01 09:34:00 12.0 12.25 12.2
基本上像.rolling()
,但它的长度不断增加,而不是窗口的大小固定。
答案 1 :(得分:0)
我不确定您到底想要什么,但是我认为以下代码可以工作:
df[['date','low']].loc[df['ticker']=='A'].min()
输出:
date 2020-05-01 09:30:00
low 10
您无需将索引设置为ticker
和date