-
Notifications
You must be signed in to change notification settings - Fork 56
Party Performance Across Election Cycles - Longitudinal Analysis (2002-2026) #8209
Description
🎯 Objective
Create longitudinal views tracking party performance metrics across all election cycles (2002-2026), enabling cross-cycle comparative analysis of party effectiveness, coalition dynamics, and electoral trends.
📋 Background
Political parties evolve significantly across election cycles - coalition alignments shift, leadership changes, policy positions adapt. The platform needs systematic views to track these longitudinal patterns, supporting predictive models for party trajectories and coalition formations.
📊 Current State (Measured Metrics)
- Existing Party Views: 13 party-related views (performance, momentum, coalitions)
- Temporal Coverage: Mostly annual or recent data
- Cross-Cycle Analysis: ❌ MISSING - No systematic party evolution tracking across 24 years
- Coalition History: Limited to 5-year alignment matrix (view_riksdagen_coalition_alignment_matrix)
- Gap: Cannot analyze party transformations like "S" performance 2002 vs 2022
✅ Acceptance Criteria
- Create
view_riksdagen_party_longitudinal_performancetracking 7 metrics per cycle - Create
view_riksdagen_party_coalition_evolutionshowing alliance shifts across cycles - Create
view_riksdagen_party_electoral_trendswith seat count, vote share evolution - Support queries comparing party performance across specific election cycles
- Calculate trend indicators: ascending, stable, descending party trajectories
- Integration with Comparative Analysis Framework (Framework 2)
🛠️ Implementation Guidance
Files to Create:
service.data.impl/src/main/resources/db/migration/party-longitudinal-views.xmlservice.data.impl/sample-data/framework-validation/comparative/test_2_4_party_longitudinal.csv
View Structure Example:
CREATE OR REPLACE VIEW view_riksdagen_party_longitudinal_performance AS
WITH election_cycles AS (
SELECT
party,
CASE
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2002 AND 2005 THEN 2002
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2006 AND 2009 THEN 2006
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2010 AND 2013 THEN 2010
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2014 AND 2017 THEN 2014
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2018 AND 2021 THEN 2018
WHEN EXTRACT(YEAR FROM ballot_date) BETWEEN 2022 AND 2025 THEN 2022
ELSE 2026
END AS election_year,
COUNT(DISTINCT ballot_id) AS total_ballots,
COUNT(DISTINCT person_id) AS active_members,
AVG(CASE WHEN vote = 'Ja' AND won THEN 1 ELSE 0 END) * 100 AS win_rate,
AVG(CASE WHEN vote = party_vote THEN 1 ELSE 0 END) * 100 AS party_discipline,
COUNT(DISTINCT document_id) AS documents_authored,
AVG(rebel_rate) AS avg_rebel_rate,
SUM(leadership_positions) AS leadership_count
FROM vote_data vd
JOIN person_data pd ON vd.person_id = pd.person_id
LEFT JOIN document_data dd ON pd.person_id = dd.person_id
GROUP BY party, election_year
),
trend_analysis AS (
SELECT
party, election_year,
total_ballots, active_members, win_rate, party_discipline,
LAG(win_rate) OVER (PARTITION BY party ORDER BY election_year) AS prev_win_rate,
LAG(active_members) OVER (PARTITION BY party ORDER BY election_year) AS prev_members,
LEAD(win_rate) OVER (PARTITION BY party ORDER BY election_year) AS next_win_rate
FROM election_cycles
)
SELECT
party, election_year,
total_ballots, active_members, win_rate, party_discipline,
win_rate - prev_win_rate AS win_rate_change,
active_members - prev_members AS membership_change,
CASE
WHEN win_rate > prev_win_rate AND next_win_rate > win_rate THEN 'ASCENDING'
WHEN win_rate < prev_win_rate AND next_win_rate < win_rate THEN 'DESCENDING'
ELSE 'STABLE'
END AS trajectory
FROM trend_analysis
ORDER BY party, election_year;Coalition Evolution Tracking:
CREATE OR REPLACE VIEW view_riksdagen_party_coalition_evolution AS
SELECT
p1.party AS party_1,
p2.party AS party_2,
election_year,
AVG(alignment_rate) AS avg_alignment,
COUNT(*) AS joint_votes,
CASE
WHEN AVG(alignment_rate) > 70 THEN 'STRONG_COALITION'
WHEN AVG(alignment_rate) > 50 THEN 'MODERATE_COALITION'
ELSE 'OPPOSITION'
END AS coalition_strength
FROM view_riksdagen_vote_data_ballot_party_summary_annual p1
JOIN view_riksdagen_vote_data_ballot_party_summary_annual p2
ON p1.ballot_id = p2.ballot_id AND p1.party < p2.party
GROUP BY p1.party, p2.party, election_year
ORDER BY party_1, party_2, election_year;📚 Related Documentation
🤖 Recommended Agent
Agent: @hack23-test-specialist
Rationale: Requires comprehensive longitudinal data validation across 7 election cycles with complex trend calculations and coalition mapping.
For implementation, the Test Specialist will:
- Design party evolution tracking with proper cycle boundaries
- Create validation test cases for known party transformations (e.g., S declining 2002-2014, then recovering)
- Implement coalition evolution tracking with historical accuracy validation
- Ensure query performance for 8 major parties × 7 cycles analysis
- Document party trajectory classification methodology
📊 Intelligence Value
⭐⭐⭐⭐⭐ VERY HIGH - Essential for understanding Swedish party system evolution, predicting future coalitions, and analyzing democratic stability.
🔗 Dependencies
- Depends on Historical Election Cycle Trend Views: Swedish Parliament Context, Meta-View Only, and Explicit All-Framework Analytical Trend Specs #8208 (Election Cycle Views) for election_year dimension
- Integrates with existing party performance views