Python: гистограмма - построение суммы значений а) года и б) квартала за все годы - PullRequest
0 голосов
/ 16 мая 2018

У меня есть данные временного ряда, то есть по дате (ГГГГ-ММ-ДД), возвраты, 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()

1 Ответ

0 голосов
/ 17 мая 2018
start = datetime(1998, 1, 1)
end = datetime(2001, 12, 31)
dates = pd.date_range(start, end, freq = 'D')

Создайте DataFrame с мультииндексом - (год, квартал)

index = pd.MultiIndex.from_tuples([(thing.year, thing.quarter) for thing in dates])
df = pd.DataFrame(np.random.randn(len(dates), 3), index = index, 
                  columns = ['returns', 'pnl', 'no_trades'])

Затем вы можете сгруппировать по году, кварталу или году и кварталу:

gb_yr = df.groupby(level=0)
gb_qtr = df.groupby(level=1)
gb_yr_qtr = df.groupby(level=(0,1))

>>> 
>>> # yearly means
>>> gb_yr.mean()
       returns       pnl  no_trades
1998  0.080989 -0.019115   0.142576
1999 -0.040881 -0.005331   0.029815
2000 -0.036227 -0.100028  -0.009175
2001  0.097230 -0.019342  -0.089498
>>> 
>>> # quarterly means across all years
>>> gb_qtr.mean()
    returns       pnl  no_trades
1  0.036992  0.023923   0.048497
2  0.053445 -0.039583   0.076721
3  0.003891 -0.016180   0.004619
4  0.007145 -0.111050  -0.054988
>>> 
>>> # means by year and quarter
>>> gb_yr_qtr.mean()
         returns       pnl  no_trades
1998 1 -0.062570  0.139856   0.105288
     2  0.044946 -0.008685   0.200393
     3  0.152209  0.007341   0.119093
     4  0.185858 -0.211401   0.145347
1999 1  0.085799  0.072655   0.054060
     2  0.111595  0.002972   0.068792
     3 -0.194506 -0.093435   0.107210
     4 -0.161999 -0.001732  -0.109851
2000 1  0.001543 -0.083488   0.174226
     2 -0.064343 -0.158431  -0.071415
     3 -0.036334 -0.037008  -0.068717
     4 -0.045669 -0.121640  -0.069474
2001 1  0.123592 -0.032138  -0.140982
     2  0.121582  0.005810   0.109115
     3  0.094194  0.058382  -0.139110
     4  0.050388 -0.109429  -0.185975
>>>
>>> # operate on single columns
>>> gb_yr['pnl'].sum()
1998    -6.976917
1999    -1.945935
2000   -36.610206
2001    -7.060010
Name: pnl, dtype: float64

>>> # plotting
>>> from matplotlib import pyplot as plt
>>> gb_yr.mean().plot()
<matplotlib.axes._subplots.AxesSubplot object at 0x000000000C04BF28>
>>> plt.show()
>>> plt.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...