2016-12-19 210 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