Как я могу зациклить функцию с несколькими входами? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь получить доход от моего исследования из функции (код ниже).К сожалению, я могу заставить его повторять только все даты, но не все значения индекса.Что я пробовал:

for i in index_c.iloc[:,1:]:
    for dt in MICH_CONSUMER_SENTIMENT['Date']:
        c=get_cum_returns(index_c,i,dt,6,5,'MXUS Index')
        cum_ret['index_return'].append(c[0])
        cum_ret['bench_return'].append(c[1])
        cum_ret['abnormal_return'].append(c[2])
        cum_ret['date'].append(dt)

Я могу получить один для работы цикла: для dt в MICH_CONSUMER_SENTIMENT ['Date']: ... , так что он добавляет все значения датыдля одного индекса в словаре 'cum_ret'.Но если я пытаюсь зациклить даты и имена индексов, я получаю следующую ошибку, и она добавляет только часть данных в dict:

ошибка

Как я могу решитьэта проблема, чтобы все значения были добавлены в словарь?Есть ли альтернативный способ решения этой проблемы?Я уверен, что есть, просто я довольно новичок в Python.

ФУНКЦИЯ

def get_cum_returns(prices, sid, date, days_before, days_after, 
    benchmark_sid):
    """
    Calculates cumulative and abnormal returns for the sid & benchmark

    Parameters
    ----------
    prices : pd.DataFrame
        Pricing history DataFrame obtained from `get_pricing`. Index should
        be the datetime index and sids should be columns.
    sid : int or zipline.assets._assets.Equity object
        Security that returns are being calculated for.
    date : datetime object
        Date that will be used as t=0 for cumulative return calcuations. All
        returns will be calculated around this date.
    days_before, days_after : int
        Days before/after to be used to calculate returns for.
    benchmark :  int or zipline.assets._assets.Equity object

    Returns
    -------
    sid_returns : pd.Series
        Cumulative returns time series from days_before ~ days_after from date
        for sid
    benchmark_returns : pd.Series
        Cumulative returns time series for benchmark sid
    abnormal_returns : pd.Series
        Abnormal cumulative returns time series for sid compared against 
    benchmark
    """
    prices=index_c
    date=dt
    days_before, days_after=6,5
    sid=i
    benchmark_sid='MXUS Index'
    day_zero_index = prices.index.searchsorted(date)
    #print 'day_zero_index', day_zero_index
    starting_index = max(day_zero_index - days_before, 0)
    ending_index   = min(day_zero_index + days_after + 1, len(prices.index) - 1)

    if starting_index < 0 or ending_index >= len(prices.index):
        assert False #is this possible
        return None

    if sid == benchmark_sid:
        temp_price = prices.iloc[starting_index:ending_index,:].loc[:,[sid]]
    else:
        temp_price = prices.iloc[starting_index:ending_index,:].loc[:,[sid, 
    benchmark_sid]]

    beta = calc_beta(sid, benchmark_sid, temp_price)
    if beta is None:
        #print 'beta is None'
        return

    daily_ret = temp_price.pct_change().fillna(0)

    daily_ret['abnormal_returns'] = daily_ret[sid] - 
    beta*daily_ret[benchmark_sid]

    cum_returns = (daily_ret + 1).cumprod() - 1

    try:
        # If there's not enough data for event study,
        # return None
        cum_returns.index = range(starting_index - day_zero_index,
                                  ending_index - day_zero_index)
    except e:
        print ('exception', e)
        return None

    sid_returns      = cum_returns[sid] - cum_returns[sid].iloc[0]
    bench_returns    = cum_returns[benchmark_sid] - 
    cum_returns[benchmark_sid].iloc[0]
    abnormal_returns = cum_returns['abnormal_returns'] - 
    cum_returns['abnormal_returns'].iloc[0]

    return sid_returns, bench_returns, abnormal_returns

Вся помощь очень ценится.

С уважением, Джака

1 Ответ

0 голосов
/ 28 декабря 2018

Сообщение об ошибке сообщает вам о проблеме:

'NoneType' object is not subscriptable

Ваша функция может время от времени возвращать None, т. Е .: в случае обнаружения исключения.Но тогда ваш цикл не проверяет, является ли c значением None, и пытается его подписать, т. Е. Делать вид, что это список.

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