如何在Pandas中扩展多标的子集表并添加自定义计算列?
实现方案:为Yahoo Finance行情数据添加计算列(扁平/层级表头)
首先假设你已经通过yfinance获取了数据并提取了Open和Close字段,下面分扁平表头和层级表头两种结构给出具体实现代码:
基础代码(已完成部分的复用)
import yfinance as yf import pandas as pd # 标的列表 tickers = ["EURUSD=X", "BTC-USD"] # 获取30天1小时行情 data = yf.download(tickers, period="30d", interval="1h") # 提取Open和Close字段形成子集表 subset = data[["Open", "Close"]].copy()
一、扁平表头实现
直接为每个标的生成带前缀的计算列,表头为一维结构,适合简单直观的数据分析:
# 遍历每个标的,添加3个计算列(示例为价差、价格比率、涨跌幅百分比,可替换为你的计算逻辑) for ticker in tickers: # 计算1:收盘价与开盘价的价差 subset[f"{ticker}_价差"] = subset["Close"][ticker] - subset["Open"][ticker] # 计算2:收盘价/开盘价的比率 subset[f"{ticker}_价格比率"] = subset["Close"][ticker] / subset["Open"][ticker] # 计算3:涨跌幅百分比 subset[f"{ticker}_涨跌幅(%)"] = (subset["Close"][ticker] - subset["Open"][ticker]) / subset["Open"][ticker] * 100 # 查看结果 print(subset.head())
执行后,表头会是类似EURUSD=X_Open、BTC-USD_价差这样的扁平命名,方便快速定位单个标的的所有数据。
二、层级表头实现
利用Pandas的MultiIndex构建双层表头,适合按类别(基础数据/计算结果)或标的分组查看数据,有两种常见结构可选:
结构1:按数据类型分层(基础数据/计算指标为上层,标的相关为下层)
# 准备计算结果DataFrame calc_df = pd.DataFrame() for ticker in tickers: calc_df[(ticker, "价差")] = subset["Close"][ticker] - subset["Open"][ticker] calc_df[(ticker, "价格比率")] = subset["Close"][ticker] / subset["Open"][ticker] calc_df[(ticker, "涨跌幅(%)")] = (subset["Close"][ticker] - subset["Open"][ticker]) / subset["Open"][ticker] * 100 # 重命名原始subset的列为双层索引 subset.columns = pd.MultiIndex.from_tuples( [(col.split("/")[0], col.split("/")[1]) for col in subset.columns], names=["数据类型", "标的"] ) # 重命名计算结果的列为双层索引 calc_df.columns = pd.MultiIndex.from_tuples( [("计算指标", f"{ticker}-{ind}") for ticker in tickers for ind in ["价差", "价格比率", "涨跌幅(%)"]], names=["数据类型", "标的-指标"] ) # 合并原始数据与计算结果 hierarchical_data = pd.concat([subset, calc_df], axis=1) # 查看结果 print(hierarchical_data.head())
结构2:按标的分层(标的为上层,基础数据/计算指标为下层)
这种结构更适合聚焦单个标的的所有数据:
hierarchical_data = pd.DataFrame() for ticker in tickers: # 添加基础数据列 hierarchical_data[(ticker, "Open")] = subset["Open"][ticker] hierarchical_data[(ticker, "Close")] = subset["Close"][ticker] # 添加计算列 hierarchical_data[(ticker, "价差")] = subset["Close"][ticker] - subset["Open"][ticker] hierarchical_data[(ticker, "价格比率")] = subset["Close"][ticker] / subset["Open"][ticker] hierarchical_data[(ticker, "涨跌幅(%)")] = (subset["Close"][ticker] - subset["Open"][ticker]) / subset["Open"][ticker] * 100 # 设置层级名称 hierarchical_data.columns.names = ["标的", "数据/指标"] # 查看结果 print(hierarchical_data.head())
自定义计算逻辑说明
如果需要替换成你自己的交易或数学计算,只需要修改代码中计算列的表达式即可,比如换成移动平均、RSI等指标的计算逻辑。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

