{ "cells": [ { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "# Concatenacióny fusión de dataframes (concat() y append()) --- 11:16 min\n", "\n", "* 11:16 min | Última modificación: Octubre 6, 2021 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La función concat() permite la concatenación de dataframes y series a lo largo de un eje." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "pd.set_option(\"display.notebook_repr_html\", False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![diagram-concat](images/diagrama-concat.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concatenación sin campos clave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Creación del dataframe 1**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing /tmp/dataset_1.csv\n" ] } ], "source": [ "%%writefile /tmp/dataset_1.csv\n", "name,location\n", "Omar Y. Fletcher,6833 Mollis. Rd.\n", "Buffy W. Vincent,\"P.O. Box 345, 8390 Ante Avenue\"\n", "Mira N. Franklin,\"P.O. Box 445, 323 Cursus Rd.\"\n", "Ferris Q. Le,Ap #791-3809 Eu Street\n", "Michael I. Gray,6715 Diam. Rd.\n", "Alan T. Mullins,512-3640 Nisl Rd.\n", "Morgan W. Zamora,416-6030 Vivamus Road\n", "Lilah O. Morrison,3859 Mauris Ave\n", "Chantale Z. Kelley,3433 Arcu. Rd.\n", "Randall Q. Mcclure,Ap #584-7470 Nibh. Ave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Creación del dataframe 2**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing /tmp/dataset_2.csv\n" ] } ], "source": [ "%%writefile /tmp/dataset_2.csv\n", "name,location\n", "Baker C. Hurst,249-6250 Velit. Rd.\n", "Bevis W. Molina,\"P.O. Box 935, 1521 At, St.\"\n", "Martina B. Schroeder,689-7600 Mi St.\n", "Kylie G. Bailey,1430 Diam. Road\n", "Steel K. Glover,\"757-681 Et, Av.\"\n", "Lucas M. Suarez,699-9329 Magna Rd.\n", "Anastasia Q. Mccray,\"P.O. Box 780, 4487 Lobortis, St.\"\n", "Germaine Q. Henson,589-4921 Duis Ave\n", "Wilma U. Mcfadden,6917 Dictum Rd.\n", "Merritt Q. Martinez,\"P.O. Box 469, 7833 Euismod Av.\"" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "**Creación del dataframe 3**" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing /tmp/bonus.csv\n" ] } ], "source": [ "%%writefile /tmp/bonus.csv\n", "bonus\n", "279\n", "138\n", "227\n", "160\n", "267\n", "231\n", "169\n", "263\n", "233\n", "292\n", "208\n", "247\n", "240\n", "161\n", "248\n", "216\n", "291\n", "215\n", "463\n", "790" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Concatenación de los dataframes 1 y 2**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " name location\n", "0 Omar Y. Fletcher 6833 Mollis. Rd.\n", "1 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue\n", "2 Mira N. Franklin P.O. Box 445, 323 Cursus Rd.\n", "3 Ferris Q. Le Ap #791-3809 Eu Street\n", "4 Michael I. Gray 6715 Diam. Rd.\n", "5 Alan T. Mullins 512-3640 Nisl Rd.\n", "6 Morgan W. Zamora 416-6030 Vivamus Road\n", "7 Lilah O. Morrison 3859 Mauris Ave\n", "8 Chantale Z. Kelley 3433 Arcu. Rd.\n", "9 Randall Q. Mcclure Ap #584-7470 Nibh. Ave\n", "0 Baker C. Hurst 249-6250 Velit. Rd.\n", "1 Bevis W. Molina P.O. Box 935, 1521 At, St.\n", "2 Martina B. Schroeder 689-7600 Mi St.\n", "3 Kylie G. Bailey 1430 Diam. Road\n", "4 Steel K. Glover 757-681 Et, Av.\n", "5 Lucas M. Suarez 699-9329 Magna Rd.\n", "6 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St.\n", "7 Germaine Q. Henson 589-4921 Duis Ave\n", "8 Wilma U. Mcfadden 6917 Dictum Rd.\n", "9 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av." ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Carga del dataset 1\n", "#\n", "dataset_1 = pd.read_csv(\"/tmp/dataset_1.csv\")\n", "\n", "#\n", "# Carga del dataset 2\n", "#\n", "dataset_2 = pd.read_csv(\"/tmp/dataset_2.csv\")\n", "\n", "#\n", "# Concat con valores por defecto\n", "#\n", "datasets_12 = pd.concat(\n", " objs=[\n", " dataset_1,\n", " dataset_2,\n", " ],\n", " #\n", " # axis= 0/index, 1/columns\n", " #\n", " axis=0,\n", " #\n", " # join={'inner', 'outer'}\n", " #\n", " join=\"outer\",\n", " #\n", " # ignore_index=bool\n", " #\n", " ignore_index=False,\n", " #\n", " # sort=bool\n", " # Ordena el otro eje si el join es 'outer'.\n", " # Se ignora cuando es 'inner'\n", " #\n", " sort=False,\n", ")\n", "\n", "#\n", "# Observe que hay numeros de fila repetidos (index)\n", "# ignore_index=False\n", "#\n", "datasets_12" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " name location\n", "0 Omar Y. Fletcher 6833 Mollis. Rd.\n", "1 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue\n", "2 Mira N. Franklin P.O. Box 445, 323 Cursus Rd.\n", "3 Ferris Q. Le Ap #791-3809 Eu Street\n", "4 Michael I. Gray 6715 Diam. Rd.\n", "5 Alan T. Mullins 512-3640 Nisl Rd.\n", "6 Morgan W. Zamora 416-6030 Vivamus Road\n", "7 Lilah O. Morrison 3859 Mauris Ave\n", "8 Chantale Z. Kelley 3433 Arcu. Rd.\n", "9 Randall Q. Mcclure Ap #584-7470 Nibh. Ave\n", "10 Baker C. Hurst 249-6250 Velit. Rd.\n", "11 Bevis W. Molina P.O. Box 935, 1521 At, St.\n", "12 Martina B. Schroeder 689-7600 Mi St.\n", "13 Kylie G. Bailey 1430 Diam. Road\n", "14 Steel K. Glover 757-681 Et, Av.\n", "15 Lucas M. Suarez 699-9329 Magna Rd.\n", "16 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St.\n", "17 Germaine Q. Henson 589-4921 Duis Ave\n", "18 Wilma U. Mcfadden 6917 Dictum Rd.\n", "19 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av." ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Se ingnora el índice\n", "#\n", "datasets_12 = pd.concat(\n", " objs=[\n", " dataset_1,\n", " dataset_2,\n", " ],\n", " ignore_index=True,\n", ")\n", "datasets_12" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " name location bonus\n", "0 Omar Y. Fletcher 6833 Mollis. Rd. 279\n", "1 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue 138\n", "2 Mira N. Franklin P.O. Box 445, 323 Cursus Rd. 227\n", "3 Ferris Q. Le Ap #791-3809 Eu Street 160\n", "4 Michael I. Gray 6715 Diam. Rd. 267\n", "5 Alan T. Mullins 512-3640 Nisl Rd. 231\n", "6 Morgan W. Zamora 416-6030 Vivamus Road 169\n", "7 Lilah O. Morrison 3859 Mauris Ave 263\n", "8 Chantale Z. Kelley 3433 Arcu. Rd. 233\n", "9 Randall Q. Mcclure Ap #584-7470 Nibh. Ave 292\n", "10 Baker C. Hurst 249-6250 Velit. Rd. 208\n", "11 Bevis W. Molina P.O. Box 935, 1521 At, St. 247\n", "12 Martina B. Schroeder 689-7600 Mi St. 240\n", "13 Kylie G. Bailey 1430 Diam. Road 161\n", "14 Steel K. Glover 757-681 Et, Av. 248\n", "15 Lucas M. Suarez 699-9329 Magna Rd. 216\n", "16 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St. 291\n", "17 Germaine Q. Henson 589-4921 Duis Ave 215\n", "18 Wilma U. Mcfadden 6917 Dictum Rd. 463\n", "19 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av. 790" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus = pd.read_csv(\"/tmp/bonus.csv\")\n", "\n", "#\n", "# Se requiere que los datasets tengan los mismos\n", "# indices en las filas.\n", "#\n", "dataset_full = pd.concat(\n", " [\n", " datasets_12,\n", " bonus,\n", " ],\n", " axis=1,\n", ")\n", "dataset_full" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concatenación usando un campo clave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Creación del primer dataframe.**" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting /tmp/dataset_1.csv\n" ] } ], "source": [ "%%writefile /tmp/dataset_1.csv\n", "clientId,name,location\n", "10,Omar Y. Fletcher,6833 Mollis. Rd.\n", "11,Buffy W. Vincent,\"P.O. Box 345, 8390 Ante Avenue\"\n", "12,Mira N. Franklin,\"P.O. Box 445, 323 Cursus Rd.\"\n", "13,Ferris Q. Le,Ap #791-3809 Eu Street\n", "14,Michael I. Gray,6715 Diam. Rd.\n", "15,Alan T. Mullins,512-3640 Nisl Rd.\n", "16,Morgan W. Zamora,416-6030 Vivamus Road\n", "17,Lilah O. Morrison,3859 Mauris Ave\n", "18,Chantale Z. Kelley,3433 Arcu. Rd.\n", "19,Randall Q. Mcclure,Ap #584-7470 Nibh. Ave" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Creación del segundo dataframe.**" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting /tmp/dataset_2.csv\n" ] } ], "source": [ "%%writefile /tmp/dataset_2.csv\n", "clientId,name,location\n", "20,Baker C. Hurst,249-6250 Velit. Rd.\n", "21,Bevis W. Molina,\"P.O. Box 935, 1521 At, St.\"\n", "22,Martina B. Schroeder,689-7600 Mi St.\n", "23,Kylie G. Bailey,1430 Diam. Road\n", "24,Steel K. Glover,\"757-681 Et, Av.\"\n", "25,Lucas M. Suarez,699-9329 Magna Rd.\n", "26,Anastasia Q. Mccray,\"P.O. Box 780, 4487 Lobortis, St.\"\n", "27,Germaine Q. Henson,589-4921 Duis Ave\n", "28,Wilma U. Mcfadden,6917 Dictum Rd.\n", "29,Merritt Q. Martinez,\"P.O. Box 469, 7833 Euismod Av.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Creación del tercer dataframe.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note que el campo `clientId` está en un orden diferente al de los archivos." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting /tmp/bonus.csv\n" ] } ], "source": [ "%%writefile /tmp/bonus.csv\n", "clientId, bonus\n", "28, 463\n", "29, 790\n", "11, 138\n", "12, 227\n", "15, 231\n", "24, 248\n", "25, 216\n", "26, 291\n", "10, 279\n", "13, 160\n", "14, 267\n", "27, 215\n", "16, 169\n", "17, 263\n", "18, 233\n", "19, 292\n", "20, 208\n", "21, 247\n", "22, 240\n", "23, 161" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Carga y concatenación de los dos primeros dataframes.**" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " name location\n", "clientId \n", "10 Omar Y. Fletcher 6833 Mollis. Rd.\n", "11 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue\n", "12 Mira N. Franklin P.O. Box 445, 323 Cursus Rd.\n", "13 Ferris Q. Le Ap #791-3809 Eu Street\n", "14 Michael I. Gray 6715 Diam. Rd.\n", "15 Alan T. Mullins 512-3640 Nisl Rd.\n", "16 Morgan W. Zamora 416-6030 Vivamus Road\n", "17 Lilah O. Morrison 3859 Mauris Ave\n", "18 Chantale Z. Kelley 3433 Arcu. Rd.\n", "19 Randall Q. Mcclure Ap #584-7470 Nibh. Ave\n", "20 Baker C. Hurst 249-6250 Velit. Rd.\n", "21 Bevis W. Molina P.O. Box 935, 1521 At, St.\n", "22 Martina B. Schroeder 689-7600 Mi St.\n", "23 Kylie G. Bailey 1430 Diam. Road\n", "24 Steel K. Glover 757-681 Et, Av.\n", "25 Lucas M. Suarez 699-9329 Magna Rd.\n", "26 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St.\n", "27 Germaine Q. Henson 589-4921 Duis Ave\n", "28 Wilma U. Mcfadden 6917 Dictum Rd.\n", "29 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av." ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_1 = pd.read_csv(\"/tmp/dataset_1.csv\")\n", "dataset_2 = pd.read_csv(\"/tmp/dataset_2.csv\")\n", "datasets_12 = pd.concat(\n", " [\n", " dataset_1,\n", " dataset_2,\n", " ],\n", " ignore_index=True,\n", ")\n", "\n", "#\n", "# Usa la columna clientId como índice de los\n", "# registros\n", "#\n", "datasets_12.set_index(\"clientId\", inplace=True)\n", "datasets_12" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Carga y concatenación del tercer dataframe.**" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " bonus\n", "clientId \n", "28 463\n", "29 790\n", "11 138\n", "12 227\n", "15 231\n", "24 248\n", "25 216\n", "26 291\n", "10 279\n", "13 160\n", "14 267\n", "27 215\n", "16 169\n", "17 263\n", "18 233\n", "19 292\n", "20 208\n", "21 247\n", "22 240\n", "23 161" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bonus = pd.read_csv(\"/tmp/bonus.csv\")\n", "bonus = bonus.set_index(\"clientId\")\n", "bonus" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " name location bonus\n", "clientId \n", "10 Omar Y. Fletcher 6833 Mollis. Rd. 279\n", "11 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue 138\n", "12 Mira N. Franklin P.O. Box 445, 323 Cursus Rd. 227\n", "13 Ferris Q. Le Ap #791-3809 Eu Street 160\n", "14 Michael I. Gray 6715 Diam. Rd. 267\n", "15 Alan T. Mullins 512-3640 Nisl Rd. 231\n", "16 Morgan W. Zamora 416-6030 Vivamus Road 169\n", "17 Lilah O. Morrison 3859 Mauris Ave 263\n", "18 Chantale Z. Kelley 3433 Arcu. Rd. 233\n", "19 Randall Q. Mcclure Ap #584-7470 Nibh. Ave 292\n", "20 Baker C. Hurst 249-6250 Velit. Rd. 208\n", "21 Bevis W. Molina P.O. Box 935, 1521 At, St. 247\n", "22 Martina B. Schroeder 689-7600 Mi St. 240\n", "23 Kylie G. Bailey 1430 Diam. Road 161\n", "24 Steel K. Glover 757-681 Et, Av. 248\n", "25 Lucas M. Suarez 699-9329 Magna Rd. 216\n", "26 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St. 291\n", "27 Germaine Q. Henson 589-4921 Duis Ave 215\n", "28 Wilma U. Mcfadden 6917 Dictum Rd. 463\n", "29 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av. 790" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset_full = pd.concat(\n", " [\n", " datasets_12,\n", " bonus,\n", " ],\n", " axis=1,\n", ")\n", "dataset_full" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " clientId name location bonus\n", "0 10 Omar Y. Fletcher 6833 Mollis. Rd. 279\n", "1 11 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue 138\n", "2 12 Mira N. Franklin P.O. Box 445, 323 Cursus Rd. 227\n", "3 13 Ferris Q. Le Ap #791-3809 Eu Street 160\n", "4 14 Michael I. Gray 6715 Diam. Rd. 267\n", "5 15 Alan T. Mullins 512-3640 Nisl Rd. 231\n", "6 16 Morgan W. Zamora 416-6030 Vivamus Road 169\n", "7 17 Lilah O. Morrison 3859 Mauris Ave 263\n", "8 18 Chantale Z. Kelley 3433 Arcu. Rd. 233\n", "9 19 Randall Q. Mcclure Ap #584-7470 Nibh. Ave 292\n", "10 20 Baker C. Hurst 249-6250 Velit. Rd. 208\n", "11 21 Bevis W. Molina P.O. Box 935, 1521 At, St. 247\n", "12 22 Martina B. Schroeder 689-7600 Mi St. 240\n", "13 23 Kylie G. Bailey 1430 Diam. Road 161\n", "14 24 Steel K. Glover 757-681 Et, Av. 248\n", "15 25 Lucas M. Suarez 699-9329 Magna Rd. 216\n", "16 26 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St. 291\n", "17 27 Germaine Q. Henson 589-4921 Duis Ave 215\n", "18 28 Wilma U. Mcfadden 6917 Dictum Rd. 463\n", "19 29 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av. 790" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Se convierte el clientId a una columna\n", "#\n", "dataset_full = dataset_full.reset_index()\n", "dataset_full" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Append" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " clientId name location bonus\n", "0 10.0 Omar Y. Fletcher 6833 Mollis. Rd. NaN\n", "1 11.0 Buffy W. Vincent P.O. Box 345, 8390 Ante Avenue NaN\n", "2 12.0 Mira N. Franklin P.O. Box 445, 323 Cursus Rd. NaN\n", "3 13.0 Ferris Q. Le Ap #791-3809 Eu Street NaN\n", "4 14.0 Michael I. Gray 6715 Diam. Rd. NaN\n", "5 15.0 Alan T. Mullins 512-3640 Nisl Rd. NaN\n", "6 16.0 Morgan W. Zamora 416-6030 Vivamus Road NaN\n", "7 17.0 Lilah O. Morrison 3859 Mauris Ave NaN\n", "8 18.0 Chantale Z. Kelley 3433 Arcu. Rd. NaN\n", "9 19.0 Randall Q. Mcclure Ap #584-7470 Nibh. Ave NaN\n", "0 20.0 Baker C. Hurst 249-6250 Velit. Rd. NaN\n", "1 21.0 Bevis W. Molina P.O. Box 935, 1521 At, St. NaN\n", "2 22.0 Martina B. Schroeder 689-7600 Mi St. NaN\n", "3 23.0 Kylie G. Bailey 1430 Diam. Road NaN\n", "4 24.0 Steel K. Glover 757-681 Et, Av. NaN\n", "5 25.0 Lucas M. Suarez 699-9329 Magna Rd. NaN\n", "6 26.0 Anastasia Q. Mccray P.O. Box 780, 4487 Lobortis, St. NaN\n", "7 27.0 Germaine Q. Henson 589-4921 Duis Ave NaN\n", "8 28.0 Wilma U. Mcfadden 6917 Dictum Rd. NaN\n", "9 29.0 Merritt Q. Martinez P.O. Box 469, 7833 Euismod Av. NaN\n", "28 NaN NaN NaN 463.0\n", "29 NaN NaN NaN 790.0\n", "11 NaN NaN NaN 138.0\n", "12 NaN NaN NaN 227.0\n", "15 NaN NaN NaN 231.0\n", "24 NaN NaN NaN 248.0\n", "25 NaN NaN NaN 216.0\n", "26 NaN NaN NaN 291.0\n", "10 NaN NaN NaN 279.0\n", "13 NaN NaN NaN 160.0\n", "14 NaN NaN NaN 267.0\n", "27 NaN NaN NaN 215.0\n", "16 NaN NaN NaN 169.0\n", "17 NaN NaN NaN 263.0\n", "18 NaN NaN NaN 233.0\n", "19 NaN NaN NaN 292.0\n", "20 NaN NaN NaN 208.0\n", "21 NaN NaN NaN 247.0\n", "22 NaN NaN NaN 240.0\n", "23 NaN NaN NaN 161.0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "# Append permite pegar un dataframe debajo de\n", "# otro haciendo coincidir las columnas\n", "#\n", "dataset_1 = pd.read_csv(\"/tmp/dataset_1.csv\")\n", "dataset_2 = pd.read_csv(\"/tmp/dataset_2.csv\")\n", "dataset_2 = dataset_2[[\"name\", \"clientId\", \"location\"]]\n", "dataset_1.append([dataset_2, bonus])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.7 ('.venv': venv)", "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.10.7" }, "toc-autonumbering": false, "toc-showmarkdowntxt": false, "vscode": { "interpreter": { "hash": "99683f87c1354598af39114791cc78b29c5617e49c4bfa4c5fb7492534eeeb87" } } }, "nbformat": 4, "nbformat_minor": 4 }