1+ import streamlit as st
2+ import pandas as pd
3+ import matplotlib .pyplot as plt
4+ import seaborn as sns
5+ import geopandas as gpd
6+ import plotly .express as px
7+
8+ energy_columns = ['renewables_electricity' , 'coal_electricity' , 'gas_electricity' , 'oil_electricity' , 'nuclear_electricity' , 'wind_electricity' , 'solar_electricity' , "hydro_electricity" ]
9+ # Load and prepare data
10+ @st .cache_data
11+ def load_data ():
12+ url = "https://raw.githubusercontent.com/owid/energy-data/master/owid-energy-data.csv"
13+ df = pd .read_csv (url )
14+ df ['year' ] = pd .to_datetime (df ['year' ], format = '%Y' )
15+ df .rename (columns = {
16+ "renewables_electricity" : "Renewables" ,
17+ "hydro_electricity" : "Hydro" ,
18+ "solar_electricity" : "Solar" ,
19+ "wind_electricity" : "Wind" ,
20+ "coal_electricity" : 'Coal' ,
21+ 'gas_electricity' : "Gas" ,
22+ 'oil_electricity' : "Oil" ,
23+ 'nuclear_electricity' : "Nuclear"
24+ }, inplace = True )
25+
26+ df .drop (columns = [])
27+
28+ return df .sort_values ('year' )
29+
30+ df = load_data ()
31+
32+
33+ # Streamlit app
34+ st .title ('Global Energy Production Analysis' )
35+ # st.write(df.columns)
36+ # st.write([col.split("_")[0].capitalize() for col in energy_columns])
37+ # Sidebar for user input
38+ st .sidebar .header ('Filter Data' )
39+ start_year = st .sidebar .slider ('Start Year' , 1900 , 2023 , 1980 )
40+ end_year = st .sidebar .slider ('End Year' , 1900 , 2022 , 2023 )
41+
42+ # Filter data based on selected years
43+ filtered_df = df [(df ['year' ].dt .year >= start_year ) & (df ['year' ].dt .year <= end_year )]
44+ # st.write(filtered_df)
45+ # Global trend plot
46+ st .header ('Global Energy Production Trends' )
47+ energy_types = st .multiselect (
48+ 'Select Energy Types' ,
49+ [col .split ("_" )[0 ].capitalize () for col in energy_columns ],
50+ default = ["Solar" , "Wind" , "Hydro" ]
51+ )
52+
53+ global_trend = filtered_df .groupby ('year' )[energy_types ].mean ()
54+
55+ fig = px .line (global_trend .reset_index (), x = 'year' , y = energy_types ,
56+ title = 'Global Energy Production Trends' )
57+ fig .update_yaxes (title = "Electricity Production (TWh)" )
58+ st .plotly_chart (fig )
59+
60+ # Map of energy production
61+ st .header ('Energy Production Map' )
62+ energy_type_map = st .selectbox ('Select Energy Type for Map' , energy_types )
63+ year_map = st .slider ('Select Year for Map' , start_year , end_year , end_year )
64+
65+ map_data = filtered_df [filtered_df ['year' ].dt .year == year_map ]
66+ world = gpd .read_file ("ne_110m_admin_0_countries/ne_110m_admin_0_countries.dbf" )
67+ # data processing
68+ world .rename (columns = {"ADMIN" : "country" }, inplace = True )
69+ # replace country name to fit the other dataset
70+ world .country = world .country .replace (
71+ ["United States of America" , "Democratic Republic of the Congo" , "Republic of the Congo" , "United Republic of Tanzania" , "The Bahamas" , "Czechia" , "eSwatini" , "Republic of Serbia" ],
72+ ["United States" , "Democratic Republic of Congo" , "Congo" , "Tanzania" , "Bahamas" , "Czechoslovakia" , "Eswatini" , "Serbia" ]
73+ )
74+
75+ # world.SOV_A3 = world.SOV_A3.replace(["US1", "CH1", "FR1", "KA1", "GB1", "NZ1", "AU1"], ["USA", "CHN", "FRA", "KAZ", "GBR", "NZL", "AUS"])
76+ # latest_year = recent_data['year'].max() - pd.Timedelta(days=365*2)
77+ # latest_data = recent_data[recent_data['year'] == latest_year]
78+ world = world .merge (map_data , on = ['country' ])
79+
80+ fig = px .choropleth (world , locations = 'ADM0_A3' , color = energy_type_map ,
81+ hover_name = 'country' , projection = 'natural earth2' , color_continuous_scale = 'Viridis' ,
82+ title = f'{ energy_type_map .replace ("_" , " " ).title ()} Production in { year_map } ' )
83+ # fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
84+ st .plotly_chart (fig )
85+
86+ # Top countries comparison
87+ st .header ('Top Countries Comparison' )
88+ n_countries = st .slider ('Number of top countries to compare' , 1 , 10 , 5 )
89+ top_countries = filtered_df .groupby ('country' )[energy_types [0 ]].mean ().nlargest (n_countries ).index .tolist ()
90+
91+ top_countries_data = filtered_df [filtered_df ['country' ].isin (top_countries )]
92+
93+ fig = px .line (top_countries_data , x = 'year' , y = energy_types [0 ], color = 'country' ,
94+ title = f'Top { n_countries } Countries in { energy_types [0 ].replace ("_" , " " ).title ()} Production' )
95+ st .plotly_chart (fig )
96+
97+ # Energy mix comparison
98+ st .header ('Energy Mix Comparison' )
99+ selected_country = st .selectbox ('Select a Country' , df ['country' ].unique (), index = None ,
100+ placeholder = "Select a country ..." ,)
101+ country_data = filtered_df [filtered_df ['country' ] == selected_country ]
102+ st .write (country_data )
103+
104+
105+ energy_mix = country_data [energy_types ]
106+ # energy_mix = energy_mix.div(energy_mix.sum(axis=1), axis=0) * 100
107+ energy_mix ['year' ] = country_data .year
108+
109+ fig = px .area (energy_mix .dropna (), x = 'year' , y = energy_types ,
110+ title = f'Energy Mix for { selected_country } ' )
111+ fig .update_yaxes (title = "Electricity Production (TWh)" )
112+ st .plotly_chart (fig )
113+ st .write (energy_mix )
114+
115+ st .write ("""
116+ This Streamlit app provides an interactive analysis of global energy production trends.
117+ You can use the sidebar and various selectors to customize the visualizations and explore different aspects of energy production data.
118+ """ )
0 commit comments