大熊猫从活动

时间:2018-04-28 02:51:33

标签: python django pandas

我试图根据"问题"找到月末余额。从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中的每个问题?

我希望这有道理吗?

感谢。

2 个答案:

答案 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})

*注意*

  1. 确保您的date字段格式正确(即datetime64 [ns])

    df [&#39; date&#39;] = pd.to_datetime(df [&#39; date&#39;],format =&#34;%Y-%m-%d&#34;)< / p>

  2. 如果问题的总体平衡是关注的话,您可以将.query('balance>0')移到链的末尾。

  3. 经测试: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 )

非常欢迎任何有关如何批准的意见!

感谢。