2016-11-30 3 views
0

Mein Wörterbuch als so strukturiert ist:Iterate ein Nested Wörterbuch in Python

stockData = { 
    'AAPL': { 
     'beta': 1.01833975315094, 
     'company_name': 'Apple', 
     'dividend': 1.9341673320912078, 
     'total':300}, 
    'GOOG': { 
     'beta': 1.01833975315094, 
     'company_name': 'Apple', 
     'dividend': 1.9341673320912078, 
     'total':300} 
    } 

und hier ist Bereich, in dem i-Werte zuweisen:

for row in range(2, sheet.max_row + 1): 
 
    # Each row in the spreadsheet has data for one census tract. 
 
    company_name = sheet['A' + str(row)].value 
 
    ticker = sheet['B' + str(row)].value 
 
    sector = sheet['C' + str(row)].value 
 
    shares = 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 
 
    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

Ich habe ein Problem, bei dem ich mit einer for-Schleife über das Wörterbuch iteriere, um einen neuen Wert 'prozentual' hinzuzufügen, der die 'Summe' dividiert durch die Summe aller Summen aller Aktien ist.

def get_portfolio_value(stocks,item): 
    portValue = 0 
    percentage = 0 
    for k, v in stocks.items(): 
     portValue = portValue + v.get(item,0) 
     stockData[ticker]['percentage'] = stockData[ticker]['total']/portValue 
    print(portValue) 

get_portfolio_value(stockData,'total') 

das Problem ist, dass die get_portfolio_value Funktion mir die gesamte portValue Gesamt des Portfolios wird immer, aber die Linie, wo i bin versucht, den prozentualen Anteil des Portfolios zu jeder Aktie hinzufügen nicht righ arbeiten - es erscheint nur seltsam genug für nur einen der Aktien. Kann jemand beraten?

+1

folgende @jDo, wo tut 'ticker' komme aus? – mikeqfu

+1

@j Tut mir leid, ich habe den Top-Code, wo ich aus einer Excel-Datei lese nicht enthalten und Werte zuweisen. Dieses einfache Zitat war nur ein Fehler beim Eingeben des Codes hier. Ich habe gerade meinen Beitrag bearbeitet, um Wertzuweisungen hinzuzufügen. –

+0

Gibt es eine gute Möglichkeit, die Aktienprozentsätze auch nach Sektor zu addieren? zum Beispiel, um eine Liste aller Sektoren mit dem Gesamtprozentsatz für diesen Sektor ... für alle Bestände zu erhalten? –

Antwort

0

Wenn ich Sie richtig die Frage verstehen, können Sie versuchen, wie folgt (I die stockData unten nur kopiert):

stockData = { 
    'AAPL': { 
     'beta': 1.01833975315094, 
     'company_name': 'Apple', 
     'dividend': 1.9341673320912078, 'total': 300}, 
    'GOOG': { 
     'beta': 1.01833975315094, 
     'company_name': 'Apple', 
     'dividend': 1.9341673320912078, 'total': 300}} 

Ich denke, das ist, was Sie meinten:

def get_portfolio_value(stocks, item='total'): 
    portValue = 0 
    for v in stocks.values(): 
     portValue += v[item] 
    for k in stocks.keys(): 
     stocks[k].update({'percentage': stocks[k]['total']/portValue}) 
    print(portValue) 

get_portfolio_value(stockData, 'total') 
0

Dies ist, was Sie wollen:

stock_data = { 
    'AAPL': {'beta': 1.01833975315094, 'company_name': 'Apple', 'dividend': 1.9341673320912078, 'total':300}, 
    'GOOG': {'beta': 1.01833975315094, 'company_name': 'Apple', 'dividend': 1.9341673320912078, 'total':300} 
} 

stock_sum = sum(stock_data[item]['total'] for item in stock_data) 

for item in stock_data: 
    stock_data[item]['percentage'] = int((float(stock_data[item]['total'])/stock_sum) * 100) 

Ergebnis:

>>> for item in stock_data: 
...  print stock_data[item]['percentage'] 
... 
50 
50 
0

Ihr Problem kann in zwei Teile gelöst werden:

  1. Nimm die Summe der gesamten Aktien.

    stock_sum = sum(stock_data['total'] for stock_data in stockData.values()) 
    
  2. Iterate über den Wert um den Eintrag zu aktualisieren: Dafür können Sie sum() als verwenden. Da Sie nicht key benötigen, dict.values() verwenden nur die Werte iterieren:

    for stock_data in stockData.values(): 
        stock_data['percentage'] = stock_data['total']/stock_sum 
        # ^Adds new key into your existing `dict` object 
    

Jetzt sind die Werte Ihrer stockData dict hält zusätzliche Schlüssel als percentage

+0

Das ist perfekt! Klappt wunderbar! Vielen Dank, ich bin immer noch sehr viel Anfänger bei Python, aber ich schätze auf jeden Fall den Rat von denen, die viel klüger sind als ich. –

+0

Keine Notwendigkeit, Ihnen zu danken. Wenn Sie die Antwort nützlich finden, [akzeptieren Sie die Antwort] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Es könnte jemandem helfen, der in Zukunft mit dem gleichen Problem konfrontiert wird –

Verwandte Themen