def coherence_libelle_infractiontype():
    ''' On regarde la cohérence entre les colonnes de infraction_histo
    et celle que l'on peut avoir dans infraction_type

    cohérence entre l'infraction type et articles, titre et libelle
    '''

    infraction_histo = read_table('infractionhisto')

    infractiontype = read_table('infractiontype')
    infractiontype.drop(['active', 'ordre'], axis=1, inplace=True)
    infractiontype.rename(columns={'id': 'infractiontype_id'}, inplace=True)

    test = infraction_histo.merge(infractiontype,
                                  on='infractiontype_id',
                                  how='outer',
                                  indicator=True)

    pb_article = test['articles_x'] != test['articles_y']
    test['pb_article'] = pb_article
    pb_titre = test['titre_x'] != test['titre_y']
    test['pb_titre'] = pb_titre
    pb_libelle = test['libelle_x'] != test['libelle_y']
    test['pb_libelle'] = pb_libelle
    pb_quelconque = pb_article | pb_titre | pb_libelle

    pb = test[pb_quelconque]
    len(test) - len(pb)  # on a 30% sans problème
    pb[['pb_libelle', 'pb_titre', 'pb_article']].sum()
    pb.groupby(['pb_libelle', 'pb_titre', 'pb_article']).size()
    # bcp de problème de cohérence titre

    pb[pb_libelle].groupby(['libelle_x', 'libelle_y']).size()
    infraction_histo.libelle.isin(infractiontype.libelle).value_counts()
def _recherche_valeurs_in_id(liste_valeurs, in_vars=['id'], verbose=False):
    ''' fonction utile pour la questions suivante
        elle cherche dans les tables si les id contiennent toutes les
        valeurs de liste_valeurs

        si la liste des valeurs est _id alors on cherche dans toutes les
        colonnes se terminant par _id
    '''
    primary_key, foreign_key = read_sql()
    tables_on_disk = set(x[:-4] for x in os.listdir(path_sarah))

    potentiel_match = []
    vars_a_etudier = in_vars

    for name in tables_on_disk:
        tab = read_table(name, nrows=0)
        if in_vars == '_id':
            vars_a_etudier = [col for col in tab.columns if col[-3:] == '_id']

        if any([var in tab.columns for var in vars_a_etudier]):
            if verbose:
                print('table', name)
            tab = read_table(name)

            for var in vars_a_etudier:
                if var in tab.columns:
                    id_tab = tab[var]
                    if all(liste_valeurs.isin(id_tab)):
                        if verbose:
                            print(' matched pour', id_tab, '!!!')
                        if in_vars == '_id':
                            potentiel_match.append((name, var))
                        else:
                            potentiel_match.append(name)
    return potentiel_match
def signalement_des_affaires():
    ''' lorsque l'on fuisionne affhygiene avec signalement affaire,
        on a beaucoup de raté, comment se fait-ce ?
    '''
    affaire = read_table('affaire')
    affhyg = read_table('affhygiene')
    signalement_affaire = read_table('signalement_affaire')
    test = pd.merge(affhyg,
                    signalement_affaire,
                    on='affaire_id',
                    how='outer',
                    indicator='provenance')
    #test.provenance.value_counts()
    #both          30692
    #left_only     10433
    #right_only      179
    # => beaucoup d'affaire n'ont pas de signalement
    id_affaires_sans_signalement = test.loc[test.provenance == 'left_only',
                                            'affaire_id']
    id_affaires_sans_signalement.sort_values(inplace=True)
    shift = id_affaires_sans_signalement - id_affaires_sans_signalement.shift(
        1)
    # => 2/3 beaucoup d'écart de 1 comme si cela concernait des affaires proches

    # exemple
    # random = id_affaires_sans_signalement.iloc[5644] # = 5685
    random = 5644
    affaire_ids = id_affaires_sans_signalement.iloc[random - 5:random + 5]

    bien_id_correspondant = affhyg.loc[affhyg['affaire_id'].isin(affaire_ids)]
    cr = read_table('cr_visite')
    cr[cr['affaire_id'].isin(bien_id_correspondant['affaire_id'])]

    ccc = cr[cr['affaire_id'].isin(id_affaires_sans_signalement)]
def lien_infractionhisto_infraction():
    infraction_brut = read_table('infraction')
    infractionhisto = read_table('infractionhisto')

    # étudie le lien entre infractionhisto et infraction
    #len(infraction_brut)  # 31022
    #len(infractionhisto)  # 49614
    assert infractionhisto.infraction_id.isin(infraction_brut.id).all()
