一位朋友给我发了一个Jupyter笔记本,代码如下:
for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]):
stock_df['Allocation'] = stock_df['NormedReturn']*allo
我理解输出,因为它在每个数据框'aapl','cisco'中创建一个新列“Allocation”...并将权重应用于Normed Returns。但是,我不太了解语法,我可以自己再做一遍。
这个for循环2元素和zip工作怎么样? (我认为在压缩时元素必须具有相似的长度,否则输出数据将被截断)。
这里Python语法的关键是zip()
函数。
从文档中,我们可以看到:
返回
tuples
的迭代器,其中i-th
元组包含来自每个参数序列或i-th
的iterables
元素。
所以它传递了iterables并将它们“拉链”在一起。通过示例可能更容易看到:
>>> a = [1, 2, 3, 4]
>>> b = [9, 8, 7, 6]
>>> list(zip(a, b))
[(1, 9), (2, 8), (3, 7), (4, 6)]
所以,在你的代码中,这与一个名为'tuple unpacking'的方法一起使用,它只是做了类似的事情:
>>> i, j = 5, 6
>>> i
5
>>> j
6
这允许干净的代码将迭代从zip()
返回的元组。如果你仍然不确定循环在做什么,我们可以将它修改为print
变量(为简单起见,我还将传递给zip
的变量转换为字符串):
for stock_df, allo in zip(('aapl', 'cisco', 'ibm', 'amzn'), [.3,.2,.4,.1]):
print(stock_df, allo)
你可以从输出中看到我们所期望的:
aapl 0.3
cisco 0.2
ibm 0.4
amzn 0.1
我希望为你清除代码,从你问你已经知道如何在循环中实际处理这些变量的问题看来,所以我不会进入那个。
这看起来像投资组合多样化的代码。 aapl,cisco,ibm和amzn是至少包含NormedReturn字段的DataFrame。
aapl = pd.DataFrame({'NormedReturn':[1,2,3]})
cisco = pd.DataFrame({'NormedReturn':[4,5,6]})
ibm = pd.DataFrame({'NormedReturn':[7,8,9]})
amzn = pd.DataFrame({'NormedReturn':[10,11,12]})
DataFrames也可能包含单个值,如'NormedReturn':[13],没问题。
Zip功能拉链迭代。它将给定的分配权重分配给这些回报; .3对aapl股票的权重,.2对cisco股票的权重等:
for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]):
print stock_df, allo
给我们股票收益和相应的分配权重:
NormedReturn
0 1
1 2
2 3 0.3
NormedReturn
0 4
1 5
2 6 0.2
NormedReturn
0 7
1 8
2 9 0.4
NormedReturn
0 10
1 11
2 12 0.1
最后,赋值将返回系列乘以分配权重:
for stock_df, allo in zip((aapl, cisco, ibm, amzn), [.3,.2,.4,.1]):
stock_df['Allocation'] = stock_df['NormedReturn']*allo
print stock_df
给你的分配,即返回*权重系列:
NormedReturn Allocation
0 1 0.3
1 2 0.6
2 3 0.9
NormedReturn Allocation
0 4 0.8
1 5 1.0
2 6 1.2
NormedReturn Allocation
0 7 2.8
1 8 3.2
2 9 3.6
NormedReturn Allocation
0 10 1.0
1 11 1.1
2 12 1.2
我想在此之后你的朋友必须把所有的NormedReturns和Allocations放在一起,这就像你的最终投资回报一样。