Записать цикл, чтобы выполнить вычисление на определенное количество строк из существующего столбца данных и добавить этот расчет в новый столбец - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь рассчитать 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'.

Я хочу умножить значения первых 40Точки данных в столбце «Q Return», а затем поднимите этот sumproduct до (4/40) и получите это первое значение в моем новом добавленном столбце.Тогда следующим значением будет субпродукт строк 1-41 столбца 'Q return', а затем возведем его в тот же показатель степени и т. Д.

Я написал эту функцию для выполнения вычисления:

    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 голосов
/ 20 сентября 2019

Я исправил это с помощью:

    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)
0 голосов
/ 20 сентября 2019

Я не совсем ясно, что вы пытаетесь достичь, но эта ошибка происходит, потому что вы передаете каждое значение в вашем столбце своей функции как t, а затем пытаетесь использовать это значение с плавающей запятойв качестве параметров range (которые должны быть целыми числами)

, если вы пытаетесь умножить каждое значение в столбце на следующие 40 значений в столбце, возможно, что-то вроде этого:

def fwdreturn(returns, start_index):
    outp = 1
    for i in range(0, 40):
        outp = outp * returns[start_index + i]
    return outp
df['10 Year Fwd Return'] = [fwdreturn(df['Q Return'].to_list(), idx) for idx in range(0, df['Q Return'].size)]
print(df)

ОДНАКО это столкнется с огромной проблемой, когда вы дойдете до точки, где есть менее 40 последовательных значений, на которые нужно умножиться.Вы должны будете выяснить, какой результат вы хотите получить в этот момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...