12_bloom's People
Forkers
mnicolleutc emmanue njouanin tanega rv2931 machbry wbarillon gcoter hehlinge42 v-cth sarahlunette12_bloom's Issues
Modifier la classe Vessel et l'url de scrapping pour conserver l'attribut "vitesse instantanée"
L'info est présente sur marinetraffic
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)
[SPRINT] Créer des flags angles et directions anormales
Ajouter les zones géographiques dans la base PostGre des zones
- Continents
- Pays
- Zone économique exclusive
Si on trouve des fichiers géographiques de polygones, c'est quoi la meilleure méthode pour les intégrer dans la base @RonanMorgan @SaboniAmine ?
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)
Créer une alerte pêche dans les AMPs
Avec un split strictement protégé
Nécessite les flags
fishing = True
position in AMP
Est-ce que c'est intéressant d'interpoler les données de trajectoires en cas de données manquantes Spire ?
@RonanMorgan t'en penses quoi
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'
Dans la visualisation Folium avec les AMPs, avoir les trajectoires au dessus des AMPs
Remplacer flake8 + isort par Ruff
@benoit-cty a suggéré que nous remplacions flake8
+ isort
par Ruff dans nos pre-commit hooks.
[SPRINT] Créer une application de démonstration pour jouer avec les données
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)
github action fail with docker/login-action Get "https://ghcr.io/v2/": denied: denied
Some github actions fails at docker login in #107
It is searly due to the use of RonanMorgan user account
Run docker/login-action@v2
Logging into ghcr.io...
Error: Error response from daemon: Get "https://ghcr.io/v2/": denied: denied
[SPRINT] Créer le flag Aires Maritimes Protégées
A quel point ça remonte déjà automatiquement maintenant que vous avez mis les données dans le PostGre @RonanMorgan @SaboniAmine ?
Pouvoir visualiser tous les bateaux d'une zone sur la carte
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 ?
Tester la colonne new position dans l'intégration
[SPRINT] Faire tourner les flags par jour sur la base de données spire pour la démo
[SPRINT] Tutoriel pour récupérer les données Spire et Marine Traffic depuis la DB en Python
Pour pouvoir plus facilement faire des tests Data Science, il faut un tutoriel pour savoir comment récupérer les données de la base de données en Python
Intégrer une première version de détection de pêche à partir des données de training Global Fishing Watch
https://globalfishingwatch.org/data-download/datasets/public-training-data-v1
On pourra peut être faire un Kaggle pour avoir une première version d'algorithme.
Cela nécessitera aussi de mettre en place un pipeline de MLOps un peu léché pour déployer l'algorithme
Accélérer l'affichage des AMPs sur la carte
Recalculer les navigation status à partir de distance_from_shore / distance_from_port
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 ?
Filtrer les AMPs
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 :
- En recodant une distance à la côte la plus proche (un code existe dans un notebook Data Science fait par @OlivIsson)
- En utilisant la méthodologie Global Fishing Watch (intéressant pour être iso avec les données d'entrainement dans la détection de pêche)
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
N'afficher que les alertes qui sont en pleine mer
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
Montrer les AMP reliées à une trajectoire grâce à l'enveloppe de la trajectoire et non le barycentre
Créer une alerte "pêche dans les 6 milles"
Nécessite les flags
distance_from_shore < 6 milles
fishing = True
[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)```
Pouvoir chercher par nom de bateau
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 :
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
set up a cache mechanism to save source extractions (Spire API and others) for reuse in test/dev
The idea is to set up a mecanism that could store API responses in production in file or BDD (sqlite ?) and the application could reuse these informations to rebuild source data for test/dev environment
The cache mecanism should be explicitly activated/deactivated by configuration for stroring and/or reuse phase
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
Créer une alerte "arrivée dans les eaux africaines"
Nécessite le flag "zone = eaux territoriales africaines"
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.
Intégrer le code existant Data Science dans le code global
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.
[SPRINT] Demo streamlit pour montrer les différentes fonctionnalités
Good pratice python launched with precommit hook
=> ajouter un precommit hook pour le linting du code python (j'ai des exemples au boulot si besoin :)
=> lancer également un test unitaire (juste une première step)
Discussion : quelle data et quel data model dans le cas d'une db relationnel
Tout est dans le titre :)
On sait qu'il y aura la donnée des bateaux, mais également la donnée des polygones (ie des zones protégées)
Besoin d'autres choses ?
[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
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.