我试图根据"问题"找到月末余额。从df_td活动列表中保存。
其实我只是想找到"问题的数量"每个月末都有正余额。
要做到这一点,我需要根据每个"问题"创建月末余额。 "动作"和"股票"活动少于月末日期。因此,余额问题的总数>每个时期都有0个。
"行动"用来知道它是买入还是出售," +"或" - "。所以余额是" +股票"少了#34; - 股票"每个"问题。"
以前我用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中的每个问题?
我希望这有道理吗?
感谢。
答案 0 :(得分:1)
检查以下代码是否适合您的需求:
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})
*注意*
确保您的date
字段格式正确(即datetime64 [ns])
df [&#39; date&#39;] = pd.to_datetime(df [&#39; date&#39;],format =&#34;%Y-%m-%d&#34;)< / p>
如果问题的总体平衡是关注的话,您可以将.query('balance>0')
移到链的末尾。
经测试:Python 3.6.4 + Pandas 0.22.0
答案 1 :(得分:0)
虽然我确信代码可能不完美或性感,但我还是有这个工作。
首先我创建了一个“bal”来显示它是借记还是贷记金额。
df_td [ 'bal' ] = np.where ( df_td [ 'action' ] == "+", df_td.shares, df_td.shares * -1 )
然后我使用groupby循环了几个月。
cnt = [ ]
for i, item in enumerate ( df.month ):
// get the trades <= month
df_mo = df_trd [ (df_trd.date <= item) ]
// groupby the issue and sum the bal about
i = df_mo.groupby ( 'issue' ) [ 'bal' ].sum ()
// get the count where greater than 0
c = i [ i > 0 ].count ()
// add to list
cnt.append ( c )
非常欢迎任何有关如何批准的意见!
感谢。