André Catarino commited on
Commit
e5837ca
·
1 Parent(s): 6aed271
Files changed (5) hide show
  1. Dockerfile +24 -0
  2. Dockerfile.dev +9 -0
  3. README.md +46 -7
  4. app/app.py +125 -0
  5. requirements.txt +9 -0
Dockerfile ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10
2
+ # Set up a new user named "user" with user ID 1000
3
+ RUN useradd -m -u 1000 user
4
+
5
+ # Switch to the "user" user
6
+ USER user
7
+ # Set home to the user's home directory
8
+ ENV HOME=/home/user \
9
+ PATH=/home/user/.local/bin:$PATH
10
+
11
+ # Set the working directory to the user's home directory
12
+ WORKDIR $HOME/app
13
+
14
+ # Copy the current directory contents into the container at $HOME/app setting the owner to the user
15
+ COPY --chown=user ./app $HOME/app
16
+
17
+
18
+ ENV DASH_DEBUG_MODE False
19
+ #COPY ./app /app
20
+ #WORKDIR /app
21
+ RUN set -ex && \
22
+ pip install -r requirements.txt
23
+ EXPOSE 8050
24
+ CMD ["gunicorn", "-b", "0.0.0.0:8050", "--reload", "app:server"]
Dockerfile.dev ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.10
2
+
3
+ ENV DASH_DEBUG_MODE True
4
+ COPY ./app /app
5
+ WORKDIR /app
6
+ RUN set -ex && \
7
+ pip install -r requirements.txt
8
+ EXPOSE 8050
9
+ CMD ["python", "app.py"]
README.md CHANGED
@@ -1,11 +1,50 @@
1
  ---
2
- title: Energy Price Forecasting
3
- emoji: 🌍
4
- colorFrom: yellow
5
- colorTo: red
6
  sdk: docker
7
- pinned: false
8
- license: mit
9
  ---
 
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Smart Shower Dashboard
3
+ emoji: 📈
4
+ colorFrom: purple
5
+ colorTo: gray
6
  sdk: docker
7
+ app_port: 8050
 
8
  ---
9
+ # Docker Dash (Plotly)
10
 
