如何高效合并指定行的时间序列数据?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
相关产品推荐
相关产品推荐

