From 4aaf477e406a385b2d05737cb8ba5f646ca11d25 Mon Sep 17 00:00:00 2001 From: Hanne Heggdal Date: Tue, 6 May 2025 15:13:49 +0200 Subject: [PATCH] interaktiv notebook laget --- notebooks/notebook_interactive_data.ipynb | 805 ++++++++++++++++++++++ 1 file changed, 805 insertions(+) create mode 100644 notebooks/notebook_interactive_data.ipynb diff --git a/notebooks/notebook_interactive_data.ipynb b/notebooks/notebook_interactive_data.ipynb new file mode 100644 index 0000000..2986442 --- /dev/null +++ b/notebooks/notebook_interactive_data.ipynb @@ -0,0 +1,805 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Notebook - Interactive data\n", + "\n", + "Denne notebooken henter data fra ønsket dag og sted, skriver til fil. Deretter er det en interaktiv graf hvor bruker kan endre på layout av diagrammet. Kan blant annet endre på farge, rutenett, størrelse av scatterplots og om man ønsker gjennomsnitt eller ikke. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Velg hvilken dag du vil sjekke været for\n", + "\n", + "For å kunne hente data og gjøre en analyse trenger programmet å vite hvilken dag du vil hente ut for, også skrives alle timene fra den dagen ut. Programmet kan ikke hente ut data fra nåværende, eller senere datoer, altså må man velge datoer fra tidligere tidspunkt.\n", + "\n", + "Dataen skrives inn slik: (yyyy, mm, dd)\n", + "Her følger et eksempel: \n", + "|Hva|Hvordan|Eksempel|\n", + "|:---|:---:|:---:|\n", + "|år|yyyy|2025|\n", + "|måned|mm|03| \n", + "|dato|dd|01| \n", + "\n", + "Denne dataen skrives da inn på følgende hvis: (2025, 03, 01)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Selected date: 2025-03-03\n", + "Unix Timestamp: 1740956400 -> 2025-03-03 00:00:00\n", + "Unix Timestamp: 1740960000 -> 2025-03-03 01:00:00\n", + "Unix Timestamp: 1740963600 -> 2025-03-03 02:00:00\n", + "Unix Timestamp: 1740967200 -> 2025-03-03 03:00:00\n", + "Unix Timestamp: 1740970800 -> 2025-03-03 04:00:00\n", + "Unix Timestamp: 1740974400 -> 2025-03-03 05:00:00\n", + "Unix Timestamp: 1740978000 -> 2025-03-03 06:00:00\n", + "Unix Timestamp: 1740981600 -> 2025-03-03 07:00:00\n", + "Unix Timestamp: 1740985200 -> 2025-03-03 08:00:00\n", + "Unix Timestamp: 1740988800 -> 2025-03-03 09:00:00\n", + "Unix Timestamp: 1740992400 -> 2025-03-03 10:00:00\n", + "Unix Timestamp: 1740996000 -> 2025-03-03 11:00:00\n", + "Unix Timestamp: 1740999600 -> 2025-03-03 12:00:00\n", + "Unix Timestamp: 1741003200 -> 2025-03-03 13:00:00\n", + "Unix Timestamp: 1741006800 -> 2025-03-03 14:00:00\n", + "Unix Timestamp: 1741010400 -> 2025-03-03 15:00:00\n", + "Unix Timestamp: 1741014000 -> 2025-03-03 16:00:00\n", + "Unix Timestamp: 1741017600 -> 2025-03-03 17:00:00\n", + "Unix Timestamp: 1741021200 -> 2025-03-03 18:00:00\n", + "Unix Timestamp: 1741024800 -> 2025-03-03 19:00:00\n", + "Unix Timestamp: 1741028400 -> 2025-03-03 20:00:00\n", + "Unix Timestamp: 1741032000 -> 2025-03-03 21:00:00\n", + "Unix Timestamp: 1741035600 -> 2025-03-03 22:00:00\n", + "Unix Timestamp: 1741039200 -> 2025-03-03 23:00:00\n" + ] + } + ], + "source": [ + "import datetime\n", + "import time\n", + "\n", + "# Makes a function so the start and end date is the same date, with all hours of that date\n", + "def get_unix_timestamps_for_day():\n", + " date_input = input(\"Choose a date (yyyy, mm, dd): \")\n", + " date_components = date_input.split(\",\")\n", + " year = int(date_components[0])\n", + " month = int(date_components[1])\n", + " day = int(date_components[2])\n", + "\n", + " # Goes through all hours of the day, use %Y-%m-%d etc. from pythons strftime to convert datetime into a readable string \n", + " timestamps = []\n", + " for hour in range(24):\n", + " dt = datetime.datetime(year, month, day, hour, 0)\n", + " unix_timestamp = int(time.mktime(dt.timetuple()))\n", + " timestamps.append((unix_timestamp, dt.strftime('%Y-%m-%d %H:%M:%S'))) \n", + " \n", + " # Prevents from getting data for the current day, or the future\n", + " if dt >= datetime.datetime.now():\n", + " print(\"Failed, cant use future dates\")\n", + "\n", + " # If \n", + " raise ValueError\n", + "\n", + " # Prints the date chosen\n", + " print(f\"Selected date: {year}-{month:02d}-{day:02d}\")\n", + "\n", + " # Prints the timestamp and the date an hour of the day after\n", + " for ts, readable in timestamps:\n", + " print(f\"Unix Timestamp: {ts} -> {readable}\")\n", + " \n", + " return date_input, [ts[0] for ts in timestamps]\n", + "\n", + "date, timestamps = get_unix_timestamps_for_day()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Velg et sted i Norge og få data\n", + "\n", + "Skriv inn et sted du ønsker data fra, foreløpig er det begrenset til Norge\n", + "\n", + "Programmet vil deretter hente data å lagre det i en json fil" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/hanne/Documents/anvendt prosjekt/anvendt_mappe/venv/lib/python3.9/site-packages/urllib3/__init__.py:35: NotOpenSSLWarning: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: https://github.com/urllib3/urllib3/issues/3020\n", + " warnings.warn(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data fetch: ok\n" + ] + } + ], + "source": [ + "import sys\n", + "import os\n", + "\n", + "# Gets the absolute path to the src folder\n", + "sys.path.append(os.path.abspath(\"../src\"))\n", + "\n", + "# Now we can import the fucntion from the module\n", + "from my_package.data import fetch_time_data\n", + "\n", + "# Import function to for input_place, replace æøå\n", + "from my_package.util import input_place\n", + "\n", + "# User input the city, for the weather\n", + "city_name = input_place()\n", + "\n", + "# Start_date is the first timestamp, end_date is the last\n", + "start_date, end_date = timestamps[0], timestamps[-1]\n", + "\n", + "# Stores the values in the variables\n", + "weather_data, folder = fetch_time_data(start_date, end_date, city_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lagre data i en json-fil\n", + "\n", + "Skriv inn navn for til filen du vil lagre med dataen.\n", + "\n", + "Eks. test\n", + "Da vil filen lagres som data_**test**.json, i mappen \"../data/output_stedsnavn/data_{filnavn}.json\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Data has been written to /Users/hanne/Documents/anvendt prosjekt/anvendt_mappe/data/../data/output_stedsnavn/data_sandnesinteractive.json\n" + ] + } + ], + "source": [ + "# Gets the absolute path to the src folder\n", + "sys.path.append(os.path.abspath(\"../src\"))\n", + "\n", + "from my_package.data import write_data\n", + "\n", + "filename = input(\"Write filename: \")\n", + "\n", + "# Writes the data, with the chosen name\n", + "write_data(weather_data, folder, filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lese fra fil\n", + "\n", + "Ved hjelp av funksjonen `extract_city_df` fjernes unødvendige kolonner, og dataen blir normalisert for lettere lesbarhet." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
main.tempmain.feels_likemain.pressuremain.humiditymain.temp_minmain.temp_maxwind.speedwind.degclouds.allrain.1h
dt
2025-03-02 23:00:004.141.411019673.845.053.0920020NaN
2025-03-03 00:00:004.311.261018713.875.583.60170100NaN
2025-03-03 01:00:005.022.121017744.395.613.6017040NaN
2025-03-03 02:00:005.252.101016754.826.144.12190750.10
2025-03-03 03:00:005.281.621016734.876.165.141901000.37
2025-03-03 04:00:005.742.201015754.996.705.14200750.24
2025-03-03 05:00:005.561.751016764.956.705.662301000.11
2025-03-03 06:00:005.811.861016734.996.706.1724075NaN
2025-03-03 07:00:006.213.021017935.516.724.63240100NaN
2025-03-03 08:00:006.102.431018745.557.255.66250750.15
2025-03-03 09:00:006.332.331019705.876.866.6925075NaN
2025-03-03 10:00:007.313.111019706.627.978.232500NaN
2025-03-03 11:00:007.073.281019746.497.976.6924075NaN
2025-03-03 12:00:007.233.481018776.497.976.6924075NaN
2025-03-03 13:00:007.233.481019816.497.976.6923075NaN
2025-03-03 14:00:007.072.951018786.497.417.72240750.12
2025-03-03 15:00:006.792.751018805.877.817.202401000.27
2025-03-03 16:00:006.552.271018776.066.877.72240750.18
2025-03-03 17:00:006.612.521018775.937.257.2024075NaN
2025-03-03 18:00:006.622.361018796.067.257.722401000.10
2025-03-03 19:00:006.372.211018815.517.257.20240100NaN
2025-03-03 20:00:006.602.681019806.067.256.6923075NaN
2025-03-03 21:00:006.552.611018786.066.876.69230100NaN
2025-03-03 22:00:006.622.531018786.067.047.2024075NaN
\n", + "
" + ], + "text/plain": [ + " main.temp main.feels_like main.pressure main.humidity \\\n", + "dt \n", + "2025-03-02 23:00:00 4.14 1.41 1019 67 \n", + "2025-03-03 00:00:00 4.31 1.26 1018 71 \n", + "2025-03-03 01:00:00 5.02 2.12 1017 74 \n", + "2025-03-03 02:00:00 5.25 2.10 1016 75 \n", + "2025-03-03 03:00:00 5.28 1.62 1016 73 \n", + "2025-03-03 04:00:00 5.74 2.20 1015 75 \n", + "2025-03-03 05:00:00 5.56 1.75 1016 76 \n", + "2025-03-03 06:00:00 5.81 1.86 1016 73 \n", + "2025-03-03 07:00:00 6.21 3.02 1017 93 \n", + "2025-03-03 08:00:00 6.10 2.43 1018 74 \n", + "2025-03-03 09:00:00 6.33 2.33 1019 70 \n", + "2025-03-03 10:00:00 7.31 3.11 1019 70 \n", + "2025-03-03 11:00:00 7.07 3.28 1019 74 \n", + "2025-03-03 12:00:00 7.23 3.48 1018 77 \n", + "2025-03-03 13:00:00 7.23 3.48 1019 81 \n", + "2025-03-03 14:00:00 7.07 2.95 1018 78 \n", + "2025-03-03 15:00:00 6.79 2.75 1018 80 \n", + "2025-03-03 16:00:00 6.55 2.27 1018 77 \n", + "2025-03-03 17:00:00 6.61 2.52 1018 77 \n", + "2025-03-03 18:00:00 6.62 2.36 1018 79 \n", + "2025-03-03 19:00:00 6.37 2.21 1018 81 \n", + "2025-03-03 20:00:00 6.60 2.68 1019 80 \n", + "2025-03-03 21:00:00 6.55 2.61 1018 78 \n", + "2025-03-03 22:00:00 6.62 2.53 1018 78 \n", + "\n", + " main.temp_min main.temp_max wind.speed wind.deg \\\n", + "dt \n", + "2025-03-02 23:00:00 3.84 5.05 3.09 200 \n", + "2025-03-03 00:00:00 3.87 5.58 3.60 170 \n", + "2025-03-03 01:00:00 4.39 5.61 3.60 170 \n", + "2025-03-03 02:00:00 4.82 6.14 4.12 190 \n", + "2025-03-03 03:00:00 4.87 6.16 5.14 190 \n", + "2025-03-03 04:00:00 4.99 6.70 5.14 200 \n", + "2025-03-03 05:00:00 4.95 6.70 5.66 230 \n", + "2025-03-03 06:00:00 4.99 6.70 6.17 240 \n", + "2025-03-03 07:00:00 5.51 6.72 4.63 240 \n", + "2025-03-03 08:00:00 5.55 7.25 5.66 250 \n", + "2025-03-03 09:00:00 5.87 6.86 6.69 250 \n", + "2025-03-03 10:00:00 6.62 7.97 8.23 250 \n", + "2025-03-03 11:00:00 6.49 7.97 6.69 240 \n", + "2025-03-03 12:00:00 6.49 7.97 6.69 240 \n", + "2025-03-03 13:00:00 6.49 7.97 6.69 230 \n", + "2025-03-03 14:00:00 6.49 7.41 7.72 240 \n", + "2025-03-03 15:00:00 5.87 7.81 7.20 240 \n", + "2025-03-03 16:00:00 6.06 6.87 7.72 240 \n", + "2025-03-03 17:00:00 5.93 7.25 7.20 240 \n", + "2025-03-03 18:00:00 6.06 7.25 7.72 240 \n", + "2025-03-03 19:00:00 5.51 7.25 7.20 240 \n", + "2025-03-03 20:00:00 6.06 7.25 6.69 230 \n", + "2025-03-03 21:00:00 6.06 6.87 6.69 230 \n", + "2025-03-03 22:00:00 6.06 7.04 7.20 240 \n", + "\n", + " clouds.all rain.1h \n", + "dt \n", + "2025-03-02 23:00:00 20 NaN \n", + "2025-03-03 00:00:00 100 NaN \n", + "2025-03-03 01:00:00 40 NaN \n", + "2025-03-03 02:00:00 75 0.10 \n", + "2025-03-03 03:00:00 100 0.37 \n", + "2025-03-03 04:00:00 75 0.24 \n", + "2025-03-03 05:00:00 100 0.11 \n", + "2025-03-03 06:00:00 75 NaN \n", + "2025-03-03 07:00:00 100 NaN \n", + "2025-03-03 08:00:00 75 0.15 \n", + "2025-03-03 09:00:00 75 NaN \n", + "2025-03-03 10:00:00 0 NaN \n", + "2025-03-03 11:00:00 75 NaN \n", + "2025-03-03 12:00:00 75 NaN \n", + "2025-03-03 13:00:00 75 NaN \n", + "2025-03-03 14:00:00 75 0.12 \n", + "2025-03-03 15:00:00 100 0.27 \n", + "2025-03-03 16:00:00 75 0.18 \n", + "2025-03-03 17:00:00 75 NaN \n", + "2025-03-03 18:00:00 100 0.10 \n", + "2025-03-03 19:00:00 100 NaN \n", + "2025-03-03 20:00:00 75 NaN \n", + "2025-03-03 21:00:00 100 NaN \n", + "2025-03-03 22:00:00 75 NaN " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "# Reads from file using pandas\n", + "weather_data = pd.read_json(f'../data/output_stedsnavn/data_{filename}.json')\n", + "#output_stedsnavn\n", + "from my_package.data import extract_city_df\n", + "\n", + "df = extract_city_df(weather_data)\n", + "display(df)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Viser temperaturen\n", + "Regner ut gjennomsnittst-temperatur ved hjelp av innebygde funksjoner. Finner også høyeste og laveste målte temperatur.\n", + "Plotter gjennomsnittstemperaturen og temperaturen per time for dagen valgt, ved hjelp av matplotlib.\n", + "\n", + "Ved hjelp av ipywidgets så er dette et interaktivt diagram som brukeren selv kan justere på ønskelige effekter ved diagrammet. Når koden først kjøres vil det komme standard layout men disse er det bare å endre, for eksempel farge og størrelse på plots. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ddbe1dcabe7a4608afe76a58eab4fb39", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(Checkbox(value=True, description='Vis gjennomsnitt'), Checkbox(value=True, description='Vis rut…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b40babbdbbe8462ca5c7963fe17585ef", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.dates as mdates\n", + "import ipywidgets as widgets\n", + "from IPython.display import display, clear_output\n", + "\n", + "# Temperaturedata\n", + "temp = df['main.temp']\n", + "x_axis = df.index\n", + "\n", + "# Widgets\n", + "show_mean = widgets.Checkbox(value=True, description='Vis gjennomsnitt')\n", + "show_grid = widgets.Checkbox(value=True, description='Vis rutenett')\n", + "dot_color = widgets.ColorPicker(value='#d62728', description='Farge på punktene')\n", + "mean_color = widgets.ColorPicker(value='#d62728', description='Farge for gjennomsnitt')\n", + "dot_size = widgets.IntSlider(value=40, min=10, max=100, step=5, description='Punktstørrelse')\n", + "\n", + "def plot_temp(show_mean, show_grid, dot_color, mean_color, dot_size):\n", + " clear_output(wait=True)\n", + "\n", + " temp_mean = temp.mean().round(2)\n", + " max_temp = temp.max().round(2)\n", + " min_temp = temp.min().round(2)\n", + "\n", + " print(f'Mean temperatur: {temp_mean}')\n", + " print(\"Highest temperature:\", max_temp)\n", + " print(\"Lowest temperature:\", min_temp)\n", + "\n", + " plt.figure(figsize=(12, 6))\n", + " plt.scatter(x_axis, temp, color=dot_color, s=dot_size, alpha=0.7, label='Temperaturmålinger')\n", + "\n", + " if show_mean:\n", + " plt.axhline(y=temp_mean, color=mean_color, linestyle=\"dashed\", label=f'Gj.snitt {temp_mean}°C')\n", + "\n", + " ax = plt.gca()\n", + " ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))\n", + " ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))\n", + " plt.xticks(rotation=45)\n", + " plt.tight_layout()\n", + " plt.title(f'Temperatur {city_name}, ({date})')\n", + " plt.axhline(y=0, color='black', linewidth=1.5)\n", + "\n", + " if show_grid:\n", + " plt.grid()\n", + "\n", + " plt.legend(loc='upper right')\n", + " plt.show()\n", + "\n", + "# Collects widgets in a UI (user interface)\n", + "ui = widgets.VBox([show_mean, show_grid, dot_color, mean_color, dot_size])\n", + "\n", + "# connects widgets to plot-functions\n", + "out = widgets.interactive_output(plot_temp, {\n", + " 'show_mean': show_mean,\n", + " 'show_grid': show_grid,\n", + " 'dot_color': dot_color,\n", + " 'mean_color': mean_color,\n", + " 'dot_size': dot_size,\n", + "})\n", + "\n", + "# show UI and output\n", + "display(ui, out)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "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.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}