Exemplo n.º 1
0
    def match_couple_hdom(self):
        '''
        Certaines personnes se déclarent en couple avec quelqu'un ne vivant pas au domicile, on les reconstruit ici. 
        Cette étape peut s'assimiler à de la fermeture de l'échantillon.
        On séléctionne les individus qui se déclare en couple avec quelqu'un hors du domicile.
        On match mariés,pacsé d'un côté et sans contrat de l'autre. Dit autrement, si on ne trouve pas de partenaire à une personne mariée ou pacsé on change son statut de couple.
        Comme pour les liens parents-enfants, on néglige ici la possibilité que le conjoint soit hors champ (étrange, prison, casernes, etc).
        Calcul aussi la variable ind['nb_enf']
        '''
        ind = self.ind  
        couple_hdom = ind['couple']==2
        # ind[couple_hdom].groupby(['etamatri','sexe'])
        # vu leur nombre, on regroupe pacsé et mariés dans le même sac
        ind.ix[(couple_hdom) & (ind['etamatri']==5),  'etamatri'] = 2
        # note que du coup, on cherche un partenaire de pacs parmi le sexe opposé. Il y a une petite par technique là dedans qui fait qu'on
        # ne gère pas les couples homosexuels
        
        #pour avoir un age plus "continu" sans gap d'une année de naissance à l'autre
        age = self.survey_date/100 - ind['anais']
        ind['age'] = (12*age + 11 - ind['mnais'])/12
                
        ## nb d'enfant
        nb_enf_mere= ind.groupby('mere').size()
        nb_enf_pere = ind.groupby('pere').size()
        enf_tot = pd.concat([nb_enf_mere, nb_enf_pere], axis=1)
        enf_tot = enf_tot.sum(axis=1)
        #comme enf_tot a le bon index on fait
        ind['nb_enf'] = enf_tot
        ind['nb_enf'] = ind['nb_enf'].fillna(0)
        
        men_contrat = couple_hdom & (ind['etamatri'].isin([2,5])) & (ind['sexe']==1)
        women_contrat = couple_hdom & (ind['etamatri'].isin([2,5])) & (ind['sexe']==2)
        men_libre = couple_hdom & (~ind['etamatri'].isin([2,5])) & (ind['sexe']==1)
        women_libre = couple_hdom & (~ind['etamatri'].isin([2,5])) & (ind['sexe']==2)   
        
       
        var_match = ['age','findet','nb_enf'] #,'classif','dip6'
        score = "- 0.4893 * other.age + 0.0131 * other.age **2 - 0.0001 * other.age **3 "\
                 " + 0.0467 * (other.age - age)  - 0.0189 * (other.age - age) **2 + 0.0003 * (other.age - age) **3 " \
                 " + 0.05   * (other.findet - findet) - 0.5 * (other.nb_enf - nb_enf) **2 "
         
        match_contrat = Matching(ind.ix[women_contrat, var_match], ind.ix[men_contrat, var_match], score)
        match_found = match_contrat.evaluate(orderby=None, method='cells')
        ind.ix[match_found.values,'conj'] =  match_found.index
        ind.ix[match_found.index,'conj'] =  match_found.values

                    
        match_libre = Matching(ind.ix[women_libre, var_match], ind.ix[men_libre, var_match], score)
        match_found = match_libre.evaluate(orderby=None, method='cells')
        ind.ix[match_found.values,'conj'] =  match_found.index
        ind.ix[match_found.index,'conj'] =  match_found.values
        ind.ix[men_libre & ~notnull(ind['conj']),['etamatri','couple']] =  [1,3]
        ind.ix[women_libre & ~notnull(ind['conj']),['etamatri','couple']] =  [1,3]  
        
        #on corrige là, les innocents qui se disent mariés et pas en couple.  
        ind.ix[ind['etamatri'].isin([2,5]) & ~notnull(ind['conj']),['etamatri','couple']] =  [3,3] 
           
        self.ind = ind   
        self.drop_variable({'ind':['couple','age']})        
Exemplo n.º 2
0
class NthPlayed:
    """ Condition to check if a condition is the nth card played """
    
    def __init__(self, n, criteria):
        """ Initialize the condition with the value of n """
        self.n = n
        self.playedFilter = ComparisonFilter(PLAYED, criteria)
        self.eventCondition = Matching(EVENT, criteria)
        
    def evaluate(self, context):
        """ Evaluate the condition """
        return self.eventCondition.evaluate(context) and len(self.playedFilter.evaluate(context)) == self.n-1
