Python 改进标签列表,以便与熊猫上的晨星一起使用
所以我有一个标签列表,是我从纳斯达克网站上为纽约证券交易所刮下来的Python 改进标签列表,以便与熊猫上的晨星一起使用,python,pandas,morningstar,Python,Pandas,Morningstar,所以我有一个标签列表,是我从纳斯达克网站上为纽约证券交易所刮下来的 import urllib.request from bs4 import BeautifulSoup import re target = "NYSE" def nyseTags(): ret = [] for k in range(1,64): source = "https://www.nasdaq.com/screening/companies-by-industry.aspx?exc
import urllib.request
from bs4 import BeautifulSoup
import re
target = "NYSE"
def nyseTags():
ret = []
for k in range(1,64):
source = "https://www.nasdaq.com/screening/companies-by-industry.aspx?exchange=NYSE&page="+str(k)
print("ReadingPage:"+source)
filehandle = urllib.request.urlopen(source)
soup = BeautifulSoup(filehandle.read(), "html.parser")
lines = soup.findAll("tr",{})
#print(len(lines))
temp = []
for n,k in enumerate(lines):
if(n == 0):
continue
try:
tds = k.findAll("td",{})
pattern = re.compile(r'\s+')
temp.append(re.sub(pattern, '', tds[1].getText()))
print(str(n)+" : "+temp[-1])
except:
pass
ret += temp
return(ret)
def arrToCsv(arr,fn):
strRep = "\n".join(arr)
fh = open(fn,"w")
fh.write(strRep)
fh.close()
arrToCsv(nyseTags(),"nyseTags.lst")
这提供了我的初始列表:
DDD
MMM
WBAI
...
XOXO
XPO
XYL
AUY
YELP
YEXT
YRD
YPF
YUMC
YUM
ZAYO
ZEN
ZBH
ZB^A
ZB^G
ZB^H
ZBK
ZOES
ZTS
ZTO
ZUO
ZYME
现在我知道,这些标签并不都是符合我需要的好的
标签,因为我希望能够访问2年的日间窗口
因此,我编写了下面的脚本来过滤掉我两年前无法获取数据的标签,但这看起来是一个有希望的开始
我不知道为什么这个脚本无法遍历整个列表,但任何输入都将非常棒
import datetime as dt
import matplotlib.pyplot as plt
from matplotlib import style
import pandas as pd
import pandas_datareader.data as web
import os
import operator
#C:\Users\Kevin\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\fred.py
style.use('ggplot')
__NOW__ = dt.datetime.now()
__2YearsAgo1__ = __NOW__ - dt.timedelta(days=725)
__2YearsAgo__ = __NOW__ - dt.timedelta(days=731)
def fetch(tag,start,end):# start and end should be dt.datetime(), tag can be a string or array of strings
if(type(tag) == str):
df = web.DataReader(tag, 'morningstar', start, end)
return(df)
else:
df = web.DataReader(tag, 'morningstar', start, end)
ret = {}
for tag, data in df.groupby(level=0):
if(type(data)==pd.core.frame.DataFrame):
ret[tag]=data
return(ret)
def scrubTags(tagList):
ret = []
fails = []
for n in range(0,int(len(tagList)/25)+1):
if(n==len(tagList)/25):
propTags = tagList[n*25:len(tagList)]
else:
propTags = tagList[n*25:n*25+25]
try:
temp = fetch(propTags,__2YearsAgo__,__2YearsAgo1__)
ret += propTags
print(str(n))
except:
print("Error in:"+"\t".join(propTags))
for k in propTags:
try:
temp = fetch(k,__2YearsAgo__,__2YearsAgo1__)
print("Passed:"+k)
ret.append(k)
except:
fails.append(k)
print("Failed:"+k)
#fails += propTags
return((ret,fails))
def arrToCsv(arr,fn):
strRep = "\n".join(arr)
fh = open(fn,"w")
fh.write(strRep)
fh.close()
def loadNYSEtagList():
fh = open("NYSETags.lst","r")
text = fh.read()
fh.close()
return(text.split("\n"))
tagList = loadNYSEtagList()
scrubTags = scrubTags(tagList)
arrToCsv(scrubTags[0],"Scrubed_505_nyseTags.lst")
arrToCsv(scrubTags[1],"Failed_505_nyseTags.lst")
另外->我知道用一个满是数据帧的字典来代替多索引是很奇怪的,但我不认为这是我问题的原因。它是否挂起了抓取?您在网站上是否超过了速率限制?此外,您正在尝试遍历for循环中的列表块。也许这里面有逻辑错误?我从来没有这样做的必要,但我认为必须有一种更为通灵的方式,因为这似乎是一个常见的问题。使用经过验证的代码可能会有所帮助。我的第一个搜索结果是:是的,我想我的分块检查出来了,尽管它可能很难看。。。为了检查我是否超过了速度限制,我在每次查询之前添加了一个5秒的计时器,但它仍然挂在同一个位置。5秒可能不够。它总是挂在同一个地方吗?那可能不是网站。你没有说它挂在哪里……如果不是因为web阅读器挂了,也许你得到了巨大的响应,而df.groupby花的时间太长了。与其这样做,不如打印df的大小/长度,看看是否有效。