A tool to analyze Pool results and visualize student and promotion statistics, available as a Jupyter Notebook or an interactive Streamlit dashboard.
This project uses the following libraries:
- matplotlib – Static graph generation (notebook)
- Jupyter Notebook – Notebook execution
- NumPy – Mathematical operations
- Pandas – Dataset processing
- Streamlit – Interactive web dashboard
- Plotly – Interactive charts (dashboard)
All dependencies are listed in requirements.txt.
- Clone the repository
git clone <repository_url>
cd <repository_name>- Create a virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies
pip install -r requirements.txtThe project uses a .env file for API authentication (Hermes API credentials).
- Create a
.envfile from the example
cp .env.example .envThen edit .env with your actual credentials:
PAT=your_pat_here
PAT_ID=your_pat_id_here
HERMES_ENDPOINT=https://api.epitest.eu/api/| Variable | Description | Required | Default |
|---|---|---|---|
PAT |
Personal Access Token | Yes | - |
PAT_ID |
PAT identifier | Yes | - |
HERMES_ENDPOINT |
Hermes API endpoint | No | https://api.epitest.eu/api/ |
Notes:
PATandPAT_IDare obtained from your Epitech account (Profile → API Tokens)- These tokens are used for all API calls to fetch student results
⚠️ Never commit the.envfile to version control. It's already in.gitignore
- Create a
datasetsfolder at the root of the repository. - Add your Pool CSV datasets inside this folder (ou upload directement depuis le dashboard).
You can download tested datasets from: 👉 https://hermes.epitest.eu/ Go to the results page and click on "CSV (All instances)".
jupyter notebook- Open
progression.ipynb. - Click Run All.
- When prompted, copy/paste the notebook link displayed in the terminal if required.
Graphs are generated and saved automatically in plots_students/.
The dashboard supports 3 data sources (selectable in the sidebar):
| Source | Description | Requirements |
|---|---|---|
| CSV | Load from local CSV files in datasets/ folder |
CSV files in datasets/ |
| API | Fetch live data from Hermes API | .env file with credentials |
| Sync | Synchronize CSV files from API | .env file with credentials |
# Standard mode
streamlit run dashboard.py
# With custom port
streamlit run dashboard.py --server.port 8502# Build and run (with environment variables)
docker-compose up --build
# Or detached mode
docker-compose up -d --buildDocker with environment variables:
If your .env file is not automatically loaded, pass variables explicitly:
# Option 1: Export before docker-compose
export HERMES_EMAIL=your.email@epitech.eu
export HERMES_PASSWORD=your_password
docker-compose up -d --build
# Option 2: Create a docker-compose.override.yml (not committed)The dashboard is accessible at http://localhost:8501
Notes Docker :
- Les datasets sont persistés via un volume (
./datasets) - Les graphs générés sont sauvegardés dans
./plots_students
Le dashboard comprend les sections suivantes :
| Section | Description |
|---|---|
| KPIs | Active students, global average, best student, hardest day |
| Class progression | Interactive line chart of daily class averages |
| Individual view | Per-student curve vs. class average + score table |
| Hardest days | Bar chart of the N days with the lowest scores (configurable) |
| Leaderboard | Students ranked by average score with color gradient |
The sidebar lets you filter students and adjust the number of hardest days shown.
- ✅ Generate cleaned daily results in the format
[login, percentage] - 📁 Upload direct de datasets depuis le dashboard (drag & drop) – même quand vide
- 🗑️ Clear data – bouton pour supprimer tous les datasets en un clic
- 📈 Class average progression chart (static + interactive)
- 👨🎓 Individual student progression charts → saved in
plots_students/ - 📊 Bar chart highlighting the hardest Pool days
- 🌐 Interactive Streamlit dashboard with Plotly charts and filters
- 🐳 Docker support – déploiement facile avec
docker-compose - 🔌 Hermes API integration – Fetch live data directly from Epitech's API
- 🕵️ Suspicious submissions detection – 4 algorithms to detect cheating patterns:
- Copieurs – Students with similar scores across multiple days
- Pics isolés – Isolated high scores (>70%) surrounded by low scores (<30%)
- Montagnes russes – Rapid alternations indicating selective cheating
- Copies collectives – Clusters of students with identical scores
- 🧪 Unit tests – Comprehensive test suite with pytest (16 tests)
- 🔄 CI/CD – GitHub Actions workflow for automated testing
- 🔄 Automatic dataset retrieval from Hermes
- 🕵️ Suspicious behavior detection algorithms
- 🧪 Unit tests with pytest
- 🔄 CI/CD with GitHub Actions
- 📊 Export suspicious reports (PDF/Excel)
- 🔌 REST API (Nest.js backend serving stats + graphs)
- 📱 Email alerts for new suspicious patterns
- 📈 Historical tracking (week-over-week comparison)
- 🔐 Single Sign-On (SSO) Epitech integration
The project includes a comprehensive test suite with 16 tests covering detection algorithms and API functions.
pip install -r requirements-dev.txtpytestpytest --cov=.pytest tests/test_detection.py.
├── .github/workflows/ # CI/CD configuration
│ └── tests.yml # GitHub Actions workflow
├── datasets/ # CSV files (mounted volume in Docker)
├── datasets_backup/ # Backup folder for development
├── plots_students/ # Generated plots
├── tests/ # Unit tests
│ ├── __init__.py
│ ├── pytest.ini # pytest configuration
│ ├── test_api.py # API tests
│ ├── test_detection.py # Detection algorithm tests
│ └── README.md # Test documentation
├── .env # Environment variables (not committed)
├── .env.example # Environment variables template
├── dashboard.py # Streamlit dashboard
├── hermes_api.py # Hermes API integration
├── progression.ipynb # Jupyter notebook
├── requirements.txt # Full dependencies (notebook + dashboard)
├── requirements-dashboard.txt # Light dependencies (dashboard only)
├── requirements-dev.txt # Development dependencies (tests)
├── Dockerfile # Docker image
├── docker-compose.yml # Docker orchestration
└── README.md