环有2个元素和一个拉链

时间:2017-12-24 19:35:46

标签: 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'...并将权重应用于Normed Returns。但是,我不太了解语法,我可以自己再做一遍。

这对2个元素的循环和拉链的工作原理如何? (我认为在压缩时元素必须具有相似的长度,否则输出数据将被截断)。

2 个答案:

答案 0 :(得分:2)

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

从文档中我们可以看到:

  

返回user> (ns my.ns) nil my.ns> (in-ns 'user) #namespace[user] user> (defn register-trace [v-name] (let [v (intern 'my.ns v-name (atom {}))] (println (str "v is " v)) (println (str "v's contents is " @v)) (println (str "v's internal value is " @@v)) v)) #'user/register-trace user> (register-trace 'asd) ;;=> v is #'my.ns/asd ;;=> v's contents is clojure.lang.Atom@6a6ee04b ;;=> v's internal value is {} #'my.ns/asd user> (let [var-atom @(register-trace 'my-var)] (swap! var-atom assoc :x 101)) ;;=> v is #'my.ns/my-var ;;=> v's contents is clojure.lang.Atom@2164d9ed ;;=> v's internal value is {} {:x 101} user> @my.ns/my-var {:x 101} user> (swap! my.ns/my-var update :x inc) {:x 102} user> @my.ns/my-var {:x 102} 的迭代器,其中tuples元组包含每个参数序列中的i-th元素或i-th

所以它传递了iterables并将它们“拉链”在一起。通过示例可能更容易看到这一点:

iterables

因此,在你的代码中,这与一个名为'tuple unpacking'的方法一起使用,它只是做了类似的事情:

>>> a = [1, 2, 3, 4]
>>> b = [9, 8, 7, 6]
>>> list(zip(a, b))
[(1, 9), (2, 8), (3, 7), (4, 6)]

这允许干净的代码将迭代从>>> 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)

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

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