Python:条形图-绘制所有年份中a)年和b)季度的值之和
我有时间序列数据,即按日期(YYYY-MM-DD)、收益、pnl和交易: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
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()