【发布时间】:2018-05-16 20:50:24
【问题描述】:
我有时间序列数据,即按日期 (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) 所有年份的季度,即 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 重现(或了解它是如何完成的)。
编辑:正如下面评论中所讨论的,这就是我已经走了多远;但是,我不确定这是否是关于 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()
【问题讨论】:
-
听起来您希望有人为您编写代码... SO 在这里帮助那些在代码中遇到特定问题的程序员,在他们进行了很好的尝试之后。如果您尝试过某事,但在某个点上卡住了,请告诉我们您尝试过什么以及难以实现什么,我相信有人会帮助您
-
如果遇到这种情况,请道歉。事实上,我已经被第 1 步卡住了,以获取季度分组的相应子组。一般来说,正如我所写,我会创建另一列
year或quarter并按总和分组。我会在我的答案中更新我到目前为止所获得的信息 -
太棒了!仅供参考,很多人确实尝试使用 SO 作为免费的编码服务,这就是为什么在你的问题中表明这不是你的意图总是好的。
标签: python pandas conditional bar-chart timeserieschart