问题描述
因此,我一直在关注有关Python金融的youtube教程,由于Yahoo现在已经关闭了对金融市场的大门,因此造成了一些住房问题.
So I have been following a youtube tutorial on Python finance and since Yahoo has now closed its doors to the financial market, it has caused a few dwelling problems.
我运行这段代码
import bs4 as bs
import datetime as dt
import os
import pandas as pd
import pandas_datareader.data as web
import pickle
import requests
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
def save_sp500_tickers():
resp = requests.get('https://en.wikipedia.org /wiki/List_of_S%26P_500_companies')
soup = bs.BeautifulSoup(resp.text, "lxml")
table = soup.find('table', {'class':'wikitable sortable'})
tickers = []
for row in table.findAll('tr')[1:]:
ticker = row.findAll('td')[0].text
tickers.append(ticker)
with open("sp500tickers.pickle", "wb") as f:
pickle.dump(ticker, f)
print(tickers)
return tickers
# save_sp500_tickers()
def get_data_from_yahoo(reload_sp500=False):
if reload_sp500:
tickers = save_sp500_tickers()
else:
with open("sp500tickers.pickle", "rb") as f:
tickers = pickle.load(f)
if not os.path.exists('stock_dfs'):
os.makedirs('stock_dfs')
start = dt.datetime(2000, 1, 1)
end = dt.datetime(2017, 8, 24)
for ticker in tickers:
if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
data = pdr.get_data_yahoo(ticker, start, end)
df.to_csv('stock_dfs/{}.csv'.format(ticker))
else:
print('Already have {}'.format(ticker))
get_data_from_yahoo()
,它崩溃时出现了一些错误,而不仅仅是一个错误.第一个错误是我应该重写pandas数据读取器.
and it crashes with a few erros, not just one. The first error is that I should override pandas data reader.
DeprecationWarning:
Auto-overriding of pandas_datareader's get_data_yahoo() is deprecated and will be removed in future versions.
Use pdr_override() to explicitly override it.
DeprecationWarning)
如何覆盖它?我真的不知道该怎么做,我是Python的新手,很抱歉成为菜鸟.
How do I override it? I really don't know how to, I am new to Python - sorry for being a noob.
那么我们有这个:
get_data_from_yahoo()
File "C:\Users\Mehdi\Desktop\Python finance\SP500_List.py", line 36, in get_data_from_yahoo
tickers = pickle.load(f)
我真的不明白为什么会这样,因为我已经用Youtuber检查了我的代码并且它们匹配.因此,将使用一些指针.
I really dont understand why this happens, because I have checked my code with the Youtuber and they match. So some pointer would be appriciated.
最后,我遇到了这个错误:
Finally, I have this error:
EOFError: Ran out of input
我也不知道这意味着什么.
which I also don't know what it means.
此外,我已经安装了"fix_yahoo_finance"软件包,并尝试使用新代码进行安装,但仍然无法正常工作.
To add to that, I have installed the 'fix_yahoo_finance' package and tried that with the new code as well and it still does not work.
将寻求任何帮助.谢谢:)
Any help is appriciated. Thanks :)
完整的错误列表:
C:\Users\Mehdi\AppData\Local\Programs\Python\Python36-32\lib\site-packages\fix_yahoo_finance\__init__.py:43: DeprecationWarning:
Auto-overriding of pandas_datareader's get_data_yahoo() is deprecated and will be removed in future versions.
Use pdr_override() to explicitly override it.
DeprecationWarning)
Traceback (most recent call last):
File "C:\Users\Mehdi\Desktop\Python finance\SP500_List.py", line 51, in <module>
get_data_from_yahoo()
File "C:\Users\Mehdi\Desktop\Python finance\SP500_List.py", line 36, in get_data_from_yahoo
tickers = pickle.load(f)
EOFError: Ran out of input
[Finished in 3.1s with exit code 1]
[shell_cmd: python -u "C:\Users\Mehdi\Desktop\Python finance\SP500_List.py"]
[dir: C:\Users\Mehdi\Desktop\Python finance]
[path: C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Users\Mehdi\AppData\Local\Programs\Python\Python36-32\Scripts\;C:\Users\Mehdi\AppData\Local\Programs\Python\Python36-32\;C:\Users\Mehdi\AppData\Local\Microsoft\WindowsApps;C:\Python36\Scripts;C:\Users\Mehdi\AppData\Roaming\Dashlane\4.8.5.35155\bin\Firefox_Extension\{442718d9-475e-452a-b3e1-fb1ee16b8e9f}\components;C:\Users\Mehdi\AppData\Roaming\Dashlane\4.8.5.35155\ucrt]
推荐答案
您的代码中有两个错误:
You have two mistakes in your code:
-
在函数
save_sp500_tickers()
的第22行中,代替此:
In line 22 in function
save_sp500_tickers()
, instead of this:
with open("sp500tickers.pickle", "wb") as f:
pickle.dump(ticker, f)
应为:
with open("sp500tickers.pickle", "wb") as f:
pickle.dump(tickers, f)
所以它是股票代号而不是股票代号
So it is tickers instead of ticker
函数 get_data_from_yahoo()
中的第47行,代替此:
In line 47 in function get_data_from_yahoo()
, instead of this:
if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
data = pdr.get_data_yahoo(ticker, start, end)
df.to_csv('stock_dfs/{}.csv'.format(ticker))
应该是:
if not os.path.exists('stock_dfs/{}.csv'.format(ticker)):
data = pdr.get_data_yahoo(ticker, start, end)
data.to_csv('stock_dfs/{}.csv'.format(ticker))
您需要使用 data
而不是 df
(在视频中使用了 df = web.DataReader(ticker,'yahoo',开始,结束)
,您在 data = pdr.get_data_yahoo(ticker,start,end)
中更改,但您忘记更改 df.to_csv('stock_dfs/{}.csv'.format(ticker))
到 data.to_csv('stock_dfs/{}.csv'.format(ticker))
)
You need to use data
instead of df
(in video was used df = web.DataReader(ticker, 'yahoo', start, end)
which you change in data = pdr.get_data_yahoo(ticker, start, end)
but you forgot to change df.to_csv('stock_dfs/{}.csv'.format(ticker))
to data.to_csv('stock_dfs/{}.csv'.format(ticker))
)
这篇关于标普500清单python脚本崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!