Я ненавижу публиковать ответ на свой вопрос, но, решив проблему, я чувствую, что должен, если кто-то еще столкнется с такой проблемой.Я не гарантирую, что это самое элегантное решение.Вероятно, это не так.
Я загрузил данные из FRED (ссылка в ответе) в файл treasury-1year-rates_1980-present.csv
, содержащий данные с 1979-12-31 до настоящего момента (в настоящее время 2018-06-12),Вам нужно получить данные за 1979-12-31, потому что 1980-01-01 - это NA, так как это федеральный праздник, то есть Новый год.
raw_tbill = pd.read_csv(path.join(base_dir, 'treasury-1year-rates_1980-present.csv'),
parse_dates=['DATE'], na_values=['.'])
raw_tbill.columns = [s.lower() for s in raw_tbill.columns.values.tolist()]
print(f'Loaded t-bill 1-year rates data, from 1980 to present, with {len(raw_tbill)} entries')
В данных FRED используется .
для представления отсутствующих данных.Таким образом, включение na_values['.']
, и мы также хотим, чтобы столбец даты был проанализирован, таким образом, включение параметра parse_dates
.
Мне нравится все в нижнем регистре.Он хранится здесь только потому, что я не хочу менять имена всех следующих столбцов.Это настоящая боль.
Два заблуждения, или ошибки, чтобы убраться с дороги первыми.
Арифметика означает неправильно. Арифметика означает, что неправильно иметь дело с процентамиданные.Вы должны использовать геометрические средства.См. это для получения дополнительной информации.Это создает данные квартал за кварталом.
Данные на самом деле не ежедневные. В любом случае, эти данные на самом деле не ежедневные.Для решения этой проблемы и того факта, что казначейские векселя по-прежнему оплачиваются в праздничные и выходные дни, все эти выходные должны быть заполнены распространяемыми вперед данными.В противном случае геометрические средние значения будут неправильными, поскольку одно из геометрических средних предположений состоит в том, что данные равномерно распределены во времени (если только вы не взвесите их, что фактически является тем же, что я делаю здесь, но я сделал это, потому что вычисление весоввремя подумать. Это не так).
# fill in days and put in the previous applicable figure
# need to deal with gaps in data
raw_tbill.set_index('date', inplace=True)
raw_tbill.dropna(inplace=True)
tbill_data = raw_tbill.reindex(pd.date_range(raw_tbill.index.min(), raw_tbill.index.max(), freq='D'),
method='ffill')
Годы не завершены. После этого у меня есть годы, которые на самом деле не заполнены (например, по-видимому,1979-12-31 пусто).Их нужно удалить за бесполезность.
# drop incomplete years
count = tbill_data.set_index([tbill_data.index.year, tbill_data.index.day]).count(level=0)
years = count[count['dgs1'] >= 365].index
tbill_data['tmp_remove'] = tbill_data.apply(lambda r : 0 if r.name.year in years else 1, axis=1)
tbill_data = tbill_data[tbill_data['tmp_remove'] == 0].drop('tmp_remove', axis=1)
Отсюда, если вы следуете коду, индекс теперь равен DatetimeIndex
.Таким образом, столбец даты отсутствует.
Получите квартальные индексы и рассчитайте. Теперь, технически, вам не нужно делать этот шаг.Это в моем коде, потому что я должен произвести это.Однако на этом пути обработки вы должны сделать это, просто чтобы получить индексы для каждого квартала.В противном случае ни четверти, ни сигары.
Кроме того, данные DSG1 представлены в процентах, мы не хотим их получать, если вы что-то с ними делаете, вы, вероятно, хотите их в пропорции, т.е. 100pc = 1.
# turn the daily tbill data into quarterly data
# use geometric means
tbill_data['dgs1'] = tbill_data['dgs1'] / 100
tbill_qtrly = tbill_data.resample('Q').apply(lambda x: gmean(x).item())
В любом случае я затем определяю функцию для вычисления года до даты, которая также использует геометрические средние значения для этого.Это тогда поднабор соответствующих данных на дату.Я полагаю, что год от года включает отчетную дату, оправдывающую <=
.Если это на самом деле не так, прокомментируйте.
def calculate_ytd(row):
year = row.name.year
year_data = tbill_data[tbill_data.index.year == year]
applicable_data = year_data[year_data.index <= row.name]
return gmean(applicable_data['dgs1'])
tbill_qtrly['dgs1_ytd'] = tbill_qtrly.apply(lambda r : calculate_ytd(r), axis=1)
Применение этой функции производит данные.
Пост-сценарий. Можно также использовать ежеквартальногеометрическое среднее в качестве основы для расчета, если все входные переменные положительные, начиная с
, где все переменные a - e положительны.