Skip to content

Commit 0bc5df3

Browse files
committed
Primer commit: inicializando repositorio
0 parents  commit 0bc5df3

2,463 files changed

Lines changed: 1139974 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Ignorar el entorno virtual
2+
venv/
3+
4+
# Ignorar archivos de configuración del editor
5+
*.vscode
6+
*.idea
7+
8+
# Ignorar archivos de compilación o cache
9+
__pycache__/
10+
*.pyc

src/Procfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
web: gunicorn app:app

src/app.py

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
import numpy as np
2+
from flask import Flask, render_template, request, redirect, url_for, flash, send_file
3+
from flask_mysqldb import MySQL
4+
from tensorflow.keras.models import Sequential
5+
from tensorflow.keras.layers import Dense
6+
import matplotlib.pyplot as plt
7+
import io
8+
9+
app = Flask(__name__)
10+
app.config['MYSQL_HOST'] = 'localhost'
11+
app.config['MYSQL_USER'] = 'root'
12+
app.config['MYSQL_PASSWORD'] = ''
13+
app.config['MYSQL_DB'] = 'ecampus_mood481'
14+
mysql = MySQL(app)
15+
16+
#solution for error 'the session is unavailable because no secret key was set'
17+
app.secret_key = 'mysecretkey'
18+
19+
@app.route('/home')
20+
def home():
21+
return render_template('index.html')
22+
23+
@app.route('/about')
24+
def about():
25+
return render_template('about.html')
26+
27+
@app.route('/register')
28+
def register():
29+
cur = mysql.connection.cursor()
30+
cur.execute('SELECT username, password, firstname, lastname, email FROM mdlns_user1')
31+
data = cur.fetchall()
32+
return render_template('register.html', users = data)
33+
34+
@app.route('/add_register', methods=['POST'])
35+
def add_register():
36+
if request.method == 'POST':
37+
username = request.form['username']
38+
password = request.form['password']
39+
firstname = request.form['firstname']
40+
lastname = request.form['lastname']
41+
email = request.form['email']
42+
43+
cur = mysql.connection.cursor()
44+
cur.execute('INSERT INTO mdlns_user1(username, password, firstname, lastname, email) VALUES(%s, %s, %s, %s, %s)', (username, password, firstname, lastname, email))
45+
mysql.connection.commit()
46+
47+
flash('Contact added successfully')
48+
return redirect(url_for('register'))
49+
50+
51+
# Datos de ejemplo: años y población (en millones)
52+
#años = np.array([2000, 2005, 2010, 2015, 2020]).reshape(-1, 1)
53+
#población = np.array([8.0, 8.5, 9.0, 9.7, 10.2]) # Población en millones
54+
55+
#function for data read
56+
def data_read_mysql():
57+
cur = mysql.connection.cursor()
58+
cur.execute("SELECT year, num_men_vot, num_wom_vot FROM voting_population WHERE department = 'Chuquisaca'")
59+
60+
# Obtener los datos de la consulta
61+
resultados = cur.fetchall()
62+
63+
# Separar los años y la población en arrays de numpy
64+
años = np.array([fila[0] for fila in resultados]).reshape(-1, 1)
65+
población = np.array([fila[1] for fila in resultados])
66+
población2 = np.array([fila[2] for fila in resultados])
67+
68+
# Cerrar la conexión
69+
cur.close()
70+
#conexion.close()
71+
72+
#return años, población, población2
73+
return años.flatten().tolist(), población.tolist(), población2.tolist()
74+
75+
# Función para crear el modelo de la red neuronal
76+
def crear_modelo():
77+
modelo = Sequential()
78+
modelo.add(Dense(64, input_dim=1, activation='relu'))
79+
modelo.add(Dense(32, activation='relu'))
80+
modelo.add(Dense(1))
81+
modelo.compile(optimizer='adam', loss='mean_squared_error')
82+
return modelo
83+
84+
# Ruta principal
85+
@app.route('/')
86+
def index():
87+
88+
años, población, población2 = data_read_mysql()
89+
90+
# Creamos y entrenamos el modelo
91+
modelo = crear_modelo()
92+
modelo.fit(años, población, epochs=1000, verbose=0)
93+
94+
# Hacemos la predicción para el año 2025
95+
año_predicción = 2024
96+
población_predicha = modelo.predict(np.array([[año_predicción]]))
97+
predicción = población_predicha[0][0]
98+
99+
# Devolvemos el resultado en una plantilla HTML
100+
return render_template('data.html', anio=año_predicción, predicción=f"{predicción:.0f}")
101+
102+
# Ruta para generar el gráfico
103+
@app.route('/plot.png')
104+
def plot_png():
105+
106+
años, población, población2 = data_read_mysql()
107+
108+
# Creamos y entrenamos el modelo
109+
modelo = crear_modelo()
110+
modelo.fit(años, población, epochs=1000, verbose=0)
111+
112+
# Predicción para varios años
113+
años_futuros = np.array([[2012], [2013], [2024], [2018], [2024], [2025], [2026]])
114+
población_predicha = modelo.predict(años_futuros)
115+
116+
# Graficamos los datos históricos y la predicción
117+
plt.figure(figsize=(8,6))
118+
plt.scatter(años, población, color='blue', label='Datos Históricos')
119+
plt.plot(años, modelo.predict(años), color='red', label='Modelo Ajustado')
120+
plt.scatter(años_futuros, población_predicha, color='green', marker='x', label='Predicciones Futuras')
121+
plt.xlabel('Año')
122+
plt.ylabel('Población (millones)')
123+
plt.title('Predicción de la Población')
124+
plt.legend()
125+
126+
# Guardamos el gráfico en un objeto de bytes en memoria
127+
img = io.BytesIO()
128+
plt.savefig(img, format='png')
129+
img.seek(0)
130+
131+
# Enviamos la imagen al navegador
132+
return send_file(img, mimetype='image/png')
133+
134+
@app.route('/votation')
135+
def votation():
136+
años, población, población2 = data_read_mysql()
137+
return render_template('population.html', anios=años, poblacion=población, poblacion2=población2)
138+
139+
140+
if __name__ == '__main__':
141+
app.run(debug=True, host='0.0.0.0', port=5001)

