politics / app.py
skanderovitch's picture
Update app.py
ac1c090 verified
import streamlit as st
import itertools
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
import numpy as np
from collections import defaultdict
# text = """Economy
# Labour Party: Aim to deliver economic stability through growth and tough spending rules? (The Speaker)?.
# Conservative Party: Focus on economic growth by reducing debt and creating jobs? (theweek)?? (The Speaker)?.
# Liberal Democrats: Promote a fair and innovative economy with opportunities for all? (The Speaker)?.
# Scottish National Party (SNP): Advocate for full tax devolution to boost the Scottish economy? (theweek)?.
# Green Party: Invest in a green economic transformation to create sustainable jobs? (The Speaker)?.
# Reform UK: Aim to stimulate growth by reducing taxes and government spending? (theweek)?? (The Speaker)?.
# Taxation
# Labour Party: Propose to raise funds by taxing private schools, clamping down on tax underpayment, and a windfall tax on oil and gas companies? (theweek)?.
# Conservative Party: Plan to cut National Insurance and maintain lower personal taxes? (theweek)?.
# Liberal Democrats: Advocate for fair taxation and investments in public services? (The Speaker)?.
# Scottish National Party (SNP): Support windfall taxes on businesses and full tax power devolution? (theweek)?.
# Green Party: Propose new taxes on assets worth over £10 million and carbon tax? (The Speaker)?.
# Reform UK: Plan to raise the income tax threshold, scrap inheritance tax on smaller estates, and cut VAT on energy bills? (theweek)?? (The Speaker)?.
# Debt
# Labour Party: Aim to keep national debt under control through economic growth? (The Speaker)?.
# Conservative Party: Focus on reducing national debt as a key priority? (The Speaker)?.
# Liberal Democrats: Promote a sustainable approach to managing national debt? (The Speaker)?.
# Scottish National Party (SNP): Push for additional funding and economic autonomy to manage debt better? (theweek)?.
# Green Party: Invest heavily in green initiatives while aiming to manage debt sustainably? (The Speaker)?.
# Reform UK: Plan to reduce government spending to manage and reduce debt? (theweek)?.
# Inflation
# Labour Party: Aim to keep inflation low through economic stability measures? (The Speaker)?.
# Conservative Party: Prioritize halving inflation as a main economic goal? (The Speaker)?.
# Liberal Democrats: Focus on maintaining low inflation through fair economic policies? (The Speaker)?.
# Scottish National Party (SNP): Call for more funding to address inflationary pressures? (theweek)?.
# Green Party: Promote economic policies that balance environmental investment with controlling inflation? (The Speaker)?.
# Reform UK: Aim to lower inflation by cutting taxes and reducing energy costs? (theweek)?.
# Healthcare
# Labour Party: Plan to reduce NHS waiting times and invest in health infrastructure? (The Speaker)?.
# Conservative Party: Focus on cutting NHS waiting lists and improving healthcare services? (The Speaker)?.
# Liberal Democrats: Promise to improve access to GPs and emergency dental care? (theweek)?? (The Speaker)?.
# Scottish National Party (SNP): Demand increased NHS funding and better healthcare services? (theweek)?.
# Green Party: Propose major NHS investment and immediate pay rises for NHS staff? (The Speaker)?.
# Reform UK: Aim to achieve zero waiting lists and exempt healthcare workers from basic income tax? (theweek)?.
# Energy
# Labour Party: Establish Great British Energy, a new publicly-owned clean power company? (The Speaker)?.
# Conservative Party: Continue investing in energy security and diversification? (theweek)?.
# Liberal Democrats: Invest in renewable energy to generate 80% of electricity from renewables by the next decade? (The Speaker)?.
# Scottish National Party (SNP): Support re-entry into the EU single market to boost energy trade? (theweek)?.
# Green Party: Push for a green energy transformation, nationalizing major energy companies? (The Speaker)?.
# Reform UK: Increase drilling for gas and oil, scrapping net-zero plans to lower energy bills? (theweek)?.
# Environment
# Labour Party: Aim to make Britain a clean energy superpower? (The Speaker)?.
# Conservative Party: Continue current environmental policies with a focus on balanced growth? (theweek)?.
# Liberal Democrats: Promote a flourishing environment with fair access to nature? (The Speaker)?.
# Scottish National Party (SNP): Advocate for stronger environmental protections and policies? (theweek)?.
# Green Party: Focus on extensive environmental legislation and investment in green infrastructure? (The Speaker)?.
# Reform UK: Oppose current green policies and focus on traditional energy sources? (theweek)?.
# Security
# Labour Party: Strengthen border security and crack down on antisocial behavior? (The Speaker)?.
# Conservative Party: Implement mandatory national service and continue the Rwanda immigration scheme? (The Speaker)?.
# Liberal Democrats: Ensure fair access to security and justice for all? (The Speaker)?.
# Scottish National Party (SNP): Focus on unifying Scotland's security policies and practices? (The Speaker)?.
# Green Party: Promote community-based security measures and social justice? (The Speaker)?.
# Reform UK: Establish a new department for immigration and enhance border security? (theweek)?.
# Education
# Labour Party: Recruit 6,500 new teachers and improve educational infrastructure? (The Speaker)?.
# Conservative Party: Replace A-Levels with a new ‘Advanced British Standard’ and ensure continuous math education until age 18? (theweek)?? (The Speaker)?.
# Liberal Democrats: Increase school and college funding per pupil above the rate of inflation and lower the voting age to 16? (theweek)?? (The Speaker)?.
# Scottish National Party (SNP): Focus on improving access to quality education and advocating for full devolution of educational powers? (theweek)?.
# Green Party: Support comprehensive educational reforms including increased funding and nationalizing education services? (The Speaker)?.
# Reform UK: Reform educational standards, introduce patriotic curriculum, and eliminate "woke" ideologies from schools? (theweek)?? (The Speaker)?.
# Pensions
# Labour Party: No specific changes to pensions mentioned in the available manifestos? (The Speaker)?.
# Conservative Party: Maintain the triple lock system for pensions, ensuring they rise with inflation, wage growth, or 2.5%, whichever is highest? (theweek)?? (The Speaker)?.
# Liberal Democrats: No specific changes to pensions mentioned in the available manifestos? (The Speaker)?.
# Scottish National Party (SNP): Demand full devolution of pension powers to Scotland? (theweek)?.
# Green Party: No specific changes to pensions mentioned in the available manifestos? (The Speaker)?.
# Reform UK: No specific changes to pensions mentioned in the available manifestos? (theweek)?.
# Housing
# Labour Party: Commit to building more affordable housing and upgrading existing homes? (The Speaker)?.
# Conservative Party: Build 1.6 million new homes and support first-time buyers with government-backed mortgages? (theweek)?? (The Speaker)?.
# Liberal Democrats: Build 380,000 new homes annually, including 150,000 social housing units? (theweek)?? (The Speaker)?.
# Scottish National Party (SNP): Focus on increasing spending to provide more social housing in Scotland? (theweek)?.
# Green Party: Provide 150,000 new social homes every year and improve home insulation? (The Speaker)?.
# Reform UK: No specific housing policies mentioned in the available manifestos? (theweek)?? (The Speaker)?.
# Immigration
# Labour Party: Strengthen border security and crack down on illegal immigration? (The Speaker)?.
# Conservative Party: Continue with the Rwanda immigration scheme and introduce mandatory national service? (theweek)?? (The Speaker)?.
# Liberal Democrats: Provide safe and legal routes for asylum seekers and reform the immigration system to be merit-based? (theweek)?? (The Speaker)?.
# Scottish National Party (SNP): Advocate for humane immigration policies and support rejoining the EU single market? (theweek)?.
# Green Party: Support fair immigration policies and provide better support for asylum seekers? (The Speaker)?.
# Reform UK: Implement a four-point plan to curb illegal immigration and leave the European Convention on Human Rights? (theweek)?? (The Speaker)?."""
# data = []
# for line in text.split('\n'):
# new_theme = line.strip().split()
# if len(new_theme) == 1:
# theme = new_theme[0]
# continue
# party, position = line.strip().split(': ')
# position = position.split('?')[0]
# data.append([theme,party,position])
# data = pd.DataFrame(data,columns='theme party position'.split()).set_index(['theme','party'])['position'].unstack()
# data.to_parquet('./data.parquet')
data = pd.read_parquet('./data.parquet')
# # Load a pre-trained model
# model = SentenceTransformer('all-MiniLM-L6-v2')
# # Define your sentences
# sentences = data.stack().to_list()
# # Generate embeddings
# embeddings = model.encode(sentences)
# embeddings = pd.DataFrame([[embedding] for embedding in embeddings],index=data.stack().index,columns=['embedding'])['embedding'].unstack()
# embeddings.to_parquet('./embeddings.parquet')
embeddings = pd.read_parquet('./embeddings.parquet')
# similarities = []
# for theme in embeddings.index:
# print(theme)
# for p1,p2 in itertools.combinations(embeddings.columns,2):
# similarity = cosine_similarity([embeddings.loc[theme,p1]], [embeddings.loc[theme,p2]])[0][0]
# similarities.append([theme,p1,p2,similarity])
# similarities.append([theme,p2,p1,similarity])
# similarities = pd.DataFrame(similarities,columns = 'theme party1 party2 similarity'.split()).set_index('theme party1 party2'.split())['similarity'].reset_index()
# similarities.to_parquet('./similarities.parquet')
# similarities = pd.read_parquet('./similarities.parquet')
# similarities.loc[('Debt',slice(None),slice(None))].reset_index()
st.title("Do you know your political parties?")
st.write(' - We gathered the political parties manisfestos from ChatGPT')
st.write(' - Create an embedding of their pledge on different matters')
st.write(' - Visualise how different they truly are on a PCA projection')
st.write('Soon extended to US parties/candidates, to make it more general')
st.divider()
parties = st.multiselect(
"Which parties do you want to compare?",
list(data.columns),
list(np.random.choice(data.columns,4,replace=False)))
themes = st.multiselect(
"Which themes matter to you?",
list(data.index),
list(np.random.choice(data.index,4,replace=False)))
subset = embeddings.loc[themes,parties]
X = np.array([array for array in subset.T.apply(lambda l: np.concatenate(l).ravel(), axis=1)])
from sklearn.manifold import Isomap
from sklearn.decomposition import PCA
model = PCA(n_components=2)
projection = model.fit_transform(X)
import plotly.express as px
projection = pd.DataFrame(projection,columns=['x','y'])
projection['party'] = parties
projection['color'] = parties
ps = []
pss = dict()
for party,pledges in data.loc[themes,parties].items():
# st.subheader()
pss[f'{party} pledges :'] = []
m = f'{party} pledges :'
for theme, t in pledges.items():
if not t.startswith('No specific'):
m += f'<br> - {theme}: {t}'
# st.write(f' - {theme}: {t}')
pss[f'{party} pledges :'].append(f' - {theme}: {t}')
ps.append(m)
projection['manifesto'] = ps
fig = px.scatter(projection,x='x', y='y', text='party', color='party', hover_data=["manifesto"])
fig.update_traces(marker=dict(size=30,
line=dict(width=5,
color='DarkSlateGrey')),
selector=dict(mode='markers')
)
fig.update_layout(legend=dict(
orientation="h",
yanchor="bottom",
y=1.02,
xanchor="right",
x=1
))
fig.update_xaxes(visible=False, showticklabels=False)
fig.update_yaxes(visible=False, showticklabels=False)
st.divider()
st.subheader('This is how similar the parties are, based on your interests')
st.plotly_chart(fig, config={'displayModeBar': False})
st.divider()
for t,ts in pss.items():
st.subheader(t)
for l in ts:
st.write(l)