Ejemplo n.º 1
0
def getCategoryDistributionInRegions(dcPaths, dfCellLocType):
    '''
        This function computes:
            1. total user number in different types of locations;
            2. category user number in different types of locations;
            3. category traffic in different types of locations; 
            
        param:
                dcPaths       - roaming paths
                dfCellLocType - index=lac-cid
        return:
               srUserNumPerRegion         - total user number per region, index:region
               dfCategoryUserNumPerRegion - category user number per region, row:category, col:region
               dfCategoryTrafficPerRegion - category traffic per region, row:category, col:region
    '''
    
    dcTotalUserNumPerRegion = {}             # total user number in different types of locations;
    dcCategoryUserNumPerRegion = {}          # category user number in different types of locations;
    dcCategoryTrafficPerRegion = {}          # category traffic in different types of locations;
    
    for path in dcPaths.values():
        for node in path.m_lsNodes:
            strKey = "%d-%d" % (node.m_nLac, node.m_nCellID)
            nRegionType = dfCellLocType.loc[strKey]["typeID"]
            strRegionName = region_type.g_dcRegionTypeName[nRegionType]
            
            # total user
            updateDictBySum(dcTotalUserNumPerRegion, strRegionName, 1)
            
            
            dcCategoryUserNumForCurrentRegion = dcCategoryUserNumPerRegion.get(strRegionName, None)
            if (dcCategoryUserNumForCurrentRegion is None):
                dcCategoryUserNumForCurrentRegion = {}
                dcCategoryUserNumPerRegion[strRegionName] = dcCategoryUserNumForCurrentRegion
                
            dcCategoryTrafficForCurrentRegion = dcCategoryTrafficPerRegion.get(strRegionName, None)
            if (dcCategoryTrafficForCurrentRegion is None):
                dcCategoryTrafficForCurrentRegion = {}
                dcCategoryTrafficPerRegion[strRegionName] = dcCategoryTrafficForCurrentRegion
                
            dcCategoryUserNumForCurretNode = {} 
            for app in node.m_lsApps:
                strCategoryName = app_category.getAppCategory(app.m_nServiceType)
                dcCategoryUserNumForCurretNode[strCategoryName] = 1
                
                updateDictBySum(dcCategoryTrafficForCurrentRegion, strCategoryName, app.m_nDownBytes)
                
                
            for (k,v) in dcCategoryUserNumForCurretNode.iteritems():
                updateDictBySum(dcCategoryUserNumForCurrentRegion, k, v)
                
    srUserNumPerRegion = pd.Series(dcTotalUserNumPerRegion)
    dfCategoryUserNumPerRegion = pd.DataFrame(dcCategoryUserNumPerRegion)
    dfCategoryTrafficPerRegion = pd.DataFrame(dcCategoryTrafficPerRegion)
    
    # delete unknown region type & app cateogry
    srUserNumPerRegion.drop(labels=region_type.g_dcRegionTypeName[region_type.ID_TYPE_UNKNOWN], inplace=True)
    
    dfCategoryUserNumPerRegion.drop(labels=app_category.g_strUnknown, inplace=True)
    del dfCategoryUserNumPerRegion[region_type.g_dcRegionTypeName[region_type.ID_TYPE_UNKNOWN]]
    
    dfCategoryTrafficPerRegion.drop(labels=app_category.g_strUnknown, inplace=True)
    del dfCategoryTrafficPerRegion[region_type.g_dcRegionTypeName[region_type.ID_TYPE_UNKNOWN]]
    
    return srUserNumPerRegion, dfCategoryUserNumPerRegion, dfCategoryTrafficPerRegion