Created
June 29, 2025 18:18
-
-
Save ximchipapa/925f1ec861ec25ceb5042c07840f30c3 to your computer and use it in GitHub Desktop.
BMM1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "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