insee-pcs 0.1.0
A set of tools to use the 'Professions et Catégories Socioprofessionnelles' system of INSEE (a French statistical agency).

INSEE PCS : Des outils pour utiliser les Professions et Catégories Socioprofessionnelles de l'INSEE
===================================================================================================

**INSEE-PCS** est un module Python permettant d'exploiter facilement les Professions et Catégories Socioprofessionnelles de l'INSEE (version 2003).

Plus d'informations sur les PCS peuvent être trouvées sur le site de l'INSEE : [Nomenclatures des professions et catégories socioprofessionnelles](https://insee.fr/fr/information/2406153).

**Ce code est testé uniquement avec Python 3. Les versions de la PCS antérieures à 2003 ne sont pas supportées.**

# Installation

Ce module est disponnible sur PyPi. Il nécessite le module `peewee` pour fonctionner.

    $ pip3 install peewee insee-pcs

# Usage

```python3
import insee_pcs

# Trouver la PCS "1" du niveau 1.
insee_pcs.get_PCS(1, "1")
"<PCS '1' (level 1)>"

# Trouver la description de la PCS "382b" du niveau 4.
insee_pcs.get_PCS(4, "382b").description
"Architectes salariés"
```

Il est aussi possible d'itérer récursivement sur tous les enfants d'une PCS avec la méthode `iter_children()`. Cette méthode accepte un paramètre optionnel, `max_level`, permettant de définir un niveau maximum pour l'itération.

```python3
# Affiche récursivement la PCS "38" (niveau 2) et ses enfants.
pcs = insee_pcs.get_PCS(2, "32")
for p in pcs.iter_children():
    print("{spaces}{code} : {description}...".format(spaces=' '*(p.level-2)*2, code=p.code, description=p.description[:20]))
"""
32 : Cadres de la fonctio...
  33 : Cadres de la fonctio...
    331a : Personnels de direct...
    332a : Ingénieurs de l’État...
    332b : Ingénieurs des colle...
    333a : Magistrats...
    333b : Inspecteurs et autre...
    333c : Cadres de la Poste...
    333d : Cadres administratif...
    333e : Autres personnels ad...
    333f : Personnels administr...
    334a : Officiers des Armées...
    335a : Personnes exerçant u...
  34 : Professeurs, profess...
    341a : Professeurs agrégés ...
    341b : Chefs d’établissemen...
    342a : Enseignants de l’ens...
    342e : Chercheurs de la rec...
    343a : Psychologues spécial...
    344a : Médecins hospitalier...
    344b : Médecins salariés no...
    344c : Internes en médecine...
    344d : Pharmaciens salariés...
  35 : Professions de l’inf...
    351a : Bibliothécaires, arc...
    352a : Journalistes (y. c. ...
    352b : Auteurs littéraires,...
    353a : Directeurs de journa...
    353b : Directeurs, responsa...
    353c : Cadres artistiques e...
    354a : Artistes plasticiens...
    354b : Artistes+B493 de la ...
    354c : Artistes dramatiques...
    354d : Artistes de la danse...
    354g : Professeurs d’art (h...
"""

# Même chose, en limitant l'itération au niveau 3.
pcs = get_PCS(1, "3")
for p in pcs.iter_children(max_level=3):
    print("{spaces}{code} : {description}...".format(spaces=' '*(p.level-1)*2, code=p.code, description=p.description[:20]))
"""
3 : Cadres et profession...
  31 : Professions libérale...
    31 : Professions libérale...
  32 : Cadres de la fonctio...
    33 : Cadres de la fonctio...
    34 : Professeurs, profess...
    35 : Professions de l’inf...
  36 : Cadres d’entreprise...
    37 : Cadres administratif...
    38 : Ingénieurs et cadres...
"""
```

La fonction `get_all_PCS_of_level()` prend un niveau (`int`) en paramètre et retourne toutes les PCS du niveau demandé dans un objet `SelectQuery` (convertible en liste).

```python3
# Trouver toutes les PCS de niveau 1. Retourne un objet `SelectQuery`.
print(list(get_all_PCS_of_level(1)))
[<PCS '1' (level 1)>, <PCS '2' (level 1)>, <PCS '3' (level 1)>, <PCS '4' (level 1)>, <PCS '5' (level 1)>, <PCS '6' (level 1)>, <PCS '7' (level 1)>, <PCS '8' (level 1)>]
```

L'objet `PCS` est un modèle Peewee classique, vous pouvez donc utiliser toutes les méthodes de Peewee dessus.

```python3
# Trouver toutes les PCS de niveau 4 dont la description contient "Éleveur".
print(list(PCS.select().where(PCS.level==4, PCS.description.contains("Éleveur"))))
[<PCS '111d' (level 4)>, <PCS '111e' (level 4)>, <PCS '121d' (level 4)>, <PCS '121e' (level 4)>, <PCS '131d' (level 4)>, <PCS '131e' (level 4)>]
```

Pour obtenir une aide détaillée hors-ligne, vous pouvez aussi faire `help(<object>)` (par exemple, `help(main_insee)`).

# Dépendances

Ce module nécessite `peewee` (disponnible avec `pip`).

# TODO

- Traduction ?
- Anciennes versions des PCS / CSP ?

# Licence

Ce module est distribué sous la licence AGPLv3, dont les termes sont disponnibles dans le fichier [LICENCE](LICENCE).