Exemplo n.º 3
0
    def matching_par_enf(self):
        '''
        Matching des parents et des enfants hors du domicile
        '''
        
        ind = self.ind
        par_look_enf = self.par_look_enf

        ## info sur les parents hors du domicile des enfants
        cond_enf_look_par = (ind['per1e']==2) | (ind['mer1e']==2)
        enf_look_par = ind[cond_enf_look_par]
        # Remarque: avant on mettait à zéro les valeurs quand on ne cherche pas le parent, maintenant
        # on part du principe qu'on fait les choses assez minutieusement                                           
        
        recode(enf_look_par, 'dip14', 'dip6', [[30,5], [41,4], [43,3], [50,2], [60,1]] , method='geq')
        recode(enf_look_par, 'classif', 'classif2', [ [[1,2,3],4], [[4,5],2], [[6,7],1], [[8,9], 3], [[10],0]], method='isin')
        enf_look_par['classif'] = enf_look_par['classif2']

        ## nb d'enfant
        nb_enf_mere_dom = ind.groupby('mere').size()
        nb_enf_pere_dom = ind.groupby('pere').size()
        nb_enf_mere_hdom = par_look_enf.groupby('mere').size()
        nb_enf_pere_hdom = par_look_enf.groupby('pere').size()
        enf_tot = pd.concat([nb_enf_mere_dom, nb_enf_pere_dom, nb_enf_mere_hdom, nb_enf_pere_hdom], axis=1)
        enf_tot = enf_tot.sum(axis=1)
        #comme enf_tot a le bon index on fait
        enf_look_par['nb_enf'] = enf_tot
        enf_look_par['nb_enf'] = enf_look_par['nb_enf'].fillna(0)
        #Note: Attention le score ne peut pas avoir n'importe quelle forme, il faut des espaces devant les mots, à la limite une parenthèse
        var_match = ['jepnais','situa','nb_enf','anais','classif','couple','dip6', 'jemnais','jemprof','sexe']
        #TODO: gerer les valeurs nulles, pour l'instant c'est très moche
        #TODO: avoir une bonne distance
        score = "- 1 * (other.anais - anais) **2 - 1.0 * (other.situa - situa) **2 - 0.5 * (other.sexe - sexe) **2 - 1.0 * (other.dip6 - dip6) \
         **2 - 1.0 * (other.nb_enf - nb_enf) **2"

        # etape1 : deux parents vivants
        cond1_enf = (enf_look_par['per1e'] == 2) & (enf_look_par['mer1e'] == 2)
        cond1_par = notnull(par_look_enf['pere']) & notnull(par_look_enf['mere'])
        # TODO: si on fait les modif de variables plus tôt, on peut mettre directement par_look_enf1
        
        #à cause du append plus haut, on prend en fait ici les premiers de par_look_enf
        match1 = Matching(enf_look_par.ix[cond1_enf, var_match], 
                          par_look_enf.ix[cond1_par, var_match], score)
        parent_found = match1.evaluate(orderby=None, method='cells')
        ind.ix[parent_found.index, ['pere','mere']] = par_look_enf.ix[parent_found, ['pere','mere']]
         
        enf_look_par.ix[parent_found.index, ['pere','mere']] = par_look_enf.ix[parent_found, ['pere','mere']]
        cond2_enf = (~notnull(enf_look_par['mere'])) & (enf_look_par['mer1e'] == 2)
        cond2_par = ~par_look_enf.index.isin(parent_found) & notnull(par_look_enf['mere'])
        match2 = Matching(enf_look_par.ix[cond2_enf, var_match], 
                          par_look_enf.ix[cond2_par, var_match], score)
        parent_found2 = match2.evaluate(orderby=None, method='cells')
        ind.ix[parent_found2.index, ['mere']] = par_look_enf.ix[parent_found2, ['mere']]        
            
        enf_look_par.ix[parent_found2.index, ['pere','mere']] = par_look_enf.ix[parent_found2, ['pere','mere']]
        cond3_enf = (~notnull(enf_look_par['pere'])) & (enf_look_par['per1e'] == 2)
        cond3_par = ~par_look_enf.index.isin(parent_found) & notnull(par_look_enf['pere'])
        # TODO: changer le score pour avoir un lien entre pere et mere plus évident
        match3 = Matching(enf_look_par.ix[cond3_enf, var_match], 
                          par_look_enf.ix[cond3_par, var_match], score)
        parent_found3 = match3.evaluate(orderby=None, method='cells')
        ind.ix[parent_found3.index, ['pere']] = par_look_enf.ix[parent_found3, ['pere']]               
        
        self.ind = ind
        self.drop_variable({'ind':['enf','per1e','mer1e','gpar'] + ['jepnais','jemnais','jemprof']})
