朋友给我发了一个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个元素的循环和拉链的工作原理如何? (我认为在压缩时元素必须具有相似的长度,否则输出数据将被截断)。
答案 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放在一起,这就像你的最终投资回报一样。