Ejemplo n.º 1
0
def mapping_raison_sociale(df_siren, raison_sociale, tol_dist_lev = 2, tol_len = 2):
    """
    Cette fonction fait un premier filter sur la raison sociale
    et renvoie l'index des lignes de df_siren qui passe se filtre
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    #!20180308 protection de la fonction mapping_siren: ajout de cette fonction 
    #if random.randint(0,3)==0: raise ValueError("Simulated error")
    raison_sociale = tools.convert2unicode(raison_sociale)
    len_raison_sociale = len(raison_sociale)
    #np_raison_sociale_Leven = np.abs(np_raison_sociale_len-len_raison_sociale)<=tol_len
    raison_sociale_filter = (df_siren[u"raison_sociale_len"]-len_raison_sociale).abs()<=tol_len
    col_filtered_raison_sociale_Leven = df_siren.loc[raison_sociale_filter,u"raison_sociale"] 
    col_exact_match = col_filtered_raison_sociale_Leven == raison_sociale
    nb_exact_match = col_exact_match.sum()
    if nb_exact_match>0: #matching exacte -> on renvoit uniquement les lignes avec un matching exacte
        res_index = col_filtered_raison_sociale_Leven.index[col_exact_match]
        pd_dist_raison_sociale = pd.DataFrame({u"Levenstein_dist_raison_sociale": [0]*len(res_index),
                                           u"is_subtring_raison_sociale": [True]*len(res_index)}, index = res_index)
        return res_index, pd_dist_raison_sociale 
    else:
        #filtre selon la métrique de levensthein
        col_dist_Lev = col_filtered_raison_sociale_Leven.apply(lambda enseigne: Levenshtein.distance(enseigne,raison_sociale))
        min_dist = col_dist_Lev.min()
        res_index = col_dist_Lev.index[col_dist_Lev<=min_dist+tol_dist_lev]
        #filtre selon les substring
        np_raison_sociale_substring = df_siren[u"raison_sociale_len"]>len_raison_sociale
        col_is_substring = df_siren.loc[np_raison_sociale_substring, u"raison_sociale"].apply(lambda enseigne: raison_sociale in enseigne)
        res_index = res_index.union(col_is_substring.index[col_is_substring])
        #
        series_raison_soc = df_siren.loc[res_index,u"raison_sociale"]
        pd_dist_raison_sociale = pd.DataFrame(index = res_index)
        pd_dist_raison_sociale[u"Levenstein_dist_raison_sociale"] = series_raison_soc.apply(lambda enseigne: Levenshtein.distance(enseigne,raison_sociale))
        pd_dist_raison_sociale[u"is_subtring_raison_sociale"] = series_raison_soc.apply(lambda enseigne: raison_sociale in enseigne)
        return res_index, pd_dist_raison_sociale
Ejemplo n.º 2
0
def mapping_code_postal(df_mapping, code_postal):
    """
    Cette fonction fait un filtre sur le code postal
    Elle renvoie le data frame filtré
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    if code_postal:
        code_postal = tools.convert2unicode(code_postal)
        match_code_postal = df_mapping[u"CODPOS"] == code_postal
        res_index = df_mapping.index[match_code_postal]
        n1 = len(res_index)
        if n1>=1:
            pd_dist_code_postal = pd.DataFrame({u"match_code_postal": match_code_postal[res_index],
                                                    u"match_code_postal_prefix": [True]*n1}, 
                                                index =res_index)
        else:
            #on essaie un match des deux premiers chiffres du code postal
            code_postal_prefix = code_postal[:2]
            match_code_postal_prefix = df_mapping[u"CODPOS"].apply(lambda codpos: codpos[:2] == code_postal_prefix)
            n2 = np.sum(match_code_postal_prefix)
            if n2>=1:
                res_index = df_mapping.index[match_code_postal_prefix]
                pd_dist_code_postal = pd.DataFrame({u"match_code_postal": match_code_postal[res_index],
                                                    u"match_code_postal_prefix": match_code_postal_prefix},
                                                    index =res_index)
            else: #pas de filtre sur le code postal
                res_index = df_mapping.index
                pd_dist_code_postal = pd.DataFrame({u"match_code_postal": match_code_postal[res_index],
                                                    u"match_code_postal_prefix": [False]*len(res_index)},
                                                    index =res_index)
        df_mapping = pd.concat([df_mapping.loc[res_index], pd_dist_code_postal], axis = 1)
    else: #le code postale n'a pas été trouvé dans le json
        df_mapping[u"match_code_postal"] = False
        df_mapping[u"match_code_postal_prefix"] = False
    return df_mapping
