【问题标题】:converting data to pandas data frame将数据转换为熊猫数据框
【发布时间】:2016-12-20 04:53:53
【问题描述】:

有没有办法将我从网上抓取的数据转换成 pandas DataFrame?

抓取的数据是股票基本面数据,例如。 abt: 2.71 6.00 abt = 股票代码,2.71 = 市账率和 6.00 = PEG 比率

我尝试用空数据框声明一个变量并使用.append() 函数但没有运气

我猜数据应该先以某种方式转换,然后才能传递给数据框,但我现在知道如何去做了。

根据 cmets 的建议重做代码,现在数据框是空的???

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)     

【问题讨论】:

  • 什么样的数据结构保存你的原始数据?如果它兼容,它可以像df(input_data) 一样简单。
  • 你没有返回任何东西。这样做:return pbr, PEG。此外,根据您的函数的结构,除非您初始化 pbr 和 PEG,否则这可能会引发错误。例如,您可以尝试在 try / except 语句之前的函数中添加pbr, PEG = 0, 0

标签: python pandas dataframe


【解决方案1】:

首先我会让你的函数返回输出数据:pbrPEG。然后你可以这样做:

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

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

【讨论】:

  • 我尝试了这种方式,因为它似乎是最简单的解决方案,但我得到了一个空数据框,由于某种原因没有填充数据列表,我重新提交了代码。
【解决方案2】:

我用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()


关注特定的比率

通过比率列表,您可以轻松访问相关数据。

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


注意:
我质疑我使用 __repr__ 来获取 html 字符串。

【讨论】:

  • 我不认为重写一个问题的网页抓取部分说“我如何对我的网页抓取代码进行后处理”是有用的。并没有真正帮助 OP(嗯,不是微不足道的),而且绝对不会帮助未来的读者。现在,您可以声称这样更好(我什至可以同意,尤其是因为我不知道抓取),但是我今天已经看到您的理由是,您的低质量答案只是低质量的,因为它是OP要求什么。请选择您的合理化选择(或者更好的是,不要给出离题答案/对离题问题的答案)。
  • @AndrasDeak 很明显你不同意我的风格。您可以随意投票(我不必告诉您。我只是这样说,以便您知道我理解)。但是,我认为这很有帮助,实际上对未来的读者非常有用。事实上,我花了一些时间弄清楚如何去做,因为在此之前,我不知道如何去做。我认为,对诚实且可能有用的工作投反对票是一种惩罚。
  • @AndrasDeak,我不会认为这个答案是低质量的——它只是让 OP 有机会从不同的角度看待他们的问题。请检查众所周知的"XY problem" - 当人们提出“错误”问题时,它总是会发生。最后 OP 想要:converting data to pandas data frame - 这个答案正是如此。只是我的 0.02 美元...
  • @MaxU 我完全同意:) 这是一个高质量的答案,可能是对 OP 原始方法的改进。您可能缺少的观点也在我的评论中:这可能没有帮助(较弱的动机),而 piRSquared 有时会相反:给出a low-effort answer to a clear XY case。我很欣赏 piRSquared 的理解,我们必须同意不同意(这就是为什么我没有回应之前的评论;我没有太多要补充的,也不想把它变成一个毫无意义的论点) .
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2019-10-12
  • 2018-07-14
相关资源
最近更新 更多