def incitation_table():
    """
       Crée la table <incitation> au ravalement.
    """
    incitation_ravalement = read_table('incitation_ravalement')
    #pour la même affaire ouverte à une adresse donnée
    # plusieurs incitations au ravalement possibles (jusqu'à 20)

    incitation_ravalement.drop(
        ['copieconforme_en_cours', 'renotification_en_cours', 'nature'],
        axis=1,
        inplace=True,
    )
    incitation_ravalement.rename(columns={
        'id':
        'incitation_ravalement_id',
        'date_envoi':
        'date_envoi_incitation_ravalement'
    },
                                 inplace=True)
    incitation_ravalement['date_envoi_incitation_ravalement'] = \
                incitation_ravalement['date_envoi_incitation_ravalement'].str[:10]

    incitation_ravalement_facade = read_table('incitation_ravalement_facade')
    incitation_ravalement_facade.rename(
        columns={'facadesconcernees_id': 'facade_id'},
        inplace=True,
    )
    incitation = incitation_ravalement.merge(incitation_ravalement_facade,
                                             on='incitation_ravalement_id',
                                             how='left')

    ###Petit travail sur les délais d'incitation ###
    delai = incitation['delai'] * (
        (incitation['type_delai'] == 3).astype(int) + 30 *
        ((incitation['type_delai'] == 4).astype(int)))
    incitation['delai_incitation_raval_en_jours'] = delai
    incitation.drop(['delai', 'type_delai'], axis=1, inplace=True)

    # une incitation peut consuire à un arrêté
    arrete_ravalement_incitation_ravalement = read_table(
        'arrete_ravalement_incitation_ravalement')
    arrete_ravalement_incitation_ravalement.rename(
        columns={'incitationsreferencees_id': 'incitation_ravalement_id'},
        inplace=True)
    incitation = incitation.merge(
        arrete_ravalement_incitation_ravalement,
        on='incitation_ravalement_id',
        how='left',
        #indicator = True,
    )
    incitation.rename(
        columns={'arrete_ravalement_id': 'arrete_suite_a_incitation_id'},
        inplace=True)
    incitation['arrete_suite_a_incitation'] = incitation[
        'arrete_suite_a_incitation_id'].notnull()
    incitation.drop('arrete_suite_a_incitation_id', axis=1, inplace=True)
    return incitation
def adresses_via_signalement(table,
                             liste_var_signalement=None,
                             prevent_duplicates=True):
    '''
    Trouve l'adresse d'une affaire en utilisant le signalement
    La fonction utilise une table contenant une variable affaire_id
    et
    retrounes la table avec l'adresse_id correspondant à chaque affaire
    repérée par affaire_id
    en éliminant les affaire_id qui ne sont pas dans signalement_affaire
    '''
    assert 'affaire_id' in table.columns


    # signalements
    signalement_affaire = read_table('signalement_affaire')

    signalement = read_table('signalement')
    var_to_keep = ['id', 'adresse_id']
    if liste_var_signalement is not None:
        var_to_keep += liste_var_signalement

    signalement = signalement[var_to_keep]
    ##Rename 'id' column of signalement table
    signalement.rename(columns = {'id':'signalement_id'}, inplace = True)
    table_signalement = pd.merge(signalement_affaire, signalement,
                                 on='signalement_id',
                                 how='left')

    # est-ce que pour une affaire on a une seule adresse
    table_signalement.groupby(['affaire_id'])['adresse_id'].nunique().value_counts()
    # => non
    # l'étude de ces cas, montre que l'on peut utiliser une seule des adresse_id
    # adresse[adresse.adresse_id.isin(table_signalement.loc[table_signalement.affaire_id == 12795, 'adresse_id'])]
    if prevent_duplicates:    
        table_signalement.drop_duplicates(['affaire_id'], inplace=True)


    assert table_signalement.affaire_id.value_counts().max() == 1
    if 'signalement_id' in table.columns:
        table.rename(columns = {'signalement_id':'signalement_id_orig'},
                                inplace = True)
    if 'libelle' in table_signalement.columns:
        table_signalement.rename(columns = {'libelle':'libelle_table'}, inplace = True)

    table_avec_signalement = pd.merge(table, table_signalement,
                                         on='affaire_id',
                                         how='left',
                                         indicator='merge_signalement')
    #    len(table.affaire_id) # => 37322
    #    len(lien_signalement_affaire.affaire_id) ## => 30871
    #    len(result1.affaire_id) ## => 30692
    return table_avec_signalement
Beispiel #7
0
def pv_table():
    """"
        Crée la table <PV> ravalement: affaires avec pv (ou non) avec quelques
        infos comme la date de l'envoi du pv, quel facade concernée, quel
        immeuble.
    """
    ##Travail sur la table pv ravalement##
    pv_ravalement = read_table('pv_ravalement')
    pv_ravalement.rename(columns={
        'id': 'pv_ravalement_id',
        'date_envoi': 'date_envoi_pv',
        'date_creation': 'date_creation_pv'
    },
                         inplace=True)
    #pb_de_date = ['11-04-29 00:00:00']
    #pv_ravalement.query('date_envoi >= "11-04-29 00:00:00"')
    pv_ravalement['date_envoi_pv'] = pv_ravalement['date_envoi_pv'].str[:10]
    pv_ravalement['date_creation_pv'] = pv_ravalement[
        'date_creation_pv'].astype(str).str[:10]
    pv_ravalement.drop(
        ['copieconforme_en_cours', 'renotification_en_cours', 'numero'],
        axis=1,
        inplace=True,
    )
    # un procès verbal a été envoyé à date_envoi

    ##Merge avec affravalement##
    affravalement = read_table('affravalement')
    table = affravalement.merge(
        pv_ravalement,
        on='affaire_id',
        how='left',
    )

    #tables_reliees_a('pv_ravalement')

    pv_ravalement_facade = read_table('pv_ravalement_facade')
    pv_ravalement_facade.rename(
        columns={'facadesconcernees_id': 'facade_id'},
        inplace=True,
    )
    ##Merge avec pv_ravalementè_facade##
    #Fais la liaison avec les façades
    table = table.merge(
        pv_ravalement_facade,
        on='pv_ravalement_id',
        how='left',
        #indicator = True,
    )

    return table
