如何在单DataFrame中为各股票计算前收盘价(Prior Close)
我在sqlite3数据库中存储了多只股票数据,通过以下代码读取为Pandas DataFrame:
import pandas as pd import sqlite3, config connection = sqlite3.connect(config.db_file) connection.row_factory = sqlite3.Row df = pd.read_sql('SELECT * FROM stock_price', connection) # sort the dataframe df.sort_values(by='stock_id', inplace=True) # set the index to be this and don't drop df.set_index(keys=['stock_id'], drop=False,inplace=True)
打印后DataFrame包含不同stock_id的股票行情数据(每个stock_id对应一只股票):
id stock_id date open high low close volume stock_id 1 1 1 2022-08-02 9.83 9.845 9.83 9.830 584772 1 2 1 2022-08-03 9.84 9.860 9.84 9.820 7711 4 3 4 2022-08-03 10.38 10.380 10.38 10.380 199 5 46 5 2022-08-03 34.75 35.200 34.75 35.200 1007 5 45 5 2022-08-02 34.32 34.550 34.32 34.442 1252 ... ... ... ... ... ... ... ... ... 98 8 98 2022-08-02 28.00 28.095 27.90 28.000 2417 99 71 99 2022-08-02 88.19 88.940 87.15 88.370 1045596 99 72 99 2022-08-03 88.34 88.550 87.65 88.410 982710 100 171 100 2022-08-02 117.58 120.010 117.08 119.270 67795 100 172 100 2022-08-03 119.80 121.940 120.60 121.440 4237 [178 rows x 8 columns]
我需要针对每个独立的stock_id单独获取其前收盘价。若每只股票单独存于DataFrame,可使用final_df['previous close'] = final_df['close'].shift()实现,但在单DataFrame中直接使用该方法会导致某股票取到其他股票的前收盘价,不符合需求。请问如何在单DataFrame中实现针对各股票单独计算前收盘价?
要实现按每个stock_id分组计算前收盘价,可通过以下两步完成:
先按股票+日期排序
确保每个股票的行情数据按日期升序排列,避免shift()取到错误的历史数据:df.sort_values(by=['stock_id', 'date'], inplace=True)分组计算前收盘价
使用groupby('stock_id')对数据按股票分组,再对每组的close列执行shift(1)操作,即可得到同一只股票的上一个交易日收盘价:df['previous_close'] = df.groupby('stock_id')['close'].shift(1)处理后,每个
stock_id的第一条数据(最早日期)的previous_close会显示为NaN(无更早收盘价),后续数据则正确对应同一只股票的前收盘价。比如stock_id=5的结果会是:id stock_id date open high low close volume previous_close
stock_id
5 45 5 2022-08-02 34.32 34.550 34.32 34.442 1252 NaN
5 46 5 2022-08-03 34.75 35.200 34.75 35.200 1007 34.442
--- 内容的提问来源于stack exchange,提问作者a7dc

