Thanks to visit codestin.com
Credit goes to Github.com

Skip to content

WhiteWine — Scala functional programming and data exploration of a white‑wine dataset | HES‑SO student project 2023

Notifications You must be signed in to change notification settings

EliasBorrajo/White-Wine

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

White Wine Analysis - Projet Scala 🍷🍇

Scala SBT Paradigm

📋 Description du Projet

Ce projet académique (archivé) a été réalisé dans le cadre du cours 635-1 CONCEPTS AVANCÉS ET TECHNIQUES ACTUELLES dispensé par Jean-Paul Calbimonte à la HES-SO Valais-Wallis. Il explore le paradigme de programmation fonctionnelle avec Scala, en contraste avec la programmation orientée objet en Java. Le projet analyse un dataset de vins blancs du monde entier en appliquant les concepts avancés de Scala.

🎯 Objectifs Pédagogiques

  • Exploration d'un nouveau paradigme : Transition de Java/OOP vers Scala/Fonctionnel
  • Maîtrise des concepts Scala : Traits, case classes, pattern matching, immutabilité
  • Programmation fonctionnelle : Higher-order functions, collections immutables, composition
  • Concurrence moderne : Utilisation des Futures pour les opérations asynchrones

📊 Dataset

Source : 11-WhiteWine.csv

Le dataset contient des informations sur des vins blancs internationaux avec les attributs suivants :

  • Nom du vin avec millésime
  • Pays d'origine
  • Région viticole
  • Producteur/Encaveur
  • Note qualitative
  • Nombre d'évaluations
  • Prix
  • Année de production

🏗️ Architecture du Projet

Modélisation des Données (selon les exigences du cours)

Le projet respecte les exigences de modélisation imposées par le cours :

  • Trait
  • Case class (immutabilité)
  • Enum

Composants Principaux

  1. WineLoader : Chargement et parsing du CSV
  2. Services d'Analyse : 6 services d'exploration de données
  3. Future Handler : Exécution asynchrone et mesure de performance
  4. Tests Unitaires : Validation des services déterministes

🔧 6 Services d'Analyse Implémentés

  • Service de Filtrage
  • Service de Tri
  • Service de Mapping
  • Service d'Aplatissement
  • Service de Groupement
  • Service de Réduction

⚡ Programmation Asynchrone avec Futures

Conformément aux bonus demandés dans le cours, le projet utilise les Future pour l'exécution asynchrone :

🛡️ Paradigme Fonctionnel

Principes Appliqués

  • Immutabilité : Toutes les structures de données sont immutables
  • Fonctions Pures : Pas d'effets de bord dans les services d'analyse
  • Composition : Les services peuvent être composés ensemble
  • Pattern Matching : Gestion élégante des cas avec match

Gestion des Erreurs (selon les principes du cours)

Le cours de Jean-Paul Calbimonte met l'accent sur la gestion robuste des erreurs avec les types Option et Try.

🧪 Tests et Validation

Le projet inclut des tests unitaires pour valider le comportement déterministe des services.

📈 Mesures de Performance

Le projet inclut un système de benchmarking pour mesurer :

  • Les temps d'exécution des services en mode parallèle (via Future)
  • Les performances individuelles de chaque traitement

Prérequis

  • Scala 3.1.3+ (version utilisée dans le cours)
  • SBT (Simple Build Tool) 1.x
  • JVM 11+
  • VSCode avec extension Metals (recommandé par le cours)

📁 Structure du Projet

White-Wine/
├── src/
│   ├── main/
│   │   └── scala/
│   │       ├── models/          # Case classes et traits
│   │       ├── services/        # Services d'analyse
│   │       ├── loaders/         # Chargement des données
│   │       └── Main.scala       # Point d'entrée
│   └── test/
│       └── scala/
│           └── services/        # Tests unitaires
├── data/
│   └── 11-WhiteWine.csv        # Dataset
├── build.sbt                   # Configuration SBT
└── README.md

🏆 Fonctionnalités Bonus Implémentées

  • Tests Unitaires pour les services déterministes
  • Futures pour l'exécution asynchrone de tous les services
  • Benchmarking avec calcul des temps d'exécution
  • Gestion d'erreurs robuste avec pattern matching

🎓 Concepts Scala Démontrés

  • Case Classes et Traits pour la modélisation (exigence du cours)
  • Pattern Matching extensif avec match (obligatoire)
  • Collections Immutables (List, Map, Set) - principe fondamental
  • Higher-Order Functions (map, filter, fold) - programmation fonctionnelle
  • Fonctions Anonymes et Lambdas (λ-calculus vu en cours)
  • Option Types pour éviter les NullPointerException
  • Future et Concurrence (bonus demandé)
  • Companion Objects et méthodes apply
  • Enums Scala 3 (version utilisée dans le cours)
  • Immutabilité et Composabilité (paradigme fonctionnel)

📝 Critères de Réussite