Beispiel #8
0
def columns_by_table():
    columns = dict()
    tables_on_disk = set(x[:-4] for x in os.listdir(path_sarah))
    for table in tables_on_disk:
        tab = read_table(table, nrows=0)
        columns[table] = tab.columns
    return columns
def table_affaire():
    """  retourne la table avec date, adresse_id et affaire_id """
    cr = read_table('cr_visite')[['date_creation','affaire_id']]
    assert all(cr.date_creation.notnull())

    # ne garde que la date (pas l'heure)
    cr['date_creation'] = cr['date_creation'].dt.date
    # on garde une seule date par affaire (la premiere)
    cr = cr.groupby('affaire_id')['date_creation'].min().reset_index()

    hyg = read_table('affhygiene')[['affaire_id', 'bien_id']]
    # on garde les affaires ayant déjà eu au moins une visite
    hyg = hyg.merge(cr,
                    on = 'affaire_id',
                    how = 'right')
    return hyg
Beispiel #10
0
def facade_table():
    """
       Crée la table <façade> qui donne des infos sur chaque façade: son nom
       (voir désignation), sa hauteur, le matériau de construction.
    """
    facade = read_table('facade')
    facade.rename(columns = {'id':'facade_id'},inplace = True)
    ####Merge avec type facade###
    def add_info(table_ini, info_table_name, col):
        info_table = read_table(info_table_name)
        info_table.drop(['active','ordre'], axis = 1, inplace = True)
        info_table.rename(columns = {'id':col[0],'libelle':col[1]},
                          inplace = True,
                          )
        table = table_ini.merge(info_table, on = col[0], how = 'left')
        table.drop([col[0]], axis = 1, inplace = True)
        return table
    ####Merge avec type facade###
    table = add_info(facade,'typefacade',['typefacade_id','type_facade'])
    ###Merge avec haut facade###
    table = add_info(table, 'hautfacade',['hautfacade_id','hauteur_facade'])
    ####Merge avec mater facade###
    table = add_info(table, 'materfacade',['materfacade_id','materiau_facade'])
    ####Merge avec affect facade###
    table = add_info(table, 'affectfacade',['affectfacade_id','affectation_facade'])
    ####Variables inutiles####
    table.drop(['the_geom','possedecbles','possedeterr','recolable'], 
               axis = 1, inplace = True)
    return table
Beispiel #11
0
def parcelles():
    ''' travaille au niveau de la parcelle cadastrale et offre une
        table propre
        A l'issue de ce programme, les tables:
            - parcelle_cadastrale
            - ilot
            - quartier_admin
            - arrondissement
        n'ont plus de raison d'être appelée
    '''
    print(" On a :\n",
          " - 75105 parcelle cadastralle, dans\n",
          " - 5031 ilots, dans\n",
          " - 80 quarties administratifs, dans\n",
          " - 20 arrondissements, dans\n",
          )

    parcelle_cadastrale = read_table('parcelle_cadastrale')
    parcelle_cadastrale.rename(columns = {'id':'parcelle_id'}, inplace = True)
    # les variables non retenues n'ont pas d'intérêt
    parcelle_cadastrale = parcelle_cadastrale[['parcelle_id','ilot_id',\
                                               'code_cadastre']]

    ilot = read_table('ilot')
    ilot.rename(columns = {'nsq_ia':'ilot_id'}, inplace = True)
    parcelle_augmentee = parcelle_cadastrale.merge(ilot, on='ilot_id', how='left')

    quartier_admin = read_table('quartier_admin')
    quartier_admin = quartier_admin[['nsq_qu', 'tln', 'nsq_ca']]
    quartier_admin.rename(columns = {'nsq_qu':'nqu',
                                     'tln': 'quartier_admin'}, inplace = True)

    parcelle_augmentee = parcelle_augmentee.merge(
        quartier_admin, on='nqu', how='left')

    arrondissement = read_table('arrondissement')
    arrond = arrondissement[['id', 'codeinsee', 'codepostal', 'nomcommune']]
    arrond.rename(columns = {'id':'nsq_ca'}, inplace = True)
    parcelle_augmentee = parcelle_augmentee.merge(arrond, on='nsq_ca', how='left')

    # on renomme ilot_id pour ne pas chercher à fusionner encore par la suite
    parcelle_augmentee.drop(['nqu', 'nsq_ca'], axis=1, inplace=True)
    parcelle_augmentee['ilot_id'].fillna(-1, inplace=True)
    parcelle_augmentee['numero_ilot'] = parcelle_augmentee['ilot_id'].astype(int)
    del parcelle_augmentee['ilot_id']

    return parcelle_augmentee
