2017-02-14 1 views
0

Erstellt ein kleines Programm mit Python zum Lesen von Daten aus einer Excel-Datei mit DocX, um ein Word-Dokument aus den Daten zu generieren. Mein Code wurde zum größten Teil arbeiten, aber gelegentlich hält diese Fehler:TypeError: Nicht unterstützte Operandentyp - float und NoneType - Verwendung von Python und DocX

TypeError: unsupported operand type(s) for +: 'float' and 'NoneType' 

Es verweist auf diese Zeile hier:

stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 

Ich kann nicht für das Leben von mir herauszufinden, warum Es erzeugt diesen Fehler. Ich habe die Daten in Excel überprüft und die Werte in Frage sind alle Zahlen ohne Text.

Hier ist ein genauerer Blick auf den Anfang des Codes:

import urllib.request 
from docx import Document 
from docx.shared import Inches 
import openpyxl, pprint, math, datetime 
from collections import OrderedDict 
print('Opening workbook...') 
wb = openpyxl.load_workbook('stocks.xlsx') 
sheet = wb.get_sheet_by_name('stock_list') 
sheet2 = wb.get_sheet_by_name('sp500') 
ei = wb.get_sheet_by_name('ei') 
garp = wb.get_sheet_by_name('garp') 
spmktcap = wb.get_sheet_by_name('spmktcap') 
stockData = {} 


number_stocks = 0 

client_name = input("What is client's name?: ") 
analyst_name = input("What is your name?: ") 
analyst_email = input("What is your email?: ") 
analyst_extension = input("What is your extension?:") 


#assign values from stock list to stockData dictionary 
for row in range(2, sheet.max_row + 1): 
    # Each row in the spreadsheet has data for one census tract. 
    ticker = sheet['A' + str(row)].value 
    shares = sheet['B' + str(row)].value 
    company_name = sheet['C' + str(row)].value 
    sector = sheet['D' + str(row)].value 
    price = sheet['E' + str(row)].value 
    total = sheet['F' + str(row)].value 
    beta = sheet['G' + str(row)].value 
    dividend = sheet['H' + str(row)].value 
    mktcap = sheet['I' + str(row)].value 
    number_stocks+=1 

    # Make sure the key for this ticker exists. 
    stockData.setdefault(ticker,{}) 
    stockData[ticker]['company_name'] = company_name 
    stockData[ticker]['sector'] = sector 
    stockData[ticker]['shares'] = shares 
    stockData[ticker]['price'] = price 
    stockData[ticker]['total'] = total 
    stockData[ticker]['dividend'] = dividend 
    stockData[ticker]['beta'] = beta 
    stockData[ticker]['mktcap'] = mktcap 


#get total portfolio value 
stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 

#add percentages for each stock to dictionary 
for stock_data in stockData.values(): 
    stock_data['percentage'] = stock_data['total']/stock_sum 

portfolio_beta = sum(stock['beta']*stock['percentage'] for stock in stockData.values()) 

portfolio_yield = sum(stock['dividend']*stock['percentage'] for stock in stockData.values()) 
portfolio_yield = portfolio_yield/100 
# print(portfolio_beta) 

market_cap = sum(stock['mktcap']*stock['percentage'] for stock in stockData.values()) 
mkt_cap_bill = market_cap/1000 
+0

Könnte es am Ende der Excel-Sheets leere Werte sein? – bernie

+0

Sie müssen sich die fraglichen Daten ansehen. Noch wichtiger ist, dass Sie die Werte wahrscheinlich vorverarbeiten sollten, indem Sie "None" durch "0" oder "NaN" ersetzen. (Vielleicht ist es wirklich ein Fehler ...) –

+0

Ok, also habe ich die Klammern geschlossen. Hat nicht geholfen. Ich löschte die gesamte Spalte in Excel und ersetzte sie. Hat nicht geholfen. ABER also habe ich die Daten in Python ausgedruckt und für das 'total'-Feld erscheint es in Python als Formel (' = e7 * b7 ') - was mich total verblüfft. Die Werte werden aus einem anderen Blatt eingefügt, das diese Formel verwendet - sie werden jedoch als Werte eingefügt. Und es gibt keine Formel in diesem Bereich! –

Antwort

0

Sie müssen die Daten verarbeiten, für None suchen, die wahrscheinlich aus leeren Zellen oder Rechenfehler in den Blättern kommt.

Auf kurze Sicht, ersetzen diese:

stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 

mit diesem:

stock_sum = sum(0 if stock_data['total'] is None else stock_data['total'] for stock_data in stockData.values()) 
+0

wenn ich das ändere - Fehler ist jetzt das: stock_data ['prozent'] = stock_data ['total']/stock_sum TypeError: nicht unterstützte Operandentyp (en) für /: 'NoneType' und 'float' –

Verwandte Themen