diff --git a/tarealab.ipynb b/tarealab.ipynb new file mode 100644 index 0000000..486a2ed --- /dev/null +++ b/tarealab.ipynb @@ -0,0 +1,1128 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "id": "c8b965a8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: mysql in c:\\users\\tachi\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (0.0.3)\n", + "Requirement already satisfied: mysqlclient in c:\\users\\tachi\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from mysql) (2.2.7)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 24.3.1 -> 25.3\n", + "[notice] To update, run: python.exe -m pip install --upgrade pip\n" + ] + } + ], + "source": [ + "pip install mysql" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "74729439", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import mysql.connector\n", + "from sqlalchemy import create_engine\n", + "\n", + "import getpass # To get the password without showing the input\n", + "password = getpass.getpass()" + ] + }, + { + "cell_type": "markdown", + "id": "80e39be6", + "metadata": {}, + "source": [ + "para las claves foraneas" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "04553015", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: cryptography in c:\\users\\tachi\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (46.0.4)\n", + "Requirement already satisfied: cffi>=2.0.0 in c:\\users\\tachi\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from cryptography) (2.0.0)\n", + "Requirement already satisfied: pycparser in c:\\users\\tachi\\appdata\\local\\programs\\python\\python313\\lib\\site-packages (from cffi>=2.0.0->cryptography) (2.23)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "[notice] A new release of pip is available: 24.3.1 -> 25.3\n", + "[notice] To update, run: python.exe -m pip install --upgrade pip\n" + ] + } + ], + "source": [ + "%pip install cryptography\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "38aa4028", + "metadata": {}, + "outputs": [], + "source": [ + "from sqlalchemy import create_engine\n", + "\n", + "\n", + "str_conn = \"mysql+pymysql://root:\"+password+\"@localhost:3306/sakila\"\n", + "engine = create_engine(str_conn)\n" + ] + }, + { + "cell_type": "markdown", + "id": "14aa045f", + "metadata": {}, + "source": [ + "## ejercicio 2" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "91e87de7", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "def rental_month(engine,month,year):\n", + "\n", + " query=\"SELECT * FROM rental WHERE MONTH(rental_date) = %s AND YEAR(rental_date) = %s\"\n", + " df=pd.read_sql(query, engine, params=(month, year))\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "d0911b7d", + "metadata": {}, + "outputs": [ + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rental_idrental_dateinventory_idcustomer_idreturn_datestaff_idlast_update
011582005-06-14 22:53:3316324162005-06-18 21:37:3322006-02-15 21:30:53
111592005-06-14 22:55:1343955162005-06-17 02:11:1312006-02-15 21:30:53
211602005-06-14 23:00:3427952392005-06-18 01:58:3422006-02-15 21:30:53
311612005-06-14 23:07:0816902852005-06-21 17:12:0812006-02-15 21:30:53
411622005-06-14 23:09:389873102005-06-23 22:00:3812006-02-15 21:30:53
\n", + "
" + ], + "text/plain": [ + " rental_id rental_date inventory_id customer_id \\\n", + "0 1158 2005-06-14 22:53:33 1632 416 \n", + "1 1159 2005-06-14 22:55:13 4395 516 \n", + "2 1160 2005-06-14 23:00:34 2795 239 \n", + "3 1161 2005-06-14 23:07:08 1690 285 \n", + "4 1162 2005-06-14 23:09:38 987 310 \n", + "\n", + " return_date staff_id last_update \n", + "0 2005-06-18 21:37:33 2 2006-02-15 21:30:53 \n", + "1 2005-06-17 02:11:13 1 2006-02-15 21:30:53 \n", + "2 2005-06-18 01:58:34 2 2006-02-15 21:30:53 \n", + "3 2005-06-21 17:12:08 1 2006-02-15 21:30:53 \n", + "4 2005-06-23 22:00:38 1 2006-02-15 21:30:53 " + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfrental=rental_month(engine,6,2005)\n", + "dfrental.head()" + ] + }, + { + "cell_type": "markdown", + "id": "b5879c23", + "metadata": {}, + "source": [ + "## ejercicio 3" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "7042469a", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def rental_count_month(df, month, year):\n", + " df_counts = df.groupby('customer_id')[['rental_id']].count().reset_index()\n", + " new_col_name = f\"alquileres_{month:02d}_{year}\"\n", + " df_counts.columns = ['customer_id', new_col_name]\n", + " \n", + " return df_counts\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "c73a6a01", + "metadata": {}, + "outputs": [], + "source": [ + "df_rental_count_month=rental_count_month(dfrental,5,2005)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "02a3cc87", + "metadata": {}, + "outputs": [ + { + "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", + "
customer_idalquileres_05_2005
012
121
232
353
463
\n", + "
" + ], + "text/plain": [ + " customer_id alquileres_05_2005\n", + "0 1 2\n", + "1 2 1\n", + "2 3 2\n", + "3 5 3\n", + "4 6 3" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_rental_count_month.head()" + ] + }, + { + "cell_type": "markdown", + "id": "5223470b", + "metadata": {}, + "source": [ + "## ejercicio 4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22d5bc10", + "metadata": {}, + "outputs": [], + "source": [ + "def compare_rentals(df1,df2):\n", + " df_merge=pd.merge(df1,df2,on='customer_id',how='inner')\n", + " \n", + " return df_merge\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "3bc96ad8", + "metadata": {}, + "outputs": [ + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
customer_idalquileres_05_2005rental_idrental_dateinventory_idreturn_datestaff_idlast_update
01211852005-06-15 00:54:1227852005-06-23 02:42:1222006-02-15 21:30:53
11214222005-06-15 18:02:5310212005-06-19 15:54:5322006-02-15 21:30:53
21214762005-06-15 21:08:4614072005-06-25 02:26:4612006-02-15 21:30:53
31217252005-06-16 15:18:577262005-06-17 21:05:5712006-02-15 21:30:53
41223082005-06-18 08:41:481972005-06-22 03:36:4822006-02-15 21:30:53
\n", + "
" + ], + "text/plain": [ + " customer_id alquileres_05_2005 rental_id rental_date \\\n", + "0 1 2 1185 2005-06-15 00:54:12 \n", + "1 1 2 1422 2005-06-15 18:02:53 \n", + "2 1 2 1476 2005-06-15 21:08:46 \n", + "3 1 2 1725 2005-06-16 15:18:57 \n", + "4 1 2 2308 2005-06-18 08:41:48 \n", + "\n", + " inventory_id return_date staff_id last_update \n", + "0 2785 2005-06-23 02:42:12 2 2006-02-15 21:30:53 \n", + "1 1021 2005-06-19 15:54:53 2 2006-02-15 21:30:53 \n", + "2 1407 2005-06-25 02:26:46 1 2006-02-15 21:30:53 \n", + "3 726 2005-06-17 21:05:57 1 2006-02-15 21:30:53 \n", + "4 197 2005-06-22 03:36:48 2 2006-02-15 21:30:53 " + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_final=compare_rentals(df_rental_count_month,dfrental)\n", + "df_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0b508da8", + "metadata": {}, + "outputs": [ + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rental_idrental_dateinventory_idcustomer_idreturn_datestaff_idlast_update
011582005-06-14 22:53:3316324162005-06-18 21:37:3322006-02-15 21:30:53
111592005-06-14 22:55:1343955162005-06-17 02:11:1312006-02-15 21:30:53
211602005-06-14 23:00:3427952392005-06-18 01:58:3422006-02-15 21:30:53
311612005-06-14 23:07:0816902852005-06-21 17:12:0812006-02-15 21:30:53
411622005-06-14 23:09:389873102005-06-23 22:00:3812006-02-15 21:30:53
\n", + "
" + ], + "text/plain": [ + " rental_id rental_date inventory_id customer_id \\\n", + "0 1158 2005-06-14 22:53:33 1632 416 \n", + "1 1159 2005-06-14 22:55:13 4395 516 \n", + "2 1160 2005-06-14 23:00:34 2795 239 \n", + "3 1161 2005-06-14 23:07:08 1690 285 \n", + "4 1162 2005-06-14 23:09:38 987 310 \n", + "\n", + " return_date staff_id last_update \n", + "0 2005-06-18 21:37:33 2 2006-02-15 21:30:53 \n", + "1 2005-06-17 02:11:13 1 2006-02-15 21:30:53 \n", + "2 2005-06-18 01:58:34 2 2006-02-15 21:30:53 \n", + "3 2005-06-21 17:12:08 1 2006-02-15 21:30:53 \n", + "4 2005-06-23 22:00:38 1 2006-02-15 21:30:53 " + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_junio=rental_month(engine,6,2005)\n", + "df_junio.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "82f14fe4", + "metadata": {}, + "outputs": [ + { + "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", + "
customer_idalquileres_06_2005
017
121
234
346
455
\n", + "
" + ], + "text/plain": [ + " customer_id alquileres_06_2005\n", + "0 1 7\n", + "1 2 1\n", + "2 3 4\n", + "3 4 6\n", + "4 5 5" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_contar=rental_count_month(df_junio,6,2005)\n", + "df_contar.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "fea31b55", + "metadata": {}, + "outputs": [ + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rental_idrental_dateinventory_idcustomer_idreturn_datestaff_idlast_updatealquileres_06_2005
011582005-06-14 22:53:3316324162005-06-18 21:37:3322006-02-15 21:30:535
111592005-06-14 22:55:1343955162005-06-17 02:11:1312006-02-15 21:30:536
211602005-06-14 23:00:3427952392005-06-18 01:58:3422006-02-15 21:30:535
311612005-06-14 23:07:0816902852005-06-21 17:12:0812006-02-15 21:30:533
411622005-06-14 23:09:389873102005-06-23 22:00:3812006-02-15 21:30:536
\n", + "
" + ], + "text/plain": [ + " rental_id rental_date inventory_id customer_id \\\n", + "0 1158 2005-06-14 22:53:33 1632 416 \n", + "1 1159 2005-06-14 22:55:13 4395 516 \n", + "2 1160 2005-06-14 23:00:34 2795 239 \n", + "3 1161 2005-06-14 23:07:08 1690 285 \n", + "4 1162 2005-06-14 23:09:38 987 310 \n", + "\n", + " return_date staff_id last_update alquileres_06_2005 \n", + "0 2005-06-18 21:37:33 2 2006-02-15 21:30:53 5 \n", + "1 2005-06-17 02:11:13 1 2006-02-15 21:30:53 6 \n", + "2 2005-06-18 01:58:34 2 2006-02-15 21:30:53 5 \n", + "3 2005-06-21 17:12:08 1 2006-02-15 21:30:53 3 \n", + "4 2005-06-23 22:00:38 1 2006-02-15 21:30:53 6 " + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_meses=compare_rentals(df_junio,df_contar)\n", + "df_meses.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "13725788", + "metadata": {}, + "outputs": [ + { + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
customer_idalquileres_05_2005rental_idrental_dateinventory_idreturn_datestaff_idlast_updatealquileres_06_2005
01211852005-06-15 00:54:1227852005-06-23 02:42:1222006-02-15 21:30:537
11214222005-06-15 18:02:5310212005-06-19 15:54:5322006-02-15 21:30:537
21214762005-06-15 21:08:4614072005-06-25 02:26:4612006-02-15 21:30:537
31217252005-06-16 15:18:577262005-06-17 21:05:5712006-02-15 21:30:537
41223082005-06-18 08:41:481972005-06-22 03:36:4822006-02-15 21:30:537
\n", + "
" + ], + "text/plain": [ + " customer_id alquileres_05_2005 rental_id rental_date \\\n", + "0 1 2 1185 2005-06-15 00:54:12 \n", + "1 1 2 1422 2005-06-15 18:02:53 \n", + "2 1 2 1476 2005-06-15 21:08:46 \n", + "3 1 2 1725 2005-06-16 15:18:57 \n", + "4 1 2 2308 2005-06-18 08:41:48 \n", + "\n", + " inventory_id return_date staff_id last_update \\\n", + "0 2785 2005-06-23 02:42:12 2 2006-02-15 21:30:53 \n", + "1 1021 2005-06-19 15:54:53 2 2006-02-15 21:30:53 \n", + "2 1407 2005-06-25 02:26:46 1 2006-02-15 21:30:53 \n", + "3 726 2005-06-17 21:05:57 1 2006-02-15 21:30:53 \n", + "4 197 2005-06-22 03:36:48 2 2006-02-15 21:30:53 \n", + "\n", + " alquileres_06_2005 \n", + "0 7 \n", + "1 7 \n", + "2 7 \n", + "3 7 \n", + "4 7 " + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfsolucion=compare_rentals(df_final,df_contar)\n", + "dfsolucion.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "9e3cec2c", + "metadata": {}, + "outputs": [], + "source": [ + "dfsolucion['diferencia']=dfsolucion['alquileres_06_2005']-dfsolucion['alquileres_05_2005']" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "a6015f2d", + "metadata": {}, + "outputs": [ + { + "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", + " \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", + "
customer_idalquileres_05_2005rental_idrental_dateinventory_idreturn_datestaff_idlast_updatealquileres_06_2005diferencia
01211852005-06-15 00:54:1227852005-06-23 02:42:1222006-02-15 21:30:5375
11214222005-06-15 18:02:5310212005-06-19 15:54:5322006-02-15 21:30:5375
21214762005-06-15 21:08:4614072005-06-25 02:26:4612006-02-15 21:30:5375
31217252005-06-16 15:18:577262005-06-17 21:05:5712006-02-15 21:30:5375
41223082005-06-18 08:41:481972005-06-22 03:36:4822006-02-15 21:30:5375
\n", + "
" + ], + "text/plain": [ + " customer_id alquileres_05_2005 rental_id rental_date \\\n", + "0 1 2 1185 2005-06-15 00:54:12 \n", + "1 1 2 1422 2005-06-15 18:02:53 \n", + "2 1 2 1476 2005-06-15 21:08:46 \n", + "3 1 2 1725 2005-06-16 15:18:57 \n", + "4 1 2 2308 2005-06-18 08:41:48 \n", + "\n", + " inventory_id return_date staff_id last_update \\\n", + "0 2785 2005-06-23 02:42:12 2 2006-02-15 21:30:53 \n", + "1 1021 2005-06-19 15:54:53 2 2006-02-15 21:30:53 \n", + "2 1407 2005-06-25 02:26:46 1 2006-02-15 21:30:53 \n", + "3 726 2005-06-17 21:05:57 1 2006-02-15 21:30:53 \n", + "4 197 2005-06-22 03:36:48 2 2006-02-15 21:30:53 \n", + "\n", + " alquileres_06_2005 diferencia \n", + "0 7 5 \n", + "1 7 5 \n", + "2 7 5 \n", + "3 7 5 \n", + "4 7 5 " + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfsolucion.head()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}