问题描述
这里的大新手。我正在使用 pandas_datareader 和 yfinance 创建一个包含许多股票的 excel 工作簿,但最近我收到越来越多的“无法读取符号”错误,因为这些股票确实仍然存在。通常我可以再次运行代码,它会工作,但问题似乎慢慢变得更糟。我听说它暗示可能 yahoo 不喜欢一次收到那么多请求,也许 time.sleep 方法可能是解决方案。
但是我已经足够初学者了,我只是不知道如何编写该代码。下面是我的代码;我想要完全相同的东西,只是延迟,我猜在每只股票之间。
import pandas_datareader as web
from datetime import datetime
import pandas as pd
start = datetime(2020,9,1)
end = datetime(2021,12,31)
stock = [ 'ACHC','ACIW',[many more stocks listed here cut for simplicity],'TECH','SAM']
df = web.DataReader(stock,'yahoo',start,end)
df.to_excel(f'excelfilename.xlsx')
提前致谢
解决方法
我也试过运行你的代码。我不知道为什么,但它给了我一个错误,所以我安装了雅虎财经库并修复了代码。我创建了一个空数据框并将每只股票添加到其中。
import pandas_datareader.data as web
from datetime import datetime
import pandas as pd
import yfinance as yf
start = datetime(2020,9,1)
end = datetime(2021,12,31)
stocks= ['ACHC','ACIW','TECH','SAM']
dfs = pd.DataFrame()
for stock in stocks:
print(stock)
df = yf.download(stock,start,end)
df['stock'] = stock
dfs = dfs.append(df,ignore_index=True)
dfs.to_excel(f'excelfilename.xlsx')
dfs.head()
打开 | 高 | 低 | 关闭 | 调整关闭 | 音量 | stock | |
---|---|---|---|---|---|---|---|
0 | 31.13 | 31.42 | 30.6 | 30.91 | 30.91 | 385700 | ACHC |
1 | 29.73 | 30.99 | 29.73 | 30.57 | 30.57 | 226500 | ACHC |
2 | 30.76 | 31.2 | 30.41 | 31.12 | 31.12 | 379300 | ACHC |
3 | 31.15 | 31.5 | 29.92 | 30.18 | 30.18 | 411200 | ACHC |
4 | 30.7 | 30.82 | 29.2 | 29.81 | 29.81 | 459500 | ACHC |
编辑: 如果要按股票水平排列它们,请在列表中一次获取一个股票,并通过删除不必要的列来更改层次索引的级别。然后将分层索引名称转换为一行并重命名列。之后,对列重新排序。
df = yf.download(stocks,end)
df.drop(['Adj Close',],axis=1,inplace=True)
df = df.swaplevel(1,axis=1)
df.columns = ["_".join(a) for a in df.columns.to_flat_index()]
df.sort_index(axis=1,inplace=True)
日期 | ACHC_Close | ACHC_High | ACHC_Low | ACHC_Open | ACHC_Volume |
---|---|---|---|---|---|
2020-08-31 00:00:00 | 30.91 | 31.42 | 30.6 | 31.13 | 385700 |
2020-09-01 00:00:00 | 30.57 | 30.99 | 29.73 | 29.73 | 226500 |
2020-09-02 00:00:00 | 31.12 | 31.2 | 30.41 | 30.76 | 379300 |
2020-09-03 00:00:00 | 30.18 | 31.5 | 29.92 | 31.15 | 411200 |
2020-09-04 00:00:00 | 29.81 | 30.82 | 29.2 | 30.7 | 459500 |