【发布时间】: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)
【问题讨论】:
-
如果你编辑你的问题,让它真正提出一个特定的问题,你会有更多的运气。
-
你能把你的代码减少到重现你的错误的基本位吗,这里有很多不相关的代码