Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 12 additions & 6 deletions docs/ANSWERS.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,29 @@
# Réponses du test

## _Utilisation de la solution (étape 1 à 3)_
- [INFO] la méthode Page.with_custom_options a été supprimée en v0.13 j'ai rétrogadé la lib de votre api et j'ai maj requirements.txt pip install "fastapi-pagination<0.13"

_Inscrire la documentation technique_
J'ai proposé une solution relativement simple car je ne vois pas l'intérêt de complexifier inutilement ce processus, mais on peut ajouter du traitement en fonction de l'utilisation des données, principalement dans le fichier de normalisation.

https://pypi.org/project/pandas/
https://pypi.org/project/httpx/
https://blog.alphorm.com/maitriser-yield-python

## Questions (étapes 4 à 7)

### Étape 4

_votre réponse ici_
Je travaille actuellement avec neo4j c'est donc tout naturellement que je proposerais cette solution, c'est une base graph adaptée à la recommandation et utilisant Cypher. Cypher permet d’exprimer et d’exécuter facilement des traversées multi-sauts (plus simple que sql). Je proposerai un modèle avec 4 noeuds de base :User, :Track, :Artist, :Genre reliés par des relations comme :LISTENED, :PERFORMED_BY, :HAS_GENRE et :SIMILAR (bien sûr ça peut largement être évolutif en fonction des variables récupérées = genre, age etc). Cette solution permet de réaliser des requêtes de recommandation sans jointures sql complexes.


### Étape 5

_votre réponse ici_
Possibilité de mettre des logs pour suivre l'état du pipeline durant son processus et un script qui mesure son état en fonction des mesures paramétrées (durée, succès etc) avec une alerte mail à partir d'une plage d'écart. Le pipeline est vraiment très simple alors des logs au niveau de l'appel API me semblent important et une vérification de l'enregistrement des données dans la db mais pas besoin de plus.

### Étape 6

_votre réponse ici_
À chaque nouvelle ingestion des données on refait un calcul de similarité sur les utilisateurs, les morceaux, les albums, les artistes en fonction des titres écouté par les utilisateurs, en limitant le nombre de titre, pour ne garder que les meilleurs voisins et pour ne garder que ce qui est récent.

### Étape 7

_votre réponse ici_
Je mettrais des logs pour vérifier les performances des recommandations en fonction des scores de similarité présent dans la db. Si les logs indiquent que les utilisateurs sont moins satisfait de leur recommandation (seuil) cela déclencherait un ré-entrainement du modèle avec un versionning pour ne pas écraser le précédent modèle et je ferais de l'A/B testing pour vérifier la pertinence du nouveau modèle en fonction du précédent.

Binary file added docs/Image1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
65 changes: 65 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Technical Test Data Engineer

[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

Here is my automated data ingestion pipeline from the application API.

## Description

To achieve automated data ingestion from the API, I created a simple project with a call to all the API pages and then a normalization of the data so that it can then be stored in a database. To simplify processing, the data is simply saved locally in the data/ file of the pipeline.

![Example](Image1.png)

## Table of Contents

- [Getting Started](#Getting-Started)
- [Launch API](#Launch-API)
- [Launch Pipeline](#Launch-Pipeline)
- [Contributing](#Contributing)
- [License](#License)

## Getting Started

```bash
git clone https://github.com/moovai/technical-test-data-engineer.git
cd technical-test-data-engineer
conda create --name test-api python==3.10.9
conda create --name test-pipeline python==3.10.9
```

## Launch API

```bash
conda activate test-api
pip install -r requirements.txt
cd src/moovitamix_fastapi
python -m uvicorn main:app
```

## Launch Pipeline

```bash
conda activate test-pipeline
pip install -r package_pipeline/requirements.txt
cd src
python -m pipeline.main
```

## Launch Test

```bash
conda activate test-pipeline
pip install -r package_pipeline/requirements.txt
PYTHONPATH=. pytest -q
```

## Contributing

Pull requests are welcome. For major changes, please open an issue first
to discuss what you would like to change.

Please make sure to update tests as appropriate.

## License

This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
4 changes: 4 additions & 0 deletions docs/info.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- [ ] méthode Page.with_custom_options a été supprimée en v0.13 j'ai rétrogadé la lib et j'ai maj requirements.txt pip install "fastapi-pagination<0.13"
- [ ] lancement API : python -m uvicorn main:app
- [ ] lancement pipeline = python -m pipeline.main
- [ ] lancement des tests = PYTHONPATH=. pytest -q
32 changes: 32 additions & 0 deletions package_pipeline/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
annotated-types==0.7.0
anyio==4.10.0
certifi==2025.8.3
exceptiongroup==1.3.0
Faker==37.5.3
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
idna==3.10
iniconfig==2.1.0
nltk==3.8.1
numpy==2.2.6
packaging==25.0
pandas==2.3.2
pip==25.1
pluggy==1.6.0
pydantic==2.11.7
pydantic_core==2.33.2
Pygments==2.19.2
pytest==8.4.1
python-dateutil==2.9.0.post0
python-dotenv==1.1.1
pytz==2025.2
respx==0.22.0
setuptools==78.1.1
six==1.17.0
sniffio==1.3.1
tomli==2.2.1
typing_extensions==4.14.1
typing-inspection==0.4.1
tzdata==2025.2
wheel==0.45.1
35 changes: 30 additions & 5 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,30 @@
faker
fastapi
uvicorn
fastapi_pagination
pytest
annotated-types==0.7.0
anyio==4.10.0
click==8.2.1
exceptiongroup==1.3.0
Faker==37.5.3
fastapi==0.116.1
fastapi-pagination==0.12.34
h11==0.16.0
idna==3.10
iniconfig==2.1.0
joblib==1.5.1
nltk==3.8.1
packaging==25.0
pip==25.1
pluggy==1.6.0
pydantic==2.11.7
pydantic_core==2.33.2
Pygments==2.19.2
pytest==8.4.1
regex==2025.7.34
setuptools==78.1.1
sniffio==1.3.1
starlette==0.47.2
tomli==2.2.1
tqdm==4.67.1
typing_extensions==4.14.1
typing-inspection==0.4.1
tzdata==2025.2
uvicorn==0.35.0
wheel==0.45.1
Empty file added src/__init__.py
Empty file.
Loading