Beispiel #12
0
def non_empty_tables():
    tables_on_disk = set(x[:-4] for x in os.listdir(path_sarah))
    for table in tables_on_disk:
        path_file = os.path.join(path_sarah, table + '.csv')
        path_good = os.path.join(path_csv_good, table + '.csv')
        tab = read_table(table)
        if len(tab) > 0:
            shutil.copy(path_file, path_good)
def infraction_table():
    infraction = read_table('infraction')[['affaire_id', 'infractiontype_id']]

    infractiontype = read_table('infractiontype')
    infractiontype.drop(['active', 'ordre'], axis=1, inplace=True)
    infractiontype.rename(columns={
        'id': 'infractiontype_id',
        'libelle': 'type_infraction'
    },
                          inplace=True)

    infraction_augmentee = infraction.merge(infractiontype,
                                            on='infractiontype_id',
                                            how='left')
    infraction_augmentee = infraction_augmentee.groupby(
        'affaire_id').first().reset_index()
    return infraction_augmentee
Beispiel #14
0
 def add_info(table_ini, info_table_name, col):
     info_table = read_table(info_table_name)
     info_table.drop(['active','ordre'], axis = 1, inplace = True)
     info_table.rename(columns = {'id':col[0],'libelle':col[1]},
                       inplace = True,
                       )
     table = table_ini.merge(info_table, on = col[0], how = 'left')
     table.drop([col[0]], axis = 1, inplace = True)
     return table
def prescription_table():
    ##prépare table prescription
    prescription = read_table('prescription')
    prescription.rename(columns={
        'id': 'prescription_id',
        'libelle': 'prescription'
    },
                        inplace=True)

    #prépare table prescription_type
    prescription_type = read_table('prescriptiontype')
    #prescription_type.ordre.isnull().all() ## =>True
    #prescription_type.active.value_counts()
    #True 32, False 1
    prescription_type.drop(['active', 'ordre'], axis=1, inplace=True)
    prescription_type.rename(columns={
        'id': 'prescriptiontype_id',
        'libelle': 'type_prescription'
    },
                             inplace=True)

    prescription_augmentee = prescription.merge(
        prescription_type,
        on='prescriptiontype_id',
        how='left',
        #                                            indicator = True
    )

    ##prépare etat_prescription
    etat_prescription = read_table('etatprescription')
    assert prescription.etat_id.isin(etat_prescription.id).all()
    etat_prescription.rename(columns={
        'id': 'etat_id',
        'libelle': 'etat_prescription'
    },
                             inplace=True)

    prescription_augmentee = prescription_augmentee.merge(etat_prescription,
                                                          on='etat_id',
                                                          how='left')
    prescription_augmentee = prescription_augmentee.groupby(
        'affaire_id').first().reset_index()

    return prescription_augmentee
Beispiel #16
0
def coherence_affaires_histoinfractions():
    '''
     infractionhisto pointe vers cr_visite qui pointe vers affaire
     infractionhisto pointe vers infraction qui pointe vers affaire
     On verifie la cohérence
    '''
    infractionhisto = read_table('infractionhisto')
    cr_visite = read_table('cr_visite')
    cr_visite.rename(columns={'id': 'compterenduvisite_id'}, inplace=True)
    infraction = read_table('infraction')
    infraction.rename(columns={'id': 'infraction_id'}, inplace=True)

    ##=>True
    #Est-ce vrai pour toute ligne de infractionhisto?
    infractionhisto = infractionhisto[[
        'id', 'infraction_id', 'compterenduvisite_id'
    ]]
    infractionhisto.rename(columns={'id': 'infractionhisto_id'}, inplace=True)
    infractionhisto.drop_duplicates(inplace=True)

    via_table_cr_visite = infractionhisto.merge(cr_visite,
                                                on='compterenduvisite_id',
                                                how='left')

    via_table_infraction = infractionhisto.merge(infraction,
                                                 on='infraction_id',
                                                 how='left',
                                                 indicator='is_in_infraction')

    infractionhisto.infraction_id.isin(infraction.infraction_id)

    parinfraction = pd.Series(via_table_infraction.affaire_id.unique())
    parvisite = pd.Series(via_table_cr_visite.affaire_id.unique())
    parinfraction.isin(parvisite).value_counts()  ##=> True 16937, False 1
    parvisite.isin(parinfraction).value_counts()  ##=> True 16937, False 125

    test_coherence = via_table_infraction.merge(
        via_table_cr_visite,
        on=['infractionhisto_id', 'affaire_id'],
        how='outer',
        indicator=True)

    problemes = test_coherence[test_coherence['_merge'] != 'both']
    test_coherence._merge.value_counts()
Beispiel #17
0
def question_bien_id():
    ''' On va regarder les id de toutes les tables et
    selectionner celle qui contiennent les valeur de bien_id
    '''
    hyg = read_table('affhygiene')
    liste_valeurs = hyg.bien_id
    print(_recherche_valeurs_in_id(liste_valeurs))
    # => ['ficherecolem']

    # autre hypothèse bien_id se retrouve dans plusieurs tables !
    immeuble = read_table('immeuble')
    batiment = read_table('batiment')
    parcelle = read_table('parcelle_cadastrale')
    localhabite = read_table('localhabite')

    tous_les_ids = immeuble.id.append(batiment.id).append(parcelle.id).append(
        localhabite.id)
    assert all(tous_les_ids.value_counts() == 1)
    assert all(liste_valeurs.isin(tous_les_ids))
