Повторный словарь в Python и итоговые суммы по категориям

Этот вопрос связан с этим постом здесь:

Итерация вложенного словаря в Python

В качестве продолжения я пытаюсь подвести итоги по всем акциям и получить общий процент акций в портфеле по секторам.

Я хочу, чтобы вывод выглядел так:

Технологии: 24%, финансовые: 14%, и т. Д.

Мой словарь выглядит так:

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

Я рассчитал общий процент от общего портфеля для каждой акции следующим образом:

for stock_data in stockData.values():
    stock_data['percentage'] = stock_data['total']/stock_sum

и я пытаюсь получить% итогов по секторам, но просто не работает.... Я попробовал это.

for stock_data in stockData.values():
    sector_totals = []
    for stock_data['sector'] in stock_data:
        sector_totals = (stock_data['sector'], stock_data['percentage'])

Любой совет?

2 ответа

Есть ли причина не использовать панд? http://pandas.pydata.org/ Это сделает вашу жизнь намного проще.

Я добавил дополнительные (поддельные) акции, чтобы сделать пример более актуальным.

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

import pandas as pd

# Create pandas dataframe wi
stockData_df = pd.DataFrame(stockData).T
stockData_df['percentage'] = stockData_df['total']/stockData_df['total'].sum()


stockData_df
Out[82]: 
         beta company_name dividend      sector total percentage
AAPL  1.01834        Apple  1.93417  Technology   300   0.333333
GOOG  1.01834        Apple  1.93417  Technology   300   0.333333
XXXX  1.01834        Apple  1.93417        Food   300   0.333333



sector_totals = stockData_df.groupby('sector').sum()['total']/stockData_df['total'].sum()

sector_totals
Out[86]: 
sector
Food          0.333333
Technology    0.666667
Name: total, dtype: float64

Вы можете перебирать свои stockData создавая sector словарь, который собирает все суммы по этому сектору:

sectors = {}
for stock in stockData.values():
    sectors.setdefault(stock['sector'], []).append(stock['total'])
print(sectors)
# {'Technology': [300, 300]}

Затем вы можете перебрать stockData добавив percentage:

for stock in stockData.values():
    stock['percentage'] = stock['total']/sum(sectors[stock['sector']])

Примечание: в py2 вам нужно сделать один из этих floatнапример, float(stock['total'])

Кроме того, вы можете создать промежуточную сумму для sector словарь, и это позволит избежать sum() выше:

sectors = {}
for stock in stockData.values():
    sectors[stock['sector']] = sectors.get(stock['sector'], 0) + stock['total']
print(sectors)
# {'Technology': 600}
Другие вопросы по тегам