Итерация вложенного словаря в 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}
     }

и вот область, где я назначаю значения:

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

У меня возникла проблема, при которой я повторяю цикл for по словарю, чтобы добавить новое значение "процент", которое представляет собой "итог", деленный на сумму всех итогов всех акций.

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')

проблема в том, что функция get_portfolio_value получает мне все итоговое значение portValue портфеля, но строка, в которой я пытаюсь добавить процент портфеля к каждой акции, работает некорректно - достаточно странно один из акций. Может кто-нибудь посоветовать?

3 ответа

Решение

Если я правильно понимаю ваш вопрос, вы можете попробовать следующее (я просто скопировал stockData ниже):

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}}

Я думаю, это то, что вы имели в виду:

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')

Ваша проблема может быть решена в двух частях:

  1. Возьмите сумму общих запасов. Для этого вы можете использовать sum() как:

    stock_sum = sum(stock_data['total'] for stock_data in stockData.values())
    
  2. Выполните итерацию по значению, чтобы обновить запись. Так как вам не нужно key использовать dict.values() перебирать только значения:

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

Теперь значения ваших stockData dict держит дополнительный ключ как percentage

Это то, что вы хотите:

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)

Результат:

>>> for item in stock_data:
...     print stock_data[item]['percentage']
...
50
50
Другие вопросы по тегам