Skip to content

Instantly share code, notes, and snippets.

@ximchipapa
Created June 29, 2025 18:18
Show Gist options
  • Select an option

  • Save ximchipapa/925f1ec861ec25ceb5042c07840f30c3 to your computer and use it in GitHub Desktop.

Select an option

Save ximchipapa/925f1ec861ec25ceb5042c07840f30c3 to your computer and use it in GitHub Desktop.
BMM1
{
"metadata": {
"kernelspec": {
"name": "python",
"display_name": "Python (Pyodide)",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "python",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8"
}
},
"nbformat_minor": 5,
"nbformat": 4,
"cells": [
{
"id": "d2efdcb7",
"cell_type": "markdown",
"source": "# 🛠️ Ejercicio: Optimización de Mantenimiento en Perforadoras - Python en Minería\nEste notebook te ayudará a practicar fundamentos de programación en Python aplicado al mantenimiento minero.\nTrabajaremos con funciones, estructuras de datos, validaciones y lógica para tomar decisiones.\n\nEn una operación minera, el equipo de mantenimiento quiere registrar y analizar las mantenciones de perforadoras hidráulicas, evaluando su impacto en la disponibilidad operativa mensual.\n\n### Requerimientos:\nEscribe una función que:\n\n* Permita ingresar el nombre del equipo, duración de cada mantención (horas) y su frecuencia mensual. Y Guarde los datos en un diccionario: EJEMPLO\n{nombre_equipo: {\"duracion\": h, \"frecuencia\": f}}\n\n* Escribe una función que calcule la disponibilidad mensual de cada equipo usando la fórmula:\nDisponibilidad (%) = ((720 - (duración * frecuencia)) / 720) * 100. Luego, que retorne un diccionario con los resultados.\n\n( Implementa manejo de errores para asegurar que la duración y frecuencia sean números positivos; que no se exceda el total de horas del mes (720 h) )\n\n* PLUS💡: Una función que recomiende reducir la frecuencia si la disponibilidad es menor al 85%.",
"metadata": {}
},
{
"id": "d77c3824",
"cell_type": "markdown",
"source": "## 1️⃣ Función para registrar datos de mantenciones\nLa siguiente función permite ingresar los datos de mantenimiento (duración y frecuencia) de distintos equipos perforadores.\nLos datos se guardan en un diccionario con validaciones para asegurar que sean coherentes.",
"metadata": {}
},
{
"id": "3dc213d8",
"cell_type": "code",
"source": "def registrar_mantenimientos_perforadoras():\n mantenimientos = {}\n while True:\n nombre = input(\"Nombre del equipo (o 'salir' para terminar): \")\n if nombre.lower() == \"salir\":\n break\n try:\n duracion = float(input(\"Duración de la mantención (en horas): \"))\n frecuencia = int(input(\"Frecuencia mensual: \"))\n if duracion <= 0 or frecuencia < 0:\n print(\"⚠️ La duración y frecuencia deben ser mayores que 0.\")\n continue\n if duracion * frecuencia > 720:\n print(\"⚠️ Las horas de mantención exceden el total de horas del mes (720h).\")\n continue\n mantenimientos[nombre] = {\"duracion\": duracion, \"frecuencia\": frecuencia}\n except ValueError:\n print(\"⚠️ Ingresa valores numéricos válidos.\")\n return mantenimientos",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": 2
},
{
"id": "a33187f6",
"cell_type": "markdown",
"source": "## 2️⃣ Función para calcular la disponibilidad operativa\nEsta función toma el diccionario de mantenciones y calcula la disponibilidad mensual de cada equipo como un porcentaje.",
"metadata": {}
},
{
"id": "b3f357fa",
"cell_type": "code",
"source": "def calcular_disponibilidad_perforadoras(mantenimientos):\n disponibilidad = {}\n for equipo, datos in mantenimientos.items():\n horas_mantenimiento = datos[\"duracion\"] * datos[\"frecuencia\"]\n disp = ((720 - horas_mantenimiento) / 720) * 100\n disponibilidad[equipo] = round(disp, 2)\n return disponibilidad",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": 3
},
{
"id": "740bcb02",
"cell_type": "markdown",
"source": "## 🌟 3️⃣ PLUS: Sugerencia automática de optimización\nEsta función revisa qué equipos tienen baja disponibilidad y sugiere reducir la frecuencia de mantenimiento para mejorarla.\nEs un ejemplo de cómo puedes aplicar lógica de negocio para tomar decisiones basadas en datos.",
"metadata": {}
},
{
"id": "203c7023",
"cell_type": "code",
"source": "def sugerir_mantenimiento_optimo(disponibilidad, mantenimientos): \n for equipo, disp in disponibilidad.items():\n if disp < 85:\n frecuencia_actual = mantenimientos[equipo][\"frecuencia\"]\n nueva_frecuencia = max(1, frecuencia_actual - 1)\n print(f\"🔧 Sugerencia: Reducir frecuencia de '{equipo}' a {nueva_frecuencia} para mejorar disponibilidad.\")",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": 18
},
{
"id": "bbddb50b",
"cell_type": "markdown",
"source": "## ▶️ 4️⃣ Ejecutar el programa completo\nPuedes ejecutar el siguiente bloque para probar todo el flujo de trabajo desde el ingreso de datos hasta las sugerencias.",
"metadata": {}
},
{
"id": "cb922f55-c170-4fdb-8828-2e8dc1b8b740",
"cell_type": "code",
"source": "# Registrar datos\nequipos = registrar_mantenimientos_perforadoras()\n\n# Calcular disponibilidad\ndispo = calcular_disponibilidad_perforadoras(equipos)\n\n# Mostrar resultados\nprint(\"\\n📊 Disponibilidad de equipos:\")\nfor eq, d in dispo.items():\n print(f\"{eq}: {d}% disponible\")\n\n# Mostrar sugerencias\nprint(\"\\n🧠 Recomendaciones de mejora:\")\nsugerir_mantenimiento_optimo(dispo, equipos)",
"metadata": {
"trusted": true
},
"outputs": [
{
"output_type": "stream",
"name": "stdin",
"text": "Nombre del equipo (o 'salir' para terminar): AVE\nDuración de la mantención (en horas): 1\nFrecuencia mensual: 30\nNombre del equipo (o 'salir' para terminar): B\nDuración de la mantención (en horas): 18\nFrecuencia mensual: 4\nNombre del equipo (o 'salir' para terminar): C\nDuración de la mantención (en horas): 10\nFrecuencia mensual: 20\nNombre del equipo (o 'salir' para terminar): salir\n"
},
{
"name": "stdout",
"output_type": "stream",
"text": "\n📊 Disponibilidad de equipos:\nAVE: 95.83% disponible\nB: 90.0% disponible\nC: 72.22% disponible\n\n🧠 Recomendaciones de mejora:\n🔧 Sugerencia: Reducir frecuencia de 'C' a 19 para mejorar disponibilidad.\n"
}
],
"execution_count": 23
},
{
"id": "26fae8c1-6856-44a5-8675-dcb512ffe836",
"cell_type": "markdown",
"source": "## ▶️ UN PROGRAMA MEJORADO\nPuedes ejecutar el siguiente bloque para probar todo el flujo de trabajo desde el ingreso de datos hasta las sugerencias.",
"metadata": {
"jp-MarkdownHeadingCollapsed": true
}
},
{
"id": "b046cca7-a837-4a22-a26e-4616b98d8daa",
"cell_type": "code",
"source": "# Registrar datos\nequipos = registrar_mantenimientos_perforadoras()\n\n# Validar si hay registros\nif not equipos:\n print(\"Gracias por usar el registro. No se registró ningún equipo.\")\nelse:\n # Calcular disponibilidad\n dispo = calcular_disponibilidad_perforadoras(equipos)\n\n # Mostrar resultados\n print(\"\\n📊 Disponibilidad de equipos:\")\n for eq, d in dispo.items():\n print(f\"{eq}: {d}% disponible\")\n\n # Mostrar sugerencias\n print(\"\\n🧠 Recomendaciones de mejora:\")\n sugerir_mantenimiento_optimo(dispo, equipos)\n",
"metadata": {
"trusted": true,
"scrolled": true
},
"outputs": [
{
"output_type": "stream",
"name": "stdin",
"text": "Nombre del equipo (o 'salir' para terminar): A\nDuración de la mantención (en horas): 20\nFrecuencia mensual: 1\nNombre del equipo (o 'salir' para terminar): B\nDuración de la mantención (en horas): 26\nFrecuencia mensual: 4\nNombre del equipo (o 'salir' para terminar): C\nDuración de la mantención (en horas): 12\nFrecuencia mensual: 10\nNombre del equipo (o 'salir' para terminar): D\nDuración de la mantención (en horas): 8\nFrecuencia mensual: 15\nNombre del equipo (o 'salir' para terminar): salir\n"
},
{
"name": "stdout",
"output_type": "stream",
"text": "\n📊 Disponibilidad de equipos:\nA: 97.22% disponible\nB: 85.56% disponible\nC: 83.33% disponible\nD: 83.33% disponible\n\n🧠 Recomendaciones de mejora:\n🔧 Sugerencia: Reducir frecuencia de 'C' a 9 para mejorar disponibilidad.\n🔧 Sugerencia: Reducir frecuencia de 'D' a 14 para mejorar disponibilidad.\n"
}
],
"execution_count": 21
},
{
"id": "e3c8e14c-e0de-41c6-a956-f795ea414507",
"cell_type": "code",
"source": "",
"metadata": {
"trusted": true
},
"outputs": [],
"execution_count": null
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment