SPB Git forge

spb/qc-election

Public
20commits 1branches 0releases
4.9 MBsize
maindefault branch
20 days agolast push
Python 66.6% HTML 24.8% CSS 4.9% JavaScript 3.6%
1.6 KB · 40 lines python
Raw Blame History
1# QC Élection Forecast — Plateforme de prévision électorale du Québec 20262# Auteur : Simon-Pierre Boucher3# Contact : contact@spboucher.ai4# https://www.qc-election.com5"""Pondération des sondages : temps, taille effective d'échantillon, sondeur.67Le filtre de Kalman intègre déjà le temps (structure d'état) et la précision8(variance d'observation). Les poids calculés ici servent :9  1. à moduler la variance d'observation (qualité du sondeur, design effect);10  2. à afficher de façon transparente le poids relatif de chaque sondage.11"""12from __future__ import annotations1314import math15from datetime import date1617from ..config import settings181920def effective_n(sample_size: int | None, mode: str) -> float:21    """Taille effective : n / design effect, plafonnée (anti-domination)."""22    n = sample_size or 600  # défaut prudent si taille inconnue23    deff = settings.design_effects.get(mode, settings.design_effects["unknown"])24    return min(n / deff, float(settings.max_effective_n))252627def time_weight(field_end: date, as_of: date) -> float:28    age = max(0, (as_of - field_end).days)29    return 0.5 ** (age / settings.time_decay_halflife_days)303132def sample_weight(sample_size: int | None, mode: str) -> float:33    return math.sqrt(effective_n(sample_size, mode) / 1000.0)343536def display_weight(field_end: date, as_of: date, sample_size: int | None,37                   mode: str, pollster_multiplier: float = 1.0) -> float:38    """Poids relatif affiché dans le Poll Explorer (0–1, normalisé côté API)."""39    return time_weight(field_end, as_of) * sample_weight(sample_size, mode) * pollster_multiplier40