def check_keys_existence(objet, list_key):
    """
    Vérifie si la liste de clé list_key est un chemin valide de l'objet
    Si oui, l'objet au bout du chemin d'accès, sinon retourne None
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    #!20180308 passage_par_reference
    #deep copy pour ne pas modidier le dictionnaire en entrée
    copy_objet = copy.deepcopy(objet)
    for key in list_key:
        if type(key) == str or type(key) == unicode:  #cas d'un dictionnaire
            key = tools.convert2unicode(key)
            if key not in copy_objet:
                logger.warning(u"La clé {} n'a pas été trouvé.".format(key))
                return None
            copy_objet = copy_objet[key]
        elif type(key) == int:
            if len(copy_objet) <= key:
                logger.warning(
                    u"La liste a une longeur insuffisante pour la clé {}.".
                    format(key))
                return None
            copy_objet = copy_objet[key]
        else:
            logger.warning(u"La clé {} a un type inconnu".format(key))
            return None
    return copy_objet
Ejemplo n.º 4
0
def get_entete_df_resultat(entete_csv_siren, entete_csv_ws,
                           param_add_tag_cctx_file):
    """
    Fonction renvoyant l'entête du fichier de résultats résumant les choix d'insertion
    de SIREN effectué
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    ls_export_name = [
        tools.convert2unicode(export_name) for import_name, export_name in
        param_add_tag_cctx_file[u'list_keys_import_export']
    ]
    #entete_csv_siren + entete_csv_ws + ['demandeur_name'] + ls_export_name
    if entete_csv_ws is None:
        #20180320: Ajout des paramètres d'input/output en arguments de ligne de commande
        #entete_csv_resultat = [u'siren@'+name for name in entete_csv_siren] + [u'res@demandeur_name'] + [u'res@'+name for name in ls_export_name]
        entete_csv_resultat = [
            u'siren@' + name for name in entete_csv_siren
        ] + [
            u'res@company_name_from_jurisprud_file',
            u'res@company_name_related_to_extracted_siren_number'
        ] + [u'res@' + name for name in ls_export_name]
    else:
        #20180320: Ajout des paramètres d'input/output en arguments de ligne de commande
        #entete_csv_resultat = [u'siren@'+name for name in entete_csv_siren] + [u'ws@'+name for name in entete_csv_ws] + [u'res@demandeur_name'] + [u'res@'+name for name in ls_export_name]
        entete_csv_resultat = [
            u'siren@' + name for name in entete_csv_siren
        ] + [u'ws@' + name for name in entete_csv_ws] + [
            u'res@company_name_from_jurisprud_file',
            u'res@company_name_related_to_extracted_siren_number'
        ] + [u'res@' + name for name in ls_export_name]
    return entete_csv_resultat
