猿问

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

我有如下的 mongodb 数据:


     code    date      num  price  money

0      2  2015-11-15   10    3.8  -38.0

1      2  2015-11-17  -10    3.7   37.0

2      2  2015-11-20   20    3.5  -70.0

3      2  2016-04-01   10    3.2  -32.0

4      2  2016-04-02  -30    3.6  108.0

5      2  2016-04-03   50    3.4 -170.0

6      2  2016-11-01  -40    3.5  140.0

7      3  2015-02-01   25    7.0 -175.0

8      3  2015-05-01   35    7.5 -262.5

9      3  2016-03-01  -15    8.0  120.0

10     5  2015-11-20   50    5.0 -250.0

11     5  2016-06-01  -50    5.5  275.0

12     6  2015-02-01   35   11.5 -402.5 

我想获取持有的证券数量和证券当前占用的资金 如果我把数据拿出来,我可以通过以下方式得到我想要的结果:

import pandas as pd

import numpy as np


df=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 dfg

dfR = df.groupby(['code'], as_index=False)\

    .apply(FiFo) \

    .drop(['type', 'total1'], axis=1) \

    .reset_index(drop=True)


如果使用mongodb的方式(比如aggregate,或者其他),如何直接得到和上面一样的结果呢?


呼啦一阵风
浏览 162回答 1
1回答

忽然笑

我在下面的网站上得到了这个答案 https://developer.mongodb.com/community/forums/t/help-writing-aggregation-query-using-pymongo-instead-of-pandas/6290/13pipeline = [  {       '$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 }   }]
随时随地看视频慕课网APP

相关分类

Python
我要回答