diff --git a/plotly-dash/analyse.py b/plotly-dash/analyse.py new file mode 100644 index 0000000..8be0209 --- /dev/null +++ b/plotly-dash/analyse.py @@ -0,0 +1,88 @@ +from dash import Dash, dcc, html, Input, Output +import plotly.express as px + +import pandas as pd +from os.path import join +import plotly.graph_objects as go + +data_folder = "data/enershelf_example" + +df = pd.read_csv(join(data_folder,"clinic_loads.csv"), index_col=0) + +aggregate = df.sum() + + +fig = go.Figure() +fig.add_trace( + go.Scatter( + x=df.index, + y=df["clinic_only"], + name="clinic_only", + marker=dict( + color='rgba(246, 78, 139, 0.6)', + line=dict(color='rgba(246, 78, 139, 1.0)', width=3) + ), + stackgroup="one" # this property is used to group some timeseries together + ) +) +fig.add_trace( + go.Scatter( + x=df.index, + y=df["hh_only"], + name="hh_only", + stackgroup="one" # this then belong to the same stack group as the above line + ) +) +fig.add_trace( + go.Scatter( + x=df.index, + y=df["combi"], + name="combi", + ) # this line does not belong to any stackgroup +) + + +app = Dash(__name__) + +app.layout = html.Div([ + dcc.Graph(id='graph-with-slider', figure=fig), + dcc.Dropdown(id="select", multi=True, options=[{"label": col, "value": col} for col in df.columns]), + # dcc.Slider( + # df['year'].min(), + # df['year'].max(), + # step=None, + # value=df['year'].min(), + # marks={str(year): str(year) for year in df['year'].unique()}, + # id='year-slider' + # ) +] + [ + html.Div([html.Label(col, htmlFor=f"{col}-value", style={"color":"blue"}), dcc.Input(id=f"{col}-value", value=aggregate[col])]) + for col in df.columns +] + +) + + +@app.callback( + Output('graph-with-slider', 'figure'), + Input('select', 'value')) +def update_figure(selected_columns): + print(selected_columns) + + fig = go.Figure() + for col_name in df.columns: + if col_name in selected_columns: + fig.add_trace( + go.Scatter( + x=df.index, + y=df[col_name], + name=col_name, + ) + ) + + return fig + + + +if __name__ == '__main__': + app.run_server(debug=True) diff --git a/plotly-dash/dash_app_workflow.ipynb b/plotly-dash/dash_app_workflow.ipynb new file mode 100644 index 0000000..016ab0d --- /dev/null +++ b/plotly-dash/dash_app_workflow.ipynb @@ -0,0 +1,400 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "af4c3f3d-675c-43bc-953c-ae477a9ac453", + "metadata": {}, + "source": [ + "## How to I get my data into python?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5ea1c8b7-e8f8-4606-b93b-c9d2c62b16e2", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from os.path import join\n", + "import matplotlib" + ] + }, + { + "cell_type": "markdown", + "id": "8057e33e-f58c-48bb-9321-2b5d02aedb4a", + "metadata": {}, + "source": [ + "Load the data file using pandas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ba20af1-73ea-48c8-90eb-ec41bb031590", + "metadata": {}, + "outputs": [], + "source": [ + "data_folder = \"data/enershelf_example\"\n", + "\n", + "\n", + "df = pd.read_csv(join(data_folder,\"clinic_loads.csv\"), index_col=0)\n", + "\n", + "df\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "0ab6bdfe-2adf-4c3e-a29d-56144daeed03", + "metadata": {}, + "source": [ + "## How do I interact with my data using python?\n", + "\n", + "- Using `.info()` [method]() of the DataFrames to get basic information about the columns names and their types\n", + "\n", + "- Using `.loc` [method](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html?highlight=loc#pandas.DataFrame.loc) of DataFrames to filter rows based on certain columns values\n", + "\n", + "- Using `.concat` [method](https://pandas.pydata.org/docs/reference/api/pandas.concat.html) of the DataFrames to merge two or more dataframes together\n", + "\n", + "- Using `.groupby` [method](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html) of the DataFrames to group chunk of data and apply operation such as sum, mean, max etc.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "899f828d-d6b7-4e6d-ae19-c65f76e7027c", + "metadata": {}, + "outputs": [], + "source": [ + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "087b4796-4f7b-4848-8087-fcaf1cba5b4f", + "metadata": {}, + "outputs": [], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4672817-1957-467a-ba94-bbd700761439", + "metadata": {}, + "outputs": [], + "source": [ + "df.loc[(df.hh_only>= 1000) & (df.clinic_only <=2000),[\"hh_only\", \"combi\"]]" + ] + }, + { + "cell_type": "markdown", + "id": "9c400d9b-e67f-4698-883b-d0d48706968f", + "metadata": {}, + "source": [ + "## What do I want to show from my data (a.k.a plotting)?\n", + "\n", + "Looking for inspiration?\n", + "https://plotly.com/python/\n", + "\n", + "If you want to engage the discussion about a certain type of plot, you could do it in https://github.com/rl-institut/plots or in the Rocket Chat Canal #RLI-Plots\n" + ] + }, + { + "cell_type": "markdown", + "id": "3cf1402e-dc6f-4940-9c9c-06c8d9078a8d", + "metadata": {}, + "source": [ + "Plot one timeseries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d614580-94a0-49f8-b49d-e7c5eb129f9c", + "metadata": {}, + "outputs": [], + "source": [ + "import plotly.graph_objects as go\n", + "\n", + "fig = go.Figure()\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"clinic_only\"],\n", + " name=\"clinic_only\",\n", + " marker=dict(\n", + " color='rgba(246, 78, 139, 0.6)',\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " )\n", + " )\n", + ")\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e3fdfba8-7383-48af-ad35-36a041f5d977", + "metadata": {}, + "source": [ + "Plot 2 timeseries?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a2649640-7457-4a4b-9578-da8f0ce50e08", + "metadata": {}, + "outputs": [], + "source": [ + "fig = go.Figure()\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"clinic_only\"],\n", + " name=\"clinic_only\",\n", + " marker=dict(\n", + " #color='rgba(246, 78, 139, 0.6)',\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " )\n", + " )\n", + ")\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"hh_only\"],\n", + " name=\"hh_only\",\n", + " marker=dict(\n", + " color=\"black\",\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " )\n", + " )\n", + ")\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "4cc7be80-ce33-4922-a5db-164496d7b887", + "metadata": {}, + "source": [ + "Copy paste ? Normally no, but it depends on your goal, if you want to add different options to different curves and you only have a few, then copy-paste is ok, otherwise `for` loop " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e3630ba-4598-4b90-98f8-c0a2091c2d92", + "metadata": {}, + "outputs": [], + "source": [ + "fig = go.Figure()\n", + "for col_name in df.columns:\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[col_name],\n", + " name=col_name,\n", + " )\n", + " )\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4460d1ff-8783-4802-820c-a5a6e2f0bff2", + "metadata": {}, + "outputs": [], + "source": [ + "fig = go.Figure()\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"clinic_only\"],\n", + " name=\"clinic_only\",\n", + " marker=dict(\n", + " color='rgba(246, 78, 139, 0.6)',\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " ),\n", + " stackgroup=\"banana\" # this property is used to group some timeseries together\n", + " )\n", + ")\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"hh_only\"],\n", + " name=\"hh_only\",\n", + " stackgroup=\"banana\" # this then belong to the same stack group as the above line\n", + " )\n", + ")\n", + "fig.add_trace(\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"combi\"],\n", + " name=\"combi\",\n", + " ) # this line does not belong to any stackgroup\n", + ")\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "8dce9fe6-61d9-420c-a4c3-361a02aa9ccf", + "metadata": {}, + "source": [ + "Here is how to define a figure from scratch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad63470f-9d2c-4620-acae-b60e8fdf106f", + "metadata": {}, + "outputs": [], + "source": [ + "fig = go.Figure(\n", + " data=[ # data is just a list of graph_objects, could be Bar, Scatter, Pie etc\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"clinic_only\"],\n", + " name=\"clinic_only\",\n", + " marker=dict(\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " ),\n", + " marker_color='rgba(246, 78, 139, 0.6)', # is it also possible to specify nested elements with a _ between the property and the subproperty\n", + " )\n", + " ]\n", + ")\n", + "\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "20e6889d-ae70-4207-a766-e6e30fb8b64b", + "metadata": {}, + "source": [ + "### Error messages\n", + "\n", + "There are here to help you, you should read them, example, typo in parameter name\n", + "\n", + "Deliberately making an error is also a way (at least with plotly) to get the whole list of option listed\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5668369f-bed0-4c20-bea6-bce3789e96b2", + "metadata": {}, + "outputs": [], + "source": [ + "fig = go.Figure(\n", + " data=[ # data is just a list of graph_objects, could be Bar, Scatter, Pie etc\n", + " go.Scatter(\n", + " x=df.index,\n", + " y=df[\"clinic_only\"],\n", + " name=\"clinic_only\",\n", + " marker=dict(\n", + " line=dict(color='rgba(246, 78, 139, 1.0)', width=3)\n", + " ),\n", + " marker_coloR='black', # is it also possible to specify nested elements with a _ between the property and the subproperty\n", + " )\n", + " ]\n", + ")\n", + "fig.show()" + ] + }, + { + "cell_type": "markdown", + "id": "854381f5-501a-45e1-bd98-94fefefb9c1a", + "metadata": {}, + "source": [ + "if your dataset is tidy, then you can use plotly express" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4633ed40-31f7-442a-a670-6341f81d0941", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import plotly.express as px\n", + "\n", + "df = px.data.gapminder().query(\"continent=='Oceania'\")\n", + "\n", + "fig = px.line(df, x=\"year\", y=\"lifeExp\", color='country')\n", + "fig.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5464845-8d28-4da2-b7c4-c40acbab6f9e", + "metadata": {}, + "outputs": [], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "323ceef6-3733-4d39-b948-52c8abe32eec", + "metadata": {}, + "source": [ + "but the figure objects are the same when using `add_trace` or defining the figure from scratch\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db38d6ad-72e3-4523-8446-077f91a66c0b", + "metadata": {}, + "outputs": [], + "source": [ + "fig._data_objs" + ] + }, + { + "cell_type": "markdown", + "id": "56954d00-d96f-43fc-921a-0a23278f0896", + "metadata": {}, + "source": [ + "## Now let's have this into a dash app\n", + "\n", + "This will be done in the `analyse.py` file" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/plotly-dash/data/enershelf_example/clinic_loads.csv b/plotly-dash/data/enershelf_example/clinic_loads.csv new file mode 100644 index 0000000..3e98001 --- /dev/null +++ b/plotly-dash/data/enershelf_example/clinic_loads.csv @@ -0,0 +1,169 @@ +timestamp,clinic_only,hh_only,combi +2022-01-01 00:00:00,1416.6686666666665,624.2381978274,2040.9068644940664 +2022-01-01 01:00:00,1416.6686666666665,624.2381978274,2057.573531160733 +2022-01-01 02:00:00,1433.3353333333334,896.8313001726,2803.4989668392664 +2022-01-01 03:00:00,1906.6676666666665,1033.1278478273998,2906.4621811607326 +2022-01-01 04:00:00,1873.3343333333328,2259.7967978273996,3923.1337978273996 +2022-01-01 05:00:00,1663.3370000000002,1169.424399,2882.7617323333334 +2022-01-01 06:00:00,1713.3373333333332,624.2381978274,3650.9101978274 +2022-01-01 07:00:00,3026.6720000000005,692.3864751726,3583.3921418392665 +2022-01-01 08:00:00,2891.0056666666665,760.534749,4262.207082333333 +2022-01-01 09:00:00,3501.6723333333334,487.9416501726001,3189.6129835059332 +2022-01-01 10:00:00,2701.671333333333,624.2381978274,4745.908864494067 +2022-01-01 11:00:00,4121.670666666667,760.534749,5223.871415666667 +2022-01-01 12:00:00,4463.336666666667,896.8313001726,4956.835966839267 +2022-01-01 13:00:00,4060.004666666667,692.3864751726,4058.392475172601 +2022-01-01 14:00:00,3366.0060000000008,706.0161278273999,3428.6867944940664 +2022-01-01 15:00:00,2722.6706666666664,896.8313001726,3435.1703001726005 +2022-01-01 16:00:00,2538.3390000000004,2259.7967978273996,4413.134131160733 +2022-01-01 17:00:00,2153.3373333333334,3077.5760978273997,5314.2470978274 +2022-01-01 18:00:00,2236.6710000000003,4713.1346978274005,7033.137697827401 +2022-01-01 19:00:00,2320.0030000000006,3350.1692001726,5536.838533505934 +2022-01-01 20:00:00,2186.6693333333333,2668.6864478274,4732.022781160733 +2022-01-01 21:00:00,2063.336333333333,1169.424399,2449.428399 +2022-01-01 22:00:00,1280.004,1033.1278478273998,2056.4638478274 +2022-01-01 23:00:00,1023.336,692.3864751726,2005.7224751725998 +2022-01-02 00:00:00,1313.336,624.2381978274,2410.9075311607335 +2022-01-02 01:00:00,1786.6693333333335,624.2381978274,2177.5738644940666 +2022-01-02 02:00:00,1553.3356666666666,896.8313001726,2583.5006335059334 +2022-01-02 03:00:00,1686.6693333333333,1033.1278478273998,3053.1301811607336 +2022-01-02 04:00:00,2020.0023333333336,2259.7967978273996,4096.466464494067 +2022-01-02 05:00:00,1836.669666666667,1169.424399,2882.762732333333 +2022-01-02 06:00:00,1713.3383333333331,624.2381978274,2610.9098644940664 +2022-01-02 07:00:00,1986.6716666666664,692.3864751726,3175.0584751726 +2022-01-02 08:00:00,2482.672,760.534749,4217.207082333334 +2022-01-02 09:00:00,3456.672333333334,487.9416501726001,4485.611650172601 +2022-01-02 10:00:00,3997.670000000001,624.2381978274,4770.9091978274 +2022-01-02 11:00:00,4146.671,760.534749,4712.2064156666665 +2022-01-02 12:00:00,3951.6716666666666,896.8313001726,3758.8359668392663 +2022-01-02 13:00:00,2862.0046666666663,692.3864751726,3280.7254751726 +2022-01-02 14:00:00,2588.339,706.0161278273999,3224.3551278274003 +2022-01-02 15:00:00,2518.3390000000004,896.8313001726,3073.5043001726 +2022-01-02 16:00:00,2176.673,2259.7967978273996,4153.1361311607325 +2022-01-02 17:00:00,1893.3393333333331,3077.5760978273997,5230.913431160733 +2022-01-02 18:00:00,2153.3373333333334,4713.1346978274005,6999.804364494068 +2022-01-02 19:00:00,2286.669666666667,3350.1692001726,5596.8382001726 +2022-01-02 20:00:00,2246.6690000000003,2668.6864478274,4658.6894478274 +2022-01-02 21:00:00,1990.003,1169.424399,3009.427399 +2022-01-02 22:00:00,1840.003,1033.1278478273998,2273.1298478274 +2022-01-02 23:00:00,1240.0020000000002,692.3864751726,2072.3884751726005 +2022-01-03 00:00:00,1380.0020000000004,624.2381978274,2027.5741978274 +2022-01-03 01:00:00,1403.336,624.2381978274,2630.9071978274 +2022-01-03 02:00:00,2006.669,896.8313001726,2903.5003001726 +2022-01-03 03:00:00,2006.669,1033.1278478273998,3449.796181160733 +2022-01-03 04:00:00,2416.668333333333,2259.7967978273996,4376.465464494066 +2022-01-03 05:00:00,2116.6686666666665,1169.424399,4157.7717323333345 +2022-01-03 06:00:00,2988.3473333333345,624.2381978274,3342.5861978274006 +2022-01-03 07:00:00,2718.3480000000004,692.3864751726,6740.740475172602 +2022-01-03 08:00:00,6048.354000000002,760.534749,7158.889082333337 +2022-01-03 09:00:00,6398.354333333336,487.9416501726001,5063.961983505935 +2022-01-03 10:00:00,4576.020333333335,624.2381978274,5230.925197827402 +2022-01-03 11:00:00,4606.687000000003,760.534749,7529.888082333336 +2022-01-03 12:00:00,6769.353333333335,896.8313001726,8661.851633505934 +2022-01-03 13:00:00,7765.020333333335,692.3864751726,8179.074475172602 +2022-01-03 14:00:00,7486.688000000003,706.0161278273999,5766.037127827403 +2022-01-03 15:00:00,5060.021000000003,896.8313001726,7210.186300172604 +2022-01-03 16:00:00,6313.355000000004,2259.7967978273996,7624.813464494069 +2022-01-03 17:00:00,5365.016666666669,3077.5760978273997,5960.922431160734 +2022-01-03 18:00:00,2883.3463333333348,4713.1346978274005,7126.476031160734 +2022-01-03 19:00:00,2413.3413333333338,3350.1692001726,5586.838533505934 +2022-01-03 20:00:00,2236.6693333333333,2668.6864478274,4955.355781160733 +2022-01-03 21:00:00,2286.6693333333333,1169.424399,3542.760399 +2022-01-03 22:00:00,2373.336,1033.1278478273998,3209.7958478274 +2022-01-03 23:00:00,2176.668,692.3864751726,1889.0561418392667 +2022-01-04 00:00:00,1196.669666666667,624.2381978274,2197.5738644940666 +2022-01-04 01:00:00,1573.3356666666666,624.2381978274,2407.5731978274 +2022-01-04 02:00:00,1783.335,896.8313001726,2770.1673001726 +2022-01-04 03:00:00,1873.336,1033.1278478273998,2906.4641811607326 +2022-01-04 04:00:00,1873.3363333333332,2259.7967978273996,4373.1361311607325 +2022-01-04 05:00:00,2113.3393333333333,1169.424399,3182.7650656666665 +2022-01-04 06:00:00,2013.3406666666665,624.2381978274,2904.2561978274007 +2022-01-04 07:00:00,2280.0180000000005,692.3864751726,4461.745475172602 +2022-01-04 08:00:00,3769.359000000002,760.534749,5578.8887490000025 +2022-01-04 09:00:00,4818.354000000002,487.9416501726001,5572.960650172602 +2022-01-04 10:00:00,5085.019000000002,624.2381978274,9040.924531160737 +2022-01-04 11:00:00,8416.686333333337,760.534749,7693.888415666669 +2022-01-04 12:00:00,6933.353666666669,896.8313001726,7663.518633505936 +2022-01-04 13:00:00,6766.687333333336,692.3864751726,7462.407475172603 +2022-01-04 14:00:00,6770.021000000003,706.0161278273999,8342.036461160737 +2022-01-04 15:00:00,7636.020333333337,896.8313001726,5886.1823001726025 +2022-01-04 16:00:00,4989.351000000002,2259.7967978273996,7903.145464494068 +2022-01-04 17:00:00,5643.348666666669,3077.5760978273997,5897.584764494067 +2022-01-04 18:00:00,2820.008666666667,4713.1346978274005,7366.469364494067 +2022-01-04 19:00:00,2653.334666666667,3350.1692001726,6020.170200172601 +2022-01-04 20:00:00,2670.001,2668.6864478274,5298.687781160734 +2022-01-04 21:00:00,2630.0013333333336,1169.424399,3202.759065666667 +2022-01-04 22:00:00,2033.3346666666669,1033.1278478273998,2236.4625144940665 +2022-01-04 23:00:00,1203.3346666666666,692.3864751726,2252.388808505933 +2022-01-05 00:00:00,1560.0023333333331,624.2381978274,2294.2418644940662 +2022-01-05 01:00:00,1670.0036666666665,624.2381978274,2800.906531160733 +2022-01-05 02:00:00,2176.668333333333,896.8313001726,3230.166966839267 +2022-01-05 03:00:00,2333.335666666667,1033.1278478273998,3149.7965144940667 +2022-01-05 04:00:00,2116.668666666667,2259.7967978273996,4443.1337978274 +2022-01-05 05:00:00,2183.337,1169.424399,3197.7707323333334 +2022-01-05 06:00:00,2028.3463333333336,624.2381978274,3442.591531160735 +2022-01-05 07:00:00,2818.353333333335,692.3864751726,8832.406475172604 +2022-01-05 08:00:00,8140.020000000003,760.534749,8070.555082333337 +2022-01-05 09:00:00,7310.020333333337,487.9416501726001,6881.29531683927 +2022-01-05 10:00:00,6393.35366666667,624.2381978274,9604.25886449407 +2022-01-05 11:00:00,8980.020666666669,760.534749,9587.222082333337 +2022-01-05 12:00:00,8826.687333333337,896.8313001726,5465.184966839269 +2022-01-05 13:00:00,4568.353666666669,692.3864751726,7111.742808505934 +2022-01-05 14:00:00,6419.356333333334,706.0161278273999,5969.702461160735 +2022-01-05 15:00:00,5263.686333333335,896.8313001726,7363.5189668392695 +2022-01-05 16:00:00,6466.687666666669,2259.7967978273996,6993.146464494068 +2022-01-05 17:00:00,4733.349666666669,3077.5760978273997,6250.921764494067 +2022-01-05 18:00:00,3173.3456666666675,4713.1346978274005,7099.8076978274 +2022-01-05 19:00:00,2386.673,3350.1692001726,5553.5052001726 +2022-01-05 20:00:00,2203.336,2668.6864478274,4805.354114494066 +2022-01-05 21:00:00,2136.6676666666667,1169.424399,2996.0933990000003 +2022-01-05 22:00:00,1826.669,1033.1278478273998,2606.4641811607335 +2022-01-05 23:00:00,1573.3363333333334,380.8125618726,1740.8155618726 +2022-01-06 00:00:00,1360.003,337.08862746000005,2397.091960793334 +2022-01-06 01:00:00,2060.0033333333336,343.33100827740003,2480.0003416107334 +2022-01-06 02:00:00,2136.6693333333333,538.0987793999999,2481.4351127333325 +2022-01-06 03:00:00,1943.3363333333332,619.8767094,2613.2127093999998 +2022-01-06 04:00:00,1993.336,1129.8984006726,3623.238067339267 +2022-01-06 05:00:00,2493.339666666667,935.5395191999999,3868.887185866668 +2022-01-06 06:00:00,2933.3476666666684,926.8165388274,7105.168872160736 +2022-01-06 07:00:00,6178.352333333336,619.8767094,5083.231376066669 +2022-01-06 08:00:00,4463.35466666667,928.1795054999999,8293.201838833336 +2022-01-06 09:00:00,7365.022333333337,913.1868861726,8361.541886172603 +2022-01-06 10:00:00,7448.355000000003,1226.66895,7500.024616666669 +2022-01-06 11:00:00,6273.355666666669,1049.4834338274,7647.838100494069 +2022-01-06 12:00:00,6598.35466666667,1076.7427461726,8246.096079505936 +2022-01-06 13:00:00,7169.353333333336,858.6682650000002,5758.689265000002 +2022-01-06 14:00:00,4900.021000000002,994.9648161726002,6055.983816172602 +2022-01-06 15:00:00,5061.019000000002,885.9275738273999,5400.281907160736 +2022-01-06 16:00:00,4514.354333333336,2589.6344511726,5863.986784505934 +2022-01-06 17:00:00,3274.3523333333346,3680.0068499999998,8325.01685 +2022-01-06 18:00:00,4645.010000000001,4713.1346978274005,7319.805031160733 +2022-01-06 19:00:00,2606.670333333333,3350.1692001726,5930.170533505934 +2022-01-06 20:00:00,2580.0013333333336,2668.6864478274,5215.354781160733 +2022-01-06 21:00:00,2546.668333333333,1169.424399,3236.094399 +2022-01-06 22:00:00,2066.67,817.7792999999999,2451.116633333333 +2022-01-06 23:00:00,1633.3373333333332,654.2234399999999,2327.55944 +2022-01-07 00:00:00,1673.336,586.0751661726,2412.7438328392664 +2022-01-07 01:00:00,1826.6686666666665,599.7048188274,2916.3731521607333 +2022-01-07 02:00:00,2316.668333333333,681.4827488274,2988.151415494067 +2022-01-07 03:00:00,2306.668666666667,817.7792999999999,3277.779966666667 +2022-01-07 04:00:00,2460.000666666667,1172.1503288273998,3365.484995494067 +2022-01-07 05:00:00,2193.334666666667,885.9275738273999,6019.273907160734 +2022-01-07 06:00:00,5133.346333333334,940.4461949999999,4177.126528333335 +2022-01-07 07:00:00,3236.680333333335,477.03792382740005,6198.72659049407 +2022-01-07 08:00:00,5721.68866666667,490.66758,5707.3542466666695 +2022-01-07 09:00:00,5216.686666666669,313.4820638274,7590.168063827403 +2022-01-07 10:00:00,7276.686000000002,545.1862011726,7105.205534505936 +2022-01-07 11:00:00,6560.019333333336,858.6682650000002,7332.021598333336 +2022-01-07 12:00:00,6473.353333333336,1172.1503288273998,10333.837662160735 +2022-01-07 13:00:00,9161.687333333335,1090.3723988274,7783.727732160736 +2022-01-07 14:00:00,6693.355333333336,1226.66895,7470.02561666667 +2022-01-07 15:00:00,6243.35666666667,1144.89102,5099.246020000001 +2022-01-07 16:00:00,3954.3550000000023,2725.9309988274003,5959.278332160735 +2022-01-07 17:00:00,3233.3473333333345,3543.7102988274,6640.384632160734 +2022-01-07 18:00:00,3096.6743333333343,4713.1346978274005,6999.807364494067 +2022-01-07 19:00:00,2286.672666666667,3350.1692001726,5603.5048668392665 +2022-01-07 20:00:00,2253.335666666667,2668.6864478274,4772.022781160733 +2022-01-07 21:00:00,2103.336333333333,1169.424399,3006.0927323333335 +2022-01-07 22:00:00,1836.6683333333335,954.0758511726001,2007.4115178392667 +2022-01-07 23:00:00,1053.3356666666666,692.3864751726,2055.7231418392666 \ No newline at end of file diff --git a/plotly-dash/presentation/presentation_plotly_dash.pdf b/plotly-dash/presentation/presentation_plotly_dash.pdf new file mode 100644 index 0000000..296dd32 Binary files /dev/null and b/plotly-dash/presentation/presentation_plotly_dash.pdf differ diff --git a/plotly-dash/requirements.txt b/plotly-dash/requirements.txt index d11fdc2..60f01ae 100644 --- a/plotly-dash/requirements.txt +++ b/plotly-dash/requirements.txt @@ -1,2 +1,3 @@ dash pandas +jupyterlab