def insert_cctx_tags_and_save(curr_filename, input_decision_path,
                              output_decision_path, dict_feature2export_all,
                              list_keys_to_export, param_add_tag_cctx_file):
    """
    Insertion des tags cctx dans le fichier json de jurisprudence et sauvegarde du fichier modifié 
    dans le dossier output_decision_path
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    #formation des noms des fichiers d'input et d'output
    input_jurisprud_file = "{}{}{}".format(input_decision_path, curr_filename,
                                           '.json')
    output_jurisprud_file = "{}{}{}".format(output_decision_path,
                                            curr_filename, '.json')
    #lecture du fichier json de jurisprudence
    curr_decision = DecisionJurisprudence(input_jurisprud_file)
    #modifie le nom des clés pour correspondre aux noms des clés d'export
    for import_name, export_name in param_add_tag_cctx_file[
            u'list_keys_import_export']:
        dict_feature2export_all[tools.convert2unicode(
            export_name)] = dict_feature2export_all.pop(import_name)
    #dict of lists to list of dicts
    list2export = add_payload_tag_for_each_field([
        dict(zip(dict_feature2export_all, t))
        for t in zip(*dict_feature2export_all.values())
    ])
    #insertion des tags
    tagname = u"CCTX_entreprises"
    curr_decision.insert_tag_cctx_entreprise(tagname, list2export)
    #sauvegarde
    curr_decision.export_json_content2jsonfile(output_jurisprud_file)
    return None
Ejemplo n.º 6
0
def update_csv_recap(curr_filename, dict_feature2export_all, df_siren_file,
                     df_ws_file, entete_csv_ws, entete_csv_resultat,
                     output_csv_recap, param_add_tag_cctx_file):
    """
    Add the new lines corresponding to the new PM demandeur inserted in the json file of jurisprudence
    in the csv file output_csv_recap
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    #20180320: Ajout des paramètres d'input/output en arguments de ligne de commande
    #ls_export_name = [u"demandeur_name"]+[tools.convert2unicode(export_name) for import_name,export_name in param_add_tag_cctx_file[u'list_keys_import_export']]
    ls_export_name = [
        u"company_name_from_jurisprud_file",
        u'company_name_related_to_extracted_siren_number'
    ] + [
        tools.convert2unicode(export_name) for import_name, export_name in
        param_add_tag_cctx_file[u'list_keys_import_export']
    ]
    pd_feature2export_all = pd.DataFrame(
        list(
            tools.dict_to_listOflist_ordered(dict_feature2export_all,
                                             ls_export_name)))
    if entete_csv_ws is None:  #pas de web scraping
        df_recap = pd.concat([df_siren_file, pd_feature2export_all],
                             axis=1,
                             ignore_index=True)
        df_recap.insert(0, column=u"FILENAME", value=curr_filename)
        df_recap.to_csv(output_csv_recap,
                        sep=';',
                        decimal=',',
                        header=False,
                        index=False,
                        mode="a",
                        encoding='UTF-8')
    else:
        if df_ws_file is None:  #fichier de web scraping non présent
            df_ws_file = pd.DataFrame(index=range(df_siren_file.shape[0]),
                                      columns=entete_csv_ws)
            df_merge_file = pd.concat([df_siren_file, df_ws_file],
                                      axis=1,
                                      ignore_index=True)
        else:  #fichier de web scraping présent
            df_merge_file = df_siren_file.merge(df_ws_file,
                                                how=u'left',
                                                on=u"NUMERO_ENTREPRISE")
            #rajout de la colonne NUMERO entreprise pour le web_scraping
            df_merge_file.insert(df_siren_file.shape[1],
                                 column=u"NUMERO_ENTREPRISE" + u"_y",
                                 value=df_merge_file[u"NUMERO_ENTREPRISE"])
        df_recap = pd.concat([df_merge_file, pd_feature2export_all],
                             axis=1,
                             ignore_index=True)
        df_recap.insert(0, column=u"FILENAME", value=curr_filename)
        df_recap.to_csv(output_csv_recap,
                        sep=';',
                        decimal=',',
                        header=False,
                        index=False,
                        mode="a",
                        encoding='UTF-8')
Ejemplo n.º 7
0
def mapping_num_rue(df_mapping, num_rue):
    """
    Cette fonction ajoute une colonne indiquant si le numero de voie est identique.
    """ 
    logger.debug(autolog_msg(u"Received a call to function"))
    if num_rue:
        num_rue = tools.convert2unicode(num_rue)
        df_mapping[u"match_exact_NUMVOIE"] = df_mapping[u"NUMVOIE_pretty"] == num_rue
    else:
        df_mapping[u"match_exact_NUMVOIE"] = False
    return df_mapping