Exemplo n.º 4
0
    def lien_parent_enfant_hdom(self):
        '''
        Travail sur les liens parents-enfants. 
        On regarde d'abord les variables utiles pour le matching puis on le réalise
        '''
        men = self.men      
        ind = self.ind
        
        ## info sur les enfants hors du domicile des parents
        par_look_enf = DataFrame()
        for k in range(1,13):
            k = str(k)
            var_hod = ['hodln','hodsex','hodan','hodco','hodip','hodenf',
                       'hodemp','hodcho','hodpri','hodniv']
            var_hod_rename=['hodln','sexe','anais','couple','dip6','nb_enf',
                            'hodemp','hodcho','hodpri','hodniv']
            var_hod_k = [var + k for var in var_hod]
            temp = men.ix[notnull(men[var_hod_k[0]]), ['id','pond']+var_hod_k]
            dict_rename = {}
            for num_varname in range(len(var_hod_rename)):
                dict_rename[var_hod_k[num_varname]] = var_hod_rename[num_varname]
            temp = temp.rename(columns=dict_rename)
            temp['situa'] = Series()
            temp['situa'][temp['hodemp']==1] = 1
            temp['situa'][temp['hodemp']==2] = 5
            temp['situa'][temp['hodcho']==1] = 4
            temp['situa'][temp['hodcho']==2] = 6
            temp['situa'][temp['hodcho']==3] = 3
            temp['situa'][temp['hodcho']==4] = 7
            
            temp['classif'] = Series()
            prive = temp['hodpri'].isin([1,2,3,4])
            temp['classif'][prive] = temp['hodpri'][prive]
            temp['classif'][~prive] = temp['hodniv'][~prive]
        
            par_look_enf = par_look_enf.append(temp)
        
        var_parent = ["id","men","sexe","anais","cs42"]
        ind['gpar'] = ind['per1e'].isin([1,2]) | ind['mer1e'].isin([1,2]) 
        info_pr = ind.ix[ind['lienpref']==0,var_parent]
        info_cj = ind.ix[ind['lienpref']==1,var_parent]    
        var_parent_pr = ['id_pr'] + var_parent[1:]
        var_parent_pr[var_parent_pr.index('anais')] = 'anais_pr'
        var_parent_cj = [nom +'_cj' for nom in var_parent]
        
    
        # d'abord les peres puis les meres
        info_pr_pere = info_pr[info_pr['sexe']==1].rename(columns={'id':'pere', 'anais':'jepnais','gpar':'gparpat','cs42':'jepprof'})
        info_cj_pere = info_cj[info_cj['sexe']==1].rename(columns={'id':'pere', 'anais':'jepnais','gpar':'gparpat','cs42':'jepprof'})
        info_pere = info_pr_pere.append(info_cj_pere)
        
        cond1 = par_look_enf['hodln']==1
        cond2 = par_look_enf['hodln']==2
        cond3 = par_look_enf['hodln']==3
        par_look_enf1 = merge(par_look_enf[cond1], info_pere, left_on='id', right_on='men', how = 'left')
        par_look_enf2 = merge(par_look_enf[cond2], info_pr_pere, left_on='id', right_on='men', how = 'left')
        par_look_enf3 = merge(par_look_enf[cond3], info_cj_pere, left_on='id', right_on='men', how = 'left')
         
        # d'abord les peres puis les meres
        info_pr_mere = info_pr[info_pr['sexe']==2].rename(columns={'id':'mere', 'anais':'jemnais','gpar':'gparmat','cs42':'jemprof'}) 
        info_cj_mere = info_cj[info_cj['sexe']==2].rename(columns={'id':'mere', 'anais':'jemnais','gpar':'gparmat','cs42':'jemprof'}) 
        info_mere = info_pr_mere.append(info_cj_mere)

        par_look_enf1 = merge(par_look_enf1, info_mere, left_on='id', right_on='men', how = 'left')
        par_look_enf2 = merge(par_look_enf2, info_pr_mere, left_on='id', right_on='men', how = 'left')
        par_look_enf3 = merge(par_look_enf3, info_cj_mere, left_on='id', right_on='men', how = 'left')        
             
        par_look_enf =  par_look_enf1.append(par_look_enf2).append(par_look_enf3)  
        par_look_enf.index = range(len(par_look_enf))

        ## info sur les parents hors du domicile des enfants
        cond_enf_look_par = (ind['per1e']==2) | (ind['mer1e']==2)
        enf_look_par = ind[cond_enf_look_par]
        # Remarque: avant on mettait à zéro les valeurs quand on ne cherche pas le parent, maintenant
        # on part du principe qu'on fait les choses assez minutieusement
                
        enf_look_par['dip6'] = Series()
        enf_look_par['dip6'][enf_look_par['diplome']>=30] = 5
        enf_look_par['dip6'][enf_look_par['diplome']>=41] = 4
        enf_look_par['dip6'][enf_look_par['diplome']>=43] = 3
        enf_look_par['dip6'][enf_look_par['diplome']>=50] = 2
        enf_look_par['dip6'][enf_look_par['diplome']>=60] = 1
        
        enf_look_par['classif2'] = enf_look_par['classif']
        enf_look_par['classif2'][enf_look_par['classif'].isin([1,2,3])] = 4
        enf_look_par['classif2'][enf_look_par['classif'].isin([4,5])] = 2
        enf_look_par['classif2'][enf_look_par['classif'].isin([6,7])] = 1
        enf_look_par['classif2'][enf_look_par['classif'].isin([8,9])] = 3
        enf_look_par['classif'] = enf_look_par['classif2']

        ## nb d'enfant
        nb_enf_mere_dom = ind.groupby('mere').size()
        nb_enf_pere_dom = ind.groupby('pere').size()
        nb_enf_mere_hdom = par_look_enf.groupby('mere').size()
        nb_enf_pere_hdom = par_look_enf.groupby('pere').size()
        enf_tot = pd.concat([nb_enf_mere_dom, nb_enf_pere_dom, nb_enf_mere_hdom, nb_enf_pere_hdom], axis=1)
        enf_tot = enf_tot.sum(axis=1)
        #comme enf_tot a le bon index on fait
        enf_look_par['nb_enf'] = enf_tot
        enf_look_par['nb_enf'] = enf_look_par['nb_enf'].fillna(0)
        #Note: Attention le score ne peut pas avoir n'importe quelle forme, il faut des espaces devant les mots, à la limite une parenthèse
        var_match = ['jepnais','jepprof','situa','nb_enf','anais','classif','couple','dip6', 'jemnais','jemprof','sexe']
        #TODO: gerer les valeurs nulles, pour l'instant c'est très moche
        #TODO: avoir une bonne distance
        score = "- 1 * (other.anais - anais) **2 - 1.0 * (other.situa - situa) **2 - 0.5 * (other.sexe - sexe) **2 - 1.0 * (other.dip6 - dip6) \
         **2 - 1.0 * (other.nb_enf - nb_enf) **2"

        # etape1 : deux parents vivants
        cond1_enf = (enf_look_par['per1e'] == 2) & (enf_look_par['mer1e'] == 2)
        cond1_par = notnull(par_look_enf['pere']) & notnull(par_look_enf['mere'])
        # TODO: si on fait les modif de variables plus tôt, on peut mettre directement par_look_enf1
        #à cause du append plus haut, on prend en fait ici les premiers de par_look_enf
        match1 = Matching(enf_look_par.ix[cond1_enf, var_match], 
                          par_look_enf.ix[cond1_par, var_match], score)
        parent_found = match1.evaluate()
        ind.ix[parent_found.index, ['pere','mere']] = par_look_enf.ix[parent_found, ['pere','mere']]
        
        enf_look_par.ix[parent_found.index, ['pere','mere']] = par_look_enf.ix[parent_found, ['pere','mere']]
        cond2_enf = (~notnull(enf_look_par['mere'])) & (enf_look_par['mer1e'] == 2)
        cond2_par = ~par_look_enf.index.isin(parent_found) & notnull(par_look_enf['mere'])
        match2 = Matching(enf_look_par.ix[cond2_enf, var_match], 
                          par_look_enf.ix[cond2_par, var_match], score)
        parent_found2 = match2.evaluate()
        ind.ix[parent_found2.index, ['mere']] = par_look_enf.ix[parent_found2, ['mere']]        
        
        parent_found = parent_found.append(parent_found2, True)    
        enf_look_par.ix[parent_found2.index, ['pere','mere']] = par_look_enf.ix[parent_found2, ['pere','mere']]
        cond3_enf = (~notnull(enf_look_par['pere'])) & (enf_look_par['per1e'] == 2)
        cond3_par = ~par_look_enf.index.isin(parent_found) & notnull(par_look_enf['pere'])
        # TODO: changer le score pour avoir un lien entre pere et mere plus évident
        match3 = Matching(enf_look_par.ix[cond3_enf, var_match], 
                          par_look_enf.ix[cond3_par, var_match], score)
        parent_found3 = match3.evaluate()
        ind.ix[parent_found3.index, ['pere']] = par_look_enf.ix[parent_found3, ['pere']]               
        
#          Temps de calcul approximatif : 15 secondes, je laisse là juste pour voir les évolution du temps de calcul par la suite 
#          mais il faudra supprimer un jour        
#         match = Matching(enf_look_par[var_match], par_look_enf[var_match], score)
#         match.evaluate()
        
        self.ind = ind
        
        pdb.set_trace()