Primera prueba de código de microservicios
Some checks failed
build / build (push) Failing after 0s
test / echo (push) Has been cancelled

This commit is contained in:
2025-12-12 12:59:20 +01:00
commit 85d023acec
7 changed files with 251 additions and 0 deletions

0
src/__init__.py Normal file
View File

85
src/flask.py Normal file
View File

@@ -0,0 +1,85 @@
from flask import Flask, jsonify, request
import os
import psycopg2
import pandas as pd
import xgboost as xgb
import joblib
app = Flask(__name__)
# Configuración de la base de datos
DB_CONFIG = {
'dbname': os.getenv('DB_NAME', 'postgres'),
'user': os.getenv('DB_USER', 'postgres'),
'password': os.getenv('DB_PASSWORD', 'tfmuocdfcarvajal'),
'host': os.getenv('DB_HOST', '10.10.5.32'),
'port': os.getenv('DB_PORT', '5432')
}
# Ruta para entrenar o cargar el modelo
MODEL_PATH = 'modelo_xgb.joblib'
def get_db_connection():
conn = psycopg2.connect(**DB_CONFIG)
return conn
def fetch_data():
conn = get_db_connection()
query = """
SELECT h3, hour, dow, total_events, total_nulos, nulo_rate
FROM demanda_h3_hour
"""
df = pd.read_sql(query, conn)
conn.close()
return df
def train_model(df):
# Variables predictoras
X = df[['hour', 'dow', 'total_events']]
# Variable objetivo: nulo_rate > 0 -> 1, else 0
y = (df['nulo_rate'] > 0).astype(int)
model = xgb.XGBClassifier(
max_depth=4, n_estimators=100, learning_rate=0.1, use_label_encoder=False, eval_metric='logloss'
)
model.fit(X, y)
joblib.dump(model, MODEL_PATH)
return model
def load_model():
try:
model = joblib.load(MODEL_PATH)
return model
except:
df = fetch_data()
return train_model(df)
model = load_model()
@app.route('/predict', methods=['GET'])
def predict():
# Parámetros de la consulta
hour = int(request.args.get('hour'))
dow = int(request.args.get('dow'))
total_events = int(request.args.get('total_events', 1)) # valor por defecto si no se pasa
X_pred = pd.DataFrame([[hour, dow, total_events]], columns=['hour', 'dow', 'total_events'])
prob = model.predict_proba(X_pred)[0][1] # Probabilidad de nulo
return jsonify({
'hour': hour,
'dow': dow,
'total_events': total_events,
'predicted_nulo_prob': float(prob)
})
@app.route('/demand', methods=['GET'])
def demand():
df = fetch_data()
X_pred = df[['hour', 'dow', 'total_events']]
df['predicted_nulo_prob'] = model.predict_proba(X_pred)[:,1].astype(float)
# Convertimos a JSON
result = df.to_dict(orient='records')
return jsonify(result)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

33
src/pyproject.toml Normal file
View File

@@ -0,0 +1,33 @@
[build-system]
requires = ["setuptools >= 61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "microservicios"
version = "1.0.1"
requires-python = ">= 3.8"
description = "Microservicios para Estimaciones"
license={text = "EULA"}
authors = [
{name = "Diego Fernández", email = "carvajal.diego@gmail.com"}
]
dependencies = [
'flask',
'psycopg2-binary',
'pandas',
'xgboost',
'scikit-learn',
'joblib'
]
[tool.setuptools]
include-package-data = true
py-modules = ["flask"]
[tool.setuptools.packages]
find = {}
[project.urls]
Documentation='https://https://gitea.tfmuocdfcarvajal.duckdns.org/TFM/microservicios_python'