spb/qc-election
Public
Python 66.6%
HTML 24.8%
CSS 4.9%
JavaScript 3.6%
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