首页 > 解决方案 > 通过 time.sleep 避免 yfinance 的限制

问题描述

大新手来了 我正在使用 pandas_datareader 和 yfinance 创建一个包含许多股票的 excel 工作簿,但最近我收到了越来越多的“无法读取符号”错误,对于肯定仍然存在的股票。通常我可以再次运行代码并且它会工作,但问题似乎慢慢变得更糟。我听说它暗示也许雅虎不喜欢一次收到那么多请求,也许 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')

提前致谢

标签: pythonpandas-datareaderyfinance

解决方案


我还尝试运行您的代码。我不知道为什么,但它给了我一个错误,所以我安装了雅虎金融库并修复了代码。我创建了一个空数据框并将每只股票添加到其中。

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()
打开 高的 低的 调整关闭 体积 股票
0 31.13 31.42 30.6 30.91 30.91 385700 乙酰胆碱酯酶
1 29.73 30.99 29.73 30.57 30.57 226500 乙酰胆碱酯酶
2 30.76 31.2 30.41 31.12 31.12 379300 乙酰胆碱酯酶
3 31.15 31.5 29.92 30.18 30.18 411200 乙酰胆碱酯酶
4 30.7 30.82 29.2 29.81 29.81 459500 乙酰胆碱酯酶

编辑: 如果您想按库存水平排列它们,请在列表中一次获取一个库存,并通过删除不必要的列来更改分层索引的级别。然后将分层索引名称转换为单行并重命名列。之后,重新排序列。

df = yf.download(stocks, start, end)
df.drop(['Adj Close',], axis=1, inplace=True)
df = df.swaplevel(1, 0, axis=1)
df.columns = ["_".join(a) for a in df.columns.to_flat_index()]
df.sort_index(axis=1, inplace=True)
日期 ACHC_关闭 ACHC_高 ACHC_低 ACHC_Open ACHC_卷
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

推荐阅读