【问题标题】:pandas does not append to df as it should of each line of iterationpandas 不会像每行迭代一样附加到 df
【发布时间】:2015-08-22 14:04:48
【问题描述】:

我有一个不正常的 df。请帮我训练它!

我的每一次迭代都需要通过最深的嵌套“if”语句(满足我的所有要求)附加执行我的 df 'df_comp_KPIs'。

为什么这段代码不起作用?

任何想法

import time
import urllib.request, urllib.error, urllib.parse
import pandas as pd
import csv
import urllib.request, urllib.error, urllib.parse
from bs4 import BeautifulSoup as bs4


start = time.time()     # Start script timer

# Creating the df that will save my results in the Yahoo KPI iterations
#global df_comp_KPIs
df_comp_KPIs = pd.DataFrame()  #columns = ('Ticker','Mark.Cap','PriceToBook','PEG5','TrailPE12Mo','DeptToEquit.')

ofInterest = ['AAN', 'ANF', 'ANCX', 'ACE', 'ATVI', 'AET', 'AGCO', 'ATSG', 'AWH', 'ALL', 'AFAM', 'ALJ']

evenBetter = []

# add some more to powers as necessary
powers = {'M': 10 ** 6, 'B': 10 ** 9, 'T': 10 ** 12}

# Convert the string from Market Cap col to float.    
def stringNoToFloat(s):
    try:
        power = s[-1]
        return float(s[:-1]) * powers[power]
    except TypeError:
        return s

#df.applymap(stringNoToFloat)

def yahoostats(ticker):

    try:
        print ('doing',ticker)
        url = 'http://finance.yahoo.com/q/ks?s='+ticker
        page = urllib.request.urlopen(url)
        soup = bs4(page)
        page.close()
        # Lookup pbr and return the next 'td' tag-content
        mcap = soup.find(text='Market Cap (intraday)').findNext('td').string
#        print('Market Cap:', mcap)
        pbr = float(soup.find(text='Price/Book (mrq):').findNext('td').string)
#        print('Ticker %s, Price to book ratio:  %1.2f' %(ticker, float(pbr)))  # format 2 dig.
#        print()

        if float(pbr) < 3:
#            print ('price to book ratio:',ticker,pbr)
            PEG5 = float(soup.find(text='PEG Ratio (5 yr expected)').findNext('td').string)
#            print('Ticker %s, PEG Ratio (5 yr expected):  %1.2f' %(ticker, PEG5))  # format 2 dig.

            if 0 < float(PEG5) < 3:
                #print 'PEG forward 5 years',PEG5
                DE = float(soup.find(text='Total Debt/Equity (mrq):').findNext('td').string)
#                print('Ticker %s, Total Debt/Equity (mrq):  %1.2f' %(ticker, DE))  # format 2 dig.
#
#                #if 0 < float(DE) < 2:
#
                PE12 = float(soup.find(text='Trailing P/E (ttm, intraday):').findNext('td').string)
#                print ('Trailing PE (12mo):', PE12)
                if float(PE12) < 15:
                    evenBetter.append(ticker)
                    df_comp_KPIs = df_comp_KPIs.append({'Ticker':ticker,'Mark.Cap':mcap,'PriceToBook':pbr,'PEG5':PEG5,'TrailPE12Mo':PE12,'DeptToEquit':DE}, ignore_index = True)  #
                    df_comp_KPIs = df_comp_KPIs.sort(['PriceToBook','PEG5'], ascending=[1,1])  # , ignore_index=True

                    print('____________________________')
                    print('')
                    print(ticker,'meets requirements')
                    print('Market Cap (intraday):', mcap)
                    print('price to book:',pbr)
                    print('PEG forward 5 years',PEG5)
                    print('Trailing PE (12mo):',PE12)
                    print('Debt to Equity:',DE)
                    print('____________________________')

        # saving ticker KPIs to csv #
        df_comp_KPIs.to_csv('df_company_KPIs.csv')

    except Exception as e:
        print ('failed in the main loop:',str(e))
        pass

    return mcap, pbr, PEG5, PE12, DE

if __name__ == '__main__':

    for eachticker in ofInterest:
        yahoostats(eachticker)
#        time.sleep(.05)
    print(evenBetter)
    print()
    print('Company screener finished in %.1f seconds' %(time.time()-start))
    # Convert string with MarketCap to float in one go on the mcap col in df
    df_comp_KPIs['Mark.Cap'].applymap(stringNoToFloat)

【问题讨论】:

  • 如果你编辑你的问题,让它真正提出一个特定的问题,你会有更多的运气。
  • 你能把你的代码减少到重现你的错误的基本位吗,这里有很多不相关的代码

标签: python pandas


【解决方案1】:

好的。看来我最终遇到了这个错误,因为我的 df 缺少全局定义。所以代码看不到函数外创建的df。

所以我的函数应该是这样的,而不是上面的:

def yahoostats(ticker):

    global df_comp_KPIs

    try:
        print ('doing',ticker)
        url = 'http://finance.yahoo.com/q/ks?s='+ticker
        page = urllib.request.urlopen(url)

这解决了问题,我可以用我的 df 更改、调用或做任何其他事情。

我在这里找到了答案: http://eli.thegreenplace.net/2011/05/15/understanding-unboundlocalerror-in-python

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多