2016-12-01 84 views
0
类别

这个问题是关于这个帖子在这里:迭代词典在Python和总和由

Iterate a Nested Dictionary in 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 

我是tr y得到百分之按部门总计,但只是不工作....我试了这个。

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

有什么建议吗?

+0

BTW:上面的字典无效,缺少引号和逗号。 – AChampion

回答

1

你可以在你的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} 
+0

这看起来真的很好..谢谢你! –

1

任何理由不使用熊猫吗? 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 
+0

这真的很有帮助。我可能会尝试这种方式。我对Python真的很新,还没有探索过它,但现在我认为我有一个很好的理由。谢谢! –