python函数从列表

时间:2015-07-29 11:05:00

标签: python list function

我对编程有些新意,并且遇到运行问题并让它从列表中获取输入参数。这是我目前的代码:

import pandas as pd
import numpy as np
from pandas.io.data import DataReader
from datetime import datetime

def pairfinder(ticker1, ticker2):

   symbols = [ticker1, ticker2]
   stock_data = DataReader(symbols, "yahoo", datetime(2011,1,1), datetime(2011,12,31))

   price = stock_data['Adj Close']
   returns = np.log(price / price.shift(1))
   diff = (returns[ticker1] - returns[ticker2])**2

   mindif = ((1/(returns[ticker1].count()))*diff.sum())
   corr = (returns[ticker1].corr(returns[ticker2]))
   print(ticker1, ticker2, mindif, corr)



tickers = ['AKSO.OL', 'BWLPG.OL', 'DETNOR.OL', 'DNB.OL', 'DNO.OL', 'FOE.OL', 'FRO.OL']

该函数从yahoo finance下载股票数据并将调整后的收盘价放在数据框中,然后计算收益,并获取它们之间的平方差并将其相加。最后它显示了两个代码,总和平方差的结果,以及两个股票之间的相关性。

现在的问题是我想让这个功能通过代码列表运行,我希望它采用第一个代码,AKSO.OL并在其上运行函数和所有其他代码,然后转到下一个并做同样的事情。我试图构造一个for循环来做这个,但我不是那么稳定使用for循环并将它与函数结合起来。

最后我想将结果放到另一个数据框中并将其保存为csv文件或类似的东西,但我想如果有人能指出我的话,我可以自己解决这个问题。第一部分问题的方向。

4 个答案:

答案 0 :(得分:2)

如果我理解你的问题,可能会这样做:

for t1 in tickers:
    for t2 in tickers:
        if t2 == t1:
            continue
        print "t1=%s, t2=%s" % (t1, t2)
        pairfinder(t1, t2)

产生

t1=AKSO.OL, t2=BWLPG.OL
t1=AKSO.OL, t2=DETNOR.OL
t1=AKSO.OL, t2=DNB.OL
t1=AKSO.OL, t2=DNO.OL
t1=AKSO.OL, t2=FOE.OL
t1=AKSO.OL, t2=FRO.OL
t1=BWLPG.OL, t2=AKSO.OL
t1=BWLPG.OL, t2=DETNOR.OL
t1=BWLPG.OL, t2=DNB.OL
t1=BWLPG.OL, t2=DNO.OL
t1=BWLPG.OL, t2=FOE.OL
t1=BWLPG.OL, t2=FRO.OL
t1=DETNOR.OL, t2=AKSO.OL
t1=DETNOR.OL, t2=BWLPG.OL
t1=DETNOR.OL, t2=DNB.OL
t1=DETNOR.OL, t2=DNO.OL
t1=DETNOR.OL, t2=FOE.OL
t1=DETNOR.OL, t2=FRO.OL
t1=DNB.OL, t2=AKSO.OL
t1=DNB.OL, t2=BWLPG.OL
t1=DNB.OL, t2=DETNOR.OL
t1=DNB.OL, t2=DNO.OL
t1=DNB.OL, t2=FOE.OL
t1=DNB.OL, t2=FRO.OL
t1=DNO.OL, t2=AKSO.OL
t1=DNO.OL, t2=BWLPG.OL
t1=DNO.OL, t2=DETNOR.OL
t1=DNO.OL, t2=DNB.OL
t1=DNO.OL, t2=FOE.OL
t1=DNO.OL, t2=FRO.OL
t1=FOE.OL, t2=AKSO.OL
t1=FOE.OL, t2=BWLPG.OL
t1=FOE.OL, t2=DETNOR.OL
t1=FOE.OL, t2=DNB.OL
t1=FOE.OL, t2=DNO.OL
t1=FOE.OL, t2=FRO.OL
t1=FRO.OL, t2=AKSO.OL
t1=FRO.OL, t2=BWLPG.OL
t1=FRO.OL, t2=DETNOR.OL
t1=FRO.OL, t2=DNB.OL
t1=FRO.OL, t2=DNO.OL
t1=FRO.OL, t2=FOE.OL

基本上它贯穿了代码列表,它将函数应用于每个股票代码(t1)和所有其他代码(t2)跳过t1。

注意:它允许重复相同的对(即t1,t2与t2,t1不同)。如果不是所需的行为,请使用itertools.combinations(如下面的另一个答案中所述)。

事实上,最好的方法是通过itertools.permutations

import itertools
for ticker1, ticker2 in itertools.permutations(tickers, 2):
        print "t1=%s, t2=%s" % (ticker1, ticker2)

答案 1 :(得分:1)

享受:

import itertools
for ticker1, ticker2 in itertools.combinations(tickers, 2):
    pairfinder(ticker1, ticker2)

Itertools是Python标准库中最有用的模块之一。它让我免于头疼多次。

答案 2 :(得分:0)

这将迭代列表代码中的每个项目,并对每个项目执行某些操作

for tick in tickers:
    doSomething(tick)

答案 3 :(得分:0)

替换此

def pairfinder(ticker1, ticker2):

   symbols = [ticker1, ticker2]

用这个

def pairfinder(symbols):
瞧,你的功能现在需要一个任意长的列表。现在,取该函数的最后一个块,它确实对两个符号进行操作,并将其移动到另一个函数中:

def calcpair(ticker1, ticker2, stock_data):
    price = stock_data['Adj Close']
    # etc.

所以现在pairfinder只需要传递calcpair每个可能的对,以及stock_data的正确子集。 ElmoVanKielmo展示了获得对的好方法 - 如果你得到索引对,你可以使用它们下标符号和各种stock_data字段(或者你可以将索引传递给{{1首先,与calcpair列表一起)。