11
+ Dockerize a Python Dash app for quick prototyping.
12
+
13
+ ## Build and run
14
+
15
+ `prod` version is served by `gunicorn` instead of the `flask` dev server.
16
+
17
+ ```sh
18
+ # dev
19
+ docker build -f Dockerfile.dev -t docker-dash-example-dev .
20
+ docker run -p 8050:8050 -v "$(pwd)"/app:/app --rm docker-dash-example-dev
21
+
22
+ # prod
23
+ docker build -f Dockerfile -t docker-dash-example-prod .
24
+ docker run -p 8050:8050 -v "$(pwd)"/app:/app --rm docker-dash-example-prod
25
+ ```
26
+
27
+ ## Access the page
28
+
29
+ Go to `http://localhost:8050` in browser.
30
+
31
+ ## Switch debug mode in Dockerfile
32
+
33
+ ```dockerfile
34
+ ENV DASH_DEBUG_MODE True # False
35
+ ```
36
+
37
+ ## Development
38
+
39
+ Install the app requirements for development to get better editor support.
40
+
41
+ ```sh
42
+ poetry install
43
+ ```
44
+
45
+ Optional: clean initialization of `poetry`:
46
+
47
+ ```sh
48
+ poetry init
49
+ cat app/requirements.txt | xargs poetry add
50
+ ```
app/app.py ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+
3
+ data = pd.DataFrame(columns=["Dataset", "Alpha", "Top K", "Recall", "Precision"])
4
+ data = pd.concat(
5
+ [
6
+ data,
7
+ pd.DataFrame(
8
+ [["ml-100k", 0.1, 20, 0.2, 0.2]],
9
+ columns=["Dataset", "Alpha", "Top K", "Recall", "Precision"],
10
+ ),
11
+ ]
12
+ )
13
+
14
+ import os
15
+ import plotly.express as px
16
+ import pandas as pd
17
+ from dash import Dash, html, dcc, Input, Output, callback
18
+ import plotly.express as px
19
+ from dataclasses import dataclass
20
+ import json
21
+
22
+ data = pd.DataFrame(columns=["Dataset", "Alpha", "Top K", "Recall", "Precision"])
23
+ data = pd.concat(
24
+ [
25
+ data,
26
+ pd.DataFrame(
27
+ [["ml-100k", 0.1, 20, 0.2, 0.2]],
28
+ columns=["Dataset", "Alpha", "Top K", "Recall", "Precision"],
29
+ ),
30
+ ]
31
+ )
32
+ debug = False
33
+
34
+
35
+ external_stylesheets = ["https://codepen.io/chriddyp/pen/bWLwgP.css"]
36
+
37
+ app = Dash(__name__, external_stylesheets=external_stylesheets)
38
+
39
+ server = app.server
40
+
41
+
42
+ dataset_options = [
43
+ {"label": entry, "value": entry} for entry in data["Dataset"].unique()
44
+ ]
45
+ dataset_options_default_value = data["Dataset"].unique()[0]
46
+
47
+ alpha_options = [{"label": entry, "value": entry} for entry in data["Alpha"].unique()]
48
+ alpha_options_default_value = data["Alpha"].unique()[0]
49
+
50
+ top_k_options = [{"label": entry, "value": entry} for entry in data["Top K"].unique()]
51
+ top_k_options_default_value = data["Top K"].unique()[0]
52
+
53
+ app.layout = html.Div(
54
+ [
55
+ html.H1("System Evaluation"),
56
+ html.Div(
57
+ [
58
+ html.Div(
59
+ [
60
+ html.H3("Dataset"),
61
+ dcc.Dropdown(
62
+ id="dataset-dropdown",
63
+ options=dataset_options,
64
+ value=dataset_options_default_value,
65
+ ),
66
+ ],
67
+ className="three columns",
68
+ ),
69
+ html.Div(
70
+ [
71
+ html.H3("Alpha"),
72
+ dcc.Dropdown(
73
+ id="alpha-dropdown",
74
+ options=alpha_options,
75
+ value=alpha_options_default_value,
76
+ ),
77
+ ],
78
+ className="three columns",
79
+ ),
80
+ html.Div(
81
+ [
82
+ html.H3("Top K"),
83
+ dcc.Dropdown(
84
+ id="top_k-dropdown",
85
+ options=top_k_options,
86
+ value=top_k_options_default_value,
87
+ ),
88
+ ],
89
+ className="three columns",
90
+ ),
91
+ ],
92
+ className="row",
93
+ ),
94
+ html.Div(
95
+ [
96
+ html.Div([dcc.Graph(id="recall-graph")], className="six columns"),
97
+ html.Div([dcc.Graph(id="precision-graph")], className="six columns"),
98
+ ],
99
+ className="row",
100
+ ),
101
+ ]
102
+ )
103
+
104
+
105
+ @app.callback(
106
+ Output("recall-graph", "figure"),
107
+ Output("precision-graph", "figure"),
108
+ Input("alpha-dropdown", "value"),
109
+ Input("dataset-dropdown", "value"),
110
+ Input("top_k-dropdown", "value"),
111
+ )
112
+ def update_graph(alpha, dataset, top_k):
113
+ filtered_data = data[
114
+ (data["Alpha"] == alpha)
115
+ & (data["Dataset"] == dataset)
116
+ & (data["Top K"] == top_k)
117
+ ]
118
+ recall_fig = px.bar(filtered_data, x="Dataset", y="Recall")
119
+ precision_fig = px.bar(filtered_data, x="Dataset", y="Precision")
120
+ return recall_fig, precision_fig
121
+
122
+
123
+ # Run app and display result inline in the notebook
124
+ if __name__ == "__main__":
125
+ app.run_server(host = '0.0.0.0', port='8050', debug=True)
requirements.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ pandas
2
+ numpy
3
+ matplotlib
4
+ seaborn
5
+ sklearn
6
+ missingpy
7
+ tensorflow
8
+ tcn
9
+ dash