💻 Développement

dev-data-validation-helper

Validation et qualité des données dans les pipelines.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- dev-data-validation-helper --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } dev-data-validation-helper -Launch"

🚀 Déjà installé ?

claude "/dev-data-validation-helper"

Ou tapez /dev-data-validation-helper dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

data qualityvalidation des donnéesdata contractschema validationGreat Expectationsdonnées incorrectesdata testing

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/dev-data-validation-helper ~/.claude/skills/

Payload du plugin : skills/dev-data-validation-helper · source éditable : dev-skills/data-validation-helper

📖 Manuel

Data Validation Helper

Workflow en 8 étapes

1. Inventaire et règles métier

2. Schema validation — fail fast

JSON Schema (API REST) :

from jsonschema import validate, ValidationError

schema = {
    "type": "object",
    "properties": {
        "user_id": {"type": "integer"},
        "email":   {"type": "string", "format": "email"},
        "amount":  {"type": "number",  "minimum": 0}
    },
    "required": ["user_id", "email", "amount"]
}

try:
    validate(instance=payload, schema=schema)
except ValidationError as e:
    raise ValueError(f"Payload invalide : {e.message}")

Pydantic v2 (Python objects) :

from pydantic import BaseModel, field_validator
from decimal import Decimal

class Transaction(BaseModel):
    user_id: int
    amount: Decimal
    currency: str

    @field_validator("currency")
    @classmethod
    def check_currency(cls, v: str) -> str:
        if v not in {"TND", "EUR", "USD"}:
            raise ValueError(f"Devise inconnue : {v}")
        return v

Pandera (DataFrames) :

import pandera as pa

schema = pa.DataFrameSchema({
    "user_id": pa.Column(int,  nullable=False),
    "amount":  pa.Column(float, pa.Check.ge(0)),
    "status":  pa.Column(str,  pa.Check.isin(["pending","done","failed"]))
})

validated_df = schema.validate(df, lazy=True)  # lazy=True collecte toutes les erreurs

3. Dimensions de qualité à mesurer

DimensionMétrique cibleRequête type
Complétude% non-null ≥ 99 %COUNT(*) - COUNT(col) > 0
Unicitédoublons = 0COUNT(*) != COUNT(DISTINCT id)
Exactitudevaleurs dans plageamount < 0 OR amount > 1e7
Fraîcheurlag ≤ SLAMAX(updated_at) < NOW() - INTERVAL '2 hours'
CohérenceFK validet.status = 'paid' AND t.paid_at IS NULL

4. Framework — choix selon contexte

ContexteOutil recommandéRaison
SQL/dbtdbt testsnatif dans le DAG, zéro overhead
DataFrame Pythonpanderatypage fort, intégration pytest
Pipeline de données richeGreat Expectationsdata docs, checkpoints réutilisables
Déclaratif simpleSoda CoreSodaCL lisible par les non-développeurs
Kafka / AvroConfluent Schema Registryenforcement côté broker

dbt schema.yml :

models:
  - name: transactions
    columns:
      - name: id
        tests: [not_null, unique]
      - name: status
        tests:
          - accepted_values:
              values: ["pending", "done", "failed"]
      - name: user_id
        tests:
          - relationships:
              to: ref('users')
              field: id

Great Expectations — checkpoint minimal :

import great_expectations as gx

context = gx.get_context()
batch = context.sources.pandas_default.read_dataframe(df)
suite  = context.add_expectation_suite("transactions_suite")

batch.expect_column_values_to_not_be_null("user_id")
batch.expect_column_values_to_be_between("amount", min_value=0, max_value=1_000_000)
batch.expect_column_values_to_be_in_set("status", ["pending","done","failed"])

result = context.run_checkpoint(checkpoint_name="daily_check")
if not result["success"]:
    raise RuntimeError("Checkpoint GE échoué — données en quarantaine.")

5. Tests statistiques et détection de dérive

from scipy.stats import ks_2samp
import numpy as np

# Comparer la distribution actuelle vs référence (baseline)
stat, p_value = ks_2samp(baseline_amounts, current_amounts)
if p_value < 0.05:
    alert(f"Dérive détectée sur 'amount' (KS p={p_value:.4f})")

# Outliers IQR
q1, q3 = np.percentile(df["amount"], [25, 75])
iqr = q3 - q1
outliers = df[(df["amount"] < q1 - 1.5 * iqr) | (df["amount"] > q3 + 1.5 * iqr)]

Surveillance en continu : calculer les percentiles p50/p95/p99 par fenêtre temporelle et alerter si la variation dépasse ±20 % de la baseline glissante.

6. Data contracts

Structure minimale d'un contrat (YAML versionné dans le repo) :

contract_version: "1.2.0"
producer: "payment-service"
consumer: "analytics-pipeline"
schema_ref: "schemas/transactions_v3.avsc"
sla:
  freshness_minutes: 30
  completeness_pct: 99.5
  max_duplicates: 0
breaking_change_policy: "deprecation 30 jours, migration guide obligatoire"

Utiliser le Schema Registry (Confluent ou AWS Glue) pour enforcer côté broker :

# Vérifier la compatibilité avant deploy
curl -X POST http://schema-registry:8081/compatibility/subjects/transactions-value/versions/latest \
  -H "Content-Type: application/vnd.schemaregistry.v1+json" \
  -d '{"schema": "<nouveau_schema_json_escaped>"}'

7. Intégration pipeline — quarantaine et alertes

valid_rows   = df[validation_mask]
invalid_rows = df[~validation_mask].assign(quarantine_reason=error_series)

# Route vers dead-letter table
invalid_rows.to_sql("bad_data", engine, if_exists="append", index=False)

# Alerte si taux d'erreur dépasse le seuil
error_rate = len(invalid_rows) / len(df)
if error_rate > 0.02:   # seuil bloquant : 2 %
    raise PipelineError(f"Taux d'erreur critique : {error_rate:.1%}")
elif error_rate > 0.001: # warning : 0.1 %
    send_slack_alert(f"⚠️ Taux d'erreur : {error_rate:.1%} — vérifier bad_data")

8. Reporting et suivi


Garde-fous et anti-patterns

Anti-patternConséquenceCorrection
Valider uniquement en fin de pipelineTransformations coûteuses sur des données invalidesValider à chaque étape d'ingestion
raise immédiat à la première erreur (strict)Perte de visibilité sur le volume total de violationslazy=True dans pandera, --store-failures dans dbt
Thresholds figés en dur dans le codeFaux positifs/négatifs au fil du tempsExternaliser dans un fichier de config versionné
Ignorer la dead-letter queueDonnées perdues, non-conformitéProcesser + alerter systématiquement
Pas de versioning de schémaBreaking change silencieuxSemantic versioning + backward-compat policy
Valider la structure mais pas la sémantiqueamount=0.0 valide techniquement mais absurde métierAjouter des règles métier explicites
Validateur non idempotentRésultats inconsistants sur re-runGarantir que re-valider les mêmes données = mêmes résultats

Bonnes pratiques 2026