Spaces:
Runtime error
Runtime error
André Catarino
commited on
Commit
·
e5837ca
1
Parent(s):
6aed271
docker
Browse files- Dockerfile +24 -0
- Dockerfile.dev +9 -0
- README.md +46 -7
- app/app.py +125 -0
- 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:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: docker
|
7 |
-
|
8 |
-
license: mit
|
9 |
---
|
|
|
10 |
|
11 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|