环有2个元素和一个拉链

问题描述 投票:1回答: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”...并将权重应用于Normed Returns。但是,我不太了解语法,我可以自己再做一遍。

这个for循环2元素和zip工作怎么样? (我认为在压缩时元素必须具有相似的长度,否则输出数据将被截断)。

python loops
2个回答
2
投票

这里Python语法的关键是zip()函数。

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

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

所以它传递了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

我希望为你清除代码,从你问你已经知道如何在循环中实际处理这些变量的问题看来,所以我不会进入那个。


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放在一起,这就像你的最终投资回报一样。

© www.soinside.com 2019 - 2024. All rights reserved.