Giter VIP home page Giter VIP logo

12_bloom's People

Contributors

erawpalassalg avatar gaudinnicolas avatar guillaumegilles avatar hehlinge42 avatar lucaszimmermann avatar machbry avatar marioncoutarel avatar mnicolleutc avatar n-toussaint avatar njouanin avatar romainm13 avatar ronanmorgan avatar rv2931 avatar saboniamine avatar sarahlunette avatar sebm42 avatar wbarillon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

12_bloom's Issues

Clean up du repo

Actuellement on a :

  • bloom_scraper.py (script de Marion avec son propre scheduling qui peut donc tourner en local)
  • bloom_scraper.sh
  • bloom_scraper_crontab.py

et le crontab est setup manuellement (ie voir README)

Les trois autres fichiers sont redondant : le crontab devrait appeler un unique fichier python qui contient le code de scraping.
Voir avec @MarionCoutarel pourquoi elle a besoin d'une librairie de scheduling pour lancer le code en local.
Est ce qu'on en a encore besoin avec l'environnement dockerisé qui contient le crontab ?
Si le besoin est justifié alors le script bloom_scraper.py devrait appeler du code qui est dans le fichier appelé par le crontab (ou alors créer une libraire commune aux deux fichiers)

Github Workflow management

Si vous avez besoin de droit spécifique sur git pour ce sujet, demandez moi :)

  • créer un hook pour éviter qu'on puisse push sur master
  • créer des tags de priorisation (0 : urgent , 1 : medium, 2: long terme)
  • demander à l'équipe si ils aimeraient avoir d'autres tags à implémenter
  • ajouter un groupe de personne (ie notre équipe tech) qui serait automatiquement dans les reviewer des PR
  • ajouter un système d'alerting (slack ou email) dès qu'une PR est en "in review" (peut être via gitAction ? ou tout simplement à voir dans les settings github)

Excution des scripts alembic en échec

L'exécution des scripts alembic produit une erreur ModuleNotFoundError: No module named 'bloom'.