Critère Statut Détails
Exploration du dataset Dataset 11_WhiteWine.csv analysé
Modélisation avec traits/classes Traits, Case classes, Companion Objects, Enums
Chargement en collections Scala WineLoader implémenté
5+ services d'exploration 6 services : Filter, Sort, Map, Flatten, Group, Reduce
Paradigme fonctionnel Immutabilité, Match cases, Gestion d'exceptions
Documentation Code documenté
Bonus : Tests unitaires Services déterministes testés
Bonus : Futures Exécution asynchrone de tous les services
Bonus : Benchmarking Mesure des performances et gains temporels

📚 Concepts du Cours Appliqués

Ce projet démontre les concepts enseignés par Jean-Paul Calbimonte :

Lambda Calculus et Fonctions

Le cours introduit le λ-calculus comme fondement de la programmation fonctionnelle :

// λx . x + x devient en Scala :
val duplicate = (x: Int) => x + x

// Composition de fonctions (vue en cours)
val addThenDouble = (x: Int) => duplicate(x + 1)

Paradigme Fonctionnel vs Impératif

Comparaison directe avec les exemples du cours :

// Style impératif (à éviter)
var total = 0
for (wine <- wines) {
  if (wine.rating > 4.0) total += 1
}

// Style fonctionnel (encouragé dans le cours)
val total = wines.filter(_.rating > 4.0).length

Immutabilité et Collections

Application des principes vus en cours avec les collections Scala :

// Collections immutables (principe clé du cours)
val originalWines = List(wine1, wine2, wine3)
val filteredWines = originalWines.filter(_.country == "France")
// originalWines reste inchangé

Projet réalisé dans le cadre du cours 635-1 CONCEPTS AVANCÉS ET TECHNIQUES ACTUELLES
Enseignant : Jean-Paul Calbimonte, HES-SO Valais-Wallis
Contexte : Exploration du paradigme fonctionnel avec Scala en transition depuis Java/OOP


Ancien README Archivé

Projet Scala

Ce projet a été réalisé durant le cours 635-1 CONCEPTS AVANCÉS ET TECHNIQUES ACTUELLES

Tâches

  1. Prenez un ensemble de données dans le dossier de données. Explorez et comprenez l'ensemble de données. (5pt)
  2. L'ensemble de données sélectionné est 11-WhiteWine.csv

    Cet ensemble de données représente une liste de vin blanc à travers le monde. Pour chaque vin est donné: son nom avec son année, son pays, sa région, son encaveur, sa note, son nombre de note attribuée, son prix et son année.

  3. Modélisez les principaux éléments de données à l'aide de classes et de traits Scala. Si vous souhaitez inclure des classes qui ne figurent pas dans le jeu de données, n'hésitez pas à les ajouter. L'héritage et l'utilisation de traits sont obligatoires. Créez un modèle de données qui reflète le domaine de la manière la plus détaillée possible, par exemple en utilisant la composition de classes, et des traits/classes cas/enums si nécessaire. L'utilisation d'une seule classe plate ou d'une modélisation très superficielle n'est pas encouragée. (20pt)
  4. Lire le contenu du jeu de données et le charger dans des collections Scala d'instances des classes définies précédemment. (5pt)
  5. Fournir au moins 5 services d'exploration de données sur les données chargées (utiliser des opérateurs différents et variés, par exemple agréger des informations, filtrer des données, résumer des informations, faire des requêtes, etc.) L'implémentation doit suivre un style fonctionnel et différentes opérations (par exemple map, reduce, fold, zip, flatMap) et des fonctions anonymes. (40pt)
  6. Pour tous vos projets, suivez le paradigme fonctionnel (évitez l'état, utilisez l'immutabilité, la composabilité). Utilisation obligatoire du match case et gestion appropriée des exceptions. (20pt)
  7. Documenter le code (10pt)
  8. Bonus : fournir 1 service en utilisant les futures

Synthèse des résultats

Critère Réussite Commentaire
Prenez un ensemble de données dans le dossier, explorer & comprendre [X] 11_WhiteWine.csv
Modélisez les principaux éléments de données [X] Traits
Case class
Companion Object
Enum
Lire le contenu du jeu de données et le charger dans des collections d'instances [X] WineLoader
Fournir au moins 5 services d'exploration de données [X] 6 Services fournis
Filter
Sort
Map
Flatten
GroupMapReduce
Suivre le paradigme fonctionnel, match, immutabilité, composabilité [X] Case
Immutabilité
Error & Exceptions Handling
Documenter le code [X]
Bonus : Unit Testing [X] Deterministic services
Bonus : fournir 1 service en utilisant les futures [X] Les 5 services sont exécutés avec future, et affichés les uns après les autres
Bonus : Calcul du temps d'exécution de chaque service future,
et temps total afin d'évaluer le gain de temps grâce aux futures
[X]

About

WhiteWine — Scala functional programming and data exploration of a white‑wine dataset | HES‑SO student project 2023

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages