我正在尝试根据活动df_td列表中的“问题”查找月末余额。

实际上,我只是想查找每个月末余额为正的“问题”计数。

为此,我需要根据少于月末日期的活动中的每个“问题”,“操作”和“份额”创建月末余额。因此,每个期间的总余额> 0。

“动作”用于知道它是买还是卖,“ +”或“-”。因此,每个“问题”的余额为“ +份额”减去“-份额”。

以前,我使用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})


* 注意 *


确保您的date字段格式正确(即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/

10-12 16:47