我正在使用 yfinance 数据,它使用股票代码。然而,这些股票代码通常不容易识别。因此,在执行下载功能后,我尝试通过查找列表然后替换数据框中的原始股票代码来替换“股票代码”。我对字典和查找/替换概念相当陌生。谁能指出我正确的方向吗?
import yfinance as yf
import pandas as pd
import csv
tickerCsv = open('Stocks.csv', 'r')
reader = csv.reader(tickerCsv)
next(reader, None) # skip the headers
tickers = {rows[0] for rows in reader}
data = yf.download(tickers, period='1mo', start="2009-01-01", end="2020-12-31", group_by='ticker')
close_prices = pd.DataFrame()
for ticker in tickers:
close_prices[ticker] = data[ticker]['Adj Close']
close_prices[ticker].replace(dict(zip(reader['Symbol'], reader['Name'])))
Stocks.csv 文件如下:
你的代码已经差不多了。我将使用 pandas 读取 csv 文件并生成符号/名称映射:
dd = pd.read_csv('Stocks.csv').set_index('Symbol')['Name'].to_dict()
输出:
{'C38U.SI': 'CICT', 'A17U.SI': 'CLAR', 'M44U.SI': 'MLT', 'ME8U.SI': 'MINT'}
那么
tickers
就是dd
的键:
tickers = list(dd)
最后,您想要替换
close_prices
中的列名称,您可以这样做:
close_prices.columns = close_prices.columns.map(dd)
总共:
import yfinance as yf
import pandas as pd
import csv
dd = pd.read_csv('Stocks.csv').set_index('Symbol')['Name'].to_dict()
tickers = list(dd)
data = yf.download(tickers, period='1mo', start="2009-01-01", end="2020-12-31", group_by='ticker')
close_prices = pd.DataFrame()
for ticker in tickers:
close_prices[ticker] = data[ticker]['Adj Close']
close_prices.columns = close_prices.columns.map(dd)
输出:
CICT CLAR MLT MINT
Date
2009-01-02 0.601655 0.538735 0.144619 NaN
2009-01-05 0.631185 0.600304 0.156840 NaN
2009-01-06 0.631185 0.615697 0.154804 NaN
2009-01-07 0.660713 0.596456 0.158877 NaN
2009-01-08 0.642258 0.577216 0.158877 NaN
... ... ... ... ...
2020-12-23 1.827041 2.496265 1.674264 2.397144
2020-12-24 1.810045 2.487803 1.691262 2.380439
2020-12-28 1.810045 2.487803 1.691262 2.380439
2020-12-29 1.835539 2.504726 1.691262 2.388792
2020-12-30 1.852535 2.547036 1.708259 2.413848
[3012 rows x 4 columns]