Beispiel #18
0
def arrete_table():
    """
       Crée la table <arrêté> avec les infos temporelles sur la vie de l'arrêté
    """
    ###Travail sur la table arrete ravalement ###
    arrete_ravalement = read_table('arrete_ravalement')
    arrete_ravalement.drop(
        [
            'copieconforme_en_cours', 'renotification_en_cours', 'cdd_id',
            'nature'
        ],
        axis=1,
        inplace=True,
    )
    dates = [
        'date_delai', 'date_enregistrement', 'date_envoi', 'date_notification',
        'date_signature', 'date_visite'
    ]
    arrete_ravalement[dates] = arrete_ravalement[dates].apply(
        lambda x: x.astype(str).str[:10])
    dates_arrete = [col + '_arrete' for col in dates]
    rename_dates = dict(zip(dates, dates_arrete))
    rename_dates['id'] = 'arrete_ravalement_id'
    arrete_ravalement.rename(columns=rename_dates, inplace=True)

    ###Petit travail sur les délais d'arreté ###
    delai = arrete_ravalement['delai'] * (
        (arrete_ravalement['type_delai'] == 3).astype(int) + 30 *
        ((arrete_ravalement['type_delai'] == 4).astype(int)))
    arrete_ravalement['delai_arrete_raval_en_jours'] = delai
    arrete_ravalement.drop(['delai', 'type_delai'], axis=1, inplace=True)

    arrete_ravalement_facade = read_table('arrete_ravalement_facade')
    arrete_ravalement_facade.rename(
        columns={'facadesconcernees_id': 'facade_id'}, inplace=True)
    table = arrete_ravalement.merge(arrete_ravalement_facade,
                                    on='arrete_ravalement_id',
                                    how='left')

    table['injonction'] = table['injonction_id'].notnull()
    table.drop('injonction_id', axis=1, inplace=True)
    return table
def traitement_reprise_infractionhisto():
    infractionhisto = read_table('infractionhisto')
    # on retire les Reprise qui sont dures à exploiter
    # TODO: vérifier le sens de ces reprises et la pertinence de les enlever
    reprise = (infractionhisto['libelle'] == 'Reprise') & \
        (infractionhisto['titre'] == 'Reprise')
    infractionhisto = infractionhisto[~reprise]
    # il y a un problème de cohérence entre l'infraction type et articles, titre et
    #libelle: voir questions.py
    # Solution : mettre les reprises (les premières lignes) de côtés
    return infractionhisto
Beispiel #20
0
def fusion(list_des_fusions, verbose=False):
    for tab2_name in list_des_fusions:
        tab2 = read_table(tab2_name)
        var2 = primary_key[tab2_name]
        assert var2 in tab2 or var2 == 'None'
        #        print(tab2_name, len(tab2))
        for link in [x for x in foreign_key if x[2] == tab2_name]:
            tab1_name = link[0]
            var1 = link[1]
            if verbose:
                print('On augmente ', tab1_name, 'avec', tab2_name)
Beispiel #21
0
def coherence_infractions_histoinfractions():
    '''
    on regarde si les infractions sont dans histoinfraction et inversement
    '''
    infractionhisto = read_table('infractionhisto')
    infraction = read_table('infraction')
    infraction.rename(columns={'id': 'infraction_id'}, inplace=True)

    #Est-ce vrai pour toute ligne de infractionhisto?
    infractionhisto = infractionhisto[[
        'id', 'infraction_id', 'compterenduvisite_id'
    ]]
    infractionhisto.rename(columns={'id': 'infractionhisto_id'}, inplace=True)

    test_coherence = infractionhisto.merge(infraction,
                                           on='infraction_id',
                                           how='outer',
                                           indicator=True)

    test_coherence._merge.value_counts()
    problemes = test_coherence[test_coherence['_merge'] != 'both']
Beispiel #22
0
def coherence_adresses_via_signalement_et_via_bien_id():
    hyg = read_table('affhygiene')
    hyg_bien_id = adresse_via_bien_id(hyg)
    hyg_bien_id = hyg_bien_id[[
        'affaire_id', 'bien_id', 'bien_id_provenance', 'parcelle_id',
        'adresse_id', 'codeinsee', 'codepostal'
    ]]

    hyg_bien_id = hyg_bien_id[hyg_bien_id.adresse_id.notnull()]

    hyg_signalement = adresses_via_signalement(hyg)
    hyg_signalement = hyg_signalement[hyg_signalement.adresse_id.notnull()]
    hyg_signalement = hyg_signalement.groupby(
        'affaire_id').first().reset_index()

    test = hyg_signalement.merge(
        hyg_bien_id,
        on='affaire_id',
        how='outer',
        indicator='origine',
        suffixes=('_bien', '_sign'),
    )

    test.origine.value_counts()

    matched = test[test['origine'] == 'both']
    matched['valid'] = matched['adresse_id_bien'] == matched['adresse_id_sign']

    adresse = adresses()[[
        'adresse_id', 'libelle', 'codepostal', 'code_cadastre'
    ]]
    matched = matched.merge(adresse,
                            left_on='adresse_id_bien',
                            right_on='adresse_id',
                            how='left')
    del matched['adresse_id']
    matched = matched.merge(
        adresse,
        left_on='adresse_id_sign',
        right_on='adresse_id',
        how='left',
        suffixes=('_bien', '_sign'),
    )

    pd.crosstab(matched['bien_id_provenance_bien'], matched['valid'])
    pb = matched[~matched['valid']][[
        'affaire_id',
        'adresse_id_bien',
        'libelle_bien',
        'adresse_id_sign',
        'libelle_sign',
    ]]
