为了账号安全,请及时绑定邮箱和手机立即绑定

可以使用pymongo的方式获取证券占用资金和证券数量吗?

可以使用pymongo的方式获取证券占用资金和证券数量吗?

呼啦一阵风 2023-02-15 17:29:28
我有如下的 mongodb 数据:     code    date      num  price  money0      2  2015-11-15   10    3.8  -38.01      2  2015-11-17  -10    3.7   37.02      2  2015-11-20   20    3.5  -70.03      2  2016-04-01   10    3.2  -32.04      2  2016-04-02  -30    3.6  108.05      2  2016-04-03   50    3.4 -170.06      2  2016-11-01  -40    3.5  140.07      3  2015-02-01   25    7.0 -175.08      3  2015-05-01   35    7.5 -262.59      3  2016-03-01  -15    8.0  120.010     5  2015-11-20   50    5.0 -250.011     5  2016-06-01  -50    5.5  275.012     6  2015-02-01   35   11.5 -402.5 我想获取持有的证券数量和证券当前占用的资金 如果我把数据拿出来,我可以通过以下方式得到我想要的结果:import pandas as pdimport numpy as npdf=pd.DataFrame({'code': [2,2,2,2,2,2,2,3,3,3,5,5,6],        'date': ['2015-11-15','2015-11-17','2015-11-20','2016-04-01','2016-04-02','2016-04-03','2016-11-01','2015-02-01','2015-05-01','2016-03-01','2015-11-20','2016-06-01','2015-02-01'],        'num' : [10,-10, 20, 10, -30,50, -40, 25, 35, -15, 50, -50, 35],        'price': [3.8,3.7,3.5,3.2, 3.6,3.4, 3.5, 7, 7.5,  8, 5,  5.5, 11.5],        'money': [-38,37,-70,-32, 108,-170, 140,-175,-262.5,120,-250, 275,-402.5]        })print(df,"\n------------------------------------------\n")df['hold'] = df.groupby(['code'])['num'].cumsum()df['type'] = np.where(df['hold'] > 0, 'B', 'S')df['total']=df['total1']= df.groupby(['code'])['money'].cumsum()def FiFo(dfg):  if dfg[dfg['hold'] == 0]['hold'].count():    subT = dfg[dfg['hold'] == 0]['total1'].iloc[-1]    dfg['total'] = np.where(dfg['hold'] > 0, dfg['total']-subT, dfg['total'])  return dfgdfR = df.groupby(['code'], as_index=False)\    .apply(FiFo) \    .drop(['type', 'total1'], axis=1) \    .reset_index(drop=True)如果使用mongodb的方式(比如aggregate,或者其他),如何直接得到和上面一样的结果呢?
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

我在下面的网站上得到了这个答案 https://developer.mongodb.com/community/forums/t/help-writing-aggregation-query-using-pymongo-instead-of-pandas/6290/13

pipeline = [

  {

       '$sort': { 'code': 1, 'date': 1 }

   },

  { 

      '$group': { 

          '_id': '$code', 

          'num': { '$last': '$num' }, 'price': { '$last': '$price' }, 'money': { '$last': '$money' }, 

          'code_data': { '$push': { 'n': "$num", 'm': "$money" } } 

      } 

  },

  { 

      '$addFields': { 

          'result': { 

               '$reduce': { 

                   'input': '$code_data', 

                   'initialValue': { 'hold': 0, 'sum_m': 0, 'total': 0 }, 

                   'in': { 

                       '$let': {

                           'vars': { 

                               'hold_': { '$add': [ '$$this.n', '$$value.hold' ] },  

                               'sum_m_': { '$add': [ '$$this.m',  '$$value.sum_m' ] }

                            },

                            'in': { 

                                '$cond': [ { '$eq': [ '$$hold_', 0 ] },  

                                           { 'hold': '$$hold_', 'sum_m': 0, 'total': '$$sum_m_' },

                                           { 'hold': '$$hold_', 'sum_m': '$$sum_m_', 'total': '$$sum_m_' }

                                         ] 

                            }

                        }

                    }

               } 

           }

      } 

  },

  { 

      '$addFields': { 'code': '$_id',  'hold': '$result.hold', 'total': '$result.total' } 

  },

  { 

      '$project': { 'code_data': 0, 'result': 0, '_id': 0 } 

  },

  { 

      '$sort': { 'code': 1 } 

  }

]


查看完整回答
反对 回复 2023-02-15
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信