Primera prueba de código de microservicios
This commit is contained in:
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
85
src/flask.py
Normal file
85
src/flask.py
Normal 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
33
src/pyproject.toml
Normal 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'
|
||||
Reference in New Issue
Block a user