Beispiel #23
0
def coherence_arretehyautre_pvscp():
    ''' Question : quelle cohérence entre arretehyautre et pvscp ? '''
    ## Ne marche pas !

    arrete = read_table('arretehyautre')[['id', 'affaire_id', 'type_id']]
    arrete.rename(columns={'id': 'arrete_hygiene_id'}, inplace=True)

    pvcsp = read_table('pvcsp')

    ## Première vérification
    pvcsp_avec_arrete = pvcsp.merge(arrete,
                                    on='arrete_hygiene_id',
                                    how='outer',
                                    indicator=True)
    # bcp moins de pvscp que d'arrete mais tous dedans.
    # supsicion : il n'y a que les arrêté en cours, les autres sont dans classés
    # sinon, il y a bien cohérence puisque les pvcsp renvoie à arrete

    ## vérification des cohérences des affaires
    cr = read_table('cr_visite')
    cr = cr[['id', 'affaire_id']]
    cr.rename(columns={'id': 'compte_rendu_id'}, inplace=True)

    arrete_avec_cr = arrete.merge(cr,
                                  on='affaire_id',
                                  how='left',
                                  indicator=True)
    # => 15 non match ? cf arrete_avec_cr._merge.value_counts()

    pvcsp_avec_cr = pvcsp.merge(cr,
                                on='compte_rendu_id',
                                how='left',
                                indicator=True)
    # pvcsp_avec_cr._merge.value_counts()

    affaires_pvscp = pvcsp_avec_cr.affaire_id
    affaires_arrete = arrete_avec_cr.affaire_id
    assert all(affaires_pvscp.isin(affaires_arrete))
    assert not all(affaires_arrete.isin(affaires_pvscp))
Beispiel #24
0
def affaires_hyg_ou_raval():
    '''
    On regarde si une affaire de la table affaire et ou bien dans
    aff_hygiene ou bien dans aff_ravalement
    '''
    affaire = read_table('affaire')
    hyg = read_table('affhygiene')
    rava = read_table('affravalement')

    # premier test
    assert len(affaire) == len(hyg) + len(rava)

    # affaire_id est bien dans l'id de affaire
    assert all(hyg['affaire_id'].isin(affaire['id']))
    assert all(rava['affaire_id'].isin(affaire['id']))

    # affaire_id n'est pas à la fois dans hygiène et dans ravalement
    assert (all(~hyg['affaire_id'].isin(rava['affaire_id'])))
    assert (all(~rava['affaire_id'].isin(hyg['affaire_id'])))

    # les affaires sont bien dans affhygiene et dans affravalement
    liste_affaire = (rava['affaire_id'].append(hyg['affaire_id'])).tolist()
    assert (all(affaire['id'].isin(liste_affaire)))
def date_crvisite():
    cr_visite_brut = read_table('cr_visite')

    ## Vaine tentative de drop_duplicates
    #    all_but_id = [x for x in cr_visite_brut.columns
    #        if x not in ['id', 'date_creation']
    #        ]
    #    cr_visite  = cr_visite_brut.drop_duplicates(subset=all_but_id) #à ne pas faire
    #     parce que l'on perd des id et que l'on rate un merge plus loin

    cr_visite = cr_visite_brut[['id', 'affaire_id', 'date']]
    #len(cr_visite) ##=>49548 visites
    #cr_visite.affaire_id.value_counts()
    #cr_visite.affaire_id.nunique() #34122 affaires distinctes
    # avec n>=1 visites chacune

    ###  on a des problème de date
    pb_de_date = [
        '1000-10-16 00:00:00', '0029-06-29 00:00:00', '1010-04-06 00:00:00'
    ]

    # on regarde si date et date_creation correspondent
    # et c'est pareil dans la moitié des cas, très proche dans les autres
    # => on peut se dire qu'en cas de problème on prend date_creation à la
    # place de date
    #    date = cr_visite_brut['date'].str[:10]
    #    date_creation = cr_visite_brut['date_creation'].astype(str).str[:10]
    #    (date == date_creation).value_counts()

    cr_visite.loc[cr_visite['date'].isin(pb_de_date), 'date'] = \
        cr_visite_brut.loc[cr_visite['date'].isin(pb_de_date), 'date_creation']
    cr_visite.loc[cr_visite['date'].isnull(), 'date'] = \
        cr_visite_brut.loc[cr_visite['date'].isnull(), 'date_creation']

    cr_visite['date'] = pd.to_datetime(cr_visite['date'])

    # une affaire entraîne peut avoir plusieurs visites dans la journée
    #assert not all(cr_visite.groupby(['affaire_id', 'date']).size() == 1)
    #cr_visite_brut[cr_visite.affaire_id == 14665]
    return cr_visite