$ alembic upgrade head  
Traceback (most recent call last):
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/bin/alembic", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/config.py", line 641, in main
    CommandLine(prog=prog).main(argv=argv)
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/config.py", line 631, in main
    self.run_cmd(cfg, options)
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/config.py", line 608, in run_cmd
    fn(
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/command.py", line 403, in upgrade
    script.run_env()
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/script/base.py", line 583, in run_env
    util.load_python_file(self.dir, "env.py")
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
    module = load_module_py(module_id, path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
    spec.loader.exec_module(module)  # type: ignore
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/Users/nicolasjouanin/Dev/python/12_bloom/src/alembic/env.py", line 8, in <module>
    from bloom.config import settings
ModuleNotFoundError: No module named 'bloom'

Créer une alerte "extinction de l'AIS"

Nécessite un historique des positions + le signal True/False sur l'AIS
Où intégrer les données dans la pipeline (parce que nécessite un historique de positions donc doit se faire soit dès qu'on récupère un point en requêtant les précédentes positions, ou à postériori)

TypeError: 'NoneType' object is not callable suite PR87

Depuis le merge de la PR #87 , l'application streamlit échoue lors du chargement des données d'un bateau avec l'erreur:

TypeError: 'NoneType' object is not callable
Traceback:

File "/Users/nicolasjouanin/Dev/python/venv-bloom/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 535, in _run_script
    exec(code, module.__dict__)
File "/Users/nicolasjouanin/Dev/python/12_bloom/bloom/pages/1_Vessel_Exploration.py", line 111, in <module>
    vi = v.query(voyage_id=voyage_id)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/nicolasjouanin/Dev/python/12_bloom/bloom/bloom/domain/vessels/vessel_trajectory.py", line 128, in query
    filtered_vessel.mpas(self.mpas())
                         ^^^^^^^^^^^

Add tests + CI for each PR

=> quels tests ? simplement lancer le job et voir qu'on a bien X lignes (X correspondant au nombre de bateau)

=> quel framework ? pytest ?

Usage of a managed queue for jobs management

Suite à notre point d'hier soir :

=> un maximum d'infra doit être managé sans pour autant reposer sur K8S, l'utilisation de services SNS et SQS, devenu assez commun chez les provider clouds, va donc être envisagé.

=> on va devoir faire marche arrière sur le Cronjob que l'on voulait déployer sur notre K8S, le type sera plutôt un Deployment car on peut imaginer des "interférences" avec la queue (je laisse @pagbrl expliciter ce point :)

=> un worker va donc être déployé pour scrapper X bateaux. L'idée est de ne pas lancer un worker par bateau pour essayer d'optimiser un peu l'utilisation du Driver Chrome et l'overhead dû au worker lui même. Rien ne nous empêche de faire également un peu d'async pour optimiser au mieux.

=> la bdd a été lancé manuellement, il faut la réintégrer aux scripts terraform pour pouvoir également orchestrer les queues via terraform.

=> Attendons la PR de @SaboniAmine et @LucasZimmermann avant de se lancer (utilisation d'une BDD + ajout de la source Spire). Et après cette tâche, on pourra envisager l'intégration des jobs des datascientists, qui pourrait également se reposer sur le même système de queue.

Intégrer les scripts des data scientists dans le repo

Travaille de communication avec les data scientists : Il me semble que Théo et Mathilde ont commencé à travailler chez eux mais ils n'ont push leurs scripts sur le repo.

Il faut les ajouter, créer un repo et les faire profiter des good practices qu'on a dev :)

Peut être qu'il faudrait ajouter un jupyter notebook dans notre environnement docker pour qu'ils puissent l'utiliser également ?

Doublon d'url de base

L'url de base est définie deux fois dans MarineTrafficVesselScraper sous forme de string.

Utiliser base_url dans la génération de vessel_url serait plus pertinent.

Intégrer distance_from_shore et distance_from_port

Description
Que cela soit comme un flag ou comme un feature pour la détection de pêche à partir des données Global Fishing Watch, on a besoin notamment du feature distance à la côte

Proposition de résolution
Deux manières de faire :

Intégration

  • Peut s'intégrer directement dans chaque nouveau point sur Spire
  • Peut se recalculer sur toute la base
  • Doit pouvoir se recalculer au cas où sur n'importe quel point

Alerting : recevoir une alerte quand nous ne recevons plus de data ou quelle est malformé

Pas spécialement d'idée sur ce sujet.

Est ce qu'un second script python doit également tourner toutes les heures pour faire des tests data ?
Quel librairie peut être utilisée pour envoyer des mails ou des alertes slacks ?

Est ce qu'on part tout de suite sur une stack de monitoring dockerisé type grafana, fluentd, alertmanager ?? A terme ce sera utile mais ça fait une sacré première step

[all_package_update] ValueError: Passing in 'datetime64' dtype with no precision is not allowed. Please pass in 'datetime64[ns]' instead.: Error while type casting for column 'timestamp'

On the branch all_package_update
Pull Request 107

Following pandas uprade to 2.X some breaking changes are failing when cliking "Load" button in Vessel Exploration

Traceback:

File "/venv/lib/python3.11/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 542, in _run_script
    exec(code, module.__dict__)
File "/project/src/pages/1_Vessel_Exploration.py", line 85, in <module>
    v = load_trajectory(mmsi, load_mpa)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/project/src/pages/1_Vessel_Exploration.py", line 27, in load_trajectory
    vessel = rep.get_vessel_trajectory(mmsi)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/project/src/bloom/infra/repositories/repository_vessel.py", line 218, in get_vessel_trajectory
    df = df.astype({"timestamp": 'datetime64'})
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/generic.py", line 6617, in astype
    res_col = col.astype(dtype=cdt, copy=copy, errors=errors)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/generic.py", line 6640, in astype
    new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/internals/managers.py", line 430, in astype
    return self.apply(
           ^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/internals/managers.py", line 363, in apply
    applied = getattr(b, f)(**kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/internals/blocks.py", line 758, in astype
    new_values = astype_array_safe(values, dtype, copy=copy, errors=errors)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/dtypes/astype.py", line 237, in astype_array_safe
    new_values = astype_array(values, dtype, copy=copy)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/dtypes/astype.py", line 182, in astype_array
    values = _astype_nansafe(values, dtype, copy=copy)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/dtypes/astype.py", line 110, in _astype_nansafe
    dta = DatetimeArray._from_sequence(arr, dtype=dtype)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py", line 327, in _from_sequence
    return cls._from_sequence_not_strict(scalars, dtype=dtype, copy=copy)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py", line 354, in _from_sequence_not_strict
    dtype = _validate_dt64_dtype(dtype)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/venv/lib/python3.11/site-packages/pandas/core/arrays/datetimes.py", line 2544, in _validate_dt64_dtype
    raise ValueError(msg)```

Mise à jour PostgreSQL

Mettre à jour la configuration docker pour utiliser une image plus récente de PostgreSQL (16+)

Créer un environnement dockerisé

=> créer un dossier docker-env/
=> utiliser docker-compose même si une seule image dans cette step 1
=> Créer une première image docker avec une image de base python 3.10
=> Copier le requirements.txt et ajouter les dépendances
=> créer le crontab dans le docker
=> créer un volume avec le projet github pour pouvoir facilement modifier le code et le tester dans le docker. A voir plus tard pour la prod si on garde ce système
=> la data (pour l'instant .csv) doit également être dans un volume
=> créer le readme correspondant

Alerting : use case de détection d'une pêche potentielle

Pour ce premier cas d'usage, et en attente de règles de détection de pêche non autorisée plus précises, nous souhaitons ajouter un système d'alerting au scrapping des données de positions récupérées sur MarineTraffic.
Voici un proposition de flow d'exécution pour ce use case :

image

Si le scrapping fonctionne, et que le bateau se trouve dans une zone protégée, la vitesse instantanée est comparée à une valeur seuil. Si elle est inférieure à cette valeur seuil, une alerte est générée, alimentant un dossier ou rapport qui sera exporté et analysé a posteriori par l'équipe Bloom.

Cette issue est dépendante de la mise à jour des données scrappées décrites dans la #22

MAj automatique de bloom_scrap.csv

=> créer un dossier data-test/
=> créer un hook python qui lancer le script et générer de la donnée (pour remplacer l'ancien fichier) avant de faire un commit.

L'idée étant d'avoir un fichier de test toujours à jour, là on a ajouté des colonnes dans l'url mais on a toujours le même csv depuis le début du projet

Validation d'un environnement de développement

A partir d'un clone du repo officiel, vérifier:

  • le démarrage du/des container docker nécessaire
  • la création des tables en BDD
  • l'exécution des scripts de chargement des données (ports, AMP, ..)
  • l'affichage des trajectoires streamlit
  • l'exécution du traitement de chargement des données spire (depuis un dump)
  • la création d'une branche et push sur le repo officiel
  • la création et merge d'une PR à partir d'une branche

Ajouter support de typage statique

@n-toussaint a suggérer d'ajouter mypy au tooling actuel, ce qui implique :

  • d'adapter le code (nous avons actuellement des types, mais seulement pour l'usage de pydantic)
  • faire une review et voir si mypy est l'outil que nous souhaitons utiliser ? pyre, pytype semblent être des alternatives viable 🤷
  • d'ajouter la lib choisie, en pre-commit ?

Refactor data model "fichier plat"

Pour l'instant on a un gros fichier csv avec des lignes qui sont ajoutées au fur et à mesure.

Il faudrait découper ce fichier :

  • dans le temps : un fichier par mois ? par semaine ?
  • par bateau ?
    Les data scientist vont avoir besoin de travailler sur plusieurs bateaux en même temps donc ça peut être chiant de séparer par bateau mais en même temps si demain on a 250 bateaux on va pas pouvoir tout garder dans le même fichier. A discuter avec l'équipe métier

Et refactorer le code python en conséquence.

CD: workflow GA pour déployer sur l'environnement Scaleway

Afin de suivre les mises à jour du scrapping des données de positions de bateau, il serait intéressant de pouvoir déployer automatiquement l'application sur la machine scaleway à disposition.
Une première étape serait de pouvoir build l'image docker dans le job build & test, puis d'avoir une autre action qui déploie cette image docker.

[Trawlwatch] ValueError: cannot convert float NaN to integer whrn reaching max vayage_id

When we display trajectory of a vessel, when voyage_id reach the max limit (voyage_id=2) an error is thrown

bloom | 2024-03-08 11:34:06.925 Uncaught app exception bloom | Traceback (most recent call last): bloom | File "/venv/lib/python3.9/site-packages/streamlit/runtime/scriptrunner/script_runner.py", line 535, in _run_script bloom | exec(code, module.__dict__) bloom | File "/project/src/pages/1_Vessel_Exploration.py", line 110, in <module> bloom | change_range(voyage_id) bloom | File "/project/src/pages/1_Vessel_Exploration.py", line 99, in change_range bloom | min_value = int(vf.index.min()) bloom | ValueError: cannot convert float NaN to integer

This erreor seems to be added by PR #87

Cf : #98 for discussion about this

image

image

Simplifier l'intégration des ports pour n'importer que des données brutes, sans données intermédiaires

Actuellement il y a un fichier ports.csv qui contient les coordonnées géographiques des ports puis un ports_rad3000_res10.csv issu d'un process de transformation de ports.csv mais contenant des zones correspondantes au port plutôt que simplement leur coordonnées

Dans l'idée il faudrait que dans DATA ont aient besoin que du fichier ports.csv de données initiales, à renomme ports_subsets, je dirais même harbours_subsets.csv si on maintien l'anglais contenant les coordonnées
Pour la génération des zones c'est quelque chose qui, si des zones doivent être générées, sont des process qui devraient être inclus dans le process d'import des harbours_subsets.csv sans fichier intermédiaire
@romainm13 @njouanin

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.