src/ia/FileGenerate.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import pandas as pd
2+
import numpy as np
3+
4+
# Fijar una semilla para reproducibilidad
5+
np.random.seed(42)
6+
7+
# Definir el número de registros
8+
num_records = 50
9+
10+
# Generar datos aleatorios para las características
11+
sepal_length = np.random.normal(5.8, 0.8, num_records) # Media=5.8, SD=0.8
12+
sepal_width = np.random.normal(3.0, 0.4, num_records) # Media=3.0, SD=0.4
13+
petal_length = np.random.normal(3.7, 1.5, num_records) # Media=3.7, SD=1.5
14+
petal_width = np.random.normal(1.2, 0.7, num_records) # Media=1.2, SD=0.7
15+
16+
# Generar datos categóricos para la especie
17+
species = np.random.choice(['setosa', 'versicolor', 'virginica'], num_records)
18+
19+
# Crear un DataFrame
20+
data = pd.DataFrame({
21+
'SepalLength': sepal_length,
22+
'SepalWidth': sepal_width,
23+
'PetalLength': petal_length,
24+
'PetalWidth': petal_width,
25+
'Species': species
26+
})
27+
28+
# Guardar el DataFrame como un archivo CSV
29+
file_path = 'flores.csv'
30+
data.to_csv(file_path, index=False)
31+
32+
print(f"Archivo CSV guardado en: {file_path}")

