代码之家  ›  专栏  ›  技术社区  ›  Louis Falconer-Flavin

如何将几个函数应用于列表中的多个标记器?(代码改进)

  •  0
  • Louis Falconer-Flavin  · 技术社区  · 8 年前

    因此,我目前正在学习如何使用numpy、pandas等分析python中的财务数据。我从一个小脚本开始,希望它能根据两个选定日期之间的价格变化对一些选定的股票进行排序。

    import numpy as np
    import pandas as pd
    from pandas_datareader import data as web
    from pandas import Series, DataFrame
    import datetime
    from operator import itemgetter
    
    #Edit below for 2 dates you wish to calculate:
    start = datetime.datetime(2014, 7, 15)
    end = datetime.datetime(2017, 7, 25)
    
    stocks = ('AAPL', 'GOOGL', 'YHOO', 'MSFT', 'AMZN', 'DAI')
    
    #Getting the data:    
    AAPL = web.DataReader('AAPL', 'google', start, end)
    GOOGL = web.DataReader('GOOGL', 'google', start, end)
    YHOO = web.DataReader('YHOO', 'google', start, end)
    MSFT = web.DataReader('MSFT', 'google', start, end)
    AMZN = web.DataReader('AMZN', 'google', start, end)
    DAI = web.DataReader('DAI', 'google', start, end)
    
    #Calculating the change:
    AAPLkey = (AAPL.ix[start]['Close'])/(AAPL.ix[end]['Close'])
    GOOGLkey = (GOOGL.ix[start]['Close'])/(GOOGL.ix[end]['Close'])
    YHOOkey = (YHOO.ix[start]['Close'])/(YHOO.ix[end]['Close'])
    MSFTkey = (MSFT.ix[start]['Close'])/(MSFT.ix[end]['Close'])
    AMZNkey = (AMZN.ix[start]['Close'])/(AMZN.ix[end]['Close'])
    DAIkey = (DAI.ix[start]['Close'])/(DAI.ix[end]['Close'])
    
    #Formatting the output in a sorted order:
    dict1 = {"AAPL" : AAPLkey, "GOOGL" : GOOGLkey, "YHOO" : YHOOkey, "MSFT" : MSFTkey, "AMZN" : AMZNkey, "DAI" : DAIkey}
    
    out = sorted(dict1.items(), key=itemgetter(1), reverse = True)
    
    for tick , change in out:
        print (tick,"\t", change)
    

    很明显,我现在想把它缩短一点,这就是我目前得到的结果:

    import numpy as np
    import pandas as pd
    from pandas_datareader import data as web
    from pandas import Series, DataFrame
    import datetime
    from operator import itemgetter
    
    #Edit below for 2 dates you wish to calculate:
    start = datetime.datetime(2014, 7, 15)
    end = datetime.datetime(2017, 7, 25)
    
    stocks = ('AAPL', 'GOOGL', 'YHOO', 'MSFT', 'AMZN', 'DAI')
    
    for eq in stocks:
        eq = web.DataReader(eq, 'google', start, end)
    
    for legend in eq:
        legend = (eq.ix[start]['Close'])/(eq.ix[end]['Close'])
    
    print (legend)
    

    那么,为了得到与我的第一个代码相同的结果,下一步是什么?

    3 回复  |  直到 8 年前
        1
  •  0
  •   snadis    8 年前

    您可以将打印语句移动到循环中。

    例如:

    for legend in eq:
        legend = (eq.loc[start]['Close'])/(eq.loc[end]['Close'])
        print(legend)
    

    改进的答案: 摆脱标签循环并打印上一个循环中的值:

    for eq in stocks:
        df = web.DataReader(eq, 'google', start, end)
        print((df.loc[start]['Close'])/(df.loc[end]['Close']))
    
        2
  •  0
  •   Chankey Pathak    8 年前

    for eq in stocks eq 因此在每次迭代中它都会被覆盖。您应该将结果存储在列表中,就像我使用 data

    数据 列出包含数据帧的列表,然后使用适当的选择。

    import numpy as np
    import pandas as pd
    from pandas_datareader import data as web
    from pandas import Series, DataFrame
    import datetime
    from operator import itemgetter
    
    # edit below for 2 dates you wish to calculate:
    start = datetime.datetime(2014, 7, 15)
    end = datetime.datetime(2017, 7, 25)
    
    stocks = ('AAPL', 'GOOGL', 'YHOO', 'MSFT', 'AMZN', 'DAI')
    
    # store all the dataframes in a list
    data = []
    
    for eq in stocks:
        data.append(web.DataReader(eq, 'google', start, end))
    
    # print required fields from each dataframe
    for df in data:
        print (df.ix[start]['Close'])/(df.ix[end]['Close'])
    

    输出:

    0.624067042032
    0.612014075932
    0.613225417599
    0.572179539021
    0.340850298595
    1.28323537643
    
        3
  •  0
  •   Louis Falconer-Flavin    8 年前

    多亏了其他答案,他们都帮了大忙。这是我的最后一个改进脚本,多亏了这个帮助:

    import numpy as np
    import pandas as pd
    from pandas_datareader import data as web
    from pandas import Series, DataFrame
    import datetime
    from operator import itemgetter
    
    # edit below for 2 dates you wish to calculate:
    start = datetime.datetime(2014, 7, 15)
    end = datetime.datetime(2017, 7, 25)
    
    stocks = ('AAPL', 'GOOGL', 'YHOO', 'MSFT', 'AMZN', 'DAI')
    
    dict1 = {}
    
    for eq in stocks:
        df = web.DataReader(eq, 'google', start, end)
        k = ((df.loc[start]['Close'])/(df.loc[end]['Close']))
        dict1 [eq] = k
    
    out = sorted(dict1.items(), key=itemgetter(1), reverse = True)
    
    for tick , change in out:
        print (tick,"\t", change)