{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Quickstart\n",
"\n",
"This tutorial serves as an overview of the main functionality of the **Garpar** system.\n",
"\n",
"\n",
"\n",
"\n",
"## Imports\n",
"\n",
"There are two important subpackages in **Garpar**:\n",
"\n",
"- `optimize` allows applying optimization models.\n",
"- `datasets` contains tools for market simulation.\n",
"\n",
"You would generally import them as:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from garpar import datasets, optimize\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## The StocksSet class\n",
"\n",
"Most of the time the system will interact between modules with instances of the `StocksSet` class. This has the following representation:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | Stocks | \n",
" S0[W 1.0, H 0.5] | \n",
" S1[W 1.0, H 0.5] | \n",
" S2[W 1.0, H 0.5] | \n",
" S3[W 1.0, H 0.5] | \n",
" S4[W 1.0, H 0.5] | \n",
" S5[W 1.0, H 0.5] | \n",
" S6[W 1.0, H 0.5] | \n",
" S7[W 1.0, H 0.5] | \n",
" S8[W 1.0, H 0.5] | \n",
" S9[W 1.0, H 0.5] | \n",
"
\n",
" \n",
" | Days | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
"
\n",
" \n",
" | 1 | \n",
" 99.188878 | \n",
" 98.882571 | \n",
" 100.869144 | \n",
" 100.677353 | \n",
" 99.038811 | \n",
" 101.327899 | \n",
" 101.153883 | \n",
" 101.124361 | \n",
" 99.305394 | \n",
" 100.757335 | \n",
"
\n",
" \n",
" | 2 | \n",
" 98.158884 | \n",
" 97.898009 | \n",
" 101.851367 | \n",
" 99.605598 | \n",
" 97.615437 | \n",
" 102.324813 | \n",
" 102.052593 | \n",
" 99.893623 | \n",
" 98.261622 | \n",
" 101.841054 | \n",
"
\n",
" \n",
" | 3 | \n",
" 99.235461 | \n",
" 98.936938 | \n",
" 100.874516 | \n",
" 98.782589 | \n",
" 98.509816 | \n",
" 103.177144 | \n",
" 100.803265 | \n",
" 99.101846 | \n",
" 97.166952 | \n",
" 102.724915 | \n",
"
\n",
" \n",
" | 4 | \n",
" 100.009253 | \n",
" 98.032746 | \n",
" 99.665105 | \n",
" 99.998989 | \n",
" 97.080036 | \n",
" 101.920711 | \n",
" 99.764444 | \n",
" 98.066264 | \n",
" 96.194938 | \n",
" 103.322679 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 361 | \n",
" 100.075486 | \n",
" 141.393170 | \n",
" 126.177975 | \n",
" 121.310110 | \n",
" 88.373973 | \n",
" 92.654392 | \n",
" 132.357026 | \n",
" 86.658111 | \n",
" 106.069829 | \n",
" 76.724532 | \n",
"
\n",
" \n",
" | 362 | \n",
" 100.787869 | \n",
" 143.278496 | \n",
" 124.347893 | \n",
" 120.216147 | \n",
" 87.287705 | \n",
" 93.728765 | \n",
" 131.019412 | \n",
" 87.243153 | \n",
" 105.152178 | \n",
" 77.575314 | \n",
"
\n",
" \n",
" | 363 | \n",
" 99.838263 | \n",
" 141.545795 | \n",
" 125.587945 | \n",
" 121.581757 | \n",
" 88.207197 | \n",
" 94.437940 | \n",
" 132.432092 | \n",
" 88.139705 | \n",
" 104.197741 | \n",
" 78.387364 | \n",
"
\n",
" \n",
" | 364 | \n",
" 100.987000 | \n",
" 142.391740 | \n",
" 124.129662 | \n",
" 123.170251 | \n",
" 87.580837 | \n",
" 95.123225 | \n",
" 131.271484 | \n",
" 89.051800 | \n",
" 105.302874 | \n",
" 79.233975 | \n",
"
\n",
" \n",
" | 365 | \n",
" 99.846713 | \n",
" 144.021314 | \n",
" 125.671752 | \n",
" 121.655118 | \n",
" 86.727899 | \n",
" 94.163632 | \n",
" 132.853493 | \n",
" 88.114551 | \n",
" 106.055626 | \n",
" 80.152366 | \n",
"
\n",
" \n",
"
\n",
"
366 days x 10 stocks - W.Size 5\n",
"
"
],
"text/plain": [
"Stocks S0[W 1.0, H 0.5] S1[W 1.0, H 0.5] S2[W 1.0, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 100.000000 \n",
"1 99.188878 98.882571 100.869144 \n",
"2 98.158884 97.898009 101.851367 \n",
"3 99.235461 98.936938 100.874516 \n",
"4 100.009253 98.032746 99.665105 \n",
"... ... ... ... \n",
"361 100.075486 141.393170 126.177975 \n",
"362 100.787869 143.278496 124.347893 \n",
"363 99.838263 141.545795 125.587945 \n",
"364 100.987000 142.391740 124.129662 \n",
"365 99.846713 144.021314 125.671752 \n",
"\n",
"Stocks S3[W 1.0, H 0.5] S4[W 1.0, H 0.5] S5[W 1.0, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 100.000000 \n",
"1 100.677353 99.038811 101.327899 \n",
"2 99.605598 97.615437 102.324813 \n",
"3 98.782589 98.509816 103.177144 \n",
"4 99.998989 97.080036 101.920711 \n",
"... ... ... ... \n",
"361 121.310110 88.373973 92.654392 \n",
"362 120.216147 87.287705 93.728765 \n",
"363 121.581757 88.207197 94.437940 \n",
"364 123.170251 87.580837 95.123225 \n",
"365 121.655118 86.727899 94.163632 \n",
"\n",
"Stocks S6[W 1.0, H 0.5] S7[W 1.0, H 0.5] S8[W 1.0, H 0.5] S9[W 1.0, H 0.5] \n",
"Days \n",
"0 100.000000 100.000000 100.000000 100.000000 \n",
"1 101.153883 101.124361 99.305394 100.757335 \n",
"2 102.052593 99.893623 98.261622 101.841054 \n",
"3 100.803265 99.101846 97.166952 102.724915 \n",
"4 99.764444 98.066264 96.194938 103.322679 \n",
"... ... ... ... ... \n",
"361 132.357026 86.658111 106.069829 76.724532 \n",
"362 131.019412 87.243153 105.152178 77.575314 \n",
"363 132.432092 88.139705 104.197741 78.387364 \n",
"364 131.271484 89.051800 105.302874 79.233975 \n",
"365 132.853493 88.114551 106.055626 80.152366 \n",
"StocksSet [366 days x 10 stocks - W.Size 5]"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"datasets.make_risso_normal()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A `StocksSet` instance unifies the representation of a market and a portfolio, simplifying stock tracking and weight (`W`) management. It streamlines data handling and serves as a shared concept across all system modules. A market reflects the current stock values, while a portfolio consists (in this context) of assigned weights for each stock. We will explore these components in more detail throughout the tutorials. For now, let’s start with a basic example.\n",
"\n",
"In this tutorial, we will simulate a market and apply an optimization model to demonstrate basic interactions with the system, providing an introduction to its functionality.\n",
"\n",
"We can simulate a market by calling the `make_risso_normal` function from the `datasets` subpackage. This function will create an instance of `StocksSet` through a simulation. For consistency, we'll specify just one parameter: `random_state`, which acts as the seed."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | Stocks | \n",
" S0[W 1.0, H 0.5] | \n",
" S1[W 1.0, H 0.5] | \n",
" S2[W 1.0, H 0.5] | \n",
" S3[W 1.0, H 0.5] | \n",
" S4[W 1.0, H 0.5] | \n",
" S5[W 1.0, H 0.5] | \n",
" S6[W 1.0, H 0.5] | \n",
" S7[W 1.0, H 0.5] | \n",
" S8[W 1.0, H 0.5] | \n",
" S9[W 1.0, H 0.5] | \n",
"
\n",
" \n",
" | Days | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
"
\n",
" \n",
" | 1 | \n",
" 100.766064 | \n",
" 101.126354 | \n",
" 101.056170 | \n",
" 100.520483 | \n",
" 99.278068 | \n",
" 101.231624 | \n",
" 101.454794 | \n",
" 101.363444 | \n",
" 100.618480 | \n",
" 98.850608 | \n",
"
\n",
" \n",
" | 2 | \n",
" 101.767974 | \n",
" 100.260879 | \n",
" 100.115244 | \n",
" 99.516454 | \n",
" 98.228567 | \n",
" 100.214519 | \n",
" 102.472212 | \n",
" 100.074498 | \n",
" 101.245075 | \n",
" 98.005358 | \n",
"
\n",
" \n",
" | 3 | \n",
" 103.171863 | \n",
" 101.187614 | \n",
" 99.261945 | \n",
" 100.561238 | \n",
" 97.054380 | \n",
" 99.457204 | \n",
" 101.534985 | \n",
" 100.942186 | \n",
" 100.124496 | \n",
" 97.030506 | \n",
"
\n",
" \n",
" | 4 | \n",
" 104.240403 | \n",
" 102.423134 | \n",
" 98.378702 | \n",
" 101.551601 | \n",
" 95.927476 | \n",
" 100.246909 | \n",
" 102.232905 | \n",
" 100.196595 | \n",
" 98.964000 | \n",
" 96.428484 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 361 | \n",
" 104.845268 | \n",
" 121.219172 | \n",
" 131.868621 | \n",
" 104.611151 | \n",
" 142.212483 | \n",
" 106.411823 | \n",
" 100.923496 | \n",
" 92.259337 | \n",
" 120.218776 | \n",
" 90.228541 | \n",
"
\n",
" \n",
" | 362 | \n",
" 105.897108 | \n",
" 122.295360 | \n",
" 130.769070 | \n",
" 103.710214 | \n",
" 143.863287 | \n",
" 107.679350 | \n",
" 102.327765 | \n",
" 93.440659 | \n",
" 121.197158 | \n",
" 91.080514 | \n",
"
\n",
" \n",
" | 363 | \n",
" 107.368403 | \n",
" 123.454928 | \n",
" 132.064844 | \n",
" 104.970441 | \n",
" 142.355648 | \n",
" 108.778114 | \n",
" 103.399001 | \n",
" 92.368845 | \n",
" 120.270729 | \n",
" 90.469203 | \n",
"
\n",
" \n",
" | 364 | \n",
" 108.435637 | \n",
" 122.318475 | \n",
" 133.215786 | \n",
" 105.868644 | \n",
" 140.662842 | \n",
" 107.785096 | \n",
" 104.275516 | \n",
" 91.656621 | \n",
" 121.732478 | \n",
" 91.496238 | \n",
"
\n",
" \n",
" | 365 | \n",
" 107.026179 | \n",
" 121.488850 | \n",
" 134.581393 | \n",
" 104.821875 | \n",
" 139.648724 | \n",
" 109.153324 | \n",
" 105.619600 | \n",
" 90.699211 | \n",
" 123.443885 | \n",
" 92.091881 | \n",
"
\n",
" \n",
"
\n",
"
366 days x 10 stocks - W.Size 5\n",
"
"
],
"text/plain": [
"Stocks S0[W 1.0, H 0.5] S1[W 1.0, H 0.5] S2[W 1.0, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 100.000000 \n",
"1 100.766064 101.126354 101.056170 \n",
"2 101.767974 100.260879 100.115244 \n",
"3 103.171863 101.187614 99.261945 \n",
"4 104.240403 102.423134 98.378702 \n",
"... ... ... ... \n",
"361 104.845268 121.219172 131.868621 \n",
"362 105.897108 122.295360 130.769070 \n",
"363 107.368403 123.454928 132.064844 \n",
"364 108.435637 122.318475 133.215786 \n",
"365 107.026179 121.488850 134.581393 \n",
"\n",
"Stocks S3[W 1.0, H 0.5] S4[W 1.0, H 0.5] S5[W 1.0, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 100.000000 \n",
"1 100.520483 99.278068 101.231624 \n",
"2 99.516454 98.228567 100.214519 \n",
"3 100.561238 97.054380 99.457204 \n",
"4 101.551601 95.927476 100.246909 \n",
"... ... ... ... \n",
"361 104.611151 142.212483 106.411823 \n",
"362 103.710214 143.863287 107.679350 \n",
"363 104.970441 142.355648 108.778114 \n",
"364 105.868644 140.662842 107.785096 \n",
"365 104.821875 139.648724 109.153324 \n",
"\n",
"Stocks S6[W 1.0, H 0.5] S7[W 1.0, H 0.5] S8[W 1.0, H 0.5] S9[W 1.0, H 0.5] \n",
"Days \n",
"0 100.000000 100.000000 100.000000 100.000000 \n",
"1 101.454794 101.363444 100.618480 98.850608 \n",
"2 102.472212 100.074498 101.245075 98.005358 \n",
"3 101.534985 100.942186 100.124496 97.030506 \n",
"4 102.232905 100.196595 98.964000 96.428484 \n",
"... ... ... ... ... \n",
"361 100.923496 92.259337 120.218776 90.228541 \n",
"362 102.327765 93.440659 121.197158 91.080514 \n",
"363 103.399001 92.368845 120.270729 90.469203 \n",
"364 104.275516 91.656621 121.732478 91.496238 \n",
"365 105.619600 90.699211 123.443885 92.091881 \n",
"StocksSet [366 days x 10 stocks - W.Size 5]"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ss = datasets.make_risso_normal(random_state=23)\n",
"ss\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that we have a `StocksSet` instance, let's apply an optimization model and observe how the weights change. To analyze the effect, focus on the `W`s in the top section of the `StocksSet` representation and compare them with their updated values after applying the following model:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | Stocks | \n",
" S0[W 3.711507e-09, H 0.5] | \n",
" S1[W 7.229484e-03, H 0.5] | \n",
" S2[W 3.709488e-01, H 0.5] | \n",
" S3[W 2.995300e-09, H 0.5] | \n",
" S4[W 5.030012e-01, H 0.5] | \n",
" S5[W 4.103622e-09, H 0.5] | \n",
" S6[W 3.458309e-09, H 0.5] | \n",
" S7[W 1.305153e-09, H 0.5] | \n",
" S8[W 1.188205e-01, H 0.5] | \n",
" S9[W 1.288363e-09, H 0.5] | \n",
"
\n",
" \n",
" | Days | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 100.000000 | \n",
"
\n",
" \n",
" | 1 | \n",
" 100.766064 | \n",
" 101.126354 | \n",
" 101.056170 | \n",
" 100.520483 | \n",
" 99.278068 | \n",
" 101.231624 | \n",
" 101.454794 | \n",
" 101.363444 | \n",
" 100.618480 | \n",
" 98.850608 | \n",
"
\n",
" \n",
" | 2 | \n",
" 101.767974 | \n",
" 100.260879 | \n",
" 100.115244 | \n",
" 99.516454 | \n",
" 98.228567 | \n",
" 100.214519 | \n",
" 102.472212 | \n",
" 100.074498 | \n",
" 101.245075 | \n",
" 98.005358 | \n",
"
\n",
" \n",
" | 3 | \n",
" 103.171863 | \n",
" 101.187614 | \n",
" 99.261945 | \n",
" 100.561238 | \n",
" 97.054380 | \n",
" 99.457204 | \n",
" 101.534985 | \n",
" 100.942186 | \n",
" 100.124496 | \n",
" 97.030506 | \n",
"
\n",
" \n",
" | 4 | \n",
" 104.240403 | \n",
" 102.423134 | \n",
" 98.378702 | \n",
" 101.551601 | \n",
" 95.927476 | \n",
" 100.246909 | \n",
" 102.232905 | \n",
" 100.196595 | \n",
" 98.964000 | \n",
" 96.428484 | \n",
"
\n",
" \n",
" | ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" | 361 | \n",
" 104.845268 | \n",
" 121.219172 | \n",
" 131.868621 | \n",
" 104.611151 | \n",
" 142.212483 | \n",
" 106.411823 | \n",
" 100.923496 | \n",
" 92.259337 | \n",
" 120.218776 | \n",
" 90.228541 | \n",
"
\n",
" \n",
" | 362 | \n",
" 105.897108 | \n",
" 122.295360 | \n",
" 130.769070 | \n",
" 103.710214 | \n",
" 143.863287 | \n",
" 107.679350 | \n",
" 102.327765 | \n",
" 93.440659 | \n",
" 121.197158 | \n",
" 91.080514 | \n",
"
\n",
" \n",
" | 363 | \n",
" 107.368403 | \n",
" 123.454928 | \n",
" 132.064844 | \n",
" 104.970441 | \n",
" 142.355648 | \n",
" 108.778114 | \n",
" 103.399001 | \n",
" 92.368845 | \n",
" 120.270729 | \n",
" 90.469203 | \n",
"
\n",
" \n",
" | 364 | \n",
" 108.435637 | \n",
" 122.318475 | \n",
" 133.215786 | \n",
" 105.868644 | \n",
" 140.662842 | \n",
" 107.785096 | \n",
" 104.275516 | \n",
" 91.656621 | \n",
" 121.732478 | \n",
" 91.496238 | \n",
"
\n",
" \n",
" | 365 | \n",
" 107.026179 | \n",
" 121.488850 | \n",
" 134.581393 | \n",
" 104.821875 | \n",
" 139.648724 | \n",
" 109.153324 | \n",
" 105.619600 | \n",
" 90.699211 | \n",
" 123.443885 | \n",
" 92.091881 | \n",
"
\n",
" \n",
"
\n",
"
366 days x 10 stocks - W.Size 5\n",
"
"
],
"text/plain": [
"Stocks S0[W 3.711507e-09, H 0.5] S1[W 7.229484e-03, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 \n",
"1 100.766064 101.126354 \n",
"2 101.767974 100.260879 \n",
"3 103.171863 101.187614 \n",
"4 104.240403 102.423134 \n",
"... ... ... \n",
"361 104.845268 121.219172 \n",
"362 105.897108 122.295360 \n",
"363 107.368403 123.454928 \n",
"364 108.435637 122.318475 \n",
"365 107.026179 121.488850 \n",
"\n",
"Stocks S2[W 3.709488e-01, H 0.5] S3[W 2.995300e-09, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 \n",
"1 101.056170 100.520483 \n",
"2 100.115244 99.516454 \n",
"3 99.261945 100.561238 \n",
"4 98.378702 101.551601 \n",
"... ... ... \n",
"361 131.868621 104.611151 \n",
"362 130.769070 103.710214 \n",
"363 132.064844 104.970441 \n",
"364 133.215786 105.868644 \n",
"365 134.581393 104.821875 \n",
"\n",
"Stocks S4[W 5.030012e-01, H 0.5] S5[W 4.103622e-09, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 \n",
"1 99.278068 101.231624 \n",
"2 98.228567 100.214519 \n",
"3 97.054380 99.457204 \n",
"4 95.927476 100.246909 \n",
"... ... ... \n",
"361 142.212483 106.411823 \n",
"362 143.863287 107.679350 \n",
"363 142.355648 108.778114 \n",
"364 140.662842 107.785096 \n",
"365 139.648724 109.153324 \n",
"\n",
"Stocks S6[W 3.458309e-09, H 0.5] S7[W 1.305153e-09, H 0.5] \\\n",
"Days \n",
"0 100.000000 100.000000 \n",
"1 101.454794 101.363444 \n",
"2 102.472212 100.074498 \n",
"3 101.534985 100.942186 \n",
"4 102.232905 100.196595 \n",
"... ... ... \n",
"361 100.923496 92.259337 \n",
"362 102.327765 93.440659 \n",
"363 103.399001 92.368845 \n",
"364 104.275516 91.656621 \n",
"365 105.619600 90.699211 \n",
"\n",
"Stocks S8[W 1.188205e-01, H 0.5] S9[W 1.288363e-09, H 0.5] \n",
"Days \n",
"0 100.000000 100.000000 \n",
"1 100.618480 98.850608 \n",
"2 101.245075 98.005358 \n",
"3 100.124496 97.030506 \n",
"4 98.964000 96.428484 \n",
"... ... ... \n",
"361 120.218776 90.228541 \n",
"362 121.197158 91.080514 \n",
"363 120.270729 90.469203 \n",
"364 121.732478 91.496238 \n",
"365 123.443885 92.091881 \n",
"StocksSet [366 days x 10 stocks - W.Size 5]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mk = optimize.mean_variance.Markowitz(target_risk=0.1)\n",
"mk.optimize(ss)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The change in weights is what we aim for when applying optimization models.\n",
"\n",
"This concludes the quickstart. We recommend continuing with [this tutorial](market_simulation.ipynb)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "garpar",
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}