Beispiel #26
0
def immeuble_table():
    """
       Crée la table <immeuble> qui fait le pont entre l'immeuble et la parcelle
       dans laquelle il se trouve
    """
    immeuble = read_table('immeuble')
    immeuble.rename(columns = {'id':'immeuble_id',
                               'adresseprincipale_id': 'adresse_id'},
                    inplace = True)

    ###Suppression colonnes inutiles ###
    immeuble = immeuble.loc[:, immeuble.notnull().sum() > 1] # retire les colonnes vides
    # une étude colonne par colonne
    del immeuble['champprocedure'] # tous vrais sauf 10
    del immeuble['demoli'] # tous vrais sauf 1
    que_des_2 = ['diagplomb', 'diagtermite', 'etudemql', 'grilleanah',
                 'rapportpreop', 'risquesaturn', 'signalementprefecturepolice',
                 ]
    immeuble.drop(que_des_2, axis=1, inplace=True)
    del immeuble['tournee_id'] # que 8 valeurs

    ### Date recolement ####
    immeuble['daterecolement'] = immeuble['daterecolement'].astype(str).str[:10]
    return immeuble
Beispiel #27
0
def adresse_via_bien_id(table):
    '''
    Trouve l'adresse d'une affaire en utilisant le bien_id
    Cet identifiant renvoie à l'une des quatre tables suivante :
        - localhabite 
        - batiment
        - immeuble
        - parcelle_cadastrale
        
    La fonction utilise une table contenant une variable bien_id
    et
    retrounes la table avec l'adresse_id correspondant à chaque affaire
    '''

    assert 'bien_id' in table.columns
    bien_ids = table['bien_id']

    # autre hypothèse bien_id se retrouve dans plusieurs tables !
    localhabite = read_table('localhabite')
    batiment = read_table('batiment')
    immeuble = read_table('immeuble')
    parcelle_cadastrale = read_table('parcelle_cadastrale')

    table['bien_id_provenance'] = ''
    for origine_possible in [
            'localhabite', 'batiment', 'immeuble', 'parcelle_cadastrale'
    ]:
        cond = bien_ids.isin(eval(origine_possible).id)
        table.loc[cond, 'bien_id_provenance'] = origine_possible
    print('origine de bien_id \n', table['bien_id_provenance'].value_counts(),
          "\n")

    ##### Travail sur les info des differentes tables

    del localhabite['codification']  #inutile et incomplet
    # TODO: on pourrait travailler sur l'étage

    # en passant
    batiment['designation'] = batiment['designation'].str.lower().str.strip()
    batiment['designation'] = batiment['designation'].str.replace(
        'timent', 't')
    batiment['designation'] = batiment['designation'].str.replace('bat', 'bât')
    batiment['designation'] = batiment['designation'].str.replace('bät', 'bât')
    batiment['designation'] = batiment['designation'].str.replace(
        'bât.', 'bât ')
    del batiment['digicode']  # inutile

    immeuble = immeuble.loc[:, immeuble.notnull().sum() >
                            1]  # retire les colonnes vides
    # une étude colonne par colonne
    del immeuble['champprocedure']  # tous vrais sauf 10
    del immeuble['demoli']  # tous vrais sauf 1
    que_des_2 = [
        'diagplomb',
        'diagtermite',
        'etudemql',
        'grilleanah',
        'rapportpreop',
        'risquesaturn',
        'signalementprefecturepolice',
    ]
    immeuble.drop(que_des_2, axis=1, inplace=True)
    del immeuble['tournee_id']  # que 8 valeurs

    parcelle_cadastrale = parcelles()

    ### Travail sur les id et les fusions
    print("Un local habité est dans un bâtiment\n",
          "Un bâtiment est dans un immeuble\n",
          "Un immeuble est dans une parcelle\n")

    # on va chercher d'abord pour chaque table les info annexes
    # parcelle_cadastrale ok grace à parcelle()

    # on a pas mal d'adresse principale vide ?!
    immeuble.rename(columns={'adresseprincipale_id': 'adresse_id'},
                    inplace=True)
    #=> on s'arrête là car toute la gestion des adresses est faire ailleurs
    # voir adresse_de_l_affaire

    entree = read_table('modentbat')[['id', 'libelle']]
    entree.columns = ['modentbat_id', 'mode_entree_batiment']
    batiment = batiment.merge(entree, how='left')
    del batiment['modentbat_id']

    hautfacade = read_table('hautfacade')[['id', 'libelle']]
    hautfacade.columns = ['hautfacade_id', 'hauteur_facade']
    batiment = batiment.merge(hautfacade, how='left')
    del batiment['hautfacade_id']

    table['localhabite_id'] = table['bien_id'] * (table['bien_id_provenance']
                                                  == 'localhabite')
    table.replace(0, np.nan, inplace=True)
    localhabite.rename(columns={'id': 'localhabite_id'}, inplace=True)
    assert localhabite['localhabite_id'].value_counts().max() == 1
    table = table.merge(localhabite, on='localhabite_id', how='left')

    bien_id_batiment = table['bien_id_provenance'] == 'batiment'
    table.loc[bien_id_batiment, 'batiment_id'] = table.loc[bien_id_batiment,
                                                           'bien_id']
    batiment.rename(columns={'id': 'batiment_id'}, inplace=True)
    assert batiment['batiment_id'].value_counts().max() == 1
    table = table.merge(batiment, on='batiment_id', how='left')

    bien_id_immeuble = table['bien_id_provenance'] == 'immeuble'
    table.loc[bien_id_immeuble, 'immeuble_id'] = table.loc[bien_id_immeuble,
                                                           'bien_id']
    immeuble.rename(columns={'id': 'immeuble_id'}, inplace=True)
    assert immeuble['immeuble_id'].value_counts().max() == 1
    table = table.merge(immeuble, on='immeuble_id', how='left')

    bien_id_parcelle = table['bien_id_provenance'] == 'parcelle_cadastrale'
    table.loc[bien_id_parcelle, 'parcelle_id'] = table.loc[bien_id_parcelle,
                                                           'bien_id']
    assert parcelle_cadastrale['parcelle_id'].value_counts().max() == 1
    table = table.merge(parcelle_cadastrale, on='parcelle_id', how='left')

    table.rename(columns={
        'observations_x': 'observations_localhabite',
        'observations_y': 'observations_batiment',
        'observations': 'observations_immeuble',
    },
                 inplace=True)

    return table
