У меня есть данные временного ряда, то есть по дате (ГГГГ-ММ-ДД), возвраты, pnl, # сделок:
date returns pnl no_trades
1998-01-01 0.01 0.05 5
1998-01-02 -0.04 0.12 2
...
2010-12-31 0.05 0.25 3
Теперь я хотел бы показать горизонтальные гистограммы с
а) средняя доходность
б) сумма pnls
по:
1) год, т.е. 1998, 1999, ..., 2010
2) квартал за все годы, т. Е. Q1 (YYYY-01-01 - YYYY-03-31), Q2, .., Q4
Кроме того, сумма # сделок за 1) и 2) должна обозначать число рядом с каждым из горизонтальных баров.
Так что, по моему мнению, нужно сделать два отдельных шага:
1) Получить данные в правильном формате
2) Подайте данные на график, а затем с наложением нескольких графиков.
Пример данных:
start = datetime(1998, 1, 1)
end = datetime(2001, 12, 31)
dates = pd.date_range(start, end, freq = 'D')
df = pd.DataFrame(np.random.randn(len(dates), 3), index = dates,
columns = ['returns', 'pnl', 'no_trades'])
Так что это могут быть две горизонтальные гистограммы для года и квартала каждый:
1) один для возвратов: гистограмма, число в середине бара, сумма no_trades в конце бара
2) один для pnl: гистограмма, число в середине бара, сумма no_trades в конце бара
Плюс пунктирная вертикальная линия поперек проходящих поперек баров, показывающая среднюю доходность и pnl.
Я мог бы сделать это в Excel (который фактически добавляет столбцы с соответствующим видом, а затем сводную диаграмму), но предпочел бы «автоматизированный» способ с возможностью воспроизведения (или понимания, как это делается) через python.
edit: как описано в комментарии ниже, это то, как далеко я продвинулся однако я не уверен, является ли это наиболее быстрым подходом в отношении 1). Я сейчас работаю над 2).
df_ret_year = df[['date', 'returns']].groupby(df['date'].dt.year).mean()
df_ret_quarter = df[['date', 'returns']].groupby(df['date'].dt.quarter).mean()
df_pnl_year = df[['date', 'pnl']].groupby(df['date'].dt.year).sum()
df_pnl_quarter = df[['date', 'pnl']].groupby(df['date'].dt.quarter).sum()
df_trades_year = df[['date', 'pnl']].groupby(df['date'].dt.year).sum()
df_trades_quarter = df[['date', 'pnl']].groupby(df['date'].dt.quarter).sum()