From 22c47e24fd3acec360576ef3049bea115b6e0788 Mon Sep 17 00:00:00 2001 From: antoniosql Date: Sat, 4 Jan 2025 19:46:06 +0100 Subject: [PATCH] plotly --- Notebooks/03_02 Visualizacion.ipynb | 202 +++++++++++++++++++++++++++- 1 file changed, 201 insertions(+), 1 deletion(-) diff --git a/Notebooks/03_02 Visualizacion.ipynb b/Notebooks/03_02 Visualizacion.ipynb index 42b20bc..ce5906c 100644 --- a/Notebooks/03_02 Visualizacion.ipynb +++ b/Notebooks/03_02 Visualizacion.ipynb @@ -1376,7 +1376,197 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Visualización con Seaborn\n" + "# Visualización con Seaborn\n", + "\n", + "Agregar algunos ejemplos de aquí: https://www.datacamp.com/es/tutorial/seaborn-python-tutorial " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from dotenv import load_dotenv\n", + "\n", + "load_dotenv() #lee las variables de entorno del archivo .env\n", + "\n", + "servidor = os.getenv(\"SERVIDOR_MYSQL\")\n", + "usuario = os.getenv(\"USUARIO_MYSQL\")\n", + "password = os.getenv(\"PASSWORD_MYSQL\")\n", + "\n", + "consulta_select = \"\"\"\n", + " SELECT f.title, COUNT(f.title) as 'Rentals', f.description, f.release_year, f.rating\n", + " FROM sakila.film f\n", + " INNER JOIN sakila.inventory i ON f.film_id = i.film_id\n", + " INNER JOIN sakila.rental r ON i.inventory_id = r.inventory_id\n", + " GROUP by title, description, release_year, rating\n", + " ORDER BY rentals desc;\n", + "\"\"\"\n", + "\n", + "import mysql.connector\n", + "try:\n", + " db = mysql.connector.connect(user=usuario, password=password,\n", + " host=servidor, database='sakila') # Definimos la cadena de conexión de la base de datos e intentamos conectar\n", + "except mysql.connector.Error as err:\n", + " print(\"Error conectando a la base de datos \" + err)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\anton\\AppData\\Local\\Temp\\ipykernel_37864\\4213328963.py:9: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.\n", + " film_rentals = pd.read_sql(consulta_select, db)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleRentalsdescriptionrelease_yearrating
0BUCKET BROTHERHOOD34A Amazing Display of a Girl And a Womanizer wh...2006PG
1ROCKETEER MOTHER33A Awe-Inspiring Character Study of a Robot And...2006PG-13
2FORWARD TEMPLE32A Astounding Display of a Forensic Psychologis...2006NC-17
3GRIT CLOCKWORK32A Thoughtful Display of a Dentist And a Squirr...2006PG
4JUGGLER HARDLY32A Epic Story of a Mad Cow And a Astronaut who ...2006PG-13
\n", + "
" + ], + "text/plain": [ + " title Rentals \\\n", + "0 BUCKET BROTHERHOOD 34 \n", + "1 ROCKETEER MOTHER 33 \n", + "2 FORWARD TEMPLE 32 \n", + "3 GRIT CLOCKWORK 32 \n", + "4 JUGGLER HARDLY 32 \n", + "\n", + " description release_year rating \n", + "0 A Amazing Display of a Girl And a Womanizer wh... 2006 PG \n", + "1 A Awe-Inspiring Character Study of a Robot And... 2006 PG-13 \n", + "2 A Astounding Display of a Forensic Psychologis... 2006 NC-17 \n", + "3 A Thoughtful Display of a Dentist And a Squirr... 2006 PG \n", + "4 A Epic Story of a Mad Cow And a Astronaut who ... 2006 PG-13 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pandas as pd\n", + "\n", + "#Display the most frequently rented movies in descending order.\n", + "\n", + "film_rentals = pd.read_sql(consulta_select, db)\n", + "film_rentals.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\anton\\AppData\\Local\\Temp\\ipykernel_37864\\732382371.py:2: FutureWarning: \n", + "\n", + "Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.\n", + "\n", + " sns.boxplot(x='rating', y='Rentals', data=film_rentals, palette='Set2')\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAq4AAAIjCAYAAADC0ZkAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAABTdklEQVR4nO3deXhTVf7H8U+6pXRlaUtJ2couS0FhxCqyK6AiKKKIIy0C4gCyCwIuwIiIgICyDDMiRQR1YBBGHFZlGUVwRCsyIgIiKmXfWoq00J7fH07zI7SFtiRNL7xfz5MH7rk3936Tk6af3pycazPGGAEAAAAlnI+3CwAAAAAKguAKAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKeJHNZtPYsWO9XYaL//znP7r99tsVHBwsm82m5ORkb5dUaD/99JNsNpumTJni7VIK5OzZs+rdu7eio6Nls9k0ePBgb5fkMYmJiapateo178dqfVxQY8eOlc1m83YZQIlFcMV1KSkpSTabzeUWFRWlVq1aadWqVd4u75p99913Gjt2rH766Se37vfChQvq2rWrTp48qWnTpmnhwoWqUqVKnttu3LjR+dxu37491/rExESFhIS4tb7r1csvv6ykpCT96U9/0sKFC/X444/nu23VqlVdXtfBwcG69dZb9fbbb3u8Tk+97kqyy99L/Pz8FBMTo8TERB08eLBI+zx37pzGjh2rjRs3urfYIrr0Z/lqN8Db/LxdAOBJ48ePV2xsrIwxOnLkiJKSknTPPffoww8/1H333eft8orsu+++07hx49SyZUu3nL3KsW/fPh04cEB/+9vf1Lt37wLfb+zYsfrwww/dVseN5pNPPtFtt92mF198sUDbN2rUSMOGDZMkHTp0SG+++aYSEhKUkZGhPn36eKxOT73urCDnveT8+fPaunWrkpKS9Omnn2rnzp0KDAws1L7OnTuncePGSZJatmzpsu65557Ts88+666yC+Smm27SwoULXdpGjRqlkJAQjRkzplhrAa6G4IrrWocOHdSkSRPncq9evVS+fHm9++67lg6unnL06FFJUunSpQt8n0aNGmnlypX66quvdMstt3iospIpPT1dwcHB17yfo0ePqm7dugXePiYmRn/84x+dy4mJiapWrZqmTZvm0eB6I7v0vaR3796KiIjQpEmT9M9//lMPP/yw247j5+cnP7/i/dVcvnx5l9eTJL3yyiuKiIjI1Q54G0MFcEMpXbq0SpUqlesXQ3p6uoYNG6ZKlSrJbrerdu3amjJliowxkqTffvtNderUUZ06dfTbb78573fy5ElVqFBBt99+u7KysiT9/0fkP/74o9q1a6fg4GA5HA6NHz/eub8r+frrr9WhQweFhYUpJCREbdq00datW53rk5KS1LVrV0lSq1atnB/hXe1jx08++UR33nmngoODVbp0aXXq1Em7du1yrk9MTFSLFi0kSV27dpXNZst1NigvTz/9tMqUKVOgsbr5jemtWrWqEhMTncs5H89++umnGjhwoCIjI1W6dGn17dtXmZmZOn36tHr06KEyZcqoTJkyGjFiRL7P7bRp01SlShWVKlVKLVq00M6dO3Nt8/333+uhhx5S2bJlFRgYqCZNmuif//ynyzY5NW3atEn9+vVTVFSUKlaseMXHe/ToUecfS4GBgWrYsKEWLFjgXJ/zEe3+/fv10UcfOfuysB/FR0ZGqk6dOtq3b59Le3Z2tqZPn6569eopMDBQ5cuXV9++fXXq1CmX7apWrar77rtPn376qW699VYFBgaqWrVqLsMPrva6W7Fihe699145HA7Z7XZVr15df/7zn50/F1fy3nvvqXHjxgoNDVVYWJgaNGigGTNmFPjxX6mP58+fL5vNpq+//jrX/V5++WX5+voW6SP/O++8U5JcnvPMzEy98MILaty4scLDwxUcHKw777xTGzZscG7z008/KTIyUpI0btw45/OY83OR1xhXm82mAQMGaPny5apfv77sdrvq1aun1atX56pr48aNatKkiQIDA1W9enXNnTv3msfNGmNUtWpVderUKde68+fPKzw8XH379nUe32az6f3339fo0aMVHR2t4OBg3X///frll19y3X/btm1q3769wsPDFRQUpBYtWuizzz4rcq24ARjgOjR//nwjyaxfv94cO3bMHD161OzcudP07dvX+Pj4mLVr1zq3zc7ONq1btzY2m8307t3bzJw503Ts2NFIMoMHD3Zut3XrVuPr62uGDBnibOvWrZspVaqU2b17t7MtISHBBAYGmpo1a5rHH3/czJw509x3331Gknn++edd6pRkXnzxRefyzp07TXBwsKlQoYL585//bF555RUTGxtr7Ha72bp1qzHGmH379pmBAwcaSWb06NFm4cKFZuHChebw4cP5Ph/r1q0zfn5+platWubVV18148aNMxEREaZMmTJm//79xhhjtmzZYkaPHm0kmYEDB5qFCxe6PE+X27Bhg5FklixZYsaPH28kme3bt7s8D8HBwVd8vDmqVKliEhISnMs5/deoUSPTvn17M2vWLPP4448bSWbEiBGmWbNmpnv37mb27NnO53bBggXO++/fv99IMg0aNDBVq1Y1kyZNMuPGjTNly5Y1kZGRLs/Vzp07TXh4uKlbt66ZNGmSmTlzpmnevLmx2Wxm2bJluWqqW7euadGihXnjjTfMK6+8ku/zc+7cOXPTTTcZf39/M2TIEPP666+bO++800gy06dPN8YYc/jwYbNw4UITERFhGjVq5OzLs2fP5rvfKlWqmHvvvdel7cKFCyY6OtqUL1/epb13797Gz8/P9OnTx/zlL38xI0eONMHBweYPf/iDyczMdNln7dq1Tfny5c3o0aPNzJkzzS233GJsNpvZuXOnMebqr7vOnTubhx9+2EyePNnMmTPHdO3a1Ugyw4cPd6kpISHBVKlSxbm8du1aI8m0adPGzJo1y8yaNcsMGDDAdO3aNd/nwJiC93FqaqopVaqUGTZsWK591K1b17Ru3fqKx8np9//85z8u7TNnzjSSzJw5c5xtx44dMxUqVDBDhw41c+bMMa+++qqpXbu28ff3N19//bUxxpizZ8+aOXPmGEnmgQcecD6P33zzjTHGmBdffNFc/qtZkmnYsKHzfWH69OmmWrVqJigoyBw/fty53VdffWXsdrupWrWqeeWVV8yECROMw+EwDRs2zLXPq6lXr55p0aKFc3nMmDHG39/fnDhxwmW7v//970aS2bx5szHm/98XGjRoYOLi4sxrr71mnn32WRMYGGhq1aplzp0757zvxx9/bAICAkx8fLyZOnWqmTZtmomLizMBAQFm27ZthaoXNw6CK65LOb9sLr/Z7XaTlJTksu3y5cuNJPPSSy+5tD/00EPGZrOZvXv3OttGjRplfHx8zObNm82SJUtcQkiOhIQEI8k8/fTTzrbs7Gxz7733moCAAHPs2DFn++VBrnPnziYgIMDs27fP2ZaSkmJCQ0NN8+bNnW05x96wYUOBno9GjRqZqKgol18633zzjfHx8TE9evRwtl0aRq/m0m1Pnz5t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TZkyxXkS4VLX8rOH6xtnXHFdW7VqlfMM19GjR7V48WLt2bNHzz77rDMEduzYUa1atdKYMWP0008/qWHDhlq7dq1WrFihwYMHO88MvPTSS0pOTtbHH3+s0NBQxcXF6YUXXtBzzz2nhx56yCUABgYGavXq1UpISFDTpk21atUqffTRRxo9enSuj2gv9dJLL2ndunVq1qyZ+vXrJz8/P82dO1cZGRl69dVXnds1atRIvr6+mjRpks6cOSO73a7WrVsrKioqz/1OnjxZHTp0UHx8vHr16qXffvtNb7zxhsLDw906JlX6fazrtGnT9M033+Q6k9u7d2899dRT6tKli+666y598803WrNmjSIiItxaQ44aNWqoWbNm+tOf/qSMjAxNnz5d5cqV04gRI5zbzJo1S82aNVODBg3Up08fVatWTUeOHNHnn3+uX3/9Vd98802Rjv3kk09q7ty5SkxM1Pbt21W1alUtXbrUeZaqoGMrC6pDhw6qX7++XnvtNfXv318tWrRQ3759NXHiRCUnJ+vuu++Wv7+/9uzZoyVLlmjGjBl66KGHCnWM/F53t99+u8qUKaOEhAQNHDhQNptNCxcuLNDH2L1799bJkyfVunVrVaxYUQcOHNAbb7yhRo0aOf+4vJKC9HGOHj16aPjw4ZLklon1n3nmGXXt2lVJSUl66qmndN9992nZsmV64IEHdO+992r//v36y1/+orp167qEs1KlSqlu3bp6//33VatWLZUtW1b169dX/fr1r6mesWPHau3atbrjjjv0pz/9yfkHef369fP8Q7Io7r33XpUrV05LlixRhw4d8n3PKVu2rJo1a6aePXvqyJEjmj59umrUqOG8QIaPj4/efPNNdejQQfXq1VPPnj0VExOjgwcPasOGDQoLC+NqfMibl2YzADwqr+mwAgMDTaNGjcycOXNcpl8xxpi0tDQzZMgQ43A4jL+/v6lZs6aZPHmyc7vt27cbPz8/lymujPl9+ps//OEPxuFwmFOnThlj/n8aqH379pm7777bBAUFmfLly5sXX3zRZToeY/KeHuqrr74y7dq1MyEhISYoKMi0atXKbNmyJddj/Nvf/maqVatmfH19CzQ11vr1680dd9xhSpUqZcLCwkzHjh3Nd99957JNUafDulzOlD6XT4eVlZVlRo4caSIiIkxQUJBp166d2bt3b77TYV0+d2bOfi+dUsyY3FNv5UyVNHnyZDN16lRTqVIlY7fbzZ133umcL/NS+/btMz169DDR0dHG39/fxMTEmPvuu88sXbr0qjVdyZEjR0zPnj1NRESECQgIMA0aNMhz+qXCToeV37ZJSUm5pnj661//aho3bmxKlSplQkNDTYMGDcyIESNMSkrKVffZokULlymRjMn/dffZZ5+Z2267zZQqVco4HA4zYsQIs2bNmlyvzcunw1q6dKm5++67TVRUlAkICDCVK1c2ffv2NYcOHbri81DYPjbGmEOHDhlfX19Tq1atK+77Ulfq96ysLFO9enVTvXp1c/HiRZOdnW1efvllU6VKFWO3283NN99sVq5cmesxG/P7vMmNGzc2AQEBLu8D+U2HdelUZzku/7kx5ve5UW+++WYTEBBgqlevbt58800zbNgwExgYWODHbEzu6bAu1a9fPyPJLF68ONe6nPeFd99914waNcpERUWZUqVKmXvvvdccOHAg1/Zff/21efDBB025cuWM3W43VapUMQ8//LD5+OOPC1Uvbhw2Y4pxZDdwA0hMTNTSpUvz/PgLgPccP35cFSpU0AsvvKDnn3/e2+UUm86dO+u///1vnuOBi2LIkCGaN2+eDh8+7Bz2kGPjxo1q1aqVlixZUugz+kBBMMYVAHBDSEpKUlZWVp7TN10vLr0ktfT7l6T+9a9/FejyzQVx/vx5vfPOO+rSpUuu0AoUB8a4AgCua5988om+++47TZgwQZ07d853Zo/rQbVq1ZSYmKhq1arpwIEDmjNnjgICAvIc81sYR48e1fr167V06VKdOHFCgwYNclPFQOEQXAEA17Xx48dry5YtuuOOO/TGG294uxyPat++vd59910dPnxYdrtd8fHxevnll/O8UENhfPfdd3rssccUFRWl119/Pd+5VwFPY4wrAAAALIExrgAAALAEgisAAAAs4bof45qdna2UlBSFhoZ65DJ7AAAAuDbGGKWlpcnhcLhcJvty131wTUlJcV7fHQAAACXXL7/8oooVK+a7/roPrjmXVfzll1+cl/gEAABAyZGamqpKlSpd9XLY131wzRkeEBYWRnAFAAAowa42rNOrX86aM2eO4uLinKEyPj5eq1atcq5v2bKlbDaby+2pp57yYsUAAADwFq+eca1YsaJeeeUV1axZU8YYLViwQJ06ddLXX3+tevXqSZL69Omj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xx57TIGBgUW6P4rfF198oeTkZNWrV08ZGRneLgdulvN+vG3bNiUkJKhnz56MP8+Dn7cLwLVp1aqV5syZo4CAADkcDvn5/d6lNWvW1O7du122jYyMVGRkpKKiorxRKvJwrf3XpEkTJScnO5fLly9fqOMHBwerRo0aqlGjhm677TbVrFlT8+bN06hRo4r+oHBVzZs3V7t27TRq1CglJiY622vVqqXvv//+ive91j6Xfg+/u3fv1vvvv1/o+8LzatSoIZvNlus9oFq1apJ+H1KE60/O+7H0+x+WDRs21Lx58xjOcxnOuFpczgu9cuXKztAjSY8++qh2796tFStWeLE6XM219l+pUqWcwbNGjRoKDQ29pnqys7M5k1NMXnnlFX344Yf6/PPPnW3du3fXDz/8kGe/G2N05swZt/T5vHnz1LhxY8Yzl1DlypXTXXfdpZkzZyo9Pd3b5cALfHx8NHr0aD333HP67bffvF1OiUJwvU5169ZNDz30kLp166bx48dr27Zt+umnn7Rp0ya9//778vX19XaJuIJr7b+zZ88qOTnZeWZu//79Sk5O1s8//yzp96mTRo8era1bt+rAgQPavn27nnjiCR08eFBdu3b19MODpAYNGuixxx7T66+/7mx7+OGH9cgjj+jRRx/Vyy+/rC+//FIHDhzQypUr1bZtW23YsCHf/V2tz3OkpqZqyZIl6t27t0ceF9xj9uzZunjxopo0aaL3339fu3bt0u7du/XOO+/o+++/5z38BtC1a1f5+vpecYq7G5JX5zTANclr+oxLZWVlmb/85S+madOmJjg42AQEBJhq1aqZPn36mO+++674CkWePNl/GzZsMJJy3RISEowxxvz222/mgQceMA6HwwQEBJgKFSqY+++/33zxxRdufIS4VF79vX//fhMQEGAufSvOysoyc+bMMX/4wx9MUFCQCQsLM40bNzYzZsww586dy3f/V+vzHHPnzjWlSpUq8NRa8J6UlBQzYMAAExsba/z9/U1ISIi59dZbzeTJk016erq3y4Mb5ff7YOLEiSYyMjLfadFuRDZjCvBtAAAAAMDLGCoAAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAMVs48aNstlsOn36tLdLAQBLIbgCQB4SExNls9lks9nk7++v2NhYjRgxQufPny/Uflq2bKnBgwe7tN1+++06dOiQwsPD3Vixq0vrz+tWtWpVjx0bADyF4AoA+Wjfvr0OHTqkH3/8UdOmTdPcuXP14osvXvN+AwICFB0dLZvN5oYq8zZjxgwdOnTIeZOk+fPnO5f/85//eOzYAOApBFcAyIfdbld0dLQqVaqkzp07q23btlq3bp1z/YkTJ/Too48qJiZGQUFBatCggd59913n+sTERG3atEkzZsxwnun86aefcg0VSEpKUunSpbVmzRrddNNNCgkJcYbmHBcvXtTAgQNVunRplStXTiNHjlRCQoI6d+6cZ+3h4eGKjo523iSpdOnSio6O1ujRo9WzZ0+X7S9cuKCoqCjNmzdP0u9nigcMGKABAwYoPDxcERERev7552WMcd4nIyNDw4cPV0xMjIKDg9W0aVNt3LjxWp5yALgigisAFMDOnTu1ZcsWBQQEONvOnz+vxo0b66OPPtLOnTv15JNP6vHHH9cXX3wh6feznvHx8erTp4/zTGelSpXy3P+5c+c0ZcoULVy4UJs3b9bPP/+s4cOHO9dPmjRJixYt0vz58/XZZ58pNTVVy5cvL9Jj6d27t1avXu0SjFeuXKlz587pkUcecbYtWLBAfn5++uKLLzRjxgy99tprevPNN53rBwwYoM8//1zvvfeeduzYoa5du6p9+/bas2dPkeoCgKsyAIBcEhISjK+vrwkODjZ2u91IMj4+Pmbp0qVXvN+9995rhg0b5lxu0aKFGTRokMs2GzZsMJLMqVOnjDHGzJ8/30gye/fudW4za9YsU758eedy+fLlzeTJk53LFy9eNJUrVzadOnUq0OORZD744APnct26dc2kSZOcyx07djSJiYkudd90000mOzvb2TZy5Ehz0003GWOMOXDggPH19TUHDx50OU6bNm3MqFGjClQTABSWn3djMwCUXK1atdKcOXOUnp6uadOmyc/PT126dHGuz8rK0ssvv6y///3vOnjwoDIzM5WRkaGgoKBCHysoKEjVq1d3LleoUEFHjx6VJJ05c0ZHjhzRrbfe6lzv6+urxo0bKzs7u0iPrXfv3vrrX/+qESNG6MiRI1q1apU++eQTl21uu+02l3G48fHxmjp1qrKysvTtt98qKytLtWrVcrlPRkaGypUrV6SaAOBqCK4AkI/g4GDVqFFDkvTWW2+pYcOGmjdvnnr16iVJmjx5smbMmKHp06erQYMGCg4O1uDBg5WZmVnoY/n7+7ss22w2l/Gk7tajRw89++yz+vzzz7VlyxbFxsbqzjvvLPD9z549K19fX23fvl2+vr4u60JCQtxdLgBIYowrABSIj4+PRo8ereeee06//fabJOmzzz5Tp06d9Mc//lENGzZUtWrV9MMPP7jcLyAgQFlZWdd07PDwcJUvX95lJoCsrCx99dVXRd5nuXLl1LlzZ82fP19JSUm5vqwlSdu2bXNZ3rp1q2rWrClfX1/dfPPNysrK0tGjR1WjRg2XW86XwQDA3QiuAFBAXbt2la+vr2bNmiVJqlmzptatW6ctW7Zo165d6tu3r44cOeJyn6pVq2rbtm366aefdPz48SJ/tP/0009r4sSJWrFihXbv3q1Bgwbp1KlT1zSlVu/evbVgwQLt2rVLCQkJudb//PPPGjp0qHbv3q13331Xb7zxhgYNGiRJqlWrlh577DH16NFDy5Yt0/79+/XFF19o4sSJ+uijj4pcEwBcCcEVAArIz89PAwYM0Kuvvqr09HQ999xzuuWWW9SuXTu1bNlS0dHRuaanGj58uHx9fVW3bl1FRkbq559/LtKxR44cqUcffVQ9evRQfHy8QkJC1K5dOwUGBhb58bRt21YVKlRQu3bt5HA4cq3v0aOHfvvtN916663q37+/Bg0apCeffNK5fv78+erRo4eGDRum2rVrq3PnzvrPf/6jypUrF7kmALgSm/HkICoAgEdkZ2frpptu0sMPP6w///nPRdrH2bNnFRMTo/nz5+vBBx90WdeyZUs1atRI06dPd0O1AOAefDkLACzgwIEDWrt2rVq0aKGMjAzNnDlT+/fvV/fu3Qu9r+zsbB0/flxTp05V6dKldf/993ugYgBwP4IrAFiAj4+PkpKSNHz4cBljVL9+fa1fv1433XRToff1888/KzY2VhUrVlRSUpL8/PhVAMAaGCoAAAAAS+DLWQAAALAEgisAAAAsgeAKAAAASyC4AgAAwBIIrgAAALAEgisAAAAsgeAKAAAASyC4AgAAwBL+D1V2z0A5YAI9AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(8, 6))\n", + "sns.boxplot(x='rating', y='Rentals', data=film_rentals, palette='Set2')\n", + "\n", + "plt.xlabel('Rating Type')\n", + "plt.ylabel('Number of Rentals')\n", + "plt.title('Boxplot of Number of Rentals by Rating Type')\n", + "\n", + "plt.show()" ] }, { @@ -1385,6 +1575,16 @@ "source": [ "# Visualización con Plotly" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Streamlit \n", + "\n", + "https://github.com/WanYin0704/Streamlit-Data-Visualization \n", + "https://github.com/ZangDim/StreamlyticsApp " + ] } ], "metadata": {