def mapping_ville(df_mapping, ville, tol_dist_lev=0):
    """
    Ajout de la colonne: Levenstein_dist_ville
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    if ville:
        ville = tools.convert2unicode(ville)
        df_mapping[u"Levenstein_dist_ville"] = df_mapping[
            u"LIBCOM_pretty"].apply(lambda libcom: Levenshtein.distance(
                libcom, ville) if libcom is not None else 1000)
    else:
        df_mapping[u"Levenstein_dist_ville"] = 1000
    return df_mapping
def mapping_adresse_complete(df_mapping, adresse_complete, tol_dist_lev=4):
    """
    Ajout de la colonne: Levenstein_dist_ADRESSE_COMPLETE
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    if adresse_complete:
        adresse_complete = tools.convert2unicode(adresse_complete)
        df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] = df_mapping[
            u"ADRESSE_COMPLETE"].apply(lambda row: Levenshtein.distance(
                row, adresse_complete) if row is not None else 1000)
    else:
        df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] = 1000
    return df_mapping
 def compute_demandeurs_adresse_complete(self):
     """
     Extrait le numero de la rue de chaque demandeur PM et remplit list_demandeur_features
     """
     logger.debug(autolog_msg(u"Received a call to function"))
     for i in range(self.nb_demandeur_PM):
         demandeur_PM = self.list_demandeurs_PM[i]
         adresse_complete = check_keys_existence(
             demandeur_PM, [u"PM", 0, u"Adresse", 0, u"payload"])
         if adresse_complete:
             self.list_demandeur_features[i][
                 u"adresse_complete"] = tools.normalize_string(
                     tools.convert2unicode(adresse_complete))
Ejemplo n.º 11
0
def mapping_ville(df_mapping, ville, tol_dist_lev = 0):
    """
    Cette fonction fait un filtre sur la ville
    Elle renvoie le data frame filtré:
        - si match exacte alors seuls les matchs excacts sont renvoyés
        - sinon toutes les lignes ayant une distance de Levenshtein inférieur au minimimum
        + tol_dist_lev sont renvoyées.
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    if ville:
        ville = tools.convert2unicode(ville)
        df_mapping[u"Levenstein_dist_ville"] = df_mapping[u"LIBCOM_pretty"].apply(lambda libcom: Levenshtein.distance(libcom, ville))
        min_dist = np.min(df_mapping[u"Levenstein_dist_ville"])
        if min_dist == 0:
            df_mapping = df_mapping.loc[df_mapping[u"Levenstein_dist_ville"] == min_dist]
        else:
            df_mapping = df_mapping.loc[df_mapping[u"Levenstein_dist_ville"] <= min_dist+tol_dist_lev]
    else:
        df_mapping[u"Levenstein_dist_ville"] = 1000
    return df_mapping
Ejemplo n.º 12
0
def mapping_adresse_complete(df_mapping, adresse_complete, tol_dist_lev = 4):
    """
    Cette fonction fait un filtre sur la ville
    Elle renvoie le data frame filtré:
        - si match exacte alors seuls les matchs excacts sont renvoyés
        - sinon toutes les lignes ayant une distance de Levenshtein inférieur au minimimum
        + tol_dist_lev sont renvoyées.
    """
    logger.debug(autolog_msg(u"Received a call to function"))
    if adresse_complete:
        adresse_complete = tools.convert2unicode(adresse_complete)
        df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] = df_mapping[u"ADRESSE_COMPLETE"].apply(lambda row: Levenshtein.distance(row, adresse_complete))
        min_dist = np.min(df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"])
        if min_dist == 0:
            df_mapping = df_mapping.loc[df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] == min_dist]
        else:
            df_mapping = df_mapping.loc[df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] <= min_dist+tol_dist_lev]
    else:
        df_mapping[u"Levenstein_dist_ADRESSE_COMPLETE"] = 1000
    return df_mapping