2016-12-19 151 views
2

有没有办法将我网页上的数据转换成熊猫DataFrame?将数据转换为熊猫数据帧

刮掉的数据是股票基本面数据例如。 abt: 2.71 6.00 ABT =股票行情,2.71 =价格以预订比和6.00 = PEG比率

我试图声明变量具有空数据帧,并用于.append()功能,但没有运气

即时猜测的数据之前,必须以某种方式转换它可以传递给一个数据框,但我现在知道如何去做。

代码重做与评论的建议,现在数据框出来了空???

import time 
import urllib.request 
import urllib.parse 
import pandas as pd 

sp500short = ['a', 'aa', 'aapl', 'abbv', 'abc', 'abt', 'ace', 'aci', 'acn', 'act', 'adbe', 'adi', 'adm', 'adp'] 
#stock = 'a' 

data = [] 

color_list = ['<span style="color:#aa0000;">', '<span style="color:#008800;">'] 
color_close = '</span>' 


def finvizPBStats(stock): 

    try: 

     sourceCode = urllib.request.urlopen('http://finviz.com/quote.ashx?t='+stock).read() 
     sourceCodeString = sourceCode.decode() 
     pbr = sourceCodeString.split('P/B</td><td width="8%" class="snapshot-td2" align="left"><b>')[1].split('</b></td>')[0] 

     for color in color_list: 
      if color in pbr: 
       pbr = pbr.split(color)[1].split(color_close)[0] 
       pbr = float(pbr) 

    except Exception as e: 
     if Exception: 
      pass 

    return   


def finvizPEGStats(stock): 

    try: 

     sourceCode = urllib.request.urlopen('http://finviz.com/quote.ashx?t='+stock).read() 
     sourceCodeString = sourceCode.decode() 
     PEG = sourceCodeString.split('PEG</td><td width="8%" class="snapshot-td2" align="left"><b>')[1].split('</b></td>')[0] 
     for color in color_list: 
      if color in PEG: 
       PEG = PEG.split(color)[1].split(color_close)[0] 
       PEG = float(PEG) 

    except Exception as e: 
     if Exception: 
      pass 

    return 

for stock in sp500short: 
    pbr = finvizPBStats(stock) 
    PEG = finvizPEGStats(stock) 
    data.append([pbr, PEG]) 

df = pd.DataFrame(index=sp500short, columns=['pbr', 'PEG']) 

print(df)  
+0

什么样的数据结构保存您的原始数据?如果它兼容,就可以像'df(input_data)'一样简单。 –

+0

你没有回报任何东西。这样做:'返回pbr,PEG'。另外,在你的函数结构上,这可能会引发错误,除非你初始化pbr和PEG。例如,你可以尝试在try/except语句之前的函数中添加'pbr,PEG = 0,0'。 – AlexG

回答

1

首先我会让你的函数返回输出数据:pbr,PEG。那么你可以做这样的事情:

data = [] 
for stock in sp500short: 
    pbr, PEG = finvizKeyStats(stock) 
    data.append([pbr, PEG]) 
    time.sleep(1) 

pd.DataFrame(data, index=sp500short, columns=['pbr', 'PEG']) 
+0

我试过这种方式,因为它似乎是最简单的解决方案,但我得到一个空的数据框,出于某种原因数据列表没有填充,我放置了代码。 –

0

我用BeautifulSoup并得到数据的整个表

import urllib 
from bs4 import BeautifulSoup 
from io import StringIO 
import pandas as pd 

sp500short = ['a', 'aa', 'aapl', 'abbv', 'abc', 'abt', 'ace', 'aci', 'acn', 'act', 'adbe', 'adi', 'adm', 'adp'] 

def get_fin(sym): 
    try: 
     sourceCode = urllib.request.urlopen('http://finviz.com/quote.ashx?t='+sym).read() 
     soup = BeautifulSoup(sourceCode, 'lxml') 
     table = soup.find("table", attrs={"class":"snapshot-table2"}) 
     tdf = pd.read_html(StringIO(table.__repr__())) 
     vals = tdf[0].values.reshape(-1, 2) 
     return pd.Series(vals[:, 1], vals[:, 0]).rename(sym) 
    except: 
     pass 

df = pd.concat([get_fin(sym) for sym in sp500short], axis=1) 

df.head() 

enter image description here


重点放在特定比率

机智h比率列表,您可以轻松访问相关数据。

ratios = ['P/E', 'PEG'] 
df.loc[ratios] 

enter image description here


注:
我质疑我使用__repr__获得HTML字符串。

+0

我不认为重写一个问题的webscraping部分说“我如何后处理我的webscraping代码”是有用的。对于OP来说并没有什么帮助(好,也不平凡),而且对未来的读者也无济于事。现在,你可以声称这样做更好(我甚至可以同意,特别是因为我不知道是否在拼抢),但是我今天已经看到你认为你的低质量答案只是低质量的,因为它是OP要求什么。请选择你合理化的选择(或者更好,不要给题外话题提供无关答案/答案)。 –

+1

@AndrasDeak很明显,你不同意我的风格。这是你打电话投票的理由(我不必告诉你,我只是在说明,所以你知道我理解)。但是,我认为这是有帮助的,并且事实上可以对未来的读者非常有用。事实上,我花了一些时间弄清楚如何去做,因为在此之前,我不知道如何去做。我认为,对诚实和潜在有用的工作是一种惩罚。 – piRSquared

+2

@AndrasDeak,我不会认为这个答案是低质量的 - 它只是让OP有机会从不同的视角来看待他们的问题。请检查众所周知的[“XY问题”](http://meta.stackexchange.com/a/66378) - 当人们问“错误”的问题时,它总是会发生。 OP最后想要的是:“将数据转换为熊猫数据框” - 这个答案正是如此。只是我的0.02美元... – MaxU