Повторный словарь в 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}