{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Creating a pandapipes network including height differences" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tutorial shows how to define junctions on different height levels. The following network will be created.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Empty network" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At first, pandapipes is imported. We will then create an empty network container and specify the\n", "fluid. The fluid water from the pandapipes library is used." ] }, { "cell_type": "code", "metadata": { "scrolled": true, "ExecuteTime": { "end_time": "2025-05-23T06:56:43.014327Z", "start_time": "2025-05-23T06:56:41.268873Z" } }, "source": [ "import pandapipes as pp" ], "outputs": [], "execution_count": 1 }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.126753Z", "start_time": "2025-05-23T06:56:43.111596Z" } }, "source": [ "net = pp.create_empty_network(fluid=\"water\") # create an empty network" ], "outputs": [], "execution_count": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The create functions are used to create more components. The components will be added to the corresponding component tables." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Junctions" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.176587Z", "start_time": "2025-05-23T06:56:43.165351Z" } }, "source": [ "junction1 = pp.create_junction(net, pn_bar=1.0, tfluid_k=293.15, height_m = 352, name=\"Junction 1\")\n", "junction2 = pp.create_junction(net, pn_bar=1.0, tfluid_k=293.15, height_m = 358, name=\"Junction 2\")\n", "junction3 = pp.create_junction(net, pn_bar=1.0, tfluid_k=293.15, height_m = 361, name=\"Junction 3\")\n", "junction4 = pp.create_junction(net, pn_bar=1.0, tfluid_k=293.15, height_m = 346, name=\"Junction 4\")\n", "junction5 = pp.create_junction(net, pn_bar=1.0, tfluid_k=293.15, height_m = 400, name=\"Junction 5\")" ], "outputs": [], "execution_count": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The junctions are now stored in the net and can be called. Some parameters, which were not explicitly mentioned in the last section, were defined using default values. Note that the parameters of the junctions above contain the parameter height_m, which defines the height above sea level of the junction. The stored potential energy is automatically respected by pandapipes." ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.221562Z", "start_time": "2025-05-23T06:56:43.209547Z" } }, "source": [ "net.junction # show junction table" ], "outputs": [ { "data": { "text/plain": [ " name pn_bar tfluid_k height_m in_service type\n", "0 Junction 1 1.0 293.15 352.0 True junction\n", "1 Junction 2 1.0 293.15 358.0 True junction\n", "2 Junction 3 1.0 293.15 361.0 True junction\n", "3 Junction 4 1.0 293.15 346.0 True junction\n", "4 Junction 5 1.0 293.15 400.0 True junction" ], "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", "
namepn_bartfluid_kheight_min_servicetype
0Junction 11.0293.15352.0Truejunction
1Junction 21.0293.15358.0Truejunction
2Junction 31.0293.15361.0Truejunction
3Junction 41.0293.15346.0Truejunction
4Junction 51.0293.15400.0Truejunction
\n", "
" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the next steps, more components are added." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### External Grid" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the example, the external grid is connected to junction5. The pressure is at 0.5 bar." ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.297010Z", "start_time": "2025-05-23T06:56:43.288757Z" } }, "source": [ "medium_pressure_grid = pp.create_ext_grid(net, junction=junction5, p_bar=0.5, t_k=293.15, name=\"Grid Connection\")\n", "\n", "net.ext_grid # show external grid table" ], "outputs": [ { "data": { "text/plain": [ " name junction p_bar t_k in_service type\n", "0 Grid Connection 4 0.5 293.15 True pt" ], "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", "
namejunctionp_bart_kin_servicetype
0Grid Connection40.5293.15Truept
\n", "
" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pipes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The network contains four pipes. The lenghts and the junctions are displayed on the network\n", "figure. Pipe 4 is defined using a roughness k_mm of 0.5 mm, which deviates from the default\n", "value of 1 mm." ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.414935Z", "start_time": "2025-05-23T06:56:43.398791Z" } }, "source": [ "pipe1 = pp.create_pipe_from_parameters(net, from_junction=junction1, to_junction=junction2, length_km=0.545, diameter_m=0.2, name=\"Pipe 1\")\n", "pipe2 = pp.create_pipe_from_parameters(net, from_junction=junction2, to_junction=junction3, length_km=0.095, diameter_m=0.15, name=\"Pipe 2\")\n", "pipe3 = pp.create_pipe_from_parameters(net, from_junction=junction1, to_junction=junction4, length_km=0.285, diameter_m=0.15, name=\"Pipe 3\")\n", "pipe4 = pp.create_pipe_from_parameters(net, from_junction=junction1, to_junction=junction5, length_km=0.43, diameter_m=0.15, k_mm=0.5, name=\"Pipe 4\")" ], "outputs": [], "execution_count": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Up to now, the pipe components table looks like the table displayed in the following section:" ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.493096Z", "start_time": "2025-05-23T06:56:43.483226Z" } }, "source": [ "net.pipe # show pipe table" ], "outputs": [ { "data": { "text/plain": [ " name from_junction to_junction std_type length_km diameter_m k_mm \\\n", "0 Pipe 1 0 1 None 0.545 0.20 0.2 \n", "1 Pipe 2 1 2 None 0.095 0.15 0.2 \n", "2 Pipe 3 0 3 None 0.285 0.15 0.2 \n", "3 Pipe 4 0 4 None 0.430 0.15 0.5 \n", "\n", " loss_coefficient u_w_per_m2k text_k qext_w sections in_service type \n", "0 0.0 0.0 NaN 0.0 1 True pipe \n", "1 0.0 0.0 NaN 0.0 1 True pipe \n", "2 0.0 0.0 NaN 0.0 1 True pipe \n", "3 0.0 0.0 NaN 0.0 1 True pipe " ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namefrom_junctionto_junctionstd_typelength_kmdiameter_mk_mmloss_coefficientu_w_per_m2ktext_kqext_wsectionsin_servicetype
0Pipe 101None0.5450.200.20.00.0NaN0.01Truepipe
1Pipe 212None0.0950.150.20.00.0NaN0.01Truepipe
2Pipe 303None0.2850.150.20.00.0NaN0.01Truepipe
3Pipe 404None0.4300.150.50.00.0NaN0.01Truepipe
\n", "
" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The parameters `from_junction` and `to_junction` define the orientation of the pipe. If the flow\n", "enters the pipe at the `from_junction` node and leaves it through the `to_junction` node, the\n", "velocity will have a positive sign. Otherwise, it has a negative sign." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Sinks\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With a sink, a constant mass flow can be defined. Here, we will create two sinks with mass flows of\n", "277 g/s and 139 g/s. Sinks and sources are always assigned to a specific junction. The sign of the\n", "mass flow is positive, if a mass flow is removed from the system." ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:43.685769Z", "start_time": "2025-05-23T06:56:43.675403Z" } }, "source": [ "sink = pp.create_sink(net, junction=junction4, mdot_kg_per_s=0.277, name=\"Sink 1\")\n", "sink = pp.create_sink(net, junction=junction3, mdot_kg_per_s=0.139, name=\"Sink 2\")\n", "net.sink" ], "outputs": [ { "data": { "text/plain": [ " name junction mdot_kg_per_s scaling in_service type\n", "0 Sink 1 3 0.277 1.0 True sink\n", "1 Sink 2 2 0.139 1.0 True sink" ], "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", "
namejunctionmdot_kg_per_sscalingin_servicetype
0Sink 130.2771.0Truesink
1Sink 220.1391.0Truesink
\n", "
" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The calculation is now started. The pipe friction can be respected using different models. By default, the Nikuradse model is used. A distinction between laminar and turbulent flow is not implemented in pandapipes. Typically, pipe calculation software detects the kind of flow. However, for pandapipes applications, we usually can expect turbulent flow conditions.\n", "\n", "Nevertheless, a distinction between laminar and turbulent flow will be added in the future." ] }, { "cell_type": "code", "metadata": { "pycharm": { "name": "#%%\n" }, "ExecuteTime": { "end_time": "2025-05-23T06:56:46.625518Z", "start_time": "2025-05-23T06:56:43.780047Z" } }, "source": [ "pp.pipeflow(net, friction_model=\"nikuradse\")" ], "outputs": [], "execution_count": 9 }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "The results are ready now and can be displayed with the following commands:" ] }, { "cell_type": "code", "metadata": { "pycharm": { "name": "#%%\n" }, "ExecuteTime": { "end_time": "2025-05-23T06:56:46.697868Z", "start_time": "2025-05-23T06:56:46.691987Z" } }, "source": [ "net.res_junction # calculated pressure and temperature at junctions" ], "outputs": [ { "data": { "text/plain": [ " p_bar t_k\n", "0 5.194289 293.15\n", "1 4.607435 293.15\n", "2 4.314005 293.15\n", "3 5.781005 293.15\n", "4 0.500000 293.15" ], "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", "
p_bart_k
05.194289293.15
14.607435293.15
24.314005293.15
35.781005293.15
40.500000293.15
\n", "
" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 10 }, { "cell_type": "code", "metadata": { "pycharm": { "name": "#%%\n" }, "ExecuteTime": { "end_time": "2025-05-23T06:56:46.773776Z", "start_time": "2025-05-23T06:56:46.767063Z" } }, "source": [ "net.res_pipe # velocities, mass flows through pipes and other results" ], "outputs": [ { "data": { "text/plain": [ " v_mean_m_per_s p_from_bar p_to_bar t_from_k t_to_k t_outlet_k \\\n", "0 0.004433 5.194289 4.607435 293.15 293.15 293.15 \n", "1 0.007880 4.607435 4.314005 293.15 293.15 293.15 \n", "2 0.015704 5.194289 5.781005 293.15 293.15 293.15 \n", "3 -0.023584 5.194289 0.500000 293.15 293.15 293.15 \n", "\n", " mdot_from_kg_per_s mdot_to_kg_per_s vdot_m3_per_s reynolds lambda \n", "0 0.139 -0.139 0.000139 886.106589 0.091849 \n", "1 0.139 -0.139 0.000139 1181.475451 0.075241 \n", "2 0.277 -0.277 0.000278 2354.451079 0.048254 \n", "3 -0.416 0.416 -0.000417 3535.926531 0.045036 " ], "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", "
v_mean_m_per_sp_from_barp_to_bart_from_kt_to_kt_outlet_kmdot_from_kg_per_smdot_to_kg_per_svdot_m3_per_sreynoldslambda
00.0044335.1942894.607435293.15293.15293.150.139-0.1390.000139886.1065890.091849
10.0078804.6074354.314005293.15293.15293.150.139-0.1390.0001391181.4754510.075241
20.0157045.1942895.781005293.15293.15293.150.277-0.2770.0002782354.4510790.048254
3-0.0235845.1942890.500000293.15293.15293.15-0.4160.416-0.0004173535.9265310.045036
\n", "
" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting\n", "\n", "Using matplotlib, the network can easily be plotted." ] }, { "cell_type": "code", "metadata": { "ExecuteTime": { "end_time": "2025-05-23T06:56:46.967174Z", "start_time": "2025-05-23T06:56:46.873099Z" } }, "source": [ "import matplotlib\n", "from pandapipes.plotting.simple_plot import simple_plot as sp\n", "\n", "sp(net, plot_sinks = True)" ], "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "hp.pandapipes.plotting.simple_plot - WARNING: No or insufficient geodata available --> Creating artificial coordinates. This may take some time\n" ] }, { "data": { "text/plain": [ "
" ], "image/png": "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X77lflNTUzl06FBeeOGFTE1NdXPEa4z29NMAAACgRzZt2pRt27bl5MmTmZ6ezsTExIJov9rs7GwmJyczMTGRmZmZJMm6deuye/funs0r0AEAAGisffv25fTp0/MBvn379qxfv37++U6nk9OnT+fw4cO5ePHign0Xc8R9JVniDgAAQGOtXbs2O3fuTDIX4+Pj4/PPvfHGG/n+97+f55577po47wdH0AEAAGi0Xbt25cSJE5mamsqZM2fy6quv5vz585mcnFzwuo0bN2bbtm05dOhQX+YU6AAAADTayMhI9u3blxdeeCFJ8vzzzy94fs2aNRkbG8vWrVtz/vz5foyYRKADAAAwBFatWpV2u53Z2dn5be12O7t27crOnTszMjLSx+nmCHQAAAAa6+LFizl8+HBOnTq1YPvmzZvz4IMPZs2aNX2a7FoCHQAAgMa5fPlyXnzxxRw7diydTmd++x133JE9e/Zk69atfZzu+gQ6AAAAjdHpdPLKK6/kyJEjmZqamt++evXq7N27N/fee29arVYfJ7wxgQ4AAEAjnD9/PocOHcrrr78+v63VamXnzp3ZtWtXRkdrJ3Dt6QAAAGARzp8/n2eeeWbBcva77747Y2NjWbduXR8nW7x2vwcAAACA5ZqamloQ5+12O5s3b87atWv7ONXSCHQAAAAG3t133529e/em3Z7L3NnZ2Rw6dChPPfVUzp492+fpFkegAwAAMPBarVZ27dqVAwcO5J577pnf/sYbb+TZZ5/Nc889l4sXL/ZxwlsT6AAAADTGmjVr8va3vz2PPvpo7rzzzvntp06dyne+850cPnw4ly9f7uOENybQAQAAaJyNGzfmne98Zx588MGsXr06ydwt2F566aV85zvfyYkTJxacs16BQAcAAKCRWq1W7rvvvjz++ON54IEH5u9/PjU1lYMHD+a73/1uzp071+cpf0KgAwAA0Gijo6PZt29fHn/88WzdunV+++uvv55nnnkmzz//fC5dutTHCee4DzoAAABDYd26dfnpn/7pnD17NuPj43njjTeSJK+++mpOnTqVXbt2LThvvddanWqL7gEAAKDLOp1Ojh8/nqNHjy64aNzIyEhmZmaSJDt37szY2FjPZnIEHQAAgKHTarWyY8eO3HPPPZmYmMjk5GSSzMd5PzgHHQAAgKG1atWq7N+/Pz/7sz+bzZs3L3juykXlesUSdwAAAMjcsvfTp0/n6NGjmZ6ezkMPPZQNGzb07PMFOgAAALxFp9Pp+RF0S9wBAADgLXod54lABwAAgBIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKAAgQ4AAAAFCHQAAAAoQKADAABAAQIdAAAAChDoAAAAUIBABwAAgAIEOgAAABQg0AEAAKCA/w9ktuJpo/p97wAAAABJRU5ErkJggg==" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "As long as no coordinates have been explicitly added to the junctions, automatically generated coordinates are used." ] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }