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

如何高效合并指定行的时间序列数据?Pandas实现方案咨询

问题

我持有四只股票的时间序列数据,分别存储在不同的DataFrame中,仅需保留其中的'Close'列。以下是我基于Pandas编写的合并与标准化代码,请问该实现是否为最高效的方式?(本人刚接触Pandas与时间序列)

def start(verbose: False):
    price_tsla = download_normalize_prices('TSLA', 'Tsla')
    price_aapl = download_normalize_prices('AAPL', 'Aapl')
    price_amzn = download_normalize_prices('AMZN', 'Amzn')
    price_sp500 = download_normalize_prices('^GSPC', 'SP500')

    combined_df = pd.concat([price_tsla, price_aapl, price_amzn, price_sp500], axis=1)
    combined_df.plot()
    plot.show()
    print( combined_df.head(5))

def download_normalize_prices(ticker, new_col_name):
    cols_to_drop = ['Open', 'High', 'Low', 'Volume', 'Dividends', 'Stock Splits']
    prices = yf.Ticker(ticker).history(start='2022-1-1', end='2022-12-31')
    prices = prices.drop(cols_to_drop, axis=1)
    prices = normalize_price(prices)
    prices = prices.rename(columns={'Close': new_col_name})

    return prices


def normalize_price( price_df ):
    price_at_row_0 = price_df['Close'].iloc[0]
    return price_df.div(price_at_row_0).mul(100)
回答

你的代码逻辑通顺,但不算最高效的实现,主要可以从减少IO请求和简化数据处理流程两方面优化:

核心优化点

  • 批量获取数据:原代码四次调用yf.Ticker单独请求数据,IO操作是时间瓶颈,用yf.download一次性获取多个标的数据,能大幅减少请求次数,提升效率。
  • 直接筛选目标列:不需要下载所有列再删除,yf.download可以指定只获取'Close'列,减少数据传输和内存占用。
  • 批量标准化处理:不用逐个DataFrame做标准化,直接对整个多列DataFrame批量计算,避免重复函数调用。

优化后的代码示例

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

def start():
    # 定义标的列表和对应的列名
    tickers = ['TSLA', 'AAPL', 'AMZN', '^GSPC']
    col_names = ['Tsla', 'Aapl', 'Amzn', 'SP500']
    
    # 批量获取Close列数据
    prices = yf.download(tickers, start='2022-1-1', end='2022-12-31')['Close']
    # 重命名列
    prices.columns = col_names
    
    # 批量标准化:除以首日价格再乘以100
    normalized_prices = prices.div(prices.iloc[0]).mul(100)
    
    # 绘图和输出
    normalized_prices.plot()
    plt.show()
    print(normalized_prices.head(5))

额外说明

  • 如果你的download_normalize_prices函数还需要兼容单个标的的场景,可以保留原函数,但批量处理时优先用上述方法。
  • 原代码中verbose: False的语法有误,应该写成verbose=False(Python函数参数默认值的正确写法)。

内容的提问来源于stack exchange,提问作者CaptainHastings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:50