【问题标题】:python function taking arguments from listpython函数从列表中获取参数
【发布时间】:2015-07-29 11:05:00
【问题描述】:

我对编程有点陌生,在运行和让它从列表中获取输入参数时遇到问题。这是我当前的代码:

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 文件或类似文件,但我想如果有人能指出我的正确之处,我可以自己解决这个问题问题第一部分的方向。

【问题讨论】:

  • 嗯,你能告诉我你是怎么调用你的函数的吗? pairfinder(tickers[0], tickers[1])?
  • 我没有调用该函数,因为我正在考虑在循环中的某个地方执行此操作,但我不知道该怎么做。

标签: python list function


【解决方案1】:

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

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)

【讨论】:

  • 您的解决方案运行良好,在我删除了 print t1 部分后,因为它为整个函数的每次迭代打印了当前代码,现在我只需要将结果写入数据帧。感谢您的帮助!这个网站很棒。
  • 我很高兴能提供帮助。我已经正确编辑了我的答案。谢谢
  • +1 这当然是正确的解决方案。它只是 itertools 中已有内容的扩展版本。请参阅可能的答案以供参考。
  • 是的,事实上我正在添加正确的方法,使用permutations
  • 无排列 - 顺序并不重要。你只需要没有重复元素的组合docs.python.org/2/library/itertools.html#itertools.combinations,就像我的回答一样。
【解决方案2】:

享受:

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

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

【讨论】:

  • 赞成。这只是排列而不是组合。
【解决方案3】:

这将遍历列表代码中的每个项目,并对每个项目做一些事情

for tick in tickers:
    doSomething(tick)

【讨论】:

    【解决方案4】:

    替换这个

    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 展示了一种获取对的好方法 - 如果您获得成对的 indices,则可以使用它们为符号和各种 stock_data 字段下标(或者您可以将索引传递给 calcpair首先,连同symbols 列表)。

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2012-09-29
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多