Munge кортежей годовых финансовых данных с метками даты элемента во временной ряд в Python Pandas
Я пытаюсь преобразовать плоский файл дампа данных SQL -> .csv во временные ряды для каждой компании.
Суть для меня заключается в том, что данные организованы в годовой набор по 4 квартала. Даты окончания квартала - это финансовые кварталы, указанные в первом кортеже каждой компании. Мне нужно объединить данные во временные ряды календарных кварталов, но я не могу понять, как это сделать.
Как я могу построить индекс даты и времени из этих меток данных?
В каждой компании всегда одинаковое количество кортежей, но они могут содержать нулевые значения. В приведенных ниже примерах строк данных выделены 2 компании с разными датами окончания финансового года.
eps_tuples[300:400]
Name Ticker Field Year Qtr 1 Qtr 2 Qtr 3 Qtr 4 FY
953 Accuray Inc ARAY EPS Year Sep.30 Dec.31 Mar.31 Jun.30 Full Year
943 Accuray Inc ARAY EPS 2012 -0.38 -0.15 -0.21 -0.28 -1.02
944 Accuray Inc ARAY EPS 2013 -0.31 -0.35 -0.42 -0.25 -1.33
945 Accuray Inc ARAY EPS 2014 -0.21 -0.07 -0.06 -0.13 -0.47
946 Accuray Inc ARAY EPS 2015 -0.27 -0.13 -0.04 -0.07 -0.51
947 Accuray Inc ARAY EPS 2016 -0.12
960 Accuride Corp ACW EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
961 Accuride Corp ACW EPS 2012 -0.06 -0.02 -0.37 -0.47 -0.92
962 Accuride Corp ACW EPS 2013 -0.31 -0.11 -0.18 0.04 -0.56
963 Accuride Corp ACW EPS 2014 -0.07 0.11 0.02 -0.10 -0.04
964 Accuride Corp ACW EPS 2015 -0.01 0.13 0.04 -0.05 0.11
965 Accuride Corp ACW EPS 2016 0.02 0.11 0.04
Я начал с нарезки df, чтобы получить только квартальные метки даты
eps_tuples[eps_tuples['FY']=='Full Year'][42:47]
Name Ticker Field Year Qtr 1 Qtr 2 Qtr 3 Qtr 4 FY
906 ACCO Brands ACCO EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
924 Accretive Healt ACHI EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
942 Accuray Inc ARAY EPS Year Sep.30 Dec.31 Mar.31 Jun.30 Full Year
960 Accuride Corp ACW EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
978 ACE Limited ACE EPS Year Mar.31 Jun.30 Sep.30 Dec.31 Full Year
Тогда я обычно делал бы диапазон дат панд что-то вроде
rng=pd.date_range(end='2016-12-31',freq='Q',periods=20)
Я озадачен тем, что существует максимум 20 периодов, возможно, меньше, а начало и конец динамически определяются первым кортежем и не привязаны к позиции в кортеже, как можно было бы предположить, если бы кортежи были календарными годами.
Как мне поступить?
1 ответ
Вам нужно создать даты из имеющихся у вас данных, а не определять диапазон. Это требует изменения ваших данных. Не самый быстрый, но, похоже, это работает с вашими примерами данных:
import datetime
ts_dict = {}
for company in df['Name'].unique():
tmpdf = df[df['Name'] == company][['Year', 'Qtr 1', 'Qtr 2', 'Qtr 3', 'Qtr 4']].reset_index(drop=True)
tmpdf.columns = tmpdf.iloc[0]
tmpdf = tmpdf.drop(0).set_index('Year').unstack().reset_index(name=company)
tmpdf.index = (tmpdf['Year'].apply(str) + tmpdf[0]).apply(lambda x: datetime.datetime.strptime(x, "%Y%b.%d"))
ts_dict[company] = tmpdf[company]
pd.DataFrame.from_dict(ts_dict)
дающий
Accuray Inc Accuride Corp
2012-03-31 -0.21 -0.06
2012-06-30 -0.28 -0.02
2012-09-30 -0.38 -0.37
2012-12-31 -0.15 -0.47
2013-03-31 -0.42 -0.31
2013-06-30 -0.25 -0.11
2013-09-30 -0.31 -0.18
2013-12-31 -0.35 0.04
2014-03-31 -0.06 -0.07
2014-06-30 -0.13 0.11
2014-09-30 -0.21 0.02
2014-12-31 -0.07 -0.1
2015-03-31 -0.04 -0.01
2015-06-30 -0.07 0.13
2015-09-30 -0.27 0.04
2015-12-31 -0.13 -0.05
2016-03-31 NaN 0.02
2016-06-30 NaN 0.11
2016-09-30 -0.12 0.04
2016-12-31 NaN NaN