Contribution au projet

Pré-requis

Il faut installer python3-venv, curl, make et git avant Poetry :

sudo apt-get install -y curl make git python3-venv

Poetry

curl -sSL https://install.python-poetry.org | python3 -

Ajouter la commande suivante dans le .bashrc :

export PATH="$HOME/.local/bin:$PATH"

Specifier la version de Python à Poetry : python 3.10

Si on a une version de python > 3.10 on peut utiliser pyenv pour spécifier la version de python à utiliser en local sur le dossier :

pyenv local 3.10
poetry env use 3.10

Installation des dépendances

poetry config virtualenvs.in-project true
poetry install

poetry config virtualenvs.in-project true permet d’installer l’environnement comme un sous-dossier du projet plutôt que dans le home. C’est recommandé pour que VSCode trouve l’environnement.

Pour développer la pipeline, il faut des packages supplémentaires :

poetry install --extras "pipeline"

Debug Poetry

Pour supprimer un environnement : https://python-poetry.org/docs/managing-environments/

poetry env list
poetry env remove 3.7

Pour nettoyer tout

rm poetry.lock 
poetry env list
poetry env remove leximpact-prepare-data-0Rkp9wuO-py3.8
poetry cache clear --all pypi
poetry env use -vvv 3.8
poetry install

Pour afficher l’arbre des dépendances:

 poetry show --tree 

En cas de problèmes d’install:

rm poetry.lock

Pour supprimer un environnement : https://python-poetry.org/docs/managing-environments/

How to develop

Lien sécurisé vers l’ERFS-FPR

To use hosted protected data with local algorithm:

sudo mkdir -p /mnt/data-in /mnt/data-out
sudo chown $USER:$USER /mnt/data-*
sshfs ysabell:/data/private-data/input /mnt/data-in
sshfs ysabell:/data/private-data/output /mnt/data-out

as local $USER and where ysabell is defined in local ~/.ssh/config.

Update package to last version

poetry update

Jupyter

First time, and after adding a librairy :

poetry run python -m ipykernel install --name leximpact-prepare-data-kernel --user

Launch jupyter

poetry run jupyter lab

Check style

make precommit

Update precommit

A faire de temps en temps pour rester à jour:

poetry run pre-commit autoupdate

NBDev

Run pre-commit before converting notebooks poetry run pre-commit run --all-files

Build lib from notebook poetry run nbdev_build_lib

Build docs from notebook poetry run nbdev_build_docs

Re-run pre-commit poetry run pre-commit run --all-files

# Pour formater automatiquement le code (voir l'entrée precommit dans Makefile pour le détail)
!make precommit
# Build docs from notebookµ
#!poetry run nbdev_build_docs
!cd .. && make docs

How we build the docs

The documentation is available at https://documentation.leximpact.dev/leximpact_prepare_data/

It’s build with NBDev in the GitLab CI.

We do it like this: - Use Poetry env for default environnnement - Use venv for specific env to remove notebook output, because --clear-output do not work with nbconvert < 6 that is needed by other dependencies. We do it to avoid publishing sensitive data. We have to find a better way to publish outputs without sensitive data. - Build the docs with poetry run nbdev_docs.

Then we copy the docs via scp to our server and serve them with Nginx.

Since NBDev v2 the doc is a pure static site.

After upgrading NBDev, do not forget to upgrade Quarto with: curl -LO https://www.quarto.org/download/latest/quarto-linux-amd64.deb && dpkg -i quarto-linux-amd64.deb

The CI also push the doc to a branch. To do it we need a token from https://git.leximpact.dev/admin/users/project_18_bot/impersonation_tokens to be put in the CI variable API_TOKEN.

Test de la doc en local

poetry run nbdev_preview

Anaconda sur CASD

Construction du paquet

docker run -i -t -v $PWD:/src continuumio/miniconda3 /bin/bash
cd /src
python3 gitlab-ci/src/get_pypi_info.py -p leximpact-prepare-data
conda install -y conda-build anaconda-client
conda config --set anaconda_upload yes
conda build -c conda-forge -c leximpact -c openfisca .conda

Pour faire l’upload:

anaconda login
anaconda upload \
    /opt/conda/conda-bld/noarch/leximpact-prepare-data-0.0.8-py_0.tar.bz2 \
    /opt/conda/conda-bld/noarch/leximpact-prepare-data-casd-0.0.8-py_0.tar.bz2 \
    /opt/conda/conda-bld/noarch/leximpact-prepare-data-dev-0.0.8-py_0.tar.bz2

Test en local

Installer le paquet dans un environnement propre:

mkdir -p casd-test
cd casd-test
git clone https://git.leximpact.dev/leximpact/simulateur-socio-fiscal/budget/leximpact-prepare-data.git
rm -r  ./conda-env
conda create  --prefix ./conda-env python=3.8
conda activate ./conda-env
conda config --add channels conda-forge
conda config --set channel_priority strict
conda install -c conda-forge -c openfisca -c leximpact leximpact-prepare-data-casd
ipython kernel install --user --name=prepare-data-conda-env

Pour vérifier que tout a fonctionné:

jupyter lab

Puis ouvrir le fichier leximpact-prepare-data/notebook/extractions_base_des_impots/test_install.ipynb et l’exécuter.

Pour sortir de l’environnement

conda deactivate

Initialisation de la base ERFS-FPR

Nous recevons de l’INSEE des fichiers SAS concernant des ménages.

Or nous avons besoin de foyers fiscaux pour nos traitements.

Pour passer des ménages aux foyers fiscaux nous utilisons OpenFisca France Data.

L’intégration continue de OpenFisca France Data effectue ce traitement. On le trouve sur le serveur dans /mnt/data-out/leximpact/erfs-fpr/, cela nous permet d’obtenir le fichier openfisca_erfs_fpr_2021.h5 que l’on va utiliser à l’étape suivante.

Si jamais vous souhaitez le refaire à la main :

clone git@git.leximpact.dev:benjello/openfisca-france-data.git
cd openfisca-france-data/
python3 -m venv .venv
source .venv/bin/activate
make install
cp /mnt/data-out/openfisca-france-data/openfisca_survey_manager_config-after-build-collection.ini ~/.config/openfisca-survey-manager/config.ini
cp /mnt/data-out/data_collections/bilal/erfs_fpr.json ./erfs_fpr.json
nano ~/.config/openfisca-survey-manager/config.ini
nano /home/jupyter-benoit/openfisca-france-data/erfs_fpr.json
cp /mnt/data-out/erfs_fpr_2021.h5 /home/jupyter-benoit/openfisca-france-data/erfs_fpr_2021.h5
build-erfs-fpr -y 2021

Le script build-erfs-fpr exécute le code openfisca_france_data.erfs_fpr.input_data_builder:main.