编写for循环,以对现有数据框列中的特定行数执行计算,并将该计算结果追加到新列中

时间:2019-09-20 18:01:49

标签: python dataframe for-loop

我正在尝试根据历史库存数据计算10年的远期回报。我有一个数据框:

    import blpapi
    options = blpapi.SessionOptions()
    options.setServerHost('localhost')
    options.setServerPort(8194)
    session = blpapi.Session(options)
    session.start()
    from tia.bbg import LocalTerminal
    import tia.bbg.datamgr as dm


    # data manager
    mgr = dm.BbgDataManager()

    # Bloomberg variables
    px = 'PX_LAST'

    # start and end date
    start_dt = '1952-01-01'
    end_dt = date.today()

    # tickers
    mve_tick = 'NCBEILQ027S' # Fred
    gdp_tick = 'GDP' # Fred
    sp_tick = mgr['SPX INDEX'] # Bloomberg

    # get data
    mve = fred.get_series(mve_tick, observation_start = start_dt, 
    observation_end = end_dt)
    gdp = fred.get_series(gdp_tick, observation_start = start_dt, 
    observation_end = end_dt)
    sp = sp_tick.get_historical(px, start_dt, end_dt)

    # create data frames
    mve_df = pd.DataFrame(mve)
    mve_df.index.name = 'Date'
    mve_df.columns = ['MVE']
    gdp_df = pd.DataFrame(gdp) * 1000
    gdp_df.index.name = 'Date'
    gdp_df.columns = ['GDP']
    gdp_col = gdp_df['GDP']
    sp_df = pd.DataFrame(sp)
    sp_df.index.name = 'Date'
    sp_df.columns = ['Price']

    # convert S&P to quarterly return
    sp_df = sp_df.resample('3MS').first()
    sp_df_col = sp_df['Price']

    # merge data frames
    df = mve_df.join([gdp_col, sp_df_col])
    df.reset_index(inplace = True)
    df['Q Return'] = df['Price'].pct_change()

我想基于在“ Q Return”列上进行的计算来添加新列。

我想乘以col'Q Return'中前40个数据点的值,然后将该和乘积提高到(4/40),并将其作为我新添加的列中的第一个值。然后,下一个值将是“ Q return”列的1-41行的总和,然后将其提高到相同的指数,依此类推。

我编写了此函数来执行计算:

    def fwdreturn(returns, t):
        outp = 1
        for i in range(t, t + 40):
            outp = outp * i
        return outp'
    df['10 Year Fwd Return'] = [fwdreturn(df['Q Return'], t) for t in df['Q Return']] # this is where error is occuring
    print(df)

我得到的错误是'float'对象无法解释为整数。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我不清楚您要完成什么,但是由于您将列中的每个值都以require 'delayed_job' require 'delayed_job_active_record' class Delayed::Job establish_connection {"adapter"=>"mysql2", "host"=>"127.0.0.1", "username"=>"root", "password"=>"aaaaa", "port"=>3306, "database"=>"users", "reconnect"=>true, "pool"=>10} end 的形式传递给函数,然后尝试使用该错误,因此发生了错误将float值作为t的参数(必须为整数)

如果您尝试将列中的每个值乘以该列中的下一个40个值,也许是这样的:

range

但是,当乘以少于40个后续值时,这将遇到一个巨大的问题。您必须弄清楚那时想要的结果是什么。

答案 1 :(得分:0)

我用这个来解决它:

    def fwdreturn(returns, t):
        outp = 1
        for i in range(t, t + 40):
            try:
                outp = outp * df['Q Return'][i]
            except KeyError:
                    return np.nan
        return outp

    df['10 Year Fwd Return'] = [fwdreturn(df['Q Return'], t) for t in df.index]


    print(df)