我有一个包含带有以下列的库存数据的DataFrame:
time ticker price
0 2020-04-02 09:30:35 EV 33.860
1 2020-04-02 09:00:00 AMG 60.430
2 2020-04-02 09:30:35 AMG 60.750
3 2020-04-02 09:00:00 BLK 455.350
4 2020-04-02 09:30:35 BLK 451.514
... ... ... ...
502596 2020-04-02 13:00:56 TLT 166.450
502597 2020-04-02 13:00:56 VXX 47.150
502598 2020-04-02 13:00:56 TSLA 529.800
502599 2020-04-02 13:00:56 BIDU 103.500
502600 2020-04-02 13:00:56 ON 12.700
[它的股票价格数据每20秒就有几百只股票。我已将时间栏设为日期时间格式。
从这里,我需要将数据分成5分钟的间隔,然后绘制数据,这是通过使用以下方法完成的:
out = df.groupby("ticker")\
.apply(lambda x: x.set_index("time")\
.resample("5T")\
.first()\
.reset_index())\
.reset_index(drop=True)
dffinal = out.dropna(axis=0)
def plot_tick(data, ticker):
ts = data[data["ticker"]==ticker].reset_index(drop=True)
ts.plot(x="time", y="price",title=ticker,figsize=(20,20),kind='line')
plot_tick(dffinal, "A")
图表很好,但是问题是我需要每只股票每5分钟间隔有高,低,开盘和收盘价。我需要它来制作烛台图,一旦我有高,低,打开和关闭列,就可以轻松地完成此操作。
开盘价和收盘价分别是5分钟周期开始和结束时的价格。高和低列分别是时间间隔内的最高价格和时间间隔内的最低价格。
所以我正在寻找这样的最终结果:
time ticker price open close high low
0 2020-04-02 09:00:00 A 72.6700
6 2020-04-02 09:30:00 A 72.1400
7 2020-04-02 09:35:00 A 72.5400
8 2020-04-02 09:40:00 A 72.4000
9 2020-04-02 09:45:00 A 72.3338
... ... ... ...
38895 2020-04-02 12:40:00 ZUMZ 17.6000
38896 2020-04-02 12:45:00 ZUMZ 17.6300
38897 2020-04-02 12:50:00 ZUMZ 17.6000
38898 2020-04-02 12:55:00 ZUMZ 17.7400
38899 2020-04-02 13:00:00 ZUMZ 17.560
显然,开,闭,高,低填充。
我理解这是一个复杂的问题,不确定是否正确地表达了这个意思,因此请在拒绝投票之前先评论一下我的误解,或者至少只是说这没有道理,我将对其进行修改。我是python的新手,所以请和我一起裸露。
谢谢您的时间。
IIUC,在groupby中,您可以通过行情自动收录器进行操作,也可以按时使用pd.Grouper,频率为5分钟。在agg方法中,可以使用pandas> 0.25 pd.NamedAgg,其中first表示打开,last表示关闭,max表示高,min表示低。
# dummy variables
np.random.seed(0)
df = pd.DataFrame({'time':pd.date_range('2020-04-01 9:30:00', freq='20s', periods=50).tolist()*2,
'ticker': ['ticker1']*50 + ['ticker2']*50,
'price':np.random.randint(30, 50, 100)})
# groupby and agg, then reset_index
df_f = df.groupby(['ticker', pd.Grouper(key='time', freq='5T')])\
.agg(open=pd.NamedAgg(column='price', aggfunc='first'),
close=pd.NamedAgg(column='price', aggfunc='last'),
high=pd.NamedAgg(column='price', aggfunc='max'),
low=pd.NamedAgg(column='price', aggfunc='min'))\
.reset_index()
print (df_f)
ticker time open close high low
0 ticker1 2020-04-01 09:30:00 42 37 49 30
1 ticker1 2020-04-01 09:35:00 44 33 49 30
2 ticker1 2020-04-01 09:40:00 47 32 49 30
3 ticker1 2020-04-01 09:45:00 30 36 36 30
4 ticker2 2020-04-01 09:30:00 38 48 48 31
5 ticker2 2020-04-01 09:35:00 30 44 45 30
6 ticker2 2020-04-01 09:40:00 45 34 48 30
7 ticker2 2020-04-01 09:45:00 32 40 46 32