-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
197 lines (161 loc) · 8.44 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import warnings
import pandas as pd
import plotly.express as px
import streamlit as st
from charts.hdi import get_hdi_charts
from charts.income import get_income_charts
from charts.olympics import get_olympics_charts
from charts.population import get_population_charts
from charts.schooling import get_schooling_charts
from statistics_calc import descriptors, qualitative_stats
warnings.filterwarnings("ignore")
def load_and_display_data(title, filename):
st.markdown(f"## :red[{title}]")
data = pd.read_csv(f"datasets/{filename}")
st.dataframe(data, hide_index=True, use_container_width=True)
st.caption(
f"Total de filas: **{data.shape[0]}** | Total de columnas: **{data.shape[1]}**"
)
col1, col2 = st.columns(2)
st.markdown("### Variables cualitativas")
qualitative_vars = data.select_dtypes(include=["object"]).columns.tolist()
qualitative = qualitative_stats(data, qualitative_vars)
st.dataframe(qualitative, hide_index=True, use_container_width=True)
st.markdown("### Variables cuantitativas")
data_descriptors = descriptors(data)
st.dataframe(data_descriptors, hide_index=False, use_container_width=True)
st.markdown("## :green[Valores únicos]")
# Add a selectbox for the user to select a column
selected_column = st.selectbox(
"Selecciona una columna para ver sus valores únicos", data.columns
)
# Display all unique values of the selected column
st.write(f"Valores únicos para {selected_column}:")
# Get all unique values of the selected column
unique_values = data[selected_column].unique()
# Convert the unique values to a DataFrame
unique_values_df = pd.DataFrame(unique_values, columns=[selected_column])
# Display the DataFrame
st.dataframe(unique_values_df, use_container_width=True)
st.write(f"Total de valores únicos: **{len(unique_values)}**")
st.markdown("## :violet[Graficar]")
# Add a selectbox for the user to select a plot type
plot_types = ["Histograma", "Box Plot", "Scatter Plot"]
selected_plot = st.selectbox("Selecciona un tipo de gráfico", plot_types)
# Add a selectbox for the user to select a quantitative variable
quantitative_vars = data.columns
selected_var = st.selectbox(
"Selecciona una variable para generar un gráfico", quantitative_vars
)
# Plot the selected plot type
if selected_plot == "Histograma":
fig = px.histogram(
data,
x=selected_var,
nbins=50,
labels={"x": selected_var, "y": "Frecuencia"},
text_auto=True,
)
fig.update_xaxes(title_text=selected_var)
fig.update_yaxes(title_text="Frecuencia")
elif selected_plot == "Box Plot":
fig = px.box(data, x=selected_var)
fig.update_xaxes(title_text=selected_var)
fig.update_yaxes(title_text="Value")
elif selected_plot == "Scatter Plot":
selected_var2 = st.selectbox(
"Selecciona una segunda variable para el gráfico de dispersión",
quantitative_vars,
)
fig = px.scatter(data, x=selected_var, y=selected_var2)
fig.update_xaxes(title_text=selected_var)
fig.update_yaxes(title_text=selected_var2)
fig.update_layout(title_text=f"{selected_plot} de {selected_var}", title_x=0.5)
st.plotly_chart(fig, use_container_width=True)
if title == "🏅 Olympics (Cleaned)":
st.caption(
"📢 **Nota:** Puede haber más Comités Olímpicos Nacionales (NOCs) que países porque algunos territorios autónomos \
tienen sus propios NOCs. Por ejemplo, Puerto Rico, Guam o Hong Kong."
)
st.markdown("### Posible discrepancia de datos")
st.markdown("""
Los datos del dataset son proporcionados por [Olympedia](https://www.olympedia.org/), una base de datos especializada en \
la historia de los Juegos Olímpicos. A continuación, se presenta una explicación sobre la posible discrepancia de datos \
con otras fuentes:
Olympedia.org tiene una larga trayectoria como la base de datos más completa y confiable sobre la historia de los Juegos Olímpicos. \
Fundada en la década de 1990 por un grupo de apasionados historiadores deportivos y estrechamente asociada con la Sociedad \
Internacional de Historiadores Olímpicos (ISOH), Olympedia ha pasado décadas recopilando, verificando y actualizando \
meticulosamente cada detalle relacionado con los atletas, eventos y medallas olímpicos desde la era moderna de los \
Juegos que comenzó en 1896. A diferencia de fuentes más generalistas como Wikipedia, que dependen de contribuciones abiertas, \
el equipo de Olympedia, que trabaja en colaboración con la ISOH, se dedica exclusivamente a mantener la base de datos \
olímpica más precisa y actualizada posible. Por lo tanto, es normal que puedan existir algunas discrepancias menores entre \
los datos de Olympedia y los de otros sitios web, ya que Olympedia realiza un mayor nivel de investigación y validación para \
asegurar la integridad de sus registros, incluyendo la incorporación de correcciones y cambios retroactivos realizados por \
el Comité Olímpico Internacional a lo largo de los años.
""")
get_olympics_charts(data)
elif title == "🎓 Schooling (Cleaned)":
get_schooling_charts(data)
elif title == "💰 Income (Cleaned)":
get_income_charts(data)
elif title == "🌍 Human Development Index (HDI) (Cleaned)":
get_hdi_charts(data)
elif title == "👦🏻 Population (Cleaned)":
get_population_charts(data)
def main():
st.set_page_config(page_title="Datamart data", page_icon="📊", layout="wide")
with st.sidebar:
# Define the datasets and their corresponding titles and qualitative variables
chosen_datasets = {
"🏅 Olympics (Cleaned)": "olympics-cleaned.csv",
"🏅 Olympics": "olympics.csv",
"🎓 Schooling (Cleaned)": "expected-years-of-schooling-cleaned.csv",
"🎓 Schooling": "expected-years-of-schooling.csv",
"💰 Income (Cleaned)": "gross-national-income-per-capita-cleaned.csv",
"💰 Income": "gross-national-income-per-capita.csv",
"🌍 Human Development Index (HDI) (Cleaned)": "human-development-index-cleaned.csv",
"🌍 Human Development Index (HDI)": "human-development-index.csv",
"👦🏻 Population (Cleaned)": "population_total_long-cleaned.csv",
"👦🏻 Population": "population_total_long.csv",
"📍 ISO-NOC Merged": "iso_noc-merged.csv",
"🗺️ Country Data Merged": "country-data-merged.csv",
}
other_datasets = {
"🔄 HDI Comparison": "human-development-index-comparison.csv",
"💹 HDI vs. GDP per capita": "hdi-vs-gdp-per-capita.csv",
"🌐 HDI Without GDP vs GDP per capita": "hdi-without-gdp-vs-gdp-per-capita.csv",
"📈 HDI - Escosura": "human-development-index-escosura.csv",
"📚 Mean Years of Schooling Long Run": "mean-years-of-schooling-long-run.csv",
}
st.markdown("# 📊 Datamart data")
st.warning(
"⚠️ **IMPORTANTE:** Considerar que se usa un punto para valores decimales y una coma para separar miles."
)
st.info("📢 **Nota:** La carga de un `scatter plot` puede tomar tiempo.")
only_chosen_datasets = st.toggle(
"Mostrar solo los datasets seleccionados",
value=True,
help="Mostrar solo los datasets que hayan sido seleccionados para el análisis o incluir todos los datasets disponibles.",
)
# Add a selectbox for the user to select a dataset
datasets = (
chosen_datasets
if only_chosen_datasets
else {**chosen_datasets, **other_datasets}
)
selected_dataset = st.selectbox("Elige un dataset", list(datasets.keys()))
st.divider()
st.button(
"Limpiar cache",
on_click=st.cache_data.clear(),
type="primary",
use_container_width=True,
)
st.caption(
"_Limpiar el cache de los graficos de interes. Solo utilizar en caso de ser necesario._"
)
# Load and display the selected dataset
filename = datasets[selected_dataset]
load_and_display_data(selected_dataset, filename)
if __name__ == "__main__":
main()