【问题标题】:Pandas create month end holding from activity熊猫从活动中创建月末持有
【发布时间】:2018-10-08 21:20:17
【问题描述】:

我正在尝试根据 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 中每个问题的“平衡”?

我希望这是有道理的?

谢谢。

【问题讨论】:

  • 可能会重复,但请看这里:stackoverflow.com/questions/37354105/…。按照此操作并添加一个 groupby 行,其中 credit > 0
  • 你的预期输出是什么
  • 预期输出是每个月期间余额 > 0 的问题数量。 2013-03-31 = 2 或 2013-04-30 = 4

标签: python django pandas


【解决方案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['date'] = pd.to_datetime(df['date'], format="%Y-%m-%d")

  2. 如果问题的总余额是问题,您可以将 .query('balance>0') 移到链的末尾。

测试:Python 3.6.4 + Pandas 0.22.0

【讨论】:

    【解决方案2】:

    虽然我确信代码可能不完美或不性感,但我还是让它工作了。

    首先我创建了一个“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 )
    

    欢迎任何关于如何批准的 cmets!

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2018-05-26
      • 2017-12-12
      • 1970-01-01
      • 2020-04-21
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多