diff --git "a/Retos/Reto #43 - SIMULADOR DE CLIMA [F\303\241cil]/python/jamerrq.ipynb" "b/Retos/Reto #43 - SIMULADOR DE CLIMA [F\303\241cil]/python/jamerrq.ipynb" new file mode 100644 index 0000000000..b58efce21d --- /dev/null +++ "b/Retos/Reto #43 - SIMULADOR DE CLIMA [F\303\241cil]/python/jamerrq.ipynb" @@ -0,0 +1,274 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Simulador de clima\n", + "\n", + "## Parámetros iniciales (a definir o modificar por el usuario)\n", + "\n", + "- Temperatura inicial (en grados Celsius)\n", + "- Probabilidad de lluvia (en porcentaje)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "temperatura_inicial = 20\n", + "probabilidad_lluvia = 0.1 # 0 <= probabilidad_lluvia <= 1\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reglas\n", + "\n", + "En cada día que pasa tenemos que\n", + "\n", + "- 10% de probabilidad de que la temperatura aumente o disminuya en 2 grados\n", + "- Si la temperatura supera los 25 grados, la probabilidad de lluvia aumenta en\n", + " 20%\n", + "- Si la temperatura es menor a 5 grados, la probabilidad de lluvia disminuye en\n", + " 20%\n", + "- Si llueve, la temperatura disminuye en 1 grado" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Función\n", + "\n", + "La función recibe:\n", + "\n", + "- Número de días a simular\n", + "\n", + "Y devuelve (muestra):\n", + "\n", + "- Temperatura de cada día\n", + "- Si llovió o no\n", + "- Probabilidad de lluvia de cada día\n", + "- Número de días que llovió" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Algunas librerías útiles" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import random as rnd\n", + "from scipy import interpolate\n", + "import numpy as np\n", + "import pandas as pd\n", + "import seaborn as sns\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "def suavizador(x, y, kind='linear'):\n", + " f = interpolate.interp1d(x, y, kind=kind)\n", + " xnew = np.linspace(min(x), max(x), 100)\n", + " ynew = f(xnew)\n", + " return xnew, ynew\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Función principal (simulación)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "def simulador(numero_dias=30, verbose=False, min_prob=0):\n", + "\n", + " temperatura_actual = temperatura_inicial\n", + " temperaturas = [temperatura_actual]\n", + " dias = [0]\n", + " lluvias = [0] * numero_dias\n", + " probabilidad_actual = probabilidad_lluvia\n", + " probabilidades = [probabilidad_actual]\n", + "\n", + " for dia in range(1, numero_dias):\n", + " random = rnd.random()\n", + " # 10% de probabilidad de que la temperatura aumente\n", + " # o disminuya en 2 grados\n", + " if random < 0.1:\n", + " delta = rnd.choice([-2, 2])\n", + " temperatura_actual += delta\n", + " if verbose:\n", + " print(f'El día {dia} la temperatura cambió en {delta} grados')\n", + "\n", + " # Lluvia\n", + " random_lluvia = rnd.random()\n", + " if random_lluvia < probabilidad_actual:\n", + " temperatura_actual -= 1\n", + " lluvias[dia] = 1\n", + " if verbose:\n", + " print(f'El día {dia} llovió')\n", + "\n", + " # Si temperatura actual > 25\n", + " if temperatura_actual > 25:\n", + " probabilidad_actual = min(1, probabilidad_actual + 0.2)\n", + " if verbose:\n", + " print(f'El día {dia} la probabilidad de lluvia aumentó a {probabilidad_actual}')\n", + "\n", + " # Si temperatura actual < 5\n", + " if temperatura_actual < 5:\n", + " probabilidad_actual = max(0, probabilidad_actual - 0.2)\n", + " if verbose:\n", + " print(f'El día {dia} la probabilidad de lluvia disminuyó a {probabilidad_actual}')\n", + "\n", + " temperaturas.append(temperatura_actual)\n", + " dias.append(dia)\n", + " probabilidades.append(probabilidad_actual)\n", + "\n", + " return dias, temperaturas, lluvias, probabilidades\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Resultados" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "El día 1 llovió\n", + "El día 8 la temperatura cambió en 2 grados\n", + "El día 8 llovió\n", + "El día 11 llovió\n", + "El día 16 llovió\n", + "El día 24 la temperatura cambió en -2 grados\n" + ] + }, + { + "data": { + "image/png": "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zZ49m2HDhgHB5dcfe+wxNmzYQJs2bbjuuuu48sorG7PUJuVo7darVy/+8Ic/8OOPP5KTk4PX66V///7cdNNNNQbSx5JRo0axY8eOWp/TtXZ4R2s3XWu1e/7555k7dy5bt27Ftm3at2/P6aefzg033EBycnL1ceG63hR4REREJOrFZv+jiIiIxBQFHhEREYl6CjwiIiIS9RR4REREJOop8IiIiEjUU+ARERGRqKfAIyJRa9++fZx88sk88MADTpciIg7TOjwi0iy88847/OEPf6j+3Ofz4ff76datGyeffDIXXXQRLVq0qH7esiyuu+460tLSeOKJJ7SQpUiM09YSItKsPPDAA3Tr1o1AIEB2djZLlixh5syZvPjiizz++OOcdNJJADz11FOYpskjjzyisCMi6uERkeahqofnrbfeYsCAATWe27lzJ1dccQX5+fl8+umntGzZ0qEqRaSp0hgeEWn22rVrx1133UVRURFvvPEGAE8//TS9evWqcdzcuXO5/vrrOfnkkxk4cCBnnXUWjz76KMXFxU6ULSKNSLe0RCQqjBw5ErfbzXfffXfYYzZv3swpp5zCtddeS0JCAhs3bmTmzJksX76c2bNnN2K1ItLYFHhEJCokJiaSnp7Onj17DnvMrbfeWv1327Y59thj6d69O1dddRVr1qyhd+/ejVGqiDhAgUdEosbRhiRu27aNJ554gsWLF5OdnV3j+I0bNyrwiEQxBR4RiQrFxcXs37+fnj171vp8UVERV1xxBXFxcfzmN7+hS5cuxMfHs2vXLiZNmkRpaWkjVywijUmBR0SiwsKFCzFNk6FDh9b6/OLFi9mzZw//+Mc/ahxTUFDQWCWKiIM0S0tEmr2dO3fy8MMPk5KSwmWXXVbrMVVr8fh8vhqPV83qEpHoph4eEWlWsrKyME2TQCBATk4O3333He+88w5ut5tnnnmGjIyMWr9uyJAhpKam8uc//5lJkybh8Xj44IMPWLt2bSO/AxFxggKPiDQrVdtLeL1e/H4/3bt358Ybb+Tiiy8+bNgBSE9PZ8aMGTz00ENMmTKFhIQERo8ezeOPP87555/fWOWLiEO00rKIiIhEPY3hERERkainwCMiIiJRT4FHREREop4Cj4iIiEQ9BR4RERGJego8IiIiEvUUeERERCTqKfCIiIhI1FPgERERkainwCMiIiJRT4FHREREop4Cj4iIiES9/w8k6XtFYylcEgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.set_theme(style=\"darkgrid\")\n", + "\n", + "dias, temperaturas, lluvias, probabilidades = simulador(verbose=True)\n", + "\n", + "xnew, ynew = suavizador(dias, temperaturas, kind='cubic')\n", + "data = {'Día': xnew, 'Temperatura': ynew}\n", + "df = pd.DataFrame(data)\n", + "sns.lineplot(data=df, x='Día', y='Temperatura', color='red')\n", + "\n", + "\n", + "# data = {'Día': dias, 'Temperatura': temperaturas, 'Lluvia': lluvias, 'Probabilidad': probabilidades}\n", + "# df = pd.DataFrame(data)\n", + "# sns.lineplot(data=df, x='Día', y='Temperatura', color='red')\n", + "\n", + "# Marcar los días de lluvia\n", + "for dia, lluvia in enumerate(lluvias):\n", + " if lluvia:\n", + " plt.plot(dia, temperaturas[dia], 'bo')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Estadísticas" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hubo 4 días de lluvia\n", + "La temperatura máxima fue 20 grados\n", + "La temperatura mínima fue 16 grados\n" + ] + } + ], + "source": [ + "dias_lluvia = sum(lluvias)\n", + "max_temperatura = max(temperaturas)\n", + "min_temperatura = min(temperaturas)\n", + "\n", + "print(f'Hubo {dias_lluvia} días de lluvia')\n", + "print(f'La temperatura máxima fue {max_temperatura} grados')\n", + "print(f'La temperatura mínima fue {min_temperatura} grados')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Referencias\n", + "\n", + "- [Seaborn Lineplot](https://seaborn.pydata.org/generated/seaborn.lineplot.html)\n", + "\n", + "- [Scipy\n", + " Interpolate](https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}