我正在尝试根据 df_td 事件列表中的“问题”查找月末余额。
实际上,我只是想找到每个月末余额为正的“问题”的数量。
为此,我需要根据月末日期之前的事件的每个“问题”、“操作”和“份额”创建月末余额。因此,每个期间余额 > 0 的问题总数。
“action”用于判断是买入还是卖出,“+”还是“-”。因此,每个“发行”的余额为“+ 股”减去“- 股”。
以前我使用 sql 来执行此操作,但这似乎是一种严重的浪费。
使用 Pandas 执行此操作的最佳方法是什么?
df_td
action code comm credit date \
0 + P 0.00 0.00 2013-03-27
1 + P 0.00 0.00 2013-03-27
2 - S 19.00 86751.01 2013-04-08
3 + Z 2000.00 0.00 2013-04-09
4 - S 18.71 730.49 2013-04-10
issue \
FIDELITY REAL ESTATE INVESTMENT PORTFOLIO FUND
FIDELITY NJ MUNICIPAL INCOME FUND
FIDELITY REAL ESTATE INVESTMENT PORTFOLIO FUND
AMERICAN RLTY CAP HEALTHCARE TR INC
FIDELITY NJ MUNICIPAL INCOME FUND
price shares
0 34.4800 2462.958
1 0.2003 60.963
2 35.2300 2462.958
3 10.0000 2000.000
4 12.2900 60.960
以 df_month 结束的月份示例
month
0 2013-03-31
1 2013-04-30
2 2013-05-31
3 2013-06-30
4 2013-07-31
当我循环几个月时,我如何获得 df_td 中每个问题的“平衡”?
我希望这是有道理的?
谢谢。
最佳答案
检查以下代码是否满足您的需求:
def get_balance(x):
return x.comm + x.credit + x.price*x.shares*(1 if x.action == '+' else -1)
df['balance'] = df.apply(get_balance, axis=1)
df.query('balance>0').set_index('date').resample('M').agg({'issue': 'nunique', 'balance': np.sum})
* 注意*
确保您的
日期
字段采用正确的格式(即 datetime64[ns])df['date'] = pd.to_datetime(df['date'], format="%Y-%m-%d")
如果问题的总余额是问题所在,您可以将
.query('balance>0')
移动到链的末尾。
测试:Python 3.6.4 + Pandas 0.22.0
关于python - Pandas 通过事件创建月末持有量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50072394/