Python:条形图-绘制所有年份中a)年和b)季度的值之和

Python:条形图-绘制所有年份中a)年和b)季度的值之和,python,pandas,conditional,bar-chart,timeserieschart,Python,Pandas,Conditional,Bar Chart,Timeserieschart,我有时间序列数据,即按日期(YYYY-MM-DD)、收益、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 现在,我想用 a) 平均回报率 b) p

我有时间序列数据,即按日期(YYYY-MM-DD)、收益、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
现在,我想用 a) 平均回报率 b) pnls之和

作者:

1) 年份,即1998年、1999年、2010年

2) 所有年份的季度,即第一季度(YYYY-01-01至YYYY-03-31)、第二季度、第四季度

此外,每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'])
这可能是每年和每个季度的两个水平条形图:

(p>1)一个返回:条形图,在杆的中间数,在杆的结尾处的Noi的和。 P< 2)PNL:条形图,在杆的中间数,NoI的总和在杆的

结束。 加上一条横穿横条的虚线垂直线,显示平均回报率和pnl

我可以在excel中完成这项工作(事实上,它是用各自的视图添加列,然后使用透视图),但我更喜欢一种“自动化”的方式,可以通过python进行复制(或者理解它是如何完成的)

编辑:正如在下面的评论中所讨论的,这就是我所取得的成绩;但是,我不确定这是否是针对1)的最快方法。我目前正在研究2)

使用多索引创建数据框-(年、季度)

然后您可以按年度、季度或年度和季度进行分组:

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()
gb_yr=df.groupby(级别=0)
gb_qtr=df.groupby(级别=1)
gb_yr_qtr=df.groupby(级别=(0,1))
>>> 
>>>#年平均数
>>>gb_年平均值()
返回pnl无交易
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
>>> 
>>>#所有年份的季度平均值
>>>gb_数量平均值()
返回pnl无交易
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
>>> 
>>>#按年度和季度表示
>>>gb_yr_数量平均值()
返回pnl无交易
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
>>>
>>>#在单柱上操作
>>>gb_yr['pnl']总和()
1998    -6.976917
1999    -1.945935
2000   -36.610206
2001    -7.060010
名称:pnl,数据类型:float64
>>>#绘图
>>>从matplotlib导入pyplot作为plt
>>>gb_年平均值()图()
>>>plt.show()
>>>plt.close()

听起来你希望有人为你编写代码。。。因此,这里是为了帮助那些在代码方面有特殊问题的程序员,在他们做了很好的尝试之后。如果你尝试了什么,并且在某一点上陷入了困境,请告诉我们你尝试了什么,以及你在努力实现什么,我相信有人会帮助你,如果是这样的话,请道歉。事实上,我已经陷入了第1)步,以获得每个季度分组的相应子组。一般来说,正如我所写的,我会创建另一列
季度
和按分组的总和。我会在我的答案中更新我的答案太棒了!仅供参考,很多人确实尝试使用SO作为免费的编码服务,这就是为什么在你的问题中表明这不是你的意图总是很好的原因。谢谢@wwii的多索引!事实上,我可以每年显示4条横线(每个季度也显示1条)。@eternity1使用多索引,您可能甚至不需要groupby的-看看文档的多索引部分,有一些非常灵活的索引方法可以避免groupby的索引-
start = datetime(1998, 1, 1)
end = datetime(2001, 12, 31)
dates = pd.date_range(start, end, freq = 'D')
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()