将SQL股票价格表转换为按Symbol分列的Pandas DataFrame
实现方法:将股票SQL表转换为宽格式Pandas DataFrame
没问题,这是个很常见的数据宽表转换需求,我来一步步给你拆解实现步骤:
1. 先从SQL读取数据到Pandas
首先你需要把SQL表的数据加载到Pandas DataFrame里,这里推荐用SQLAlchemy配合pd.read_sql来实现,兼容性更好:
import pandas as pd from sqlalchemy import create_engine # 替换成你的数据库连接字符串(比如MySQL、PostgreSQL、SQLite等) engine = create_engine('your_database_connection_string') # 替换成你的表名 query = "SELECT Symbol, Date, Price FROM your_stock_table" # 读取数据 raw_df = pd.read_sql(query, engine)
2. 转换为目标宽格式
核心是用Pandas的透视功能,分两种场景处理:
场景A:每个日期+股票代码的组合唯一
如果你的数据里,同一天同一支股票只有一条价格记录,直接用pivot方法即可:
# 生成透视表:Date作为行索引,Symbol作为列,Price作为值 pivoted_df = raw_df.pivot(index='Date', columns='Symbol', values='Price') # 把列名改成「股票代码_price」的格式 pivoted_df.columns = [f"{symbol}_price" for symbol in pivoted_df.columns]
场景B:存在重复的日期+股票代码记录
如果同一天同一支股票有多条价格(比如日内多次交易),需要先做聚合处理,用pivot_table更稳妥,比如取当日最后一笔价格:
# 聚合重复记录,这里用lambda取最后一条的价格,你也可以换成mean()、max()等 pivoted_df = raw_df.pivot_table( index='Date', columns='Symbol', values='Price', aggfunc=lambda x: x.iloc[-1] ) # 同样重命名列 pivoted_df.columns = [f"{symbol}_price" for symbol in pivoted_df.columns]
3. 可选:调整日期列的格式
如果你的Date列从SQL读出来不是datetime类型,建议先转换,避免排序或筛选出问题:
raw_df['Date'] = pd.to_datetime(raw_df['Date'])
如果不想把Date作为索引,而是作为普通列,可以重置索引:
pivoted_df = pivoted_df.reset_index()
最终你得到的pivoted_df就是你想要的结构:Date列(或索引)+ 每支股票对应的_price列。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