Beispiel #28
0
                                                           'bien_id']
    assert parcelle_cadastrale['parcelle_id'].value_counts().max() == 1
    table = table.merge(parcelle_cadastrale, on='parcelle_id', how='left')

    table.rename(columns={
        'observations_x': 'observations_localhabite',
        'observations_y': 'observations_batiment',
        'observations': 'observations_immeuble',
    },
                 inplace=True)

    return table


if __name__ == '__main__':

    hyg = read_table('affhygiene')
    hyg = adresse_via_bien_id(hyg)

    ### dans immeuble il y a parcelle et adresse.
    # or adresse est lié à parcelle, il faut vérifier la cohérence
    adresse = adresses()[['adresse_id', 'parcelle_id']]
    test = hyg[hyg.adresse_id.notnull()].merge(adresse,
                                               on='adresse_id',
                                               how='left',
                                               indicator=True)
    sum(test['parcelle_id_x'] != test['parcelle_id_y'])
    # 1 seule erreur

    path_adresses = os.path.join(path_output, 'adresses.csv')
    hyg.to_csv(path_adresses)
Ce programme étudier les pistes pour déterminer les bâtiments non insalubres

Idée 1: les cr_visites sans histoinfraction
Idée 2: les cr_visites sans histoinfraction
Idée 3: les affaires sans infraction

"""

import pandas as pd

from insalubrite.Sarah.read import read_table
from insalubrite.config_insal import path_output

### Idée 1: cr_visites sans histoinfraction

cr = read_table('cr_visite')
cr = cr[['id', 'affaire_id']]

infraction_histo = read_table('infractionhisto')
infraction_histo = infraction_histo[[
    'date_historisation',
    'compterenduvisite_id',
    'infraction_id',
    'infractiontype_id',
    'titre',
    'libelle',
    'articles',
]]

# il y a un problème de cohérence entre l'infraction type et articles, titre et
#libelle
Beispiel #30
0
        suffixes=('_sign', '_bien'),
        indicator=indicator,
    )
    #    assert len(table_adresses_max) == len(table_bien_id)
    #table_adresses_max.adresse_id_bien.value_counts(dropna=False)
    ##=> NaN 30832, reste 21843
    #table_adresses_max.adresse_id_sign.value_counts(dropna=False)
    ##=> NaN 14339, reste 38336
    (table_adresses_max.adresse_id_bien == \
               table_adresses_max.adresse_id_sign).value_counts(dropna = False)
    ##=>False 40568, True 12107

    #Idée: Construire une colonne adresse_id avec adresse_id_sign quand ça
    # existe et sinon adresse_id_bien
    table_adresses_max['adresse_id'] = table_adresses_max['adresse_id_sign']
    no_adresse_signalement = table_adresses_max['adresse_id_sign'].isnull()
    table_adresses_max.loc[no_adresse_signalement, 'adresse_id'] = \
            table_adresses_max.loc[no_adresse_signalement, 'adresse_id_bien' ]

    #retire les doublons, en ne gardant
    table_adresses_max.drop_duplicates(inplace=True)
    table_adresses_max.groupby(var_to_merge_on)['adresse_id'].nunique()

    assert len(table_adresses_max) == len(table)
    return table_adresses_max


if __name__ == '__main__':
    hyg = read_table('affhygiene')[['affaire_id', 'bien_id']]
    adresse_par_affaires = add_adresse_id(hyg, indicator='origine')