Python 带有2个元素和一个拉链的循环

Python 带有2个元素和一个拉链的循环,python,loops,Python,Loops,一位朋友寄给我一本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”。。。并将权重应用于标准回报。但是,我对语法理解不够,无法自己再做一次 请问这对于2个元

一位朋友寄给我一本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”。。。并将权重应用于标准回报。但是,我对语法理解不够,无法自己再做一次


请问这对于2个元素上的循环和zip是如何工作的?(我认为压缩时元素必须具有相似的长度,否则输出数据将被截断)。

这看起来像是一种代码。aapl、cisco、ibm和amzn是至少包含NormedReturn字段的数据帧

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]})
数据帧也可能包含单个值,如'NormedReturn':[13],没有问题

拉链功能可将多个拉链拉在一起。它将给定的分配权重分配给这些收益。aapl库存重量为3,思科库存重量为2,等等:

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

我认为在此之后,您的朋友必须将所有的normedreturn和分配放在一起,这就像您的最终投资组合回报一样。

这里Python语法的关键部分是函数

从文件中,我们可以看到:

返回
元组的迭代器,其中
i-th
元组包含每个参数序列或
i-th
元素

因此,它被传递到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
的变量转换为字符串):

您可以从输出中看到,这符合我们的预期:

aapl 0.3
cisco 0.2
ibm 0.4
amzn 0.1

我希望这能为您清除代码,从您提出的问题来看,您已经知道这些变量在循环中实际上是如何处理的,所以我不再赘述。

看看python文档:有一个关于
zip
的很好的解释。您压缩的对象将被截断,但是它们的长度是一样的:
(aapl,cisco,ibm,amzn)
有长度3,
[.3,.2,.4,.1]
@juanpa.arrivillaga length
4
@JoeIddon-whoops。是的,打字错误。谢谢乔!现在更清楚了:)@choubix请接受(回答旁边的灰色-->绿色箭头)谢谢:)非常欢迎,@choubix!请随意将我或乔的答案标记为已接受的答案。圣诞快乐!
aapl 0.3
cisco 0.2
ibm 0.4
amzn 0.1