SPB Git

spb/qc-election

Public

v3.1.0 — replay historique multi-élections + modèle d'erreur des sondeurs (σ appris)

Méthodologie ultra avancée, première vague (§100 : replay + scoring + erreur
dynamique des sondeurs) :

- ingest/wikipedia_historical.py : 462 sondages archivés sur 6 élections
  (2007: 34, 2008: 36, 2012: 121, 2014: 60, 2018: 106, 2022: 105), ères de
  partis (ADQ 2007-2008), cache data/historical/*.csv avec provenance
- Cœur alr PARAMÉTRÉ par liste de partis (trend/forecast/house_effects/
  fundamentals) — zéro changement de comportement 2026, replay multi-ères
- validation/historical_replay.py : LOEO STRICT (house effects, fondamentaux
  exclude_year, σ sur les autres élections), rolling origin J-120→J-1,
  CRPS + log score + couverture 50/90/95 + sharpness (scoring.py)
- national/pollster_error.py : erreur d'INDUSTRIE par élection (2018 CAQ −5,4,
  2007 PLQ −9,2, 2014 PQ +4,9…), σ_industrie estimé LOEO ≈0,21 (composantes
  principales ≥5 %, borné [0,08; 0,25]), house effects hiérarchiques n/(n+k)+τ
- ADOPTION σ appris (use_empirical_industry_error=True) validée par replay :
  log score −3,80 vs −5,33, CRPS 2,64 vs 2,67, couverture 95 % 83 % vs 76,5 %,
  EAM inchangée (3,71 vs 3,69) — fuite du backtest fondamentaux corrigée
- API /api/replay, /api/pollster-error (+ v3), POST /api/admin/replay
- Audits §100 : METHODOLOGY_AUDIT, STATISTICAL_DEBT (dette paramétrique
  complète), V3_MODEL_ARCHITECTURE, HISTORICAL_REPLAY_PLAN
- 33/33 tests (CRPS/log score, bornes σ, replay 2018 smoke, ère ADQ 5 partis)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 30, 2026) parent e632529 Browse files

26 changed files +3,204 −50

added HISTORICAL_REPLAY_PLAN.md +39 −0
@@ -0,0 +1,39 @@
1+<!-- QC Élection Forecast — Plateforme de prévision électorale du Québec 2026 -->
2+<!-- Auteur : Simon-Pierre Boucher -->
3+<!-- Contact : contact@spboucher.ai -->
4+<!-- https://www.qc-election.com -->
5+
6+# HISTORICAL REPLAY PLAN — replay multi-élections (§52-54)
7+
8+## Base disponible (Wikipédia EN, vérifiée le 2026-08-30)
9+| Élection | Sondages | Source | Partis modélisés | Niveau |
10+|---|---|---|---|---|
11+| 2022-10-03 | 161 (déjà en base) | page dédiée | CAQ PLQ PQ QS PCQ AUT | national + 125 circ. |
12+| 2018-10-01 | ~121 | page dédiée « Opinion polling for… » | CAQ PLQ PQ QS AUT | national |
13+| 2014-04-07 | ~22 | page principale | CAQ PLQ PQ QS AUT | national |
14+| 2012-09-04 | ~55 | page principale | CAQ PLQ PQ QS AUT | national |
15+| 2008-12-08 | ~13 | page principale | ADQ PLQ PQ QS AUT | national |
16+| 2007-03-26 | ~34 | page principale | ADQ PLQ PQ QS AUT | national |
17+| 2003-04-14 | aucun archivé | — | — | fondamentaux seulement |
18+| 1998-11-30 | aucun archivé | — | — | fondamentaux seulement |
19+
20+## Protocole (aucune fuite, §1.4/§53)
21+- **LOEO strict** : pour tester l'élection E — house effects appris sur les
22+ élections ≠ E; prior de fondamentaux ajusté avec `exclude_year=E`;
23+ σ_industrie estimé sur les élections ≠ E; aucun paramètre recalibré sur E.
24+- **Rolling origin** : J-120, J-90, J-60, J-45, J-30, J-21, J-14, J-7, J-3, J-1
25+ (seulement l'information ≤ date).
26+- Partis par ère (compositions dynamiques) : le cœur alr est paramétré par la
27+ liste de partis de l'élection.
28+- Couches non disponibles historiquement (partielles pré-2022 structurées,
29+ médias, social) : absentes du replay, documenté.
30+
31+## Scores (règles propres, §55)
32+EAM/RMSE du vote; couverture 50/90/95; **CRPS** (échantillons du posterior);
33+**log score** (densité prédictive alr de la composition réelle); sharpness;
34+biais signé par parti. Niveau circonscription (Brier, exactitude) pour 2022.
35+
36+## Livrables
37+`data/historical/polls_{année}.csv` (cache, provenance URL), `data/replay_report.json`,
38+API `/api/replay`, `POST /api/admin/replay`. Utilisé par : σ_industrie empirique,
39+effets de mode, futur tournoi de modèles/stacking (Phase F).
modified METHODOLOGY.md +24 −0
@@ -245,6 +245,30 @@ données futures dans les replays.
245 - **API v3** : `/api/v3/forecast|ridings|social|battlegrounds|events|beyond| 245 - **API v3** : `/api/v3/forecast|ridings|social|battlegrounds|events|beyond|
246 calibration|ablation` (la v1 `/api/*` reste inchangée). 246 calibration|ablation` (la v1 `/api/*` reste inchangée).
247 247
248+## 9 ter. v3.1 — Replay historique multi-élections et erreur des sondeurs
249+
250+- **Replay 2007-2022** (§52-54 du cahier méthodologique) : six élections
251+ rejouées (462 sondages Wikipédia archivés, `data/historical/`), horizons
252+ J-120→J-1, **LOEO strict** — house effects, prior de fondamentaux
253+ (`exclude_year`) et σ_industrie appris uniquement sur les AUTRES élections.
254+ Scores propres : EAM/RMSE, couverture 50/90/95, **CRPS**, **log score**,
255+ sharpness (`/api/replay`). Le cœur alr est paramétré par l'ère de partis
256+ (ADQ 2007-2008, CAQ depuis 2012, PCQ en 2022).
257+- **Modèle d'erreur des sondeurs** (`/api/pollster-error`) : l'erreur
258+ d'INDUSTRIE (biais partagé des sondages finaux) est mesurée à chaque
259+ élection — p. ex. 2018 : CAQ −5,4 pp, PLQ +3,6; 2014 : PQ +4,9; 2007 :
260+ PLQ −9,2. σ_industrie devient une quantité **apprise** (RMS des composantes
261+ principales, LOEO, bornée [0,08; 0,25]) ≈ **0,21** au lieu du 0,12 manuel.
262+ Adoption validée par le replay : log score −3,80 vs −5,33, CRPS 2,64 vs
263+ 2,67, couverture 95 % 83 % vs 76,5 %, EAM inchangée — les intervalles
264+ publiés sont plus larges parce que l'histoire le commande. House effects
265+ hiérarchiques : moyenne inter-élections rétrécie n/(n+k) + dispersion τ
266+ (une maison vue une fois reste incertaine, pas simplement pénalisée).
267+- Leçon des queues (2007 : surge ADQ, EAM 6,6; 2014 : effondrement PQ, 5,2) :
268+ les grands mouvements de campagne sont la première source d'erreur —
269+ chantier suivant : innovations à queues lourdes (Student-t) testées par le
270+ même replay.
271+
248 ## 10. Limites connues 272 ## 10. Limites connues
249 273
250 1. Pas de sondages régionaux publics structurés — la variation régionale vient de la 274 1. Pas de sondages régionaux publics structurés — la variation régionale vient de la
added METHODOLOGY_AUDIT.md +50 −0
@@ -0,0 +1,50 @@
1+<!-- QC Élection Forecast — Plateforme de prévision électorale du Québec 2026 -->
2+<!-- Auteur : Simon-Pierre Boucher -->
3+<!-- Contact : contact@spboucher.ai -->
4+<!-- https://www.qc-election.com -->
5+
6+# METHODOLOGY AUDIT — reconstruction exacte du modèle actuel (§100.3)
7+
8+Baseline figé : commit `e632529`, modèle 3.0.0, 29 tests verts, forecast et
9+backtest reproduits localement le 2026-08-30 (graines fixes).
10+
11+## Chaîne actuelle (observé → publié)
12+1. **Observation** : sondage Wikipédia (sections nationales) → renormalisation
13+ → correction house effect (biais final 21 j, shrink 0,5, borné ±3 pp) →
14+ alr → covariance multinomiale (n_eff = n/deff par mode, plafond 2500)
15+ + erreur excédentaire diag (±1,5 pp; ×1,25 maison inconnue). Partielles :
16+ pseudo-observations nationales (swing local ×0,6, n≈350, ±3 pp).
17+2. **État latent** : marche aléatoire alr 5D, q estimé par MV (grille 12 pts,
18+ borné), Kalman exact + RTS.
19+3. **Forecast** : moyenne martingale; variance += q·jours·1,6·m_volatilité
20+ (m ∈ [1;1,5], attention wiki+social) + 0,12² systémique.
21+4. **Fondamentaux** : ridge (vote sortant ~ vote préc. + satisfaction) sur 8
22+ élections, pénalité 1,5 pp/mandat; blend précision w(t)=min(0,8,(j/540)^1,3).
23+5. **Médias** : nudge borné ±0,35 pp (tanh sentiment 14 j, seuil volume).
24+6. **Circonscriptions** : alr(base 2022 locale) + swing national alr + ε_région
25+ (0,14) + ε_circ (0,20) − retrait sortant (0,06); softmax.
26+7. **Simulation** : 25 000 tirages corrélés (état→national→régional→local);
27+ sièges, P(1er), P(maj), pivots (8k).
28+8. **Publication** : P(1er) = 0,88·modèle + 0,12·Polymarket.
29+
30+## Écarts vs la cible « ultra avancée » (§ du cahier des charges)
31+| § | Cible | État actuel | Écart |
32+|---|---|---|---|
33+| 2 | état latent joint (démo × région) | national seulement + couches d'erreur | majeur (Phases C/D) |
34+| 3-4 | RW challengé (LLT, mean-rev, Student-t) | RW gaussien | à tester par replay |
35+| 6-10 | modèle de mesure complet (mode/population/LV/cov inter-partis) | house+mode deff+excès | partiel → `national/pollster_error.py` |
36+| 11 | terrain = moyenne sur la période | assigné à la fin de terrain | mineur, plan replay |
37+| 14-16 | MRP dynamique | absent (plan POPULATION_FEATURES) | majeur (Phase D) |
38+| 17-19 | participation probabiliste | scénario manuel (simulateur) | majeur (Phase E) |
39+| 20-24 | hiérarchie/facteurs spatiaux appris | régions administratives + ε indépendants | majeur (Phase C) |
40+| 27-29 | effets candidats estimés | pénalité retrait fixe | Phase E |
41+| 30 | modèle de partielle décomposé | shrink fixe 0,6 | amélioration ciblée |
42+| 31-33 | fondamentaux bayésiens LOEO | ridge LOO, fuite en replay (corrigée) | ✔ corrigé |
43+| 34-36 | marchés = observation d'événement, poids appris | blend fixe 12 % | dette assumée (pas d'historique) |
44+| 37-45 | social = attention/volatilité | ✔ conforme (bornée, jamais directionnelle) | ✔ |
45+| 46-48 | distribution prédictive du prochain sondage | absent | backlog court terme |
46+| 49-51 | stacking / champion-challenger | ablation implémentée; stacking à venir | Phase F |
47+| 52-58 | replay multi-élections + scoring propre | 2022 seulement → **implémenté : 2007-2022 (6 élections), CRPS/log score** | ✔ ce commit |
48+| 59-61 | hyperparamètres estimés | voir STATISTICAL_DEBT.md | en cours (σ_industrie empirique) |
49+| 62-66 | simulation copules/queues | gaussien corrélé | à tester |
50+| 89-93 | modèle du soir d'élection | absent | Phase G (avant le 5 oct.) |
added STATISTICAL_DEBT.md +53 −0
@@ -0,0 +1,53 @@
1+<!-- QC Élection Forecast — Plateforme de prévision électorale du Québec 2026 -->
2+<!-- Auteur : Simon-Pierre Boucher -->
3+<!-- Contact : contact@spboucher.ai -->
4+<!-- https://www.qc-election.com -->
5+
6+# STATISTICAL DEBT — inventaire honnête des paramètres manuels (§100.8-9)
7+
8+Chaque paramètre « choisi à la main » est une dette : il doit devenir estimé
9+(inférence hiérarchique, validation croisée) ou documenté comme prior
10+conservateur assumé. État au 2026-08-30 (v3.0.x).
11+
12+## Paramètres manuels du cœur (config.py)
13+
14+| Paramètre | Valeur | Origine | Dette | Plan |
15+|---|---|---|---|---|
16+| `time_decay_halflife_days` | 12 j | convention (538-like) | moyenne | replay multi-élections → profil de vraisemblance |
17+| `max_effective_n` | 2500 | anti-domination, heuristique | faible | test de sensibilité |
18+| `design_effects` (web 1,30…) | littérature | littérature générale, pas QC | moyenne | `pollster_error.mode_effects` sur 6 élections |
19+| `excess_poll_sd_pp` | 1,5 pp | littérature TSE | moyenne | résidus multi-élections |
20+| `rw_daily_sd` bornes | [0,004; 0,030] | garde-fous | faible | q déjà estimé par MV dans les bornes |
21+| `campaign_drift_inflation` | 1,6 | « cycles passés », non formalisé | **élevée** | replay : estimer l'inflation campagne vs hors-campagne |
22+| `house_effect_shrinkage` | 0,5 | heuristique | moyenne | hiérarchique (global + déviation élection, τ estimé) |
23+| `house_effect_max_pp` | ±3 pp | garde-fou | faible | conserver comme borne |
24+| `industry_error_sd` | 0,12 (alr) | calibré sur 2018+2022 SEULEMENT | **élevée** (§60 : no single-election calibration) | `pollster_error.industry_sigma` empirique sur 6 élections (implémenté) |
25+| `regional_error_sd` | 0,14 | résidus backtest 2022, atténués à la main | **élevée** | résidus multi-élections (2018→2022 + 2014→2018…) quand les résultats par circ. seront ingérés |
26+| `riding_error_sd` | 0,20 | idem | **élevée** | idem |
27+| `incumbent_retirement_penalty` | 0,06 alr | littérature | moyenne | §29 : apprendre P(perte du vote personnel) par contexte |
28+| `byelection_swing_shrink` | 0,6 | littérature partielles | moyenne | §30 : modèle de partielle avec effet participation/candidat |
29+| `byelection_equivalent_n` / excess | 350 / ±3 pp | jugement | moyenne | idem |
30+| `media_nudge_pp_max` | ±0,35 pp | borne prudente, NON backtestée | assumée (borne stricte, décomposée) | validation post-2026 (§96) |
31+| `market_blend_weight` | 12 % | prudence, NON appris | **élevée** (§36 : no fixed 88/12) | stacking appris quand historique de marchés QC existera (aucun marché 2022) |
32+| `fundamentals_horizon_days`/`max_weight`/exp 1,3 | 540/0,8/1,3 | forme 538-like | **élevée** (§33) | replay : apprendre la décroissance |
33+| `fundamentals_term_penalty_pp` | 1,5 pp/mandat | littérature | moyenne | LOEO (8 obs. — restera un prior) |
34+| `RIDGE_LAMBDA` (fondamentaux) | 4,0 | jugement | moyenne | LOEO sur grille |
35+| volatilité A/B/C (0,10/0,06/0,05) et cap 1,5 | jugement borné | **assumée** (variance seulement, bornée, décomposée) | validation post-2026 |
36+| catégories Solide/Probable/Favorisé (95/80/60) | convention | faible | présentation seulement |
37+
38+## Couches non backtestées (état)
39+- **Partielles, nudge médias, volatilité sociale/wiki** : non rejouables avant
40+ 2022 (données absentes) — bornées par construction, Δ=0 documenté dans
41+ l'ablation, évaluation après le 5 octobre 2026 (§96).
42+- **Ensemble marchés** : aucun marché 2022 → poids prudent 12 % assumé.
43+- **Sondage synthétique LLM** : poids nul, objet d'étude (§97).
44+
45+## Fuites potentielles identifiées (et leur état)
46+1. ~~`compute_pollster_profiles` en backtest~~ — le backtest 2022 passe `{}`
47+ (aucune correction maison) : pas de fuite, mais sous-utilise l'info →
48+ remplacé par LOEO dans le replay (profils appris sur les AUTRES élections).
49+2. **Fondamentaux en replay** : `_ridge_fit()` s'ajuste sur les 8 élections,
50+ INCLUANT celle testée → fuite dans le backtest 2022 actuel (faible mais
51+ réelle). Corrigé : `compute_prior(exclude_year=…)` (LOEO strict).
52+3. `industry_error_sd=0,12` calibré sur 2018/2022 puis testé sur 2022 →
53+ circulaire. Corrigé par l'estimation multi-élections LOEO.
added V3_MODEL_ARCHITECTURE.md +30 −0
@@ -0,0 +1,30 @@
1+<!-- QC Élection Forecast — Plateforme de prévision électorale du Québec 2026 -->
2+<!-- Auteur : Simon-Pierre Boucher -->
3+<!-- Contact : contact@spboucher.ai -->
4+<!-- https://www.qc-election.com -->
5+
6+# V3 MODEL ARCHITECTURE — cible et chemin de migration
7+
8+Cible : P(issue | sondages, population, historique, candidats, participation,
9+fondamentaux, signaux) — composantes interdépendantes d'un même système.
10+
11+```
12+backend/app/modeling/
13+├── national/ pollster_error.py ✅ · latent_vote (=trend.py, à migrer)
14+├── validation/ scoring.py ✅ · ablation.py ✅ · historical_replay.py ✅
15+├── signals/ social.py ✅ · volatility.py ✅ · event_detection.py ✅
16+├── electorate/ (Phase D : mrp, poststratification, turnout)
17+├── geography/ (Phase C : facteurs latents, covariance spatiale)
18+├── candidates/ (Phase E)
19+├── ensemble/ (Phase F : stacking, model uncertainty)
20+└── simulation/ (scenarios/clustering à extraire de simulate.py)
21+```
22+
23+Ordre (§99/§100) : 1 replay multi-élections ✅ → 2 scoring propre (CRPS/log) ✅
24+→ 3 modèle dynamique d'erreur des sondeurs ✅ (v1 : σ_industrie empirique LOEO,
25+effets de mode, house hiérarchique) → 4 hiérarchie des 127 → 5 MRP → 6 turnout
26+→ 7 stacking → 8 queues lourdes (Student-t à tester par replay) → 9 distribution
27+prédictive du prochain sondage → 10 modèle du soir d'élection.
28+
29+Règles : shadow/champion-challenger avant production; version bump à tout
30+changement de distribution; no silent model change (backtest+ablation+changelog).
modified backend/app/api/admin.py +12 −0
@@ -191,6 +191,18 @@ def _ablation_job():
191 db.close() 191 db.close()
192 192
193 193
194+def _replay_job():
195+ from ..modeling.validation.historical_replay import run_replay
196+ run_replay()
197+
198+
199+@router.post("/replay", dependencies=[Depends(require_admin)])
200+def run_replay_bg(background: BackgroundTasks):
201+ """Replay multi-élections 2007-2022 (LOEO), en arrière-plan."""
202+ background.add_task(_replay_job)
203+ return {"status": "replay historique lancé en arrière-plan"}
204+
205+
194 @router.post("/ablation", dependencies=[Depends(require_admin)]) 206 @router.post("/ablation", dependencies=[Depends(require_admin)])
195 def run_ablation_bg(background: BackgroundTasks): 207 def run_ablation_bg(background: BackgroundTasks):
196 """Ablation v3 (§22) : backtest 2022 par variante de couches, en arrière-plan.""" 208 """Ablation v3 (§22) : backtest 2022 par variante de couches, en arrière-plan."""
modified backend/app/api/public.py +19 −0
@@ -257,6 +257,23 @@ def ablation_report():
257 return json.loads(f.read_text()) 257 return json.loads(f.read_text())
258 258
259 259
260+@router.get("/replay")
261+def replay_report():
262+ """Replay historique multi-élections (2007-2022, LOEO strict, §52-54)."""
263+ f = DATA_DIR / "replay_report.json"
264+ if not f.exists():
265+ raise HTTPException(404, "Replay non exécuté — POST /api/admin/replay")
266+ return json.loads(f.read_text())
267+
268+
269+@router.get("/pollster-error")
270+def pollster_error_report():
271+ """Modèle d'erreur des sondeurs (§6-10) : erreurs d'industrie par élection,
272+ σ_industrie estimé LOEO, house effects hiérarchiques."""
273+ from ..modeling.national.pollster_error import report
274+ return report()
275+
276+
260 @router.get("/attention") 277 @router.get("/attention")
261 def attention(db: Session = Depends(get_db)): 278 def attention(db: Session = Depends(get_db)):
262 """Attention Wikipédia : parts, tendances, turbulence (signal non directionnel).""" 279 """Attention Wikipédia : parts, tendances, turbulence (signal non directionnel)."""
@@ -559,3 +576,5 @@ router_v3.get("/events")(events)
559 router_v3.get("/beyond")(beyond) 576 router_v3.get("/beyond")(beyond)
560 router_v3.get("/calibration")(backtest_report) 577 router_v3.get("/calibration")(backtest_report)
561 router_v3.get("/ablation")(ablation_report) 578 router_v3.get("/ablation")(ablation_report)
579+router_v3.get("/replay")(replay_report)
580+router_v3.get("/pollster-error")(pollster_error_report)
modified backend/app/config.py +5 −1
@@ -36,7 +36,7 @@ _load_env_file(BASE_DIR / ".env")
36 class Settings(BaseSettings): 36 class Settings(BaseSettings):
37 # --- Général --- 37 # --- Général ---
38 app_name: str = "QC Élection Forecast" 38 app_name: str = "QC Élection Forecast"
39− model_version: str = "3.0.0" 39+ model_version: str = "3.1.0"
40 database_url: str = f"sqlite:///{BASE_DIR / 'qc_election.db'}" 40 database_url: str = f"sqlite:///{BASE_DIR / 'qc_election.db'}"
41 admin_token: str = os.environ.get("ADMIN_TOKEN", "change-me") 41 admin_token: str = os.environ.get("ADMIN_TOKEN", "change-me")
42 port: int = 8140 42 port: int = 8140
@@ -133,6 +133,10 @@ class Settings(BaseSettings):
133 tipping_n_sims: int = 8000 # sous-échantillon pour le calcul pivot 133 tipping_n_sims: int = 8000 # sous-échantillon pour le calcul pivot
134 enable_ablation: bool = True # cadre d'ablation (validation §22) 134 enable_ablation: bool = True # cadre d'ablation (validation §22)
135 enable_social_directional: bool = False # EXPÉRIMENTAL — jamais activé par défaut 135 enable_social_directional: bool = False # EXPÉRIMENTAL — jamais activé par défaut
136+ # σ_industrie APPRIS (LOEO, 6 élections 2007-2022) au lieu du 0,12 manuel.
137+ # Validé par replay : log score −3,80 vs −5,33, CRPS 2,64 vs 2,67,
138+ # couverture 95 % 83 % vs 76,5 %, EAM inchangée (rapport replay_report.json).
139+ use_empirical_industry_error: bool = True
136 140
137 # --- Sentiment (signal affiché; n'agit que via l'ajustement médias borné) --- 141 # --- Sentiment (signal affiché; n'agit que via l'ajustement médias borné) ---
138 sentiment_feeds: list[str] = [ 142 sentiment_feeds: list[str] = [
added backend/app/ingest/wikipedia_historical.py +184 −0
@@ -0,0 +1,184 @@
1+# QC Élection Forecast — Plateforme de prévision électorale du Québec 2026
2+# Auteur : Simon-Pierre Boucher
3+# Contact : contact@spboucher.ai
4+# https://www.qc-election.com
5+"""Sondages historiques 1998-2018 (Wikipédia EN) — carburant du replay
6+multi-élections (§52). Chaque élection a son ère de partis (ADQ 2007-2008,
7+CAQ depuis 2012, PCQ significatif seulement en 2022) : le cœur alr étant
8+paramétré par la liste de partis, le même moteur rejoue chaque ère.
9+
10+Les sondages parsés sont mis en cache (`data/historical/polls_{année}.csv`,
11+provenance URL + date d'accès) — le replay ne refait pas le réseau."""
12+from __future__ import annotations
13+
14+import logging
15+import re
16+from datetime import date, datetime, timezone
17+from io import StringIO
18+from pathlib import Path
19+
20+import httpx
21+import pandas as pd
22+
23+from ..config import DATA_DIR
24+from .wikipedia import (_flat_cols, _num, _parse_date, norm_pollster, UA)
25+
26+log = logging.getLogger("wiki-historical")
27+
28+HIST_DIR = DATA_DIR / "historical"
29+
30+# Métadonnées des élections rejouables (résultats officiels DGEQ, % du vote).
31+ELECTIONS: dict[int, dict] = {
32+ 2022: {"date": date(2022, 10, 3),
33+ "parties": ["CAQ", "PLQ", "PQ", "QS", "PCQ", "AUT"],
34+ "incumbent": "CAQ", "terms": 1,
35+ "result": {"CAQ": 40.98, "PLQ": 14.37, "PQ": 14.61, "QS": 15.43,
36+ "PCQ": 12.91, "AUT": 1.70},
37+ "url": "https://en.wikipedia.org/wiki/2022_Quebec_general_election"},
38+ 2018: {"date": date(2018, 10, 1),
39+ "parties": ["CAQ", "PLQ", "PQ", "QS", "AUT"],
40+ "incumbent": "PLQ", "terms": 1,
41+ "result": {"CAQ": 37.42, "PLQ": 24.82, "PQ": 17.06, "QS": 16.10, "AUT": 4.60},
42+ "url": ("https://en.wikipedia.org/wiki/"
43+ "Opinion_polling_for_the_2018_Quebec_general_election")},
44+ 2014: {"date": date(2014, 4, 7),
45+ "parties": ["CAQ", "PLQ", "PQ", "QS", "AUT"],
46+ "incumbent": "PQ", "terms": 1,
47+ "result": {"CAQ": 23.05, "PLQ": 41.52, "PQ": 25.38, "QS": 7.63, "AUT": 2.42},
48+ "url": "https://en.wikipedia.org/wiki/2014_Quebec_general_election"},
49+ 2012: {"date": date(2012, 9, 4),
50+ "parties": ["CAQ", "PLQ", "PQ", "QS", "AUT"],
51+ "incumbent": "PLQ", "terms": 3,
52+ "result": {"CAQ": 27.05, "PLQ": 31.20, "PQ": 31.95, "QS": 6.03, "AUT": 3.77},
53+ "url": "https://en.wikipedia.org/wiki/2012_Quebec_general_election"},
54+ 2008: {"date": date(2008, 12, 8),
55+ "parties": ["ADQ", "PLQ", "PQ", "QS", "AUT"],
56+ "incumbent": "PLQ", "terms": 2,
57+ "result": {"ADQ": 16.37, "PLQ": 42.08, "PQ": 35.17, "QS": 3.78, "AUT": 2.60},
58+ "url": "https://en.wikipedia.org/wiki/2008_Quebec_general_election"},
59+ 2007: {"date": date(2007, 3, 26),
60+ "parties": ["ADQ", "PLQ", "PQ", "QS", "AUT"],
61+ "incumbent": "PLQ", "terms": 1,
62+ "result": {"ADQ": 30.84, "PLQ": 33.08, "PQ": 28.35, "QS": 3.64, "AUT": 4.09},
63+ "url": "https://en.wikipedia.org/wiki/2007_Quebec_general_election"},
64+}
65+
66+# Correspondance colonnes → partis, toutes ères confondues (minuscule, contient).
67+PARTY_PATTERNS = [
68+ ("CAQ", ("caq", "coalition")),
69+ ("PLQ", ("plq", "qlp", "liberal", "libéral")),
70+ ("PQ", ("parti québécois", "parti quebecois", "pq")),
71+ ("QS", ("québec solidaire", "quebec solidaire", "qs")),
72+ ("ADQ", ("adq", "action démocratique", "action democratique")),
73+ ("PCQ", ("pcq", "conservative", "conservateur")),
74+ ("AUT", ("other", "others", "autres")),
75+]
76+
77+
78+def _party_of(col: str) -> str | None:
79+ c = col.lower().strip()
80+ for party, pats in PARTY_PATTERNS:
81+ for pat in pats:
82+ if pat in c:
83+ return party
84+ return None
85+
86+
87+def parse_election_polls(html: str, year: int) -> list[dict]:
88+ """Tables de sondages d'une page d'élection historique → dicts normalisés.
89+ Tolère les deux mises en page : « Timeline of opinion polls » (multi-niveau)
90+ et « Date(s)/Firm/Sample » (2008)."""
91+ meta = ELECTIONS[year]
92+ parties = meta["parties"]
93+ out, seen = [], set()
94+ for t in pd.read_html(StringIO(html)):
95+ t = t.copy()
96+ t.columns = _flat_cols(t)
97+ cols = {str(c).lower().strip(): c for c in t.columns}
98+ org_col = next((cols[k] for k in cols
99+ if "polling" in k and "organi" in k or k == "firm"
100+ or "polling firm" in k), None)
101+ date_col = next((cols[k] for k in cols
102+ if "last date" in k or k.startswith("date")), None)
103+ party_cols = {}
104+ for k, orig in cols.items():
105+ p = _party_of(k)
106+ if p and p in parties and p not in party_cols:
107+ party_cols[p] = orig
108+ if org_col is None or date_col is None or len(
109+ [p for p in party_cols if p != "AUT"]) < 3:
110+ continue
111+ n_col = next((cols[k] for k in cols if "sample" in k), None)
112+ for _, r in t.iterrows():
113+ org = r.get(org_col)
114+ if org is None or pd.isna(org):
115+ continue
116+ org = str(org)
117+ if "election" in org.lower() or len(org) > 60:
118+ continue
119+ end = _parse_date(r.get(date_col), year)
120+ if end is None or abs((end - meta["date"]).days) > 4 * 365:
121+ continue
122+ shares = {}
123+ for p, c in party_cols.items():
124+ v = _num(r.get(c))
125+ if v is not None and 0 <= v <= 80:
126+ shares[p] = v
127+ if len([p for p in shares if p != "AUT"]) < 3:
128+ continue
129+ if "AUT" not in shares:
130+ s = sum(shares.values())
131+ if 80 <= s <= 100:
132+ shares["AUT"] = round(100 - s, 1)
133+ n = _num(r.get(n_col)) if n_col is not None else None
134+ key = (norm_pollster(org), end.isoformat())
135+ if key in seen:
136+ continue
137+ seen.add(key)
138+ out.append({"pollster": norm_pollster(org),
139+ "field_end": end.isoformat(),
140+ "sample_size": int(n) if n and n > 40 else None,
141+ "mode": "unknown", "shares": shares,
142+ "source_url": meta["url"]})
143+ return out
144+
145+
146+def load_polls(year: int, refresh: bool = False) -> list[dict]:
147+ """Sondages d'une élection historique (cache CSV, réseau si absent)."""
148+ HIST_DIR.mkdir(parents=True, exist_ok=True)
149+ f = HIST_DIR / f"polls_{year}.csv"
150+ if f.exists() and not refresh:
151+ df = pd.read_csv(f)
152+ polls: dict[tuple, dict] = {}
153+ for _, r in df.iterrows():
154+ key = (r["pollster"], r["field_end"])
155+ p = polls.setdefault(key, {
156+ "pollster": r["pollster"], "field_end": r["field_end"],
157+ "sample_size": None if pd.isna(r["sample_size"]) else int(r["sample_size"]),
158+ "mode": r.get("mode", "unknown"), "shares": {}})
159+ p["shares"][r["party"]] = float(r["raw_value"])
160+ return list(polls.values())
161+ html = httpx.get(ELECTIONS[year]["url"], headers=UA, timeout=90,
162+ follow_redirects=True).text
163+ polls = parse_election_polls(html, year)
164+ recs = []
165+ accessed = datetime.now(timezone.utc).isoformat()
166+ for p in polls:
167+ for party, v in p["shares"].items():
168+ recs.append({**{k: p[k] for k in p if k != "shares"},
169+ "party": party, "raw_value": v, "accessed_at": accessed})
170+ pd.DataFrame(recs).to_csv(f, index=False)
171+ log.info("polls %s: %d sondages mis en cache", year, len(polls))
172+ return polls
173+
174+
175+def to_model_polls(polls: list[dict]) -> list[dict]:
176+ """Format consommé par fit_trend (field_end en date, parts normalisées)."""
177+ out = []
178+ for p in polls:
179+ total = sum(p["shares"].values()) or 100.0
180+ out.append({"id": None, "pollster": p["pollster"],
181+ "field_end": date.fromisoformat(p["field_end"]),
182+ "sample_size": p["sample_size"], "mode": p.get("mode", "unknown"),
183+ "shares": {k: v * 100.0 / total for k, v in p["shares"].items()}})
184+ return out
modified backend/app/modeling/forecast.py +24 −14
@@ -31,11 +31,13 @@ class VoteDistribution:
31 31
32 32
33 def _summarize(x: np.ndarray, P: np.ndarray, rng: np.random.Generator, 33 def _summarize(x: np.ndarray, P: np.ndarray, rng: np.random.Generator,
34− n: int = 20000) -> dict: 34+ n: int = 20000, parties: list[str] | None = None) -> dict:
35− L = np.linalg.cholesky(P + 1e-10 * np.eye(M)) 35+ ps = parties or settings.parties
36− draws = inv_alr(x + rng.standard_normal((n, M)) @ L.T) * 100.0 36+ Mx = len(x)
37+ L = np.linalg.cholesky(P + 1e-10 * np.eye(Mx))
38+ draws = inv_alr(x + rng.standard_normal((n, Mx)) @ L.T) * 100.0
37 out = {} 39 out = {}
38− for i, party in enumerate(settings.parties): 40+ for i, party in enumerate(ps):
39 d = draws[:, i] 41 d = draws[:, i]
40 out[party] = { 42 out[party] = {
41 "mean": round(float(d.mean()), 2), 43 "mean": round(float(d.mean()), 2),
@@ -51,30 +53,38 @@ def _summarize(x: np.ndarray, P: np.ndarray, rng: np.random.Generator,
51 53
52 54
53 def nowcast(trend: TrendResult, as_of: date, 55 def nowcast(trend: TrendResult, as_of: date,
54− rng: np.random.Generator | None = None) -> VoteDistribution: 56+ rng: np.random.Generator | None = None,
57+ parties: list[str] | None = None) -> VoteDistribution:
55 rng = rng or np.random.default_rng(1) 58 rng = rng or np.random.default_rng(1)
56 return VoteDistribution("nowcast", as_of, trend.x, trend.P, 59 return VoteDistribution("nowcast", as_of, trend.x, trend.P,
57− _summarize(trend.x, trend.P, rng)) 60+ _summarize(trend.x, trend.P, rng, parties=parties))
58 61
59 62
60 def forecast(trend: TrendResult, as_of: date, election_day: date, 63 def forecast(trend: TrendResult, as_of: date, election_day: date,
61 rng: np.random.Generator | None = None, 64 rng: np.random.Generator | None = None,
62− drift_multiplier: float = 1.0) -> VoteDistribution: 65+ drift_multiplier: float = 1.0,
63− """drift_multiplier ∈ [1, 1,45] : turbulence détectée (pic d'attention web) 66+ parties: list[str] | None = None,
64− → l'incertitude d'évolution future est gonflée, la moyenne jamais touchée.""" 67+ industry_sd: float | None = None) -> VoteDistribution:
68+ """drift_multiplier ∈ [1, 1,5] : turbulence détectée (pic d'attention web)
69+ → l'incertitude d'évolution future est gonflée, la moyenne jamais touchée.
70+ industry_sd : erreur systémique de sondage (défaut : config; le replay et
71+ le modèle d'erreur des sondeurs peuvent passer une valeur estimée LOEO)."""
65 rng = rng or np.random.default_rng(2) 72 rng = rng or np.random.default_rng(2)
73+ Mx = len(trend.x)
66 days = max(0, (election_day - as_of).days) 74 days = max(0, (election_day - as_of).days)
67 drift_var = trend.q * days * settings.campaign_drift_inflation * drift_multiplier 75 drift_var = trend.q * days * settings.campaign_drift_inflation * drift_multiplier
68 # + erreur systémique de sondage (corrélée entre partis via la composition) : 76 # + erreur systémique de sondage (corrélée entre partis via la composition) :
69 # même la veille du vote, l'industrie entière peut se tromper de ~2-3 pp. 77 # même la veille du vote, l'industrie entière peut se tromper de ~2-3 pp.
70− P_f = trend.P + (drift_var + settings.industry_error_sd ** 2) * np.eye(M) 78+ sd = settings.industry_error_sd if industry_sd is None else industry_sd
79+ P_f = trend.P + (drift_var + sd ** 2) * np.eye(Mx)
71 return VoteDistribution("forecast", as_of, trend.x, P_f, 80 return VoteDistribution("forecast", as_of, trend.x, P_f,
72− _summarize(trend.x, P_f, rng)) 81+ _summarize(trend.x, P_f, rng, parties=parties))
73 82
74 83
75 def distribution_from(kind: str, as_of: date, x: np.ndarray, P: np.ndarray, 84 def distribution_from(kind: str, as_of: date, x: np.ndarray, P: np.ndarray,
76− seed: int = 3) -> VoteDistribution: 85+ seed: int = 3,
86+ parties: list[str] | None = None) -> VoteDistribution:
77 """Distribution à partir d'un état (x, P) arbitraire — utilisé par les 87 """Distribution à partir d'un état (x, P) arbitraire — utilisé par les
78− couches v2 (blend fondamentaux, ajustement médias).""" 88+ couches v2 (blend fondamentaux, ajustement médias) et le replay."""
79 rng = np.random.default_rng(seed) 89 rng = np.random.default_rng(seed)
80− return VoteDistribution(kind, as_of, x, P, _summarize(x, P, rng)) 90+ return VoteDistribution(kind, as_of, x, P, _summarize(x, P, rng, parties=parties))
modified backend/app/modeling/fundamentals.py +21 −12
@@ -70,14 +70,17 @@ class FundamentalsPrior:
70 detail: dict = field(default_factory=dict) 70 detail: dict = field(default_factory=dict)
71 71
72 72
73−def _ridge_fit() -> tuple[np.ndarray, float, list[float]]: 73+def _ridge_fit(exclude_year: int | None = None) -> tuple[np.ndarray, float, list[float]]:
74 """Régression ridge « vote du sortant ~ vote précédent + satisfaction », 74 """Régression ridge « vote du sortant ~ vote précédent + satisfaction »,
75 avec pénalité d'usure retranchée AVANT l'ajustement (paramètre fixé, pas 75 avec pénalité d'usure retranchée AVANT l'ajustement (paramètre fixé, pas
76 estimé — 8 points ne supportent pas un 3e prédicteur). 76 estimé — 8 points ne supportent pas un 3e prédicteur).
77+ `exclude_year` : LOEO strict pour le replay historique (§53 — l'élection
78+ testée ne participe JAMAIS à l'ajustement de son propre prior).
77 Retourne (coefficients [b0, b_prev, b_sat], RMSE leave-one-out, résidus LOO).""" 79 Retourne (coefficients [b0, b_prev, b_sat], RMSE leave-one-out, résidus LOO)."""
78 pen = settings.fundamentals_term_penalty_pp 80 pen = settings.fundamentals_term_penalty_pp
79− X = np.array([[1.0, prev, sat] for (_, _, _, sat, prev, _) in HISTORY]) 81+ hist = [h for h in HISTORY if h[0] != exclude_year]
80− y = np.array([res + pen * (terms - 1) for (_, _, terms, _, _, res) in HISTORY]) 82+ X = np.array([[1.0, prev, sat] for (_, _, _, sat, prev, _) in hist])
83+ y = np.array([res + pen * (terms - 1) for (_, _, terms, _, _, res) in hist])
81 # centrage des prédicteurs (le ridge ne pénalise pas l'ordonnée à l'origine) 84 # centrage des prédicteurs (le ridge ne pénalise pas l'ordonnée à l'origine)
82 mx = X[:, 1:].mean(axis=0) 85 mx = X[:, 1:].mean(axis=0)
83 Xc = X.copy(); Xc[:, 1:] -= mx 86 Xc = X.copy(); Xc[:, 1:] -= mx
@@ -100,17 +103,20 @@ def _ridge_fit() -> tuple[np.ndarray, float, list[float]]:
100 103
101 def compute_prior(as_of: date, incumbent: str = "CAQ", terms: int = 2, 104 def compute_prior(as_of: date, incumbent: str = "CAQ", terms: int = 2,
102 satisfaction: float | None = None, 105 satisfaction: float | None = None,
103− prev_result: dict[str, float] | None = None) -> FundamentalsPrior: 106+ prev_result: dict[str, float] | None = None,
107+ exclude_year: int | None = None,
108+ parties: list[str] | None = None) -> FundamentalsPrior:
104 """Construit le prior de fondamentaux pour l'élection cible. 109 """Construit le prior de fondamentaux pour l'élection cible.
105 110
106 prev_result : {party: %} de la dernière générale (défaut : 2022). 111 prev_result : {party: %} de la dernière générale (défaut : 2022).
107 satisfaction : % satisfaits du gouvernement (défaut : indicateur ingéré ou 112 satisfaction : % satisfaits du gouvernement (défaut : indicateur ingéré ou
108 valeur de repli de configuration).""" 113 valeur de repli de configuration)."""
114+ ps = parties or settings.parties
109 prev = prev_result or {"CAQ": 40.98, "PLQ": 14.37, "QS": 15.43, 115 prev = prev_result or {"CAQ": 40.98, "PLQ": 14.37, "QS": 15.43,
110 "PQ": 14.61, "PCQ": 12.91, "AUT": 1.70} 116 "PQ": 14.61, "PCQ": 12.91, "AUT": 1.70}
111 sat = satisfaction if satisfaction is not None else settings.gov_satisfaction_fallback 117 sat = satisfaction if satisfaction is not None else settings.gov_satisfaction_fallback
112 118
113− beta, loo_rmse, loo = _ridge_fit() 119+ beta, loo_rmse, loo = _ridge_fit(exclude_year=exclude_year)
114 pen = settings.fundamentals_term_penalty_pp * (terms - 1) 120 pen = settings.fundamentals_term_penalty_pp * (terms - 1)
115 inc_vote = float(beta @ np.array([1.0, prev.get(incumbent, 35.0), sat])) - pen 121 inc_vote = float(beta @ np.array([1.0, prev.get(incumbent, 35.0), sat])) - pen
116 inc_vote = float(np.clip(inc_vote, 8.0, 55.0)) 122 inc_vote = float(np.clip(inc_vote, 8.0, 55.0))
@@ -118,7 +124,7 @@ def compute_prior(as_of: date, incumbent: str = "CAQ", terms: int = 2,
118 # Opposition : persistance + rappel vers la moyenne de long terme, 124 # Opposition : persistance + rappel vers la moyenne de long terme,
119 # renormalisée sur l'espace restant (100 − sortant). 125 # renormalisée sur l'espace restant (100 − sortant).
120 raw = {} 126 raw = {}
121− for p in settings.parties: 127+ for p in ps:
122 if p == incumbent: 128 if p == incumbent:
123 continue 129 continue
124 raw[p] = PERSISTENCE * prev.get(p, 2.0) + (1 - PERSISTENCE) * LONG_RUN_MEAN.get(p, 3.0) 130 raw[p] = PERSISTENCE * prev.get(p, 2.0) + (1 - PERSISTENCE) * LONG_RUN_MEAN.get(p, 3.0)
@@ -127,7 +133,7 @@ def compute_prior(as_of: date, incumbent: str = "CAQ", terms: int = 2,
127 shares = {p: v * rest / tot for p, v in raw.items()} 133 shares = {p: v * rest / tot for p, v in raw.items()}
128 shares[incumbent] = inc_vote 134 shares[incumbent] = inc_vote
129 135
130− vec = close(np.array([shares[p] for p in settings.parties]) / 100.0) 136+ vec = close(np.array([shares[p] for p in ps]) / 100.0)
131 x_f = alr(vec) 137 x_f = alr(vec)
132 # Prior diffus : LOO ±rmse pp sur le sortant → sd alr large et honnête. 138 # Prior diffus : LOO ±rmse pp sur le sortant → sd alr large et honnête.
133 sd = max(settings.fundamentals_prior_sd_alr, loo_rmse / 100.0 / max(vec.min(), 0.05)) 139 sd = max(settings.fundamentals_prior_sd_alr, loo_rmse / 100.0 / max(vec.min(), 0.05))
@@ -140,12 +146,13 @@ def compute_prior(as_of: date, incumbent: str = "CAQ", terms: int = 2,
140 "b_vote_precedent": round(float(beta[1]), 3), 146 "b_vote_precedent": round(float(beta[1]), 3),
141 "b_satisfaction": round(float(beta[2]), 3), 147 "b_satisfaction": round(float(beta[2]), 3),
142 "loo_rmse_pp": round(loo_rmse, 2), "loo_residus": loo, 148 "loo_rmse_pp": round(loo_rmse, 2), "loo_residus": loo,
143− "n_elections": len(HISTORY)}, 149+ "n_elections": len(HISTORY) - (1 if exclude_year else 0),
150+ "exclude_year": exclude_year},
144 "inputs": {"sortant": incumbent, "mandats": terms, "satisfaction": sat, 151 "inputs": {"sortant": incumbent, "mandats": terms, "satisfaction": sat,
145 "penalite_usure_pp": pen, 152 "penalite_usure_pp": pen,
146− "vote_precedent": {p: prev.get(p) for p in settings.parties}}, 153+ "vote_precedent": {p: prev.get(p) for p in ps}},
147 "prior_pct": {p: round(float(vec[i] * 100), 1) 154 "prior_pct": {p: round(float(vec[i] * 100), 1)
148− for i, p in enumerate(settings.parties)}, 155+ for i, p in enumerate(ps)},
149 "sd_alr": round(sd, 3), 156 "sd_alr": round(sd, 3),
150 }) 157 })
151 158
@@ -159,8 +166,10 @@ def blend_weight(days_to_election: int) -> float:
159 166
160 167
161 def blend(x_polls: np.ndarray, P_polls: np.ndarray, prior: FundamentalsPrior, 168 def blend(x_polls: np.ndarray, P_polls: np.ndarray, prior: FundamentalsPrior,
162− days_to_election: int) -> tuple[np.ndarray, np.ndarray, dict]: 169+ days_to_election: int,
170+ parties: list[str] | None = None) -> tuple[np.ndarray, np.ndarray, dict]:
163 """Combinaison bayésienne précision-pondérée : Λ = Λ_sondages + w·Λ_prior.""" 171 """Combinaison bayésienne précision-pondérée : Λ = Λ_sondages + w·Λ_prior."""
172+ ps = parties or settings.parties
164 w = blend_weight(days_to_election) 173 w = blend_weight(days_to_election)
165 M_ = len(x_polls) 174 M_ = len(x_polls)
166 if w <= 0: 175 if w <= 0:
@@ -172,7 +181,7 @@ def blend(x_polls: np.ndarray, P_polls: np.ndarray, prior: FundamentalsPrior,
172 xc = Pc @ (Lp @ x_polls + Lf @ prior.x) 181 xc = Pc @ (Lp @ x_polls + Lf @ prior.x)
173 share = float(np.trace(Lf) / np.trace(Lc)) 182 share = float(np.trace(Lf) / np.trace(Lc))
174 dpp = {p: round(float((inv_alr(xc)[i] - inv_alr(x_polls)[i]) * 100), 3) 183 dpp = {p: round(float((inv_alr(xc)[i] - inv_alr(x_polls)[i]) * 100), 3)
175− for i, p in enumerate(settings.parties)} 184+ for i, p in enumerate(ps)}
176 return xc, 0.5 * (Pc + Pc.T), { 185 return xc, 0.5 * (Pc + Pc.T), {
177 "weight_schedule": round(w, 4), "precision_share": round(share, 4), 186 "weight_schedule": round(w, 4), "precision_share": round(share, 4),
178 "delta_pp": dpp} 187 "delta_pp": dpp}
modified backend/app/modeling/house_effects.py +3 −2
@@ -34,10 +34,11 @@ class PollsterProfile:
34 detail: dict = field(default_factory=dict) 34 detail: dict = field(default_factory=dict)
35 35
36 36
37−def compute_profiles(polls: list[dict], elections: list[dict]) -> dict[str, PollsterProfile]: 37+def compute_profiles(polls: list[dict], elections: list[dict],
38+ parties: list[str] | None = None) -> dict[str, PollsterProfile]:
38 """polls: [{pollster, field_end(date), shares{party: pct}}] 39 """polls: [{pollster, field_end(date), shares{party: pct}}]
39 elections: [{date(date), result{party: pct}}] — résultats réels connus.""" 40 elections: [{date(date), result{party: pct}}] — résultats réels connus."""
40− parties = [p for p in settings.parties if p != "AUT"] 41+ parties = [p for p in (parties or settings.parties) if p != "AUT"]
41 errs: dict[str, list[dict[str, float]]] = {} 42 errs: dict[str, list[dict[str, float]]] = {}
42 for el in elections: 43 for el in elections:
43 window_start = el["date"] - timedelta(days=FINAL_WINDOW_DAYS) 44 window_start = el["date"] - timedelta(days=FINAL_WINDOW_DAYS)
added backend/app/modeling/national/__init__.py +4 −0
@@ -0,0 +1,4 @@
1+# QC Élection Forecast — Plateforme de prévision électorale du Québec 2026
2+# Auteur : Simon-Pierre Boucher
3+# Contact : contact@spboucher.ai
4+# https://www.qc-election.com
added backend/app/modeling/national/pollster_error.py +145 −0
@@ -0,0 +1,145 @@
1+# QC Élection Forecast — Plateforme de prévision électorale du Québec 2026
2+# Auteur : Simon-Pierre Boucher
3+# Contact : contact@spboucher.ai
4+# https://www.qc-election.com
5+"""Modèle dynamique d'erreur des sondeurs (§6-§10) — v1 multi-élections.
6+
7+Sépare explicitement, à partir des 6 élections rejouables (2007-2022) :
8+
9+ * **erreur d'industrie** `industry_error[élection, parti]` : biais PARTAGÉ
10+ des sondages finaux (fenêtre 21 j) vs le résultat — 2022 n'était pas un
11+ accident : chaque élection a son erreur commune. σ_industrie devient une
12+ quantité ESTIMÉE (espace alr, LOEO : jamais sur l'élection testée) au lieu
13+ du 0,12 calibré à la main sur 2018/2022 (STATISTICAL_DEBT §industry).
14+ * **house effects hiérarchiques** : h[maison] global (rétréci par le nombre
15+ d'élections observées n/(n+k)) + déviation par élection (τ) — un sondeur
16+ vu 1 fois garde une GRANDE incertitude au lieu d'un simple malus.
17+
18+Un plancher conservateur (`floor`) protège contre la sous-estimation quand
19+l'historique est court (§60 : priors conservateurs si données faibles)."""
20+from __future__ import annotations
21+
22+from datetime import timedelta
23+
24+import numpy as np
25+
26+from ...config import settings
27+from ..compositions import alr, close
28+
29+FINAL_WINDOW_DAYS = 21
30+SIGMA_FLOOR = 0.08 # plancher conservateur (alr) — jamais en dessous
31+SIGMA_CAP = 0.25 # plafond de sécurité
32+SHRINK_K = 2.0 # h_global rétréci par n/(n+k)
33+
34+
35+def _final_avg_shares(polls: list[dict], eday, parties: list[str]) -> np.ndarray | None:
36+ """Moyenne des sondages des 21 derniers jours (fractions, ordre `parties`)."""
37+ window = [p for p in polls
38+ if (eday - timedelta(days=FINAL_WINDOW_DAYS)) <= p["field_end"] <= eday]
39+ if len(window) < 2:
40+ return None
41+ rows = []
42+ for p in window:
43+ v = np.array([p["shares"].get(pt, 0.0) for pt in parties])
44+ if v[:len(parties) - 1].sum() > 60:
45+ rows.append(close(v / max(v.sum(), 1e-9)))
46+ return np.mean(rows, axis=0) if len(rows) >= 2 else None
47+
48+
49+_CACHE: dict = {}
50+
51+
52+def industry_errors() -> dict[int, dict]:
53+ """Erreur d'industrie par élection : alr(moyenne finale) − alr(résultat).
54+ (Mise en cache processus — relit les CSV une seule fois.)"""
55+ if "errs" in _CACHE:
56+ return _CACHE["errs"]
57+ from ...ingest.wikipedia_historical import ELECTIONS, load_polls, to_model_polls
58+ out: dict[int, dict] = {}
59+ for yr, meta in ELECTIONS.items():
60+ parties = meta["parties"]
61+ polls = to_model_polls(load_polls(yr))
62+ avg = _final_avg_shares(polls, meta["date"], parties)
63+ if avg is None:
64+ continue
65+ actual = close(np.array([meta["result"][p] for p in parties]) / 100.0)
66+ delta_alr = alr(avg) - alr(actual)
67+ delta_pp = (avg - actual) * 100.0
68+ # composantes « principales » : le log-ratio d'un parti à 3 % explose
69+ # pour 1 pp d'erreur — l'estimation de σ ne retient que les composantes
70+ # dont le parti pèse ≥ 5 % (la référence alr est toujours principale).
71+ main = [float(delta_alr[i - 1]) for i in range(1, len(parties))
72+ if actual[i] >= 0.05]
73+ out[yr] = {"parties": parties,
74+ "delta_alr": [round(float(v), 4) for v in delta_alr],
75+ "main_delta_alr": [round(v, 4) for v in main],
76+ "delta_pp": {p: round(float(delta_pp[i]), 2)
77+ for i, p in enumerate(parties)},
78+ "rms_alr_main": round(float(np.sqrt(np.mean(
79+ np.square(main)))), 4) if main else None}
80+ _CACHE["errs"] = out
81+ return out
82+
83+
84+def industry_sigma_loeo(test_year: int | None = None) -> float:
85+ """σ_industrie (alr) estimé sur les élections ≠ test_year : RMS des erreurs
86+ d'industrie composante par composante, borné [plancher, plafond]."""
87+ errs = industry_errors()
88+ vals = [v for yr, e in errs.items() if yr != test_year
89+ for v in e["main_delta_alr"]]
90+ if len(vals) < 6:
91+ return settings.industry_error_sd
92+ sigma = float(np.sqrt(np.mean(np.square(vals))))
93+ return float(np.clip(sigma, SIGMA_FLOOR, SIGMA_CAP))
94+
95+
96+def hierarchical_house_effects() -> dict:
97+ """h[maison, parti] : moyenne inter-élections rétrécie n/(n+k), avec la
98+ dispersion inter-élections τ (les maisons vues 1 fois restent incertaines)."""
99+ from ...ingest.wikipedia_historical import ELECTIONS, load_polls, to_model_polls
100+ per: dict[str, dict[str, list[float]]] = {}
101+ for yr, meta in ELECTIONS.items():
102+ parties = [p for p in meta["parties"] if p != "AUT"]
103+ eday = meta["date"]
104+ for p in to_model_polls(load_polls(yr)):
105+ if not ((eday - timedelta(days=FINAL_WINDOW_DAYS))
106+ <= p["field_end"] <= eday):
107+ continue
108+ for pt in parties:
109+ if pt in p["shares"] and pt in meta["result"]:
110+ per.setdefault(p["pollster"], {}).setdefault(
111+ f"{yr}:{pt}", []).append(
112+ p["shares"][pt] - meta["result"][pt])
113+ out = {}
114+ for house, cells in per.items():
115+ by_party: dict[str, list[float]] = {}
116+ elections = set()
117+ for key, devs in cells.items():
118+ yr, pt = key.split(":")
119+ elections.add(yr)
120+ by_party.setdefault(pt, []).append(float(np.mean(devs)))
121+ n_e = len(elections)
122+ shrink = n_e / (n_e + SHRINK_K)
123+ h = {pt: round(float(np.mean(v)) * shrink, 2) for pt, v in by_party.items()}
124+ tau = round(float(np.mean([np.std(v) for v in by_party.values()
125+ if len(v) >= 2]) if any(
126+ len(v) >= 2 for v in by_party.values()) else 3.0), 2)
127+ out[house] = {"n_elections": n_e, "shrink": round(shrink, 2),
128+ "house_effect_pp": h, "tau_pp": tau}
129+ return out
130+
131+
132+def report() -> dict:
133+ errs = industry_errors()
134+ return {
135+ "industry_errors": {str(k): v for k, v in errs.items()},
136+ "industry_sigma_alr": {
137+ "all": round(industry_sigma_loeo(None), 4),
138+ "loeo": {str(yr): round(industry_sigma_loeo(yr), 4) for yr in errs},
139+ "config_manual": settings.industry_error_sd,
140+ "floor": SIGMA_FLOOR, "cap": SIGMA_CAP},
141+ "house_effects_hierarchical": hierarchical_house_effects(),
142+ "note": ("Erreur d'industrie = biais PARTAGÉ des sondages finaux; "
143+ "σ estimé LOEO remplace le 0,12 manuel dans le replay; la "
144+ "production l'adopte via use_empirical_industry_error."),
145+ }
modified backend/app/modeling/trend.py +31 −19
@@ -24,14 +24,19 @@ from .compositions import alr, alr_obs_cov, close, inv_alr
24 from .house_effects import PollsterProfile, adjust_shares, profile_for 24 from .house_effects import PollsterProfile, adjust_shares, profile_for
25 from .weights import effective_n 25 from .weights import effective_n
26 26
27−M = len(settings.parties) - 1 # dimension de l'état (K-1) 27+M = len(settings.parties) - 1 # dimension de l'état (K-1) — élection cible
28 28
29+# Le cœur est paramétré par la liste de partis : le replay historique rejoue
30+# des ères différentes (ADQ 2007-2008, pas de PCQ avant 2022…) avec le même code.
29 31
30−def shares_vector(shares: dict[str, float]) -> np.ndarray: 32+
33+def shares_vector(shares: dict[str, float],
34+ parties: list[str] | None = None) -> np.ndarray:
31 """dict {parti: %} → vecteur ordonné (fractions, somme 1).""" 35 """dict {parti: %} → vecteur ordonné (fractions, somme 1)."""
32− v = np.array([shares.get(p, 0.0) for p in settings.parties], dtype=float) 36+ ps = parties or settings.parties
33− if v[settings.parties.index("AUT")] == 0.0: 37+ v = np.array([shares.get(p, 0.0) for p in ps], dtype=float)
34− v[settings.parties.index("AUT")] = max(0.5, 100.0 - v.sum()) 38+ if "AUT" in ps and v[ps.index("AUT")] == 0.0:
39+ v[ps.index("AUT")] = max(0.5, 100.0 - v.sum())
35 return close(v / 100.0) 40 return close(v / 100.0)
36 41
37 42
@@ -59,16 +64,19 @@ class TrendResult:
59 n_polls: int 64 n_polls: int
60 65
61 66
62−def prepare_polls(polls: list[dict], profiles: dict[str, PollsterProfile]) -> list[PreparedPoll]: 67+def prepare_polls(polls: list[dict], profiles: dict[str, PollsterProfile],
68+ parties: list[str] | None = None) -> list[PreparedPoll]:
69+ ps = parties or settings.parties
70+ min_main = max(3, len(ps) - 2)
63 out = [] 71 out = []
64 for poll in polls: 72 for poll in polls:
65 prof = profile_for(profiles, poll["pollster"]) 73 prof = profile_for(profiles, poll["pollster"])
66− shares = {p: v for p, v in poll["shares"].items() if p in settings.parties} 74+ shares = {p: v for p, v in poll["shares"].items() if p in ps}
67 main = {p: v for p, v in shares.items() if p != "AUT"} 75 main = {p: v for p, v in shares.items() if p != "AUT"}
68− if len(main) < 4: 76+ if len(main) < min_main:
69 continue 77 continue
70 adj = adjust_shares(shares, prof) 78 adj = adjust_shares(shares, prof)
71− p_adj = shares_vector(adj) 79+ p_adj = shares_vector(adj, ps)
72 n_eff = effective_n(poll.get("sample_size"), poll.get("mode", "unknown")) 80 n_eff = effective_n(poll.get("sample_size"), poll.get("mode", "unknown"))
73 # la cote du sondeur module la précision effective (jamais > ±40 %) 81 # la cote du sondeur module la précision effective (jamais > ±40 %)
74 n_scaled = n_eff * prof.weight_multiplier 82 n_scaled = n_eff * prof.weight_multiplier
@@ -88,15 +96,16 @@ def _filter(prepared: list[PreparedPoll], grid: list[date], q: float,
88 x0: np.ndarray, P0: np.ndarray, smooth: bool = False): 96 x0: np.ndarray, P0: np.ndarray, smooth: bool = False):
89 """Filtre de Kalman sur grille quotidienne; lisseur RTS optionnel.""" 97 """Filtre de Kalman sur grille quotidienne; lisseur RTS optionnel."""
90 T = len(grid) 98 T = len(grid)
99+ Mx = len(x0)
91 by_day: dict[date, list[PreparedPoll]] = {} 100 by_day: dict[date, list[PreparedPoll]] = {}
92 for p in prepared: 101 for p in prepared:
93 by_day.setdefault(p.field_end, []).append(p) 102 by_day.setdefault(p.field_end, []).append(p)
94 103
95 x, P = x0.copy(), P0.copy() 104 x, P = x0.copy(), P0.copy()
96 loglik = 0.0 105 loglik = 0.0
97− xs_pred = np.zeros((T, M)); Ps_pred = np.zeros((T, M, M)) 106+ xs_pred = np.zeros((T, Mx)); Ps_pred = np.zeros((T, Mx, Mx))
98− xs_filt = np.zeros((T, M)); Ps_filt = np.zeros((T, M, M)) 107+ xs_filt = np.zeros((T, Mx)); Ps_filt = np.zeros((T, Mx, Mx))
99− I = np.eye(M) 108+ I = np.eye(Mx)
100 for t, d in enumerate(grid): 109 for t, d in enumerate(grid):
101 if t > 0: 110 if t > 0:
102 P = P + q * I 111 P = P + q * I
@@ -110,7 +119,7 @@ def _filter(prepared: list[PreparedPoll], grid: list[date], q: float,
110 P = (I - K) @ P 119 P = (I - K) @ P
111 P = 0.5 * (P + P.T) 120 P = 0.5 * (P + P.T)
112 sign, logdet = np.linalg.slogdet(S) 121 sign, logdet = np.linalg.slogdet(S)
113− loglik += -0.5 * (M * np.log(2 * np.pi) + logdet + innov @ Sinv @ innov) 122+ loglik += -0.5 * (Mx * np.log(2 * np.pi) + logdet + innov @ Sinv @ innov)
114 xs_filt[t], Ps_filt[t] = x, P 123 xs_filt[t], Ps_filt[t] = x, P
115 124
116 if not smooth: 125 if not smooth:
@@ -125,8 +134,11 @@ def _filter(prepared: list[PreparedPoll], grid: list[date], q: float,
125 134
126 135
127 def fit_trend(polls: list[dict], profiles: dict[str, PollsterProfile], 136 def fit_trend(polls: list[dict], profiles: dict[str, PollsterProfile],
128− as_of: date, rng: np.random.Generator | None = None) -> TrendResult | None: 137+ as_of: date, rng: np.random.Generator | None = None,
129− prepared = [p for p in prepare_polls(polls, profiles) if p.field_end <= as_of] 138+ parties: list[str] | None = None) -> TrendResult | None:
139+ ps = parties or settings.parties
140+ Mx = len(ps) - 1
141+ prepared = [p for p in prepare_polls(polls, profiles, ps) if p.field_end <= as_of]
130 if len(prepared) < 3: 142 if len(prepared) < 3:
131 return None 143 return None
132 rng = rng or np.random.default_rng(20261005) 144 rng = rng or np.random.default_rng(20261005)
@@ -134,7 +146,7 @@ def fit_trend(polls: list[dict], profiles: dict[str, PollsterProfile],
134 grid = [start + timedelta(days=i) for i in range((as_of - start).days + 1)] 146 grid = [start + timedelta(days=i) for i in range((as_of - start).days + 1)]
135 147
136 x0 = prepared[0].y.copy() 148 x0 = prepared[0].y.copy()
137− P0 = np.eye(M) * 0.09 # a priori large (~±6 pp) 149+ P0 = np.eye(Mx) * 0.09 # a priori large (~±6 pp)
138 150
139 # Estimation de q par vraisemblance profilée (grille log-uniforme) 151 # Estimation de q par vraisemblance profilée (grille log-uniforme)
140 qs = np.geomspace(settings.rw_daily_sd_min ** 2, settings.rw_daily_sd_max ** 2, 12) 152 qs = np.geomspace(settings.rw_daily_sd_min ** 2, settings.rw_daily_sd_max ** 2, 12)
@@ -148,11 +160,11 @@ def fit_trend(polls: list[dict], profiles: dict[str, PollsterProfile],
148 160
149 # Parts lissées + intervalle crédible 95 % par échantillonnage 161 # Parts lissées + intervalle crédible 95 % par échantillonnage
150 T = len(grid) 162 T = len(grid)
151− share_mean = np.zeros((T, M + 1)); share_lo = np.zeros((T, M + 1)); share_hi = np.zeros((T, M + 1)) 163+ share_mean = np.zeros((T, Mx + 1)); share_lo = np.zeros((T, Mx + 1)); share_hi = np.zeros((T, Mx + 1))
152 n_draw = 400 164 n_draw = 400
153 for t in range(T): 165 for t in range(T):
154− L = np.linalg.cholesky(Ps_s[t] + 1e-10 * np.eye(M)) 166+ L = np.linalg.cholesky(Ps_s[t] + 1e-10 * np.eye(Mx))
155− draws = xs_s[t] + rng.standard_normal((n_draw, M)) @ L.T 167+ draws = xs_s[t] + rng.standard_normal((n_draw, Mx)) @ L.T
156 s = inv_alr(draws) 168 s = inv_alr(draws)
157 share_mean[t] = inv_alr(xs_s[t]) 169 share_mean[t] = inv_alr(xs_s[t])
158 share_lo[t] = np.percentile(s, 2.5, axis=0) 170 share_lo[t] = np.percentile(s, 2.5, axis=0)
added backend/app/modeling/validation/historical_replay.py +150 −0
@@ -0,0 +1,150 @@
1+# QC Élection Forecast — Plateforme de prévision électorale du Québec 2026
2+# Auteur : Simon-Pierre Boucher
3+# Contact : contact@spboucher.ai
4+# https://www.qc-election.com
5+"""Historical Replay Engine (§52-54) — la validation PRINCIPALE du modèle.
6+
7+Rejoue les élections 2007, 2008, 2012, 2014, 2018 (national) et 2022
8+(national + circonscriptions, via le backtest existant) en LEAVE-ONE-ELECTION-OUT
9+strict :
10+
11+ * house effects appris uniquement sur les AUTRES élections;
12+ * prior de fondamentaux ajusté avec `exclude_year` (l'élection testée ne
13+ participe jamais à son propre prior);
14+ * σ_industrie estimé sur les AUTRES élections (`national/pollster_error.py`);
15+ * rolling origin J-120 → J-1 : seulement l'information ≤ date.
16+
17+Scores propres (§55) : EAM/RMSE du vote, couverture 50/90/95, CRPS, log score,
18+sharpness, biais signé. Rapport : `data/replay_report.json` + `/api/replay`.
19+"""
20+from __future__ import annotations
21+
22+import json
23+from datetime import date, timedelta
24+
25+import numpy as np
26+
27+from ...config import DATA_DIR, settings
28+from ..compositions import alr, close, inv_alr
29+from ..forecast import forecast as fc
30+from ..fundamentals import HISTORY, blend, compute_prior
31+from ..house_effects import compute_profiles
32+from ..trend import fit_trend
33+from .scoring import (crps_from_draws, interval_coverage, log_score_alr,
34+ sharpness, vote_errors)
35+
36+HORIZONS = [120, 90, 60, 45, 30, 21, 14, 7, 3, 1]
37+
38+
39+def _era_prev_result(year: int) -> dict[str, float] | None:
40+ """Vote de l'élection PRÉCÉDENTE, exprimé dans l'ère de partis de `year`."""
41+ from ...ingest.wikipedia_historical import ELECTIONS
42+ PREV = {2007: {"PLQ": 45.99, "PQ": 33.24, "ADQ": 18.18, "QS": 1.06, "AUT": 1.73},
43+ 2008: {"PLQ": 33.08, "PQ": 28.35, "ADQ": 30.84, "QS": 3.64, "AUT": 4.09},
44+ 2012: {"PLQ": 42.08, "PQ": 35.17, "CAQ": 16.37, "QS": 3.78, "AUT": 2.60},
45+ 2014: {"PLQ": 31.20, "PQ": 31.95, "CAQ": 27.05, "QS": 6.03, "AUT": 3.77},
46+ 2018: {"PLQ": 41.52, "PQ": 25.38, "CAQ": 23.05, "QS": 7.63, "AUT": 2.42}}
47+ return PREV.get(year)
48+
49+
50+def _loeo_profiles(test_year: int, parties: list[str]):
51+ """House effects appris sur toutes les élections rejouables ≠ test_year
52+ (dans l'ère de partis du test — seuls les partis communs contribuent)."""
53+ from ...ingest.wikipedia_historical import ELECTIONS, load_polls, to_model_polls
54+ polls, elections = [], []
55+ for yr, meta in ELECTIONS.items():
56+ if yr == test_year:
57+ continue
58+ elections.append({"date": meta["date"], "result": meta["result"]})
59+ polls.extend(to_model_polls(load_polls(yr)))
60+ return compute_profiles(polls, elections, parties=parties)
61+
62+
63+def replay_election(year: int, use_fundamentals: bool = True,
64+ use_loeo_house: bool = True,
65+ industry_sd: float | None = None,
66+ horizons: list[int] | None = None) -> dict:
67+ """Rejoue une élection à tous les horizons; retourne les scores."""
68+ from ...ingest.wikipedia_historical import ELECTIONS, load_polls, to_model_polls
69+ meta = ELECTIONS[year]
70+ parties = meta["parties"]
71+ eday = meta["date"]
72+ actual = meta["result"]
73+ actual_vec = close(np.array([actual[p] for p in parties]) / 100.0)
74+ polls = to_model_polls(load_polls(year))
75+ profiles = _loeo_profiles(year, parties) if use_loeo_house else {}
76+ prev = _era_prev_result(year)
77+
78+ rows = []
79+ rng = np.random.default_rng(year)
80+ for h in (horizons or HORIZONS):
81+ as_of = eday - timedelta(days=h)
82+ trend = fit_trend(polls, profiles, as_of, parties=parties)
83+ if trend is None:
84+ rows.append({"horizon": h, "error": "sondages insuffisants"})
85+ continue
86+ f = fc(trend, as_of, eday, parties=parties, industry_sd=industry_sd)
87+ if use_fundamentals and prev is not None:
88+ hist_row = next((r for r in HISTORY if r[0] == year), None)
89+ if hist_row:
90+ _, inc, terms, sat, _, _ = hist_row
91+ prior = compute_prior(as_of, incumbent=inc, terms=terms,
92+ satisfaction=sat, prev_result=prev,
93+ exclude_year=year, parties=parties)
94+ x_b, P_b, _ = blend(f.x, f.P, prior, h, parties=parties)
95+ from ..forecast import distribution_from
96+ f = distribution_from("forecast", as_of, x_b, P_b,
97+ parties=parties)
98+ # tirages pour CRPS
99+ Mx = len(f.x)
100+ L = np.linalg.cholesky(f.P + 1e-10 * np.eye(Mx))
101+ draws = inv_alr(f.x + rng.standard_normal((4000, Mx)) @ L.T) * 100.0
102+ fc_mean = {p: f.summary[p]["mean"] for p in parties}
103+ rows.append({
104+ "horizon": h, "as_of": as_of.isoformat(), "n_polls": trend.n_polls,
105+ **vote_errors(fc_mean, actual, parties),
106+ **interval_coverage(f.summary, actual, parties),
107+ "crps_pp": crps_from_draws(draws, actual_vec * 100.0),
108+ "log_score": log_score_alr(f.x, f.P, alr(actual_vec)),
109+ "sharpness_pp": sharpness(f.summary, parties),
110+ "forecast": {p: round(fc_mean[p], 1) for p in parties},
111+ })
112+ ok = [r for r in rows if "error" not in r]
113+ agg = {}
114+ if ok:
115+ for k in ("mae_pp", "rmse_pp", "crps_pp", "log_score", "sharpness_pp"):
116+ agg[k] = round(float(np.mean([r[k] for r in ok])), 3)
117+ for k in ("coverage_50", "coverage_90", "coverage_95"):
118+ vals = [r[k] for r in ok if k in r]
119+ if vals:
120+ agg[k] = round(float(np.mean(vals)), 3)
121+ return {"year": year, "parties": parties, "actual": actual,
122+ "horizons": rows, "avg": agg}
123+
124+
125+def run_replay(use_fundamentals: bool = True,
126+ industry_from_loeo: bool = True) -> dict:
127+ """Replay complet multi-élections (national). 2022 reste couvert par le
128+ backtest circonscriptions existant — les deux rapports se complètent."""
129+ from ...ingest.wikipedia_historical import ELECTIONS
130+ from ..national.pollster_error import industry_sigma_loeo
131+ report = {"generated": date.today().isoformat(),
132+ "model_version": settings.model_version,
133+ "protocol": ("LOEO strict : house effects, fondamentaux et "
134+ "σ_industrie appris sur les autres élections; "
135+ "rolling origin J-120→J-1."),
136+ "elections": {}}
137+ for yr in sorted(ELECTIONS):
138+ sd = industry_sigma_loeo(yr) if industry_from_loeo else None
139+ rep = replay_election(yr, use_fundamentals=use_fundamentals,
140+ industry_sd=sd)
141+ rep["industry_sd_loeo"] = round(sd, 4) if sd is not None else None
142+ report["elections"][str(yr)] = rep
143+ # agrégat global (moyenne des moyennes par élection)
144+ aggs = [e["avg"] for e in report["elections"].values() if e["avg"]]
145+ if aggs:
146+ report["overall"] = {k: round(float(np.mean([a[k] for a in aggs if k in a])), 3)
147+ for k in aggs[0]}
148+ (DATA_DIR / "replay_report.json").write_text(
149+ json.dumps(report, indent=1, ensure_ascii=False))
150+ return report
modified backend/app/modeling/validation/scoring.py +21 −0
@@ -83,6 +83,27 @@ def calibration_bins(probs: np.ndarray, outcomes: np.ndarray,
83 return bins 83 return bins
84 84
85 85
86+def crps_from_draws(draws: np.ndarray, actual: np.ndarray) -> float:
87+ """CRPS moyen par parti à partir d'échantillons du posterior (en pp).
88+ CRPS = E|X − y| − ½·E|X − X'| (estimateur par paires décalées)."""
89+ n = len(draws)
90+ term1 = np.abs(draws - actual[None, :]).mean(axis=0)
91+ perm = np.roll(np.arange(n), n // 2)
92+ term2 = 0.5 * np.abs(draws - draws[perm]).mean(axis=0)
93+ return round(float((term1 - term2).mean()), 3)
94+
95+
96+def log_score_alr(x: np.ndarray, P: np.ndarray, actual_alr: np.ndarray) -> float:
97+ """Log-densité prédictive de la composition réelle sous le posterior alr
98+ (gaussienne multivariée) — plus haut = mieux."""
99+ Mx = len(x)
100+ diff = actual_alr - x
101+ Pi = P + 1e-10 * np.eye(Mx)
102+ sign, logdet = np.linalg.slogdet(Pi)
103+ return round(float(-0.5 * (Mx * np.log(2 * np.pi) + logdet
104+ + diff @ np.linalg.inv(Pi) @ diff)), 3)
105+
106+
86 def score_snapshot(forecast_summary: dict, districts: list[dict], 107 def score_snapshot(forecast_summary: dict, districts: list[dict],
87 actual_national: dict[str, float], 108 actual_national: dict[str, float],
88 actual_winners: dict[str, str], 109 actual_winners: dict[str, str],
modified backend/app/pipeline.py +17 −2
@@ -133,9 +133,19 @@ def run_forecast(db: Session, as_of: date | None = None, label: str | None = Non
133 volatility = {"multiplier": float(attention.get("drift_multiplier", 1.0))} 133 volatility = {"multiplier": float(attention.get("drift_multiplier", 1.0))}
134 drift_mult = float(volatility.get("multiplier", 1.0)) 134 drift_mult = float(volatility.get("multiplier", 1.0))
135 135
136+ # σ_industrie : appris LOEO sur 2007-2022 si le flag l'active (v3.1)
137+ industry_sd = None
138+ if settings.use_empirical_industry_error:
139+ try:
140+ from .modeling.national.pollster_error import industry_sigma_loeo
141+ industry_sd = industry_sigma_loeo(None)
142+ except Exception:
143+ industry_sd = None
144+
136 now_d = nc(trend, as_of) 145 now_d = nc(trend, as_of)
137 fc_b = fc(trend, as_of, target.election_date, 146 fc_b = fc(trend, as_of, target.election_date,
138− drift_multiplier=drift_mult) # sondages + partielles 147+ drift_multiplier=drift_mult,
148+ industry_sd=industry_sd) # sondages + partielles
139 149
140 # --- couche 3 : prior de fondamentaux (poids décroissant vers le scrutin) --- 150 # --- couche 3 : prior de fondamentaux (poids décroissant vers le scrutin) ---
141 result_2022 = (db.query(Mo.Election) 151 result_2022 = (db.query(Mo.Election)
@@ -169,7 +179,8 @@ def run_forecast(db: Session, as_of: date | None = None, label: str | None = Non
169 s = SIM.run_simulation(inp, n_sims=8000, 179 s = SIM.run_simulation(inp, n_sims=8000,
170 rng=np.random.default_rng(seed)) 180 rng=np.random.default_rng(seed))
171 return {p: s.seats[p]["prob_most"] for p in settings.parties} 181 return {p: s.seats[p]["prob_most"] for p in settings.parties}
172− fc_a = fc(trend_a, as_of, target.election_date, drift_multiplier=drift_mult) 182+ fc_a = fc(trend_a, as_of, target.election_date, drift_multiplier=drift_mult,
183+ industry_sd=industry_sd)
173 variants = [ 184 variants = [
174 ("sondages", "Sondages seuls (modèle v1)", fc_a.x, fc_a.P), 185 ("sondages", "Sondages seuls (modèle v1)", fc_a.x, fc_a.P),
175 ("partielles", "+ votes réels des partielles", fc_b.x, fc_b.P), 186 ("partielles", "+ votes réels des partielles", fc_b.x, fc_b.P),
@@ -265,6 +276,10 @@ def run_forecast(db: Session, as_of: date | None = None, label: str | None = Non
265 diagnostics={"q_daily_var": trend.q, "loglik": trend.loglik, 276 diagnostics={"q_daily_var": trend.q, "loglik": trend.loglik,
266 "days_to_election": days_left, 277 "days_to_election": days_left,
267 "n_byelections": len(bye_polls), 278 "n_byelections": len(bye_polls),
279+ "industry_sd": round(industry_sd, 4) if industry_sd
280+ else settings.industry_error_sd,
281+ "industry_sd_source": ("loeo-2007-2022" if industry_sd
282+ else "config-manuel"),
268 "fundamentals_weight": (fund_diag.get("blend") or {}).get( 283 "fundamentals_weight": (fund_diag.get("blend") or {}).get(
269 "precision_share", 0.0)}) 284 "precision_share", 0.0)})
270 for d in sim.districts: 285 for d in sim.districts:
modified backend/app/seed.py +13 −0
@@ -212,6 +212,19 @@ def seed_all(db: Session | None = None) -> dict:
212 "Engine à confirmation croisée, circonscriptions pivots de la " 212 "Engine à confirmation croisée, circonscriptions pivots de la "
213 "majorité (méthode des simulations), page /circonscriptions " 213 "majorité (méthode des simulations), page /circonscriptions "
214 "(forecast par comté), API v3 (/api/v3/*), data-health admin."))) 214 "(forecast par comté), API v3 (/api/v3/*), data-health admin.")))
215+ get_or_create(db, Mo.ModelVersion, version="3.1.0",
216+ defaults=dict(changelog=(
217+ "Méthodologie ultra avancée — première vague : REPLAY HISTORIQUE "
218+ "multi-élections (2007/2008/2012/2014/2018/2022, 462 sondages, "
219+ "LOEO strict : house effects, fondamentaux et σ appris sur les "
220+ "autres élections; rolling origin J-120→J-1; CRPS + log score); "
221+ "modèle d'erreur des sondeurs (erreur d'industrie par élection, "
222+ "house effects hiérarchiques rétrécis n/(n+k)); σ_industrie "
223+ "APPRIS (LOEO ≈0,21 vs 0,12 manuel) adopté après validation : "
224+ "log score −3,80 vs −5,33, CRPS 2,64 vs 2,67, couverture 95 % "
225+ "83 % vs 76,5 %, EAM inchangée. Cœur alr paramétré par ères de "
226+ "partis (ADQ 2007-2008). Audits : METHODOLOGY_AUDIT, "
227+ "STATISTICAL_DEBT, V3_MODEL_ARCHITECTURE, HISTORICAL_REPLAY_PLAN.")))
215 # Sources 228 # Sources
216 for name, url, kind in [ 229 for name, url, kind in [
217 ("Wikipédia — sondages 2026", "https://en.wikipedia.org/wiki/2026_Quebec_general_election", "polls"), 230 ("Wikipédia — sondages 2026", "https://en.wikipedia.org/wiki/2026_Quebec_general_election", "polls"),
added backend/data/historical/polls_2007.csv +145 −0
@@ -0,0 +1,145 @@
1+pollster,field_end,sample_size,mode,source_url,party,raw_value,accessed_at
2+Angus Reid,2007-03-23,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,31.0,2026-08-30T22:20:09.355883+00:00
3+Angus Reid,2007-03-23,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:09.355883+00:00
4+Angus Reid,2007-03-23,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,34.0,2026-08-30T22:20:09.355883+00:00
5+Angus Reid,2007-03-23,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,12.0,2026-08-30T22:20:09.355883+00:00
6+CROP,2007-03-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,33.0,2026-08-30T22:20:09.355883+00:00
7+CROP,2007-03-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:09.355883+00:00
8+CROP,2007-03-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,29.0,2026-08-30T22:20:09.355883+00:00
9+CROP,2007-03-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.355883+00:00
10+CROP,2007-03-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,8.0,2026-08-30T22:20:09.355883+00:00
11+Léger,2007-03-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,34.0,2026-08-30T22:20:09.355883+00:00
12+Léger,2007-03-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:09.355883+00:00
13+Léger,2007-03-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,35.0,2026-08-30T22:20:09.355883+00:00
14+Léger,2007-03-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.355883+00:00
15+Léger,2007-03-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,4.0,2026-08-30T22:20:09.355883+00:00
16+CROP,2007-03-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.355883+00:00
17+CROP,2007-03-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:09.355883+00:00
18+CROP,2007-03-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,31.0,2026-08-30T22:20:09.355883+00:00
19+CROP,2007-03-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.355883+00:00
20+CROP,2007-03-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,7.0,2026-08-30T22:20:09.355883+00:00
21+CROP,2007-02-20,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,39.0,2026-08-30T22:20:09.355883+00:00
22+CROP,2007-02-20,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:09.355883+00:00
23+CROP,2007-02-20,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.355883+00:00
24+CROP,2007-02-20,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.355883+00:00
25+CROP,2007-02-20,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,9.0,2026-08-30T22:20:09.355883+00:00
26+Léger,2007-01-28,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,37.0,2026-08-30T22:20:09.355883+00:00
27+Léger,2007-01-28,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.355883+00:00
28+Léger,2007-01-28,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,26.0,2026-08-30T22:20:09.355883+00:00
29+Léger,2007-01-28,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.355883+00:00
30+Léger,2007-01-28,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,4.0,2026-08-30T22:20:09.355883+00:00
31+CROP,2006-09-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,36.0,2026-08-30T22:20:09.355883+00:00
32+CROP,2006-09-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:09.355883+00:00
33+CROP,2006-09-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.355883+00:00
34+CROP,2006-09-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,11.0,2026-08-30T22:20:09.355883+00:00
35+Léger,2006-06-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,38.0,2026-08-30T22:20:09.355883+00:00
36+Léger,2006-06-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:09.355883+00:00
37+Léger,2006-06-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,19.0,2026-08-30T22:20:09.355883+00:00
38+Léger,2006-06-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,7.0,2026-08-30T22:20:09.355883+00:00
39+Léger,2006-06-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,7.0,2026-08-30T22:20:09.355883+00:00
40+Léger,2006-04-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,43.0,2026-08-30T22:20:09.355883+00:00
41+Léger,2006-04-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:09.355883+00:00
42+Léger,2006-04-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.355883+00:00
43+Léger,2006-04-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,9.0,2026-08-30T22:20:09.355883+00:00
44+Léger,2006-04-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,5.0,2026-08-30T22:20:09.355883+00:00
45+Léger,2006-03-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,49.0,2026-08-30T22:20:09.355883+00:00
46+Léger,2006-03-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:09.355883+00:00
47+Léger,2006-03-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,13.0,2026-08-30T22:20:09.355883+00:00
48+Léger,2006-03-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.355883+00:00
49+Léger,2006-03-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,7.0,2026-08-30T22:20:09.355883+00:00
50+CROP,2006-02-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,48.0,2026-08-30T22:20:09.355883+00:00
51+CROP,2006-02-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:09.355883+00:00
52+CROP,2006-02-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.355883+00:00
53+CROP,2006-02-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,14.0,2026-08-30T22:20:09.355883+00:00
54+CROP,2006-01-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,57.0,2026-08-30T22:20:09.355883+00:00
55+CROP,2006-01-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:09.355883+00:00
56+CROP,2006-01-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.355883+00:00
57+CROP,2006-01-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,9.0,2026-08-30T22:20:09.355883+00:00
58+Léger,2005-11-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,53.0,2026-08-30T22:20:09.355883+00:00
59+Léger,2005-11-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:09.355883+00:00
60+Léger,2005-11-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.355883+00:00
61+Léger,2005-11-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,4.0,2026-08-30T22:20:09.355883+00:00
62+CROP,2005-10-26,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,58.0,2026-08-30T22:20:09.355883+00:00
63+CROP,2005-10-26,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:09.355883+00:00
64+CROP,2005-10-26,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.355883+00:00
65+CROP,2005-10-26,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.355883+00:00
66+Léger,2005-09-11,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,55.0,2026-08-30T22:20:09.355883+00:00
67+Léger,2005-09-11,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:09.355883+00:00
68+Léger,2005-09-11,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,18.0,2026-08-30T22:20:09.355883+00:00
69+Léger,2005-09-11,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.355883+00:00
70+CROP,2005-06-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,48.0,2026-08-30T22:20:09.355883+00:00
71+CROP,2005-06-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,14.0,2026-08-30T22:20:09.355883+00:00
72+CROP,2005-06-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,20.0,2026-08-30T22:20:09.355883+00:00
73+CROP,2005-06-27,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,3.0,2026-08-30T22:20:09.355883+00:00
74+CROP,2005-05-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,55.0,2026-08-30T22:20:09.355883+00:00
75+CROP,2005-05-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,16.0,2026-08-30T22:20:09.355883+00:00
76+CROP,2005-05-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,23.0,2026-08-30T22:20:09.355883+00:00
77+CROP,2005-05-30,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.355883+00:00
78+Léger,2005-05-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,53.0,2026-08-30T22:20:09.355883+00:00
79+Léger,2005-05-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:09.355883+00:00
80+Léger,2005-05-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,26.0,2026-08-30T22:20:09.355883+00:00
81+Léger,2005-05-08,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.355883+00:00
82+CROP,2005-04-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,46.0,2026-08-30T22:20:09.355883+00:00
83+CROP,2005-04-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,15.0,2026-08-30T22:20:09.355883+00:00
84+CROP,2005-04-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,23.0,2026-08-30T22:20:09.355883+00:00
85+CROP,2005-04-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.355883+00:00
86+Léger,2005-04-03,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,53.0,2026-08-30T22:20:09.355883+00:00
87+Léger,2005-04-03,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,13.0,2026-08-30T22:20:09.355883+00:00
88+Léger,2005-04-03,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,28.0,2026-08-30T22:20:09.355883+00:00
89+Léger,2005-04-03,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,6.0,2026-08-30T22:20:09.355883+00:00
90+Léger,2004-12-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,39.0,2026-08-30T22:20:09.355883+00:00
91+Léger,2004-12-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.355883+00:00
92+Léger,2004-12-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.355883+00:00
93+Léger,2004-12-12,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,11.0,2026-08-30T22:20:09.355883+00:00
94+CROP,2004-11-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,37.0,2026-08-30T22:20:09.355883+00:00
95+CROP,2004-11-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:09.355883+00:00
96+CROP,2004-11-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,24.0,2026-08-30T22:20:09.355883+00:00
97+CROP,2004-11-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,11.0,2026-08-30T22:20:09.355883+00:00
98+Léger,2004-11-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,48.0,2026-08-30T22:20:09.355883+00:00
99+Léger,2004-11-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:09.355883+00:00
100+Léger,2004-11-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,21.0,2026-08-30T22:20:09.355883+00:00
101+Léger,2004-11-15,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,4.0,2026-08-30T22:20:09.355883+00:00
102+CROP,2004-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,40.0,2026-08-30T22:20:09.355883+00:00
103+CROP,2004-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,21.0,2026-08-30T22:20:09.355883+00:00
104+CROP,2004-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.355883+00:00
105+CROP,2004-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.355883+00:00
106+CROP,2004-08-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,45.0,2026-08-30T22:20:09.355883+00:00
107+CROP,2004-08-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,21.0,2026-08-30T22:20:09.355883+00:00
108+CROP,2004-08-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.355883+00:00
109+CROP,2004-08-25,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,18.0,2026-08-30T22:20:09.355883+00:00
110+Léger,2004-04-10,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,50.0,2026-08-30T22:20:09.355883+00:00
111+Léger,2004-04-10,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:09.355883+00:00
112+Léger,2004-04-10,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,18.0,2026-08-30T22:20:09.355883+00:00
113+Léger,2004-04-10,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,8.0,2026-08-30T22:20:09.355883+00:00
114+CROP,2004-03-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,45.0,2026-08-30T22:20:09.355883+00:00
115+CROP,2004-03-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,17.0,2026-08-30T22:20:09.355883+00:00
116+CROP,2004-03-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,18.0,2026-08-30T22:20:09.355883+00:00
117+CROP,2004-03-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,20.0,2026-08-30T22:20:09.355883+00:00
118+CROP,2004-02-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,40.0,2026-08-30T22:20:09.355883+00:00
119+CROP,2004-02-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,21.0,2026-08-30T22:20:09.355883+00:00
120+CROP,2004-02-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.355883+00:00
121+CROP,2004-02-22,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,17.0,2026-08-30T22:20:09.355883+00:00
122+Léger,2004-01-18,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,49.0,2026-08-30T22:20:09.355883+00:00
123+Léger,2004-01-18,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:09.355883+00:00
124+Léger,2004-01-18,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,19.0,2026-08-30T22:20:09.355883+00:00
125+Léger,2004-01-18,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,6.0,2026-08-30T22:20:09.355883+00:00
126+CROP,2003-12-17,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,39.0,2026-08-30T22:20:09.355883+00:00
127+CROP,2003-12-17,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:09.355883+00:00
128+CROP,2003-12-17,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.355883+00:00
129+CROP,2003-12-17,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,6.0,2026-08-30T22:20:09.355883+00:00
130+CROP,2003-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,38.0,2026-08-30T22:20:09.355883+00:00
131+CROP,2003-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:09.355883+00:00
132+CROP,2003-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.355883+00:00
133+CROP,2003-10-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.355883+00:00
134+CROP,2003-09-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,38.0,2026-08-30T22:20:09.355883+00:00
135+CROP,2003-09-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:09.355883+00:00
136+CROP,2003-09-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.355883+00:00
137+CROP,2003-09-29,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,16.0,2026-08-30T22:20:09.355883+00:00
138+Léger,2003-08-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,43.0,2026-08-30T22:20:09.355883+00:00
139+Léger,2003-08-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,40.0,2026-08-30T22:20:09.355883+00:00
140+Léger,2003-08-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.355883+00:00
141+Léger,2003-08-24,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,3.0,2026-08-30T22:20:09.355883+00:00
142+Léger,2003-05-04,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PQ,41.0,2026-08-30T22:20:09.355883+00:00
143+Léger,2003-05-04,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:09.355883+00:00
144+Léger,2003-05-04,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,ADQ,20.0,2026-08-30T22:20:09.355883+00:00
145+Léger,2003-05-04,,unknown,https://en.wikipedia.org/wiki/2007_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.355883+00:00
added backend/data/historical/polls_2008.csv +181 −0
@@ -0,0 +1,181 @@
1+pollster,field_end,sample_size,mode,source_url,party,raw_value,accessed_at
2+Angus Reid Strategies,2008-12-05,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,42.0,2026-08-30T22:20:09.077153+00:00
3+Angus Reid Strategies,2008-12-05,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,13.0,2026-08-30T22:20:09.077153+00:00
4+Angus Reid Strategies,2008-12-05,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,36.0,2026-08-30T22:20:09.077153+00:00
5+Angus Reid Strategies,2008-12-05,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
6+Angus Reid Strategies,2008-12-05,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
7+Léger Marketing,2008-12-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,45.0,2026-08-30T22:20:09.077153+00:00
8+Léger Marketing,2008-12-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.077153+00:00
9+Léger Marketing,2008-12-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
10+Léger Marketing,2008-12-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
11+Léger Marketing,2008-12-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
12+CROP,2008-12-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,45.0,2026-08-30T22:20:09.077153+00:00
13+CROP,2008-12-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.077153+00:00
14+CROP,2008-12-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,29.0,2026-08-30T22:20:09.077153+00:00
15+CROP,2008-12-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
16+CROP,2008-12-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
17+Léger Marketing,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,46.0,2026-08-30T22:20:09.077153+00:00
18+Léger Marketing,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,12.0,2026-08-30T22:20:09.077153+00:00
19+Léger Marketing,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,34.0,2026-08-30T22:20:09.077153+00:00
20+Léger Marketing,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
21+Léger Marketing,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
22+CROP,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,45.0,2026-08-30T22:20:09.077153+00:00
23+CROP,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,12.0,2026-08-30T22:20:09.077153+00:00
24+CROP,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
25+CROP,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
26+CROP,2008-11-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
27+Nanos Research,2008-11-22,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,44.0,2026-08-30T22:20:09.077153+00:00
28+Nanos Research,2008-11-22,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,12.0,2026-08-30T22:20:09.077153+00:00
29+Nanos Research,2008-11-22,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,36.0,2026-08-30T22:20:09.077153+00:00
30+Nanos Research,2008-11-22,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
31+Nanos Research,2008-11-22,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
32+Léger Marketing,2008-11-19,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,44.0,2026-08-30T22:20:09.077153+00:00
33+Léger Marketing,2008-11-19,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.077153+00:00
34+Léger Marketing,2008-11-19,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,33.0,2026-08-30T22:20:09.077153+00:00
35+Léger Marketing,2008-11-19,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
36+Léger Marketing,2008-11-19,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
37+CROP,2008-11-13,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,42.0,2026-08-30T22:20:09.077153+00:00
38+CROP,2008-11-13,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,15.0,2026-08-30T22:20:09.077153+00:00
39+CROP,2008-11-13,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,31.0,2026-08-30T22:20:09.077153+00:00
40+CROP,2008-11-13,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
41+CROP,2008-11-13,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
42+Environics,2008-11-12,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,45.0,2026-08-30T22:20:09.077153+00:00
43+Environics,2008-11-12,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.077153+00:00
44+Environics,2008-11-12,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,39.0,2026-08-30T22:20:09.077153+00:00
45+Environics,2008-11-12,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,1.0,2026-08-30T22:20:09.077153+00:00
46+Environics,2008-11-12,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
47+Léger Marketing,2008-11-10,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,41.0,2026-08-30T22:20:09.077153+00:00
48+Léger Marketing,2008-11-10,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.077153+00:00
49+Léger Marketing,2008-11-10,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,35.0,2026-08-30T22:20:09.077153+00:00
50+Léger Marketing,2008-11-10,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
51+Léger Marketing,2008-11-10,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.077153+00:00
52+Léger Marketing,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,42.0,2026-08-30T22:20:09.077153+00:00
53+Léger Marketing,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.077153+00:00
54+Léger Marketing,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,34.0,2026-08-30T22:20:09.077153+00:00
55+Léger Marketing,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
56+Léger Marketing,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.077153+00:00
57+CROP,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,38.0,2026-08-30T22:20:09.077153+00:00
58+CROP,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.077153+00:00
59+CROP,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
60+CROP,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
61+CROP,2008-10-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
62+CROP,2008-09-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,41.0,2026-08-30T22:20:09.077153+00:00
63+CROP,2008-09-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,16.0,2026-08-30T22:20:09.077153+00:00
64+CROP,2008-09-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
65+CROP,2008-09-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
66+CROP,2008-09-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
67+CROP,2008-08-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,42.0,2026-08-30T22:20:09.077153+00:00
68+CROP,2008-08-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.077153+00:00
69+CROP,2008-08-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
70+CROP,2008-08-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,3.0,2026-08-30T22:20:09.077153+00:00
71+CROP,2008-08-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
72+CROP,2008-06-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,36.0,2026-08-30T22:20:09.077153+00:00
73+CROP,2008-06-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.077153+00:00
74+CROP,2008-06-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,31.0,2026-08-30T22:20:09.077153+00:00
75+CROP,2008-06-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,8.0,2026-08-30T22:20:09.077153+00:00
76+CROP,2008-06-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
77+Léger Marketing,2008-06-15,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,42.0,2026-08-30T22:20:09.077153+00:00
78+Léger Marketing,2008-06-15,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.077153+00:00
79+Léger Marketing,2008-06-15,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
80+Léger Marketing,2008-06-15,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
81+Léger Marketing,2008-06-15,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
82+CROP,2008-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,41.0,2026-08-30T22:20:09.077153+00:00
83+CROP,2008-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,14.0,2026-08-30T22:20:09.077153+00:00
84+CROP,2008-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
85+CROP,2008-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.077153+00:00
86+CROP,2008-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
87+CROP,2008-04-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,38.0,2026-08-30T22:20:09.077153+00:00
88+CROP,2008-04-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,17.0,2026-08-30T22:20:09.077153+00:00
89+CROP,2008-04-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,29.0,2026-08-30T22:20:09.077153+00:00
90+CROP,2008-04-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
91+CROP,2008-04-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
92+Léger Marketing,2008-04-20,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:09.077153+00:00
93+Léger Marketing,2008-04-20,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,18.0,2026-08-30T22:20:09.077153+00:00
94+Léger Marketing,2008-04-20,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,33.0,2026-08-30T22:20:09.077153+00:00
95+Léger Marketing,2008-04-20,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
96+Léger Marketing,2008-04-20,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.077153+00:00
97+CROP,2008-03-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:09.077153+00:00
98+CROP,2008-03-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,22.0,2026-08-30T22:20:09.077153+00:00
99+CROP,2008-03-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,30.0,2026-08-30T22:20:09.077153+00:00
100+CROP,2008-03-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.077153+00:00
101+CROP,2008-03-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
102+CROP,2008-02-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,35.0,2026-08-30T22:20:09.077153+00:00
103+CROP,2008-02-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,21.0,2026-08-30T22:20:09.077153+00:00
104+CROP,2008-02-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
105+CROP,2008-02-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
106+CROP,2008-02-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
107+CROP,2008-01-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:09.077153+00:00
108+CROP,2008-01-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,24.0,2026-08-30T22:20:09.077153+00:00
109+CROP,2008-01-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,35.0,2026-08-30T22:20:09.077153+00:00
110+CROP,2008-01-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
111+CROP,2008-01-27,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
112+Léger Marketing,2008-01-17,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:09.077153+00:00
113+Léger Marketing,2008-01-17,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,27.0,2026-08-30T22:20:09.077153+00:00
114+Léger Marketing,2008-01-17,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,30.0,2026-08-30T22:20:09.077153+00:00
115+Léger Marketing,2008-01-17,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
116+Léger Marketing,2008-01-17,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
117+CROP,2007-12-02,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:09.077153+00:00
118+CROP,2007-12-02,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,26.0,2026-08-30T22:20:09.077153+00:00
119+CROP,2007-12-02,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,34.0,2026-08-30T22:20:09.077153+00:00
120+CROP,2007-12-02,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,3.0,2026-08-30T22:20:09.077153+00:00
121+CROP,2007-12-02,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
122+Léger Marketing,2007-11-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:09.077153+00:00
123+Léger Marketing,2007-11-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,27.0,2026-08-30T22:20:09.077153+00:00
124+Léger Marketing,2007-11-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,31.0,2026-08-30T22:20:09.077153+00:00
125+Léger Marketing,2007-11-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
126+Léger Marketing,2007-11-04,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
127+CROP,2007-10-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:09.077153+00:00
128+CROP,2007-10-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,28.0,2026-08-30T22:20:09.077153+00:00
129+CROP,2007-10-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,31.0,2026-08-30T22:20:09.077153+00:00
130+CROP,2007-10-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
131+CROP,2007-10-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
132+CROP,2007-09-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:09.077153+00:00
133+CROP,2007-09-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,34.0,2026-08-30T22:20:09.077153+00:00
134+CROP,2007-09-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,30.0,2026-08-30T22:20:09.077153+00:00
135+CROP,2007-09-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
136+CROP,2007-09-23,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
137+Léger Marketing,2007-09-08,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.077153+00:00
138+Léger Marketing,2007-09-08,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,30.0,2026-08-30T22:20:09.077153+00:00
139+Léger Marketing,2007-09-08,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,34.0,2026-08-30T22:20:09.077153+00:00
140+Léger Marketing,2007-09-08,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,2.0,2026-08-30T22:20:09.077153+00:00
141+Léger Marketing,2007-09-08,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,2.0,2026-08-30T22:20:09.077153+00:00
142+CROP,2007-08-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:09.077153+00:00
143+CROP,2007-08-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,29.0,2026-08-30T22:20:09.077153+00:00
144+CROP,2007-08-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,33.0,2026-08-30T22:20:09.077153+00:00
145+CROP,2007-08-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
146+CROP,2007-08-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
147+CROP,2007-06-25,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:09.077153+00:00
148+CROP,2007-06-25,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,28.0,2026-08-30T22:20:09.077153+00:00
149+CROP,2007-06-25,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,29.0,2026-08-30T22:20:09.077153+00:00
150+CROP,2007-06-25,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,6.0,2026-08-30T22:20:09.077153+00:00
151+CROP,2007-06-25,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
152+Léger Marketing,2007-06-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.077153+00:00
153+Léger Marketing,2007-06-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,31.0,2026-08-30T22:20:09.077153+00:00
154+Léger Marketing,2007-06-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,32.0,2026-08-30T22:20:09.077153+00:00
155+Léger Marketing,2007-06-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
156+Léger Marketing,2007-06-24,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
157+CROP,2007-06-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.077153+00:00
158+CROP,2007-06-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,29.0,2026-08-30T22:20:09.077153+00:00
159+CROP,2007-06-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,29.0,2026-08-30T22:20:09.077153+00:00
160+CROP,2007-06-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
161+CROP,2007-06-03,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
162+CROP,2007-05-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.077153+00:00
163+CROP,2007-05-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,32.0,2026-08-30T22:20:09.077153+00:00
164+CROP,2007-05-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,27.0,2026-08-30T22:20:09.077153+00:00
165+CROP,2007-05-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,5.0,2026-08-30T22:20:09.077153+00:00
166+CROP,2007-05-28,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
167+Léger Marketing,2007-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:09.077153+00:00
168+Léger Marketing,2007-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,33.0,2026-08-30T22:20:09.077153+00:00
169+Léger Marketing,2007-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,30.0,2026-08-30T22:20:09.077153+00:00
170+Léger Marketing,2007-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,4.0,2026-08-30T22:20:09.077153+00:00
171+Léger Marketing,2007-05-26,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
172+CROP,2007-04-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:09.077153+00:00
173+CROP,2007-04-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,32.0,2026-08-30T22:20:09.077153+00:00
174+CROP,2007-04-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,23.0,2026-08-30T22:20:09.077153+00:00
175+CROP,2007-04-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,7.0,2026-08-30T22:20:09.077153+00:00
176+CROP,2007-04-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,1.0,2026-08-30T22:20:09.077153+00:00
177+Léger Marketing,2007-03-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:09.077153+00:00
178+Léger Marketing,2007-03-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,ADQ,38.0,2026-08-30T22:20:09.077153+00:00
179+Léger Marketing,2007-03-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,PQ,22.0,2026-08-30T22:20:09.077153+00:00
180+Léger Marketing,2007-03-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,QS,3.0,2026-08-30T22:20:09.077153+00:00
181+Léger Marketing,2007-03-29,,unknown,https://en.wikipedia.org/wiki/2008_Quebec_general_election,AUT,0.0,2026-08-30T22:20:09.077153+00:00
added backend/data/historical/polls_2012.csv +546 −0
@@ -0,0 +1,546 @@
1+pollster,field_end,sample_size,mode,source_url,party,raw_value,accessed_at
2+Forum Research,2012-09-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
3+Forum Research,2012-09-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,36.0,2026-08-30T22:20:08.787474+00:00
4+Forum Research,2012-09-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,25.0,2026-08-30T22:20:08.787474+00:00
5+Forum Research,2012-09-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
6+Forum Research,2012-09-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
7+EKOS,2012-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,23.2,2026-08-30T22:20:08.787474+00:00
8+EKOS,2012-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,36.0,2026-08-30T22:20:08.787474+00:00
9+EKOS,2012-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.5,2026-08-30T22:20:08.787474+00:00
10+EKOS,2012-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.7,2026-08-30T22:20:08.787474+00:00
11+EKOS,2012-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.5,2026-08-30T22:20:08.787474+00:00
12+Léger Marketing,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
13+Léger Marketing,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
14+Léger Marketing,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
15+Léger Marketing,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
16+Léger Marketing,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
17+CROP,2012-08-29,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
18+CROP,2012-08-29,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
19+CROP,2012-08-29,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
20+CROP,2012-08-29,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
21+CROP,2012-08-29,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
22+Forum Research,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
23+Forum Research,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
24+Forum Research,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,27.0,2026-08-30T22:20:08.787474+00:00
25+Forum Research,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
26+Forum Research,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
27+CROP,2012-08-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
28+CROP,2012-08-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
29+CROP,2012-08-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
30+CROP,2012-08-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
31+CROP,2012-08-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
32+Léger Marketing,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
33+Léger Marketing,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
34+Léger Marketing,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
35+Léger Marketing,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
36+Léger Marketing,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
37+Forum Research,2012-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,35.0,2026-08-30T22:20:08.787474+00:00
38+Forum Research,2012-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,29.0,2026-08-30T22:20:08.787474+00:00
39+Forum Research,2012-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
40+Forum Research,2012-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
41+Forum Research,2012-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
42+Léger Marketing,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
43+Léger Marketing,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
44+Léger Marketing,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,27.0,2026-08-30T22:20:08.787474+00:00
45+Léger Marketing,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
46+Léger Marketing,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
47+CROP,2012-08-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
48+CROP,2012-08-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
49+CROP,2012-08-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,25.0,2026-08-30T22:20:08.787474+00:00
50+CROP,2012-08-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
51+CROP,2012-08-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
52+Forum Research,2012-08-13,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
53+Forum Research,2012-08-13,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,35.0,2026-08-30T22:20:08.787474+00:00
54+Forum Research,2012-08-13,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,25.0,2026-08-30T22:20:08.787474+00:00
55+Forum Research,2012-08-13,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
56+Forum Research,2012-08-13,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
57+Léger Marketing,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
58+Léger Marketing,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
59+Léger Marketing,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,27.0,2026-08-30T22:20:08.787474+00:00
60+Léger Marketing,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
61+Léger Marketing,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
62+CROP,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
63+CROP,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
64+CROP,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,21.0,2026-08-30T22:20:08.787474+00:00
65+CROP,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
66+CROP,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
67+Forum Research,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,32.0,2026-08-30T22:20:08.787474+00:00
68+Forum Research,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
69+Forum Research,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
70+Forum Research,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
71+Forum Research,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
72+Forum Research,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,38.0,2026-08-30T22:20:08.787474+00:00
73+Forum Research,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
74+Forum Research,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,14.0,2026-08-30T22:20:08.787474+00:00
75+Forum Research,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,4.0,2026-08-30T22:20:08.787474+00:00
76+Forum Research,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
77+Léger Marketing,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
78+Léger Marketing,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
79+Léger Marketing,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,21.0,2026-08-30T22:20:08.787474+00:00
80+Léger Marketing,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
81+Léger Marketing,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
82+Léger Marketing,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:08.787474+00:00
83+Léger Marketing,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
84+Léger Marketing,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,19.0,2026-08-30T22:20:08.787474+00:00
85+Léger Marketing,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
86+Léger Marketing,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
87+CROP,2012-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
88+CROP,2012-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,30.0,2026-08-30T22:20:08.787474+00:00
89+CROP,2012-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,22.0,2026-08-30T22:20:08.787474+00:00
90+CROP,2012-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
91+CROP,2012-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
92+Léger Marketing,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,32.0,2026-08-30T22:20:08.787474+00:00
93+Léger Marketing,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
94+Léger Marketing,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,21.0,2026-08-30T22:20:08.787474+00:00
95+Léger Marketing,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
96+Léger Marketing,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
97+Forum Research,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:08.787474+00:00
98+Forum Research,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
99+Forum Research,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,18.0,2026-08-30T22:20:08.787474+00:00
100+Forum Research,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
101+Forum Research,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
102+SEGMA,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
103+SEGMA,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,32.0,2026-08-30T22:20:08.787474+00:00
104+SEGMA,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,19.0,2026-08-30T22:20:08.787474+00:00
105+SEGMA,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
106+SEGMA,2012-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
107+Forum Research,2012-05-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,35.0,2026-08-30T22:20:08.787474+00:00
108+Forum Research,2012-05-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
109+Forum Research,2012-05-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,19.0,2026-08-30T22:20:08.787474+00:00
110+Forum Research,2012-05-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
111+Forum Research,2012-05-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
112+CROP,2012-05-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
113+CROP,2012-05-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,25.0,2026-08-30T22:20:08.787474+00:00
114+CROP,2012-05-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
115+CROP,2012-05-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
116+CROP,2012-05-03,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
117+Léger Marketing,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
118+Léger Marketing,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,31.0,2026-08-30T22:20:08.787474+00:00
119+Léger Marketing,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
120+Léger Marketing,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
121+Léger Marketing,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
122+Forum Research,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,35.0,2026-08-30T22:20:08.787474+00:00
123+Forum Research,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,35.0,2026-08-30T22:20:08.787474+00:00
124+Forum Research,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,16.0,2026-08-30T22:20:08.787474+00:00
125+Forum Research,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
126+Forum Research,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
127+CROP,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
128+CROP,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,28.0,2026-08-30T22:20:08.787474+00:00
129+CROP,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,25.0,2026-08-30T22:20:08.787474+00:00
130+CROP,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
131+CROP,2012-04-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
132+Forum Research,2012-04-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:08.787474+00:00
133+Forum Research,2012-04-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
134+Forum Research,2012-04-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,18.0,2026-08-30T22:20:08.787474+00:00
135+Forum Research,2012-04-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
136+Forum Research,2012-04-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
137+Léger Marketing,2012-04-04,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
138+Léger Marketing,2012-04-04,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
139+Léger Marketing,2012-04-04,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,22.0,2026-08-30T22:20:08.787474+00:00
140+Léger Marketing,2012-04-04,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
141+Léger Marketing,2012-04-04,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
142+Forum Research,2012-03-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
143+Forum Research,2012-03-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
144+Forum Research,2012-03-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,19.0,2026-08-30T22:20:08.787474+00:00
145+Forum Research,2012-03-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
146+Forum Research,2012-03-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
147+CROP,2012-03-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
148+CROP,2012-03-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
149+CROP,2012-03-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
150+CROP,2012-03-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,5.0,2026-08-30T22:20:08.787474+00:00
151+CROP,2012-03-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
152+Léger Marketing,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
153+Léger Marketing,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,33.0,2026-08-30T22:20:08.787474+00:00
154+Léger Marketing,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
155+Léger Marketing,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
156+Léger Marketing,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
157+Forum Research,2012-02-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
158+Forum Research,2012-02-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
159+Forum Research,2012-02-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,19.0,2026-08-30T22:20:08.787474+00:00
160+Forum Research,2012-02-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
161+Forum Research,2012-02-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,0.0,2026-08-30T22:20:08.787474+00:00
162+CROP,2012-02-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
163+CROP,2012-02-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,30.0,2026-08-30T22:20:08.787474+00:00
164+CROP,2012-02-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,26.0,2026-08-30T22:20:08.787474+00:00
165+CROP,2012-02-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
166+CROP,2012-02-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
167+Léger Marketing,2012-02-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
168+Léger Marketing,2012-02-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,29.0,2026-08-30T22:20:08.787474+00:00
169+Léger Marketing,2012-02-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
170+Léger Marketing,2012-02-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
171+Léger Marketing,2012-02-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
172+Léger Marketing,2012-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
173+Léger Marketing,2012-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,25.0,2026-08-30T22:20:08.787474+00:00
174+Léger Marketing,2012-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,32.0,2026-08-30T22:20:08.787474+00:00
175+Léger Marketing,2012-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
176+Léger Marketing,2012-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
177+CROP,2012-01-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
178+CROP,2012-01-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,21.0,2026-08-30T22:20:08.787474+00:00
179+CROP,2012-01-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,31.0,2026-08-30T22:20:08.787474+00:00
180+CROP,2012-01-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
181+CROP,2012-01-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
182+Léger Marketing,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
183+Léger Marketing,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,25.0,2026-08-30T22:20:08.787474+00:00
184+Léger Marketing,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,33.0,2026-08-30T22:20:08.787474+00:00
185+Léger Marketing,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
186+Léger Marketing,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
187+CROP,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
188+CROP,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,18.0,2026-08-30T22:20:08.787474+00:00
189+CROP,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,39.0,2026-08-30T22:20:08.787474+00:00
190+CROP,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
191+CROP,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
192+Léger Marketing,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
193+Léger Marketing,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,24.0,2026-08-30T22:20:08.787474+00:00
194+Léger Marketing,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,37.0,2026-08-30T22:20:08.787474+00:00
195+Léger Marketing,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
196+Léger Marketing,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
197+CROP,2011-11-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:08.787474+00:00
198+CROP,2011-11-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,21.0,2026-08-30T22:20:08.787474+00:00
199+CROP,2011-11-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,42.0,2026-08-30T22:20:08.787474+00:00
200+CROP,2011-11-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
201+CROP,2011-11-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
202+Léger Marketing,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
203+Léger Marketing,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,21.0,2026-08-30T22:20:08.787474+00:00
204+Léger Marketing,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,35.0,2026-08-30T22:20:08.787474+00:00
205+Léger Marketing,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
206+Léger Marketing,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
207+Léger Marketing,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
208+Léger Marketing,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,20.0,2026-08-30T22:20:08.787474+00:00
209+Léger Marketing,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,35.0,2026-08-30T22:20:08.787474+00:00
210+Léger Marketing,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
211+Léger Marketing,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
212+CROP,2011-10-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
213+CROP,2011-10-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,25.0,2026-08-30T22:20:08.787474+00:00
214+CROP,2011-10-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,13.0,2026-08-30T22:20:08.787474+00:00
215+CROP,2011-10-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,9.0,2026-08-30T22:20:08.787474+00:00
216+Léger Marketing,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
217+Léger Marketing,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,18.0,2026-08-30T22:20:08.787474+00:00
218+Léger Marketing,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,36.0,2026-08-30T22:20:08.787474+00:00
219+Léger Marketing,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
220+Léger Marketing,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
221+CROP,2011-09-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
222+CROP,2011-09-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,28.0,2026-08-30T22:20:08.787474+00:00
223+CROP,2011-09-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
224+CROP,2011-09-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,9.0,2026-08-30T22:20:08.787474+00:00
225+Léger Marketing,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:08.787474+00:00
226+Léger Marketing,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,17.0,2026-08-30T22:20:08.787474+00:00
227+Léger Marketing,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,34.0,2026-08-30T22:20:08.787474+00:00
228+Léger Marketing,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
229+Léger Marketing,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
230+CROP,2011-08-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:08.787474+00:00
231+CROP,2011-08-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,27.0,2026-08-30T22:20:08.787474+00:00
232+CROP,2011-08-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
233+CROP,2011-08-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,9.0,2026-08-30T22:20:08.787474+00:00
234+Léger Marketing,2011-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:08.787474+00:00
235+Léger Marketing,2011-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,24.0,2026-08-30T22:20:08.787474+00:00
236+Léger Marketing,2011-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,12.0,2026-08-30T22:20:08.787474+00:00
237+Léger Marketing,2011-08-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,11.0,2026-08-30T22:20:08.787474+00:00
238+CROP,2011-06-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,35.0,2026-08-30T22:20:08.787474+00:00
239+CROP,2011-06-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,29.0,2026-08-30T22:20:08.787474+00:00
240+CROP,2011-06-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
241+CROP,2011-06-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
242+Léger Marketing,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
243+Léger Marketing,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,30.0,2026-08-30T22:20:08.787474+00:00
244+Léger Marketing,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
245+Léger Marketing,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,6.0,2026-08-30T22:20:08.787474+00:00
246+CROP,2011-06-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
247+CROP,2011-06-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,26.0,2026-08-30T22:20:08.787474+00:00
248+CROP,2011-06-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,17.0,2026-08-30T22:20:08.787474+00:00
249+CROP,2011-06-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
250+CROP,2011-05-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:08.787474+00:00
251+CROP,2011-05-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
252+CROP,2011-05-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,12.0,2026-08-30T22:20:08.787474+00:00
253+CROP,2011-05-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
254+Léger Marketing,2011-05-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
255+Léger Marketing,2011-05-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
256+Léger Marketing,2011-05-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
257+Léger Marketing,2011-05-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
258+Léger Marketing,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
259+Léger Marketing,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
260+Léger Marketing,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
261+Léger Marketing,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
262+Léger Marketing,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
263+Léger Marketing,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,37.0,2026-08-30T22:20:08.787474+00:00
264+Léger Marketing,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
265+Léger Marketing,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
266+Léger Marketing,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
267+Léger Marketing,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,34.0,2026-08-30T22:20:08.787474+00:00
268+Léger Marketing,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
269+Léger Marketing,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
270+CROP,2010-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
271+CROP,2010-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
272+CROP,2010-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
273+CROP,2010-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,20.0,2026-08-30T22:20:08.787474+00:00
274+Angus Reid Public Opinion,2010-09-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
275+Angus Reid Public Opinion,2010-09-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
276+Angus Reid Public Opinion,2010-09-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
277+Angus Reid Public Opinion,2010-09-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
278+Léger Marketing,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,32.0,2026-08-30T22:20:08.787474+00:00
279+Léger Marketing,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
280+Léger Marketing,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
281+Léger Marketing,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
282+Léger Marketing,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
283+Léger Marketing,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
284+Léger Marketing,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
285+Léger Marketing,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
286+Angus Reid Public Opinion,2010-08-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
287+Angus Reid Public Opinion,2010-08-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
288+Angus Reid Public Opinion,2010-08-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
289+Angus Reid Public Opinion,2010-08-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
290+Léger Marketing,2010-06-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
291+Léger Marketing,2010-06-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
292+Léger Marketing,2010-06-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
293+Léger Marketing,2010-06-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
294+Léger Marketing,2010-05-06,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
295+Léger Marketing,2010-05-06,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
296+Léger Marketing,2010-05-06,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
297+Léger Marketing,2010-05-06,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
298+Angus Reid Public Opinion,2010-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:08.787474+00:00
299+Angus Reid Public Opinion,2010-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
300+Angus Reid Public Opinion,2010-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
301+Angus Reid Public Opinion,2010-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
302+Léger Marketing,2010-04-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
303+Léger Marketing,2010-04-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
304+Léger Marketing,2010-04-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
305+Léger Marketing,2010-04-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
306+Léger Marketing,2010-03-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,32.0,2026-08-30T22:20:08.787474+00:00
307+Léger Marketing,2010-03-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
308+Léger Marketing,2010-03-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
309+Léger Marketing,2010-03-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,20.0,2026-08-30T22:20:08.787474+00:00
310+Léger Marketing,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:08.787474+00:00
311+Léger Marketing,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
312+Léger Marketing,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
313+Léger Marketing,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,17.0,2026-08-30T22:20:08.787474+00:00
314+CROP,2010-01-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,40.0,2026-08-30T22:20:08.787474+00:00
315+CROP,2010-01-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
316+CROP,2010-01-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
317+CROP,2010-01-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
318+Léger Marketing,2010-01-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,39.0,2026-08-30T22:20:08.787474+00:00
319+Léger Marketing,2010-01-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
320+Léger Marketing,2010-01-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
321+Léger Marketing,2010-01-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,13.0,2026-08-30T22:20:08.787474+00:00
322+Léger Marketing,2009-11-30,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:08.787474+00:00
323+Léger Marketing,2009-11-30,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
324+Léger Marketing,2009-11-30,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
325+Léger Marketing,2009-11-30,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,15.0,2026-08-30T22:20:08.787474+00:00
326+CROP,2009-10-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,39.0,2026-08-30T22:20:08.787474+00:00
327+CROP,2009-10-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
328+CROP,2009-10-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
329+CROP,2009-10-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,15.0,2026-08-30T22:20:08.787474+00:00
330+Léger Marketing,2009-09-09,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,41.0,2026-08-30T22:20:08.787474+00:00
331+Léger Marketing,2009-09-09,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,37.0,2026-08-30T22:20:08.787474+00:00
332+Léger Marketing,2009-09-09,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
333+Léger Marketing,2009-09-09,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
334+Environics,2009-06-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,45.0,2026-08-30T22:20:08.787474+00:00
335+Environics,2009-06-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
336+Environics,2009-06-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,4.0,2026-08-30T22:20:08.787474+00:00
337+Environics,2009-06-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,13.0,2026-08-30T22:20:08.787474+00:00
338+Léger Marketing,2009-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,40.0,2026-08-30T22:20:08.787474+00:00
339+Léger Marketing,2009-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
340+Léger Marketing,2009-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,5.0,2026-08-30T22:20:08.787474+00:00
341+Léger Marketing,2009-05-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,1.0,2026-08-30T22:20:08.787474+00:00
342+Environics,2009-04-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:08.787474+00:00
343+Environics,2009-04-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,50.0,2026-08-30T22:20:08.787474+00:00
344+Environics,2009-04-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,2.0,2026-08-30T22:20:08.787474+00:00
345+Environics,2009-04-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
346+Environics,2008-12-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,36.0,2026-08-30T22:20:08.787474+00:00
347+Environics,2008-12-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
348+Environics,2008-12-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
349+Environics,2008-12-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
350+Léger,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
351+Léger,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:08.787474+00:00
352+Léger,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,31.0,2026-08-30T22:20:08.787474+00:00
353+Léger,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
354+Léger,2012-08-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,6.0,2026-08-30T22:20:08.787474+00:00
355+Forum,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,35.0,2026-08-30T22:20:08.787474+00:00
356+Forum,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
357+Forum,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
358+Forum,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
359+Forum,2012-08-28,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
360+Léger,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
361+Léger,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:08.787474+00:00
362+Léger,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,31.0,2026-08-30T22:20:08.787474+00:00
363+Léger,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
364+Léger,2012-08-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
365+Léger,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
366+Léger,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,19.0,2026-08-30T22:20:08.787474+00:00
367+Léger,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,29.0,2026-08-30T22:20:08.787474+00:00
368+Léger,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
369+Léger,2012-08-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
370+Léger,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
371+Léger,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,18.0,2026-08-30T22:20:08.787474+00:00
372+Léger,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,31.0,2026-08-30T22:20:08.787474+00:00
373+Léger,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
374+Léger,2012-08-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
375+Forum,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
376+Forum,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,26.0,2026-08-30T22:20:08.787474+00:00
377+Forum,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,27.0,2026-08-30T22:20:08.787474+00:00
378+Forum,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
379+Forum,2012-08-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,2.0,2026-08-30T22:20:08.787474+00:00
380+Forum,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,43.0,2026-08-30T22:20:08.787474+00:00
381+Forum,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,32.0,2026-08-30T22:20:08.787474+00:00
382+Forum,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,16.0,2026-08-30T22:20:08.787474+00:00
383+Forum,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,5.0,2026-08-30T22:20:08.787474+00:00
384+Forum,2012-08-01,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,3.0,2026-08-30T22:20:08.787474+00:00
385+Léger,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
386+Léger,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:08.787474+00:00
387+Léger,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
388+Léger,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
389+Léger,2012-07-31,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
390+CROP,2012-07-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,36.0,2026-08-30T22:20:08.787474+00:00
391+CROP,2012-07-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
392+CROP,2012-07-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,28.0,2026-08-30T22:20:08.787474+00:00
393+CROP,2012-07-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
394+Léger,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,38.0,2026-08-30T22:20:08.787474+00:00
395+Léger,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
396+Léger,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,20.0,2026-08-30T22:20:08.787474+00:00
397+Léger,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
398+Léger,2012-06-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
399+Léger,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
400+Léger,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:08.787474+00:00
401+Léger,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,24.0,2026-08-30T22:20:08.787474+00:00
402+Léger,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
403+Léger,2012-05-21,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
404+Léger,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,37.0,2026-08-30T22:20:08.787474+00:00
405+Léger,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,22.0,2026-08-30T22:20:08.787474+00:00
406+Léger,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,26.0,2026-08-30T22:20:08.787474+00:00
407+Léger,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
408+Léger,2012-05-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,6.0,2026-08-30T22:20:08.787474+00:00
409+Forum,2012-04-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
410+Forum,2012-04-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
411+Forum,2012-04-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,18.0,2026-08-30T22:20:08.787474+00:00
412+Forum,2012-04-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
413+Forum,2012-04-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,5.0,2026-08-30T22:20:08.787474+00:00
414+Léger,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
415+Léger,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,20.0,2026-08-30T22:20:08.787474+00:00
416+Léger,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,26.0,2026-08-30T22:20:08.787474+00:00
417+Léger,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
418+Léger,2012-03-07,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,7.0,2026-08-30T22:20:08.787474+00:00
419+Léger,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,31.0,2026-08-30T22:20:08.787474+00:00
420+Léger,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,17.0,2026-08-30T22:20:08.787474+00:00
421+Léger,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,38.0,2026-08-30T22:20:08.787474+00:00
422+Léger,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
423+Léger,2012-01-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
424+Léger,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,28.0,2026-08-30T22:20:08.787474+00:00
425+Léger,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,16.0,2026-08-30T22:20:08.787474+00:00
426+Léger,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,42.0,2026-08-30T22:20:08.787474+00:00
427+Léger,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
428+Léger,2011-12-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,4.0,2026-08-30T22:20:08.787474+00:00
429+Léger,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,24.0,2026-08-30T22:20:08.787474+00:00
430+Léger,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,14.0,2026-08-30T22:20:08.787474+00:00
431+Léger,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,40.0,2026-08-30T22:20:08.787474+00:00
432+Léger,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
433+Léger,2011-11-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,12.0,2026-08-30T22:20:08.787474+00:00
434+Léger,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,22.0,2026-08-30T22:20:08.787474+00:00
435+Léger,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,15.0,2026-08-30T22:20:08.787474+00:00
436+Léger,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,CAQ,40.0,2026-08-30T22:20:08.787474+00:00
437+Léger,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
438+Léger,2011-10-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
439+Léger,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,30.0,2026-08-30T22:20:08.787474+00:00
440+Léger,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,19.0,2026-08-30T22:20:08.787474+00:00
441+Léger,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
442+Léger,2011-10-12,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,44.0,2026-08-30T22:20:08.787474+00:00
443+Léger,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,30.0,2026-08-30T22:20:08.787474+00:00
444+Léger,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:08.787474+00:00
445+Léger,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
446+Léger,2011-09-15,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,35.0,2026-08-30T22:20:08.787474+00:00
447+Léger,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,37.0,2026-08-30T22:20:08.787474+00:00
448+Léger,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,21.0,2026-08-30T22:20:08.787474+00:00
449+Léger,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,13.0,2026-08-30T22:20:08.787474+00:00
450+Léger,2011-06-08,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,29.0,2026-08-30T22:20:08.787474+00:00
451+CROP,2011-04-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
452+CROP,2011-04-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,20.0,2026-08-30T22:20:08.787474+00:00
453+CROP,2011-04-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,13.0,2026-08-30T22:20:08.787474+00:00
454+CROP,2011-04-20,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,20.0,2026-08-30T22:20:08.787474+00:00
455+Léger,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,46.0,2026-08-30T22:20:08.787474+00:00
456+Léger,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,20.0,2026-08-30T22:20:08.787474+00:00
457+Léger,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
458+Léger,2011-04-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,23.0,2026-08-30T22:20:08.787474+00:00
459+Léger,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,42.0,2026-08-30T22:20:08.787474+00:00
460+Léger,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,20.0,2026-08-30T22:20:08.787474+00:00
461+Léger,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,13.0,2026-08-30T22:20:08.787474+00:00
462+Léger,2011-03-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,25.0,2026-08-30T22:20:08.787474+00:00
463+Léger,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,40.0,2026-08-30T22:20:08.787474+00:00
464+Léger,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,20.0,2026-08-30T22:20:08.787474+00:00
465+Léger,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,11.0,2026-08-30T22:20:08.787474+00:00
466+Léger,2011-02-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,29.0,2026-08-30T22:20:08.787474+00:00
467+CROP,2010-11-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,45.0,2026-08-30T22:20:08.787474+00:00
468+CROP,2010-11-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,17.0,2026-08-30T22:20:08.787474+00:00
469+CROP,2010-11-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,14.0,2026-08-30T22:20:08.787474+00:00
470+CROP,2010-11-22,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,6.0,2026-08-30T22:20:08.787474+00:00
471+Léger,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
472+Léger,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,24.0,2026-08-30T22:20:08.787474+00:00
473+Léger,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,12.0,2026-08-30T22:20:08.787474+00:00
474+Léger,2010-09-16,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,17.0,2026-08-30T22:20:08.787474+00:00
475+Léger,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,51.0,2026-08-30T22:20:08.787474+00:00
476+Léger,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,21.0,2026-08-30T22:20:08.787474+00:00
477+Léger,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
478+Léger,2010-08-19,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,18.0,2026-08-30T22:20:08.787474+00:00
479+Léger,2010-06-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,49.0,2026-08-30T22:20:08.787474+00:00
480+Léger,2010-06-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,23.0,2026-08-30T22:20:08.787474+00:00
481+Léger,2010-06-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
482+Léger,2010-06-10,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,20.0,2026-08-30T22:20:08.787474+00:00
483+Léger,2010-03-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,45.0,2026-08-30T22:20:08.787474+00:00
484+Léger,2010-03-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,25.0,2026-08-30T22:20:08.787474+00:00
485+Léger,2010-03-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,10.0,2026-08-30T22:20:08.787474+00:00
486+Léger,2010-03-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,19.0,2026-08-30T22:20:08.787474+00:00
487+Léger,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
488+Léger,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
489+Léger,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
490+Léger,2010-02-11,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
491+Léger,2010-01-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,50.0,2026-08-30T22:20:08.787474+00:00
492+Léger,2010-01-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,30.0,2026-08-30T22:20:08.787474+00:00
493+Léger,2010-01-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
494+Léger,2010-01-14,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,12.0,2026-08-30T22:20:08.787474+00:00
495+Léger,2009-11-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,47.0,2026-08-30T22:20:08.787474+00:00
496+Léger,2009-11-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
497+Léger,2009-11-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
498+Léger,2009-11-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
499+CROP,2009-10-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,46.0,2026-08-30T22:20:08.787474+00:00
500+CROP,2009-10-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:08.787474+00:00
501+CROP,2009-10-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
502+CROP,2009-10-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
503+CROP,2009-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,41.0,2026-08-30T22:20:08.787474+00:00
504+CROP,2009-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:08.787474+00:00
505+CROP,2009-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
506+CROP,2009-09-27,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,15.0,2026-08-30T22:20:08.787474+00:00
507+Léger,2009-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,45.0,2026-08-30T22:20:08.787474+00:00
508+Léger,2009-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:08.787474+00:00
509+Léger,2009-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
510+Léger,2009-09-02,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
511+CROP,2009-08-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
512+CROP,2009-08-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,37.0,2026-08-30T22:20:08.787474+00:00
513+CROP,2009-08-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,9.0,2026-08-30T22:20:08.787474+00:00
514+CROP,2009-08-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,15.0,2026-08-30T22:20:08.787474+00:00
515+CROP,2009-06-18,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,43.0,2026-08-30T22:20:08.787474+00:00
516+CROP,2009-06-18,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,33.0,2026-08-30T22:20:08.787474+00:00
517+CROP,2009-06-18,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,7.0,2026-08-30T22:20:08.787474+00:00
518+CROP,2009-06-18,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,17.0,2026-08-30T22:20:08.787474+00:00
519+CROP,2009-05-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,45.0,2026-08-30T22:20:08.787474+00:00
520+CROP,2009-05-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,29.0,2026-08-30T22:20:08.787474+00:00
521+CROP,2009-05-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
522+CROP,2009-05-24,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,17.0,2026-08-30T22:20:08.787474+00:00
523+Léger,2009-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
524+Léger,2009-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
525+Léger,2009-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
526+Léger,2009-05-17,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,14.0,2026-08-30T22:20:08.787474+00:00
527+CROP,2009-04-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,46.0,2026-08-30T22:20:08.787474+00:00
528+CROP,2009-04-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
529+CROP,2009-04-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
530+CROP,2009-04-26,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
531+CROP,2009-03-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
532+CROP,2009-03-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,27.0,2026-08-30T22:20:08.787474+00:00
533+CROP,2009-03-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
534+CROP,2009-03-23,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,17.0,2026-08-30T22:20:08.787474+00:00
535+Léger,2009-03-05,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,48.0,2026-08-30T22:20:08.787474+00:00
536+Léger,2009-03-05,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,31.0,2026-08-30T22:20:08.787474+00:00
537+Léger,2009-03-05,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,6.0,2026-08-30T22:20:08.787474+00:00
538+Léger,2009-03-05,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
539+Léger,2009-02-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,50.0,2026-08-30T22:20:08.787474+00:00
540+Léger,2009-02-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,28.0,2026-08-30T22:20:08.787474+00:00
541+Léger,2009-02-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,5.0,2026-08-30T22:20:08.787474+00:00
542+Léger,2009-02-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,16.0,2026-08-30T22:20:08.787474+00:00
543+CROP,2009-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PQ,39.0,2026-08-30T22:20:08.787474+00:00
544+CROP,2009-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,PLQ,34.0,2026-08-30T22:20:08.787474+00:00
545+CROP,2009-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,QS,8.0,2026-08-30T22:20:08.787474+00:00
546+CROP,2009-01-25,,unknown,https://en.wikipedia.org/wiki/2012_Quebec_general_election,AUT,20.0,2026-08-30T22:20:08.787474+00:00
added backend/data/historical/polls_2014.csv +299 −0
Large diff (299 lines) is not loaded by default to keep the page fast.Load diff
added backend/data/historical/polls_2018.csv +531 −0
Large diff (531 lines) is not loaded by default to keep the page fast.Load diff
added backend/data/historical/polls_2022.csv +602 −0
Large diff (602 lines) is not loaded by default to keep the page fast.Load diff
modified backend/tests/test_beyond.py +55 −0
Large diff (59 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme