|
| 1 | +from pathlib import Path |
| 2 | +from time import perf_counter |
| 3 | + |
| 4 | +import pandas as pd |
| 5 | +from bloom.config import settings |
| 6 | +from bloom.container import UseCases |
| 7 | +from bloom.domain.spire_ais_data import SpireAisData |
| 8 | +from bloom.infra.database.errors import DBException |
| 9 | +from bloom.logger import logger |
| 10 | +from pydantic import ValidationError |
| 11 | +from shapely import wkb |
| 12 | +import numpy as np |
| 13 | + |
| 14 | + |
| 15 | +def map_to_domain(row: pd.Series) -> SpireAisData: |
| 16 | + isna = row.isna() |
| 17 | + |
| 18 | + return SpireAisData( |
| 19 | + spire_update_statement=row['spire_update_statement'], |
| 20 | + vessel_ais_class=row['vessel_ais_class'], |
| 21 | + vessel_flag=row['vessel_flag'], |
| 22 | + vessel_name=row['vessel_name'], |
| 23 | + vessel_callsign=row['vessel_callsign'], |
| 24 | + vessel_timestamp=row['vessel_timestamp'], |
| 25 | + vessel_update_timestamp=row['vessel_update_timestamp'], |
| 26 | + vessel_ship_type=row['vessel_ship_type'], |
| 27 | + vessel_sub_ship_type=row['vessel_sub_ship_type'], |
| 28 | + vessel_mmsi=row['vessel_mmsi'], |
| 29 | + vessel_imo=row['vessel_imo'], |
| 30 | + vessel_width=row['vessel_width'], |
| 31 | + vessel_length=row['vessel_length'], |
| 32 | + position_accuracy=row['position_accuracy'], |
| 33 | + position_collection_type=row['position_collection_type'], |
| 34 | + position_course=row['position_course'], |
| 35 | + position_heading=row['position_heading'], |
| 36 | + position_latitude=row['position_latitude'], |
| 37 | + position_longitude=row['position_longitude'], |
| 38 | + position_maneuver=row['position_maneuver'], |
| 39 | + position_navigational_status=row['position_navigational_status'], |
| 40 | + position_rot=row['position_rot'], |
| 41 | + position_speed=row['position_speed'], |
| 42 | + position_timestamp=row['position_timestamp'], |
| 43 | + position_update_timestamp=row['position_update_timestamp'], |
| 44 | + voyage_destination=row['voyage_destination'], |
| 45 | + voyage_draught=row['voyage_draught'], |
| 46 | + voyage_eta=row['voyage_eta'], |
| 47 | + voyage_timestamp=row['voyage_timestamp'], |
| 48 | + voyage_update_timestamp=row['voyage_update_timestamp'], |
| 49 | + created_at=row['created_at'], |
| 50 | + ) |
| 51 | + |
| 52 | + |
| 53 | +def run(csv_file_name: str): |
| 54 | + use_cases = UseCases() |
| 55 | + db = use_cases.db() |
| 56 | + spire_ais_data_repository = use_cases.spire_ais_data_repository() |
| 57 | + |
| 58 | + total = 0 |
| 59 | + try: |
| 60 | + df = pd.read_csv(csv_file_name, sep=";") |
| 61 | + df = df.rename(columns={}) |
| 62 | + df=df.replace(np.NaN,None) |
| 63 | + spire_ais_data = df.apply(map_to_domain, axis=1) |
| 64 | + with db.session() as session: |
| 65 | + spire_ais_data = spire_ais_data_repository.batch_create_ais_data(session=session, ais_list=list(spire_ais_data)) |
| 66 | + session.commit() |
| 67 | + total = len(spire_ais_data) |
| 68 | + #print(spire_ais_data) |
| 69 | + except ValidationError as e: |
| 70 | + logger.error("Erreur de validation des données de bateau") |
| 71 | + logger.error(e.errors()) |
| 72 | + except DBException: |
| 73 | + logger.error("Erreur d'insertion en base") |
| 74 | + logger.info(f"{total} ais data créés") |
| 75 | + |
| 76 | + |
| 77 | +if __name__ == "__main__": |
| 78 | + time_start = perf_counter() |
| 79 | + file_name = Path(settings.data_folder).joinpath("./spire_positions_subset.csv") |
| 80 | + logger.info(f"DEBUT - Chargement des données AIS Spire depuis le fichier {file_name}") |
| 81 | + run(file_name) |
| 82 | + time_end = perf_counter() |
| 83 | + duration = time_end - time_start |
| 84 | + logger.info(f"FIN - Chargement des données AIS Spire en {duration:.2f}s") |
0 commit comments