Reputation: 2784
Not sure if this is possible or not. Assuming I have a list of dictionaries like follows:
stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, {another_dict}, {another_dict}]
Then I have another list, like so:
weights_list = [(0.95, 0.025, 0.025),
(0.90, 0.05, 0.05),
(0.85, 0.075, 0.075),
(0.80, 0.1, 0.1),
(0.75, 0.125, 0.125),
(0.70, 0.15, 0.15)]
The end result would be to attach a different (whole) dictionary to each sets of lists within weights_list, as demonstrated below:
[({'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, 0.95),({another_dict}, 0.025), ({another_dict}, 0.025)]
The reason I was hoping to use it is so that I can call certain dictionary key values to multiply against its respective weight allocated.
The code I have now, all written by @zehnpaard is as follows:
def portfolios(stocks, weights_list):
for x in stocks:
for stock_triplet in itertools.combinations(x, 3):
for weights in weights_list:
unique_weight_orders = set(itertools.permutations(weights))
for weight_order in unique_weight_orders:
yield zip(stock_triplet, weight_order)
for port in portfolios(stocks,weights_list):
print port
However this prints out a combination for every dictionary key, as opposed to the entire dictionary. I tried for x in len(stocks)
, but it returns an error 'int' object is not iterable
as many of you would probably assume.
Thanks in advance for any help received!
Upvotes: 0
Views: 132
Reputation: 5291
I have assumed 2 dictionaries within your list like so:
stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, { 'abc': 456 }, { 'abc': 123, 98.6: 37 }]
the following code snippet, causes it to print every combination:
for weights in weights_list:
unique_weight_orders = set(itertools.permutations(weights))
for weight_order in unique_weight_orders:
yield zip(stock_triplet, weight_order)
Current output:
[('sd_returns', 0.95), ('var_returns', 0.025), ('name', 0.025)]
[('sd_returns', 0.025), ('var_returns', 0.025), ('name', 0.95)]
[('sd_returns', 0.025), ('var_returns', 0.95), ('name', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('name', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.9), ('name', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.05), ('name', 0.9)]
[('sd_returns', 0.075), ('var_returns', 0.075), ('name', 0.85)]
[('sd_returns', 0.075), ('var_returns', 0.85), ('name', 0.075)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('name', 0.075)]
[('sd_returns', 0.1), ('var_returns', 0.1), ('name', 0.8)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('name', 0.1)]
[('sd_returns', 0.1), ('var_returns', 0.8), ('name', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('name', 0.125)]
[('sd_returns', 0.125), ('var_returns', 0.125), ('name', 0.75)]
[('sd_returns', 0.125), ('var_returns', 0.75), ('name', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('name', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.7), ('name', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.15), ('name', 0.7)]
[('sd_returns', 0.95), ('var_returns', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.025), ('var_returns', 0.025), ('avg_returns', 0.95)]
[('sd_returns', 0.025), ('var_returns', 0.95), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.9), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.05), ('avg_returns', 0.9)]
[('sd_returns', 0.075), ('var_returns', 0.075), ('avg_returns', 0.85)]
[('sd_returns', 0.075), ('var_returns', 0.85), ('avg_returns', 0.075)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.1), ('var_returns', 0.1), ('avg_returns', 0.8)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.1), ('var_returns', 0.8), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.125), ('var_returns', 0.125), ('avg_returns', 0.75)]
[('sd_returns', 0.125), ('var_returns', 0.75), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.7), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.15), ('avg_returns', 0.7)]
[('sd_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.025), ('name', 0.025), ('avg_returns', 0.95)]
[('sd_returns', 0.025), ('name', 0.95), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('name', 0.9), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('name', 0.05), ('avg_returns', 0.9)]
[('sd_returns', 0.075), ('name', 0.075), ('avg_returns', 0.85)]
[('sd_returns', 0.075), ('name', 0.85), ('avg_returns', 0.075)]
[('sd_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.1), ('name', 0.1), ('avg_returns', 0.8)]
[('sd_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.1), ('name', 0.8), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.125), ('name', 0.125), ('avg_returns', 0.75)]
[('sd_returns', 0.125), ('name', 0.75), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('name', 0.7), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('name', 0.15), ('avg_returns', 0.7)]
[('var_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('var_returns', 0.025), ('name', 0.025), ('avg_returns', 0.95)]
[('var_returns', 0.025), ('name', 0.95), ('avg_returns', 0.025)]
[('var_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('var_returns', 0.05), ('name', 0.9), ('avg_returns', 0.05)]
[('var_returns', 0.05), ('name', 0.05), ('avg_returns', 0.9)]
[('var_returns', 0.075), ('name', 0.075), ('avg_returns', 0.85)]
[('var_returns', 0.075), ('name', 0.85), ('avg_returns', 0.075)]
[('var_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('var_returns', 0.1), ('name', 0.1), ('avg_returns', 0.8)]
[('var_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('var_returns', 0.1), ('name', 0.8), ('avg_returns', 0.1)]
[('var_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('var_returns', 0.125), ('name', 0.125), ('avg_returns', 0.75)]
[('var_returns', 0.125), ('name', 0.75), ('avg_returns', 0.125)]
[('var_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('var_returns', 0.15), ('name', 0.7), ('avg_returns', 0.15)]
[('var_returns', 0.15), ('name', 0.15), ('avg_returns', 0.7)]
if you change it to skip permutations, like so:
for weights in weights_list:
yield zip(stock_triplet, weights)
It gives output:
[('sd_returns', 0.95), ('var_returns', 0.025), ('name', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('name', 0.05)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('name', 0.075)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('name', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('name', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('name', 0.15)]
[('sd_returns', 0.95), ('var_returns', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('var_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('var_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('var_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('var_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('var_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('var_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
Complete code after the change:
import itertools
stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, { 'abc': 456 }, { 'abc': 123, 98.6: 37 }]
weights_list = [(0.95, 0.025, 0.025),
(0.90, 0.05, 0.05),
(0.85, 0.075, 0.075),
(0.80, 0.1, 0.1),
(0.75, 0.125, 0.125),
(0.70, 0.15, 0.15)]
def portfolios(stocks, weights_list):
for x in stocks:
for stock_triplet in itertools.combinations(x, 3):
for weights in weights_list:
yield zip(stock_triplet, weights)
for port in portfolios(stocks,weights_list):
print port
Upvotes: 1