Python pandas和MongoDB performan

2024-05-23 22:05:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用pymongo从mongodb读取数据并从mongo查询结果创建数据帧时遇到了性能问题。在

我在一个集合中有以下类型的文档,我在一个4.7GB数据大小的集合中总共有500万个文档

{      
        "CUST_LEVEL1" : "ALL CHANNELS",
        "CUST_LEVEL2" : "CUSTOMER CHANNEL",
        "CUST_LEVEL3" : "Commercial Rebate",
        "CUST_LEVEL4" : "Express Scripts Inc.",
        "CUST_LEVEL5" : "UBC ESI MC NON STND",
        "CUST_LEVEL6" : "BR - 103 OPEN 103-140Price Protection",
        "PRODUCT_LEVEL1" : "Allergan USA Inc.",
        "PRODUCT_LEVEL2" : "SPECIALIZE",
        "PRODUCT_LEVEL3" : "MED DERM",
        "PRODUCT_LEVEL4" : "TAZORAC",
        "PRODUCT_LEVEL5" : 46,
        "PRODUCT_LEVEL6" : "Tazorac .1% Gel 30 G",
        "METHODOLOGY" : "",
        "CALCULATION_PERIODS" : "",
        "FREQ_CAL_START_PERIOD_SID" : "",
        "FREQ_CAL_END_PERIOD_SID" : "",
        "PERIOD_DATE" : "2015-01-01 00:00:00",
        "ACCOUNT_GROWTH" : 2,
        "PRODUCT_GROWTH" : 3,
        "CCP_DETAILS_SID" : 563275,
        "PROJECTION_SALES" : 0,
        "PROJECTION_UNITS" : 0,
        "ACTUAL_SALES" : 0,
        "ACTUAL_UNITS" : 0,
        "EXFACTORY_ACTUAL_SALES" : 0,
        "EXFACTORY_ACTUAL_UNITS" : 0,
        "EXFACTORY_CUST_ACTUAL_SALES" : 0,
        "EXFACTORY_CUST_ACTUAL_UNITS" : 0,
        "EXFACTORY_FORECAST_SALES" : 0,
        "EXFACTORY_FORECAST_UNITS" : 0,
        "EXFACTORY_CUST_FORECAST_UNITS" : 0,
        "EXFACTORY_CUST_FORECAST_SALES" : 0,
        "ITEM_PRICE" : 0
}

我遵循这个answer使用Pymongo从mongodb读取数据,下面的代码用于从mongodb读取数据

^{pr2}$

在从mongodb中读取数据后,我编写了以下代码来导出“PROJECTION_SALES”字段。在

fd['PROJECTION_SALES']=((((fd['ACCOUNT_GROWTH']/100)+1)*((fd['PRODUCT_GROWTH']/100)+1)*
   ((fd.groupby(['CCP_DETAILS_SID',fd['PERIOD_DATE'].dt.year])['EXFACTORY_FORECAST_SALES'].transform('sum').divide(
        fd.groupby(['CCP_DETAILS_SID',fd['PERIOD_DATE'].dt.year])['EXFACTORY_FORECAST_UNITS'].transform('sum')).
fillna(fd['ITEM_PRICE']*fd['PERIOD_DATE'].dt.daysinmonth.divide((fd.assign(x=fd.PERIOD_DATE.dt.daysinmonth).groupby(['CCP_DETAILS_SID',fd['PERIOD_DATE'].dt.year])['x'].transform('sum'))))))
.pct_change(periods=3).fillna(1)).cumprod()*(fd[fd['PERIOD_DATE'].dt.year==BASE].groupby([fd['PERIOD_DATE'].dt.year,'CCP_DETAILS_SID'])['ACTUAL_SALES'].transform('sum')))

最后更新回mongodb集合。在

MongoDb和Python运行在两台不同的机器上,在windows操作系统中使用8GB的RAM。当我在上面运行Python代码时,从mongodb读取数据需要很长时间才能将数据带到Python,我可以在Mongod中找到它。在

我正在阅读收集的全部数据。分块读取数据会提高性能吗?在

Pymongo客户端有问题吗?在

有没有更好的方法来提高绩效?在


Tags: ccpdatemongodbdt读取数据productperiodunits