src/ia/FloresApp.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import streamlit as st
2+
import pandas as pd
3+
import numpy as np
4+
from sklearn.ensemble import RandomForestClassifier
5+
from sklearn.model_selection import train_test_split
6+
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
7+
import matplotlib.pyplot as plt
8+
import seaborn as sns
9+
10+
# Título de la aplicación
11+
st.title('Clasificación de Flores con Machine Learning')
12+
13+
# Sección 1: Cargar un archivo CSV
14+
st.header('1. Cargar un archivo CSV')
15+
#uploaded_file = st.file_uploader("Elige un archivo CSV", type=["csv"])
16+
uploaded_file = 'flores.csv'
17+
18+
#if uploaded_file is not None:
19+
# Leer el archivo CSV
20+
df = pd.read_csv(uploaded_file)
21+
#df = pd.read_csv('flores.csv')
22+
23+
st.write("Datos cargados:")
24+
st.write(df.head())
25+
26+
# Asumiendo que la última columna es la etiqueta y el resto son características
27+
X = df.iloc[:, :-1] # Características
28+
y = df.iloc[:, -1] # Etiqueta
29+
30+
# Dividir los datos en conjuntos de entrenamiento y prueba
31+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
32+
33+
# Entrenar el modelo
34+
model = RandomForestClassifier(n_estimators=100, random_state=42)
35+
model.fit(X_train, y_train)
36+
37+
# Realizar predicciones y mostrar precisión
38+
y_pred = model.predict(X_test)
39+
accuracy = accuracy_score(y_test, y_pred)
40+
st.write(f'Precisión del modelo: {accuracy:.2f}')
41+
42+
# Sección 2: Visualizar estadísticas del modelo
43+
st.header('2. Visualizar estadísticas del modelo')
44+
45+
# Mostrar matriz de confusión
46+
st.subheader('Matriz de Confusión')
47+
cm = confusion_matrix(y_test, y_pred)
48+
fig, ax = plt.subplots()
49+
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax)
50+
st.pyplot(fig)
51+
52+
# Mostrar reporte de clasificación
53+
st.subheader('Reporte de Clasificación')
54+
report = classification_report(y_test, y_pred, output_dict=True)
55+
st.write(pd.DataFrame(report).transpose())
56+
57+
# Mostrar métricas adicionales
58+
st.subheader('Métricas adicionales')
59+
precision = report['weighted avg']['precision']
60+
recall = report['weighted avg']['recall']
61+
f1_score = report['weighted avg']['f1-score']
62+
st.write(f"Precisión (Precision): {precision:.2f}")
63+
st.write(f"Sensibilidad (Recall): {recall:.2f}")
64+
st.write(f"F1-Score: {f1_score:.2f}")
65+
#****************************************************************************************
66+
# Sección 3: Introducir datos manualmente
67+
st.header('3. Introducir datos manualmente')
68+
sepal_length = st.number_input('Longitud del Sépalo (cm)', min_value=0.0, max_value=10.0, step=0.1)
69+
sepal_width = st.number_input('Ancho del Sépalo (cm)', min_value=0.0, max_value=10.0, step=0.1)
70+
petal_length = st.number_input('Longitud del Pétalo (cm)', min_value=0.0, max_value=10.0, step=0.1)
71+
petal_width = st.number_input('Ancho del Pétalo (cm)', min_value=0.0, max_value=10.0, step=0.1)
72+
73+
# Botón para realizar la predicción manual
74+
if st.button('Evaluar'):
75+
#if uploaded_file is not None: # Verificar que los datos han sido cargados
76+
# Crear un array con los datos de entrada del usuario
77+
input_data = np.array([[sepal_length, sepal_width, petal_length, petal_width]])
78+
79+
# Realizar la predicción
80+
prediction = model.predict(input_data)
81+
82+
# Mostrar el resultado de la predicción
83+
st.write(f'La flor es de la especie: {prediction[0]}')
84+
85+
# Crear un nuevo DataFrame con los datos introducidos y el resultado
86+
new_data = pd.DataFrame({
87+
'SepalLength': [sepal_length],
88+
'SepalWidth': [sepal_width],
89+
'PetalLength': [petal_length],
90+
'PetalWidth': [petal_width],
91+
'Species': [prediction[0]]
92+
})
93+
94+
# Concatenar el nuevo registro con los datos existentes
95+
df = pd.concat([df, new_data], ignore_index=True)
96+
97+
# Guardar el DataFrame actualizado en el mismo archivo CSV
98+
#df.to_csv(uploaded_file.name, index=False)
99+
df.to_csv(uploaded_file, index=False)
100+
101+
st.write("El dataset del archivo CSV fue actualizado con este nuevo resultado.")
102+
#else:
103+
#st.write("Por favor, carga primero un archivo CSV.")
104+

0 commit comments

Comments
 (0)