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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:35:36