# -*- coding: utf-8 -*-
"""
@author: Alexis Eidelman

Travaille sur les données issues de 
https://www.data.gouv.fr/fr/datasets/
service-public-fr-annuaire-de-ladministration-base-de-donnees-nationales/

pour obtenir le graph des administrations
Il y a 223874 triplets
7336 entités

"""

import rdflib
import pandas as pd


g = rdflib.Graph()
g.parse('annuaire_gouv.rdf', format='xml')


def load_all():
    DF = rdflib.Namespace('http://www.df.gouv.fr/administration_francaise/annuaire#')
    requete =  g.query("""SELECT ?a ?b ?c
        WHERE {?a ?b ?c }""", 
        initNs={ 'df': DF })
    return requete
data = load_all()

# pour simplifier l'écriture
df = 'http://www.df.gouv.fr/administration_francaise/annuaire#'
ann = 'http://lannuaire.service-public.fr/'

# crée un dictionnaire 
diction = dict()
for row in data:
    index = row[0].toPython()
    index = index.replace(df, 'df/').replace(ann, 'an/')
    predicat = row[1].toPython().replace(df, 'df/').replace(ann, 'an/')
    attribut = row[2].toPython()
    if isinstance(attribut, str):
        attribut = attribut.replace(df, 'df/').replace(ann, 'an/')
    if index not in diction:
        diction[index] = dict()
    diction[index][predicat] = attribut

tab = pd.DataFrame.from_dict(diction).T
# 13877 lignes
# 50 colonnes = 50 prédicats différents


# il y a 3 doublons : tab.duplicated().sum()
tab.drop_duplicates(inplace=True)

## propriété de la table
tab.isnull().sum()
for col in tab.columns:
    print(tab[col].value_counts().head(3))

# certaines lignes ne semblent pas porter beaucoup d'informations
cols_remplies_seules = [
    'http://www.mondeca.com/system/basicontology#created_the',
    'http://www.mondeca.com/system/basicontology#updated_the',
    'http://www.mondeca.com/system/t3#bt',
    'http://www.mondeca.com/system/t3#nt',
    'http://www.w3.org/1999/02/22-rdf-syntax-ns#type',
    ]
sans_info = tab.drop(cols_remplies_seules, axis=1)
sans_info.dropna(how='all', inplace=True)
# c'est des assoc ?

tab = tab[tab.index.isin(sans_info.index)]
# 7336 lignes

tab.to_csv('AnnuaireServicePublic.csv')

@@ -1526,54 +1526,67 @@
 nes 
-ne semblent pas porter beaucoup d'informations
+correspondent %C3%A0 des associations :%0A# liens entre les entit%C3%A9
 %0Acol
@@ -1880,25 +1880,79 @@
 ,%0A    %5D%0A
-sans_info
+# en gros, bt, c'est l'enfant et nt c'est le parent%0A%0Asans_liens
  = tab.d
@@ -1990,20 +1990,21 @@
 1)%0Asans_
-info
+liens
 .dropna(
@@ -2034,37 +2034,377 @@
 )%0A# 
-c'est des assoc ?%0A%0Atab = tab%5B
+tab.loc%5Btab.index.isin(sans_liens.index), cols_remplies_seules%5D.notnull().sum()%0Aentites = tab.loc%5Btab.index.isin(sans_liens.index)%5D.drop(%0A    %5B'http://www.mondeca.com/system/t3#bt', 'http://www.mondeca.com/system/t3#nt'%0A    %5D, axis=1)%0A# entites%5B'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'%5D.value_counts()%0A# =%3E on a plusieurs types%0A# 7336 lignes%0A%0Aassoc = tab.loc%5B~
 tab.
@@ -2423,34 +2423,571 @@
 ans_
-info
+liens
 .index)
-%5D%0A# 7336 lignes
+, cols_remplies_seules%5D%0A# assoc%5B'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'%5D.value_counts()%0A# =%3E on n'a qu'un seul type%0Adel assoc%5B'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'%5D%0A# 6538 lignes%0A%0Ajoined = entites.reset_index().merge(assoc, #left_index=True, %0A                       left_on='index',%0A                       right_on='http://www.mondeca.com/system/t3#nt',%0A                       how='left')%0A%0Ajoined%5B'http://www.mondeca.com/system/t3#bt'%5D.value_counts(dropna=False)%0Ajoined%5Bjoined%5B'http://www.mondeca.com/system/t3#bt'%5D.isnull()%5D%0Axxx
 %0A%0Ata

add links in csv