You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单DataFrame中为各股票计算前收盘价(Prior Close)

问题:单DataFrame中按股票分组计算前收盘价

我在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分组计算前收盘价,可通过以下两步完成:

  1. 先按股票+日期排序
    确保每个股票的行情数据按日期升序排列,避免shift()取到错误的历史数据:

    df.sort_values(by=['stock_id', 'date'], inplace=True)
    
  2. 分组计算前收盘价
    使用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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:45:36