使用 time.sleep 避免 yfinance 的限制
Avoiding the limits of yfinance with time.sleep
这里是大新手。我正在使用 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')
提前致谢
我也试过 运行 你的代码。我不知道为什么,但它给了我一个错误,所以我安装了 yahoo finance 库并修复了代码。我创建了一个空数据框并将每只股票添加到其中。
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()
Open
High
Low
Close
Adj Close
Volume
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, 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)
Date
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
这里是大新手。我正在使用 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')
提前致谢
我也试过 运行 你的代码。我不知道为什么,但它给了我一个错误,所以我安装了 yahoo finance 库并修复了代码。我创建了一个空数据框并将每只股票添加到其中。
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()
Open | High | Low | Close | Adj Close | Volume | 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, 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)
Date | 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 |