Skip to content

Commit 145d0b2

Browse files
committed
model card renders
1 parent 4df3530 commit 145d0b2

6 files changed

Lines changed: 254 additions & 55 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/docs/site/*
2-
2+
docs/source/reference
3+
vetiver/templates/*.html
34
# Mac specific
45
.DS_Store
56

vetiver/data/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
sources = {
44
"mtcars": _files("vetiver") / "data/mtcars.csv",
55
"chicago": _files("vetiver") / "data/chicago.csv",
6+
"sacramento": _files("vetiver") / "data/sacramento.csv",
67
}
78

89

@@ -16,5 +17,6 @@ def __getattr__(k):
1617
f_path = sources.get("mtcars")
1718
if k == "chicago":
1819
f_path = sources.get("chicago")
19-
20+
elif k == "sacramento":
21+
f_path = sources.get("sacramento")
2022
return pd.read_csv(f_path)

vetiver/data/sacramento.csv

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
"price","type","sqft","beds","baths"
2+
68212,"Residential",1167,3,1
3+
89921,"Condo",1122,3,1
4+
98937,"Residential",1146,3,2
5+
122682,"Residential",1329,4,2
6+
123000,"Residential",1240,4,2
7+
124100,"Residential",1601,3,2
8+
126640,"Residential",1088,3,2
9+
131200,"Residential",1380,4,2
10+
141000,"Condo",1039,2,2
11+
146250,"Residential",1418,3,2
12+
149593,"Residential",1146,4,2
13+
152000,"Condo",1304,2,2
14+
164000,"Residential",1120,4,1
15+
173000,"Residential",1590,4,2
16+
181000,"Residential",1172,3,2
17+
189000,"Residential",1420,3,2
18+
195000,"Multi_Family",2162,4,4
19+
231477,"Residential",1478,3,2
20+
234697,"Residential",1287,3,2
21+
242638,"Residential",2163,3,2
22+
244500,"Residential",1473,3,3
23+
254200,"Residential",1921,4,2
24+
263500,"Residential",1713,4,2
25+
265000,"Condo",1672,3,2
26+
285000,"Residential",2056,4,2
27+
292024,"Residential",1126,2,1
28+
334150,"Residential",1690,2,1
29+
370500,"Residential",2734,4,3
30+
372000,"Residential",2110,3,2
31+
430000,"Residential",3615,5,3
32+
510000,"Residential",3508,5,4
33+
539000,"Residential",2462,4,2
34+
98000,"Residential",1220,2,1
35+
99000,"Residential",1643,3,1
36+
100000,"Condo",722,1,1
37+
111000,"Residential",1039,3,1
38+
123750,"Residential",1110,3,2
39+
126000,"Residential",1080,3,2
40+
135500,"Residential",1264,3,2
41+
145000,"Residential",1448,4,2
42+
146000,"Residential",1183,4,2
43+
150000,"Residential",1364,3,2
44+
161653,"Residential",1156,3,2
45+
175000,"Residential",1671,3,2
46+
180400,"Residential",1716,3,2
47+
205000,"Residential",1953,4,3
48+
230000,"Residential",1567,3,2
49+
236250,"Residential",1291,3,1
50+
256054,"Multi_Family",2085,5,4
51+
261000,"Residential",1567,3,2
52+
270000,"Residential",1531,3,2
53+
280000,"Residential",2494,4,3
54+
330000,"Residential",1258,3,2
55+
350000,"Residential",2295,4,3
56+
460000,"Residential",2129,3,2
57+
504000,"Residential",2791,3,3
58+
613401,"Residential",3838,4,3
59+
614000,"Residential",3059,4,3.5
60+
48000,"Condo",484,1,1
61+
100000,"Condo",625,1,1
62+
101000,"Residential",888,2,1
63+
114750,"Residential",779,2,1
64+
116100,"Residential",1174,3,1
65+
120000,"Multi_Family",1995,4,4
66+
123000,"Residential",1104,3,2
67+
130000,"Residential",1209,3,2
68+
133105,"Residential",1139,2,1
69+
136500,"Residential",1690,2,2
70+
145000,"Residential",1120,3,2
71+
147000,"Residential",1590,4,2
72+
149600,"Residential",1407,3,2
73+
150000,"Condo",1057,2,2
74+
150000,"Residential",1646,3,2
75+
165000,"Residential",1112,2,2
76+
168000,"Residential",1039,3,1
77+
188325,"Residential",1152,3,1
78+
215000,"Residential",1856,4,2
79+
220000,"Residential",950,2,1
80+
232000,"Residential",1375,3,2
81+
232500,"Condo",1250,2,2
82+
233641,"Residential",1058,3,1
83+
236000,"Multi_Family",2382,5,4
84+
240000,"Residential",1816,4,2
85+
252155,"Residential",1574,4,2
86+
254172,"Residential",1830,3,2
87+
261000,"Residential",1904,4,2
88+
270000,"Residential",1457,3,2
89+
285000,"Multi_Family",960,2,2
90+
296000,"Residential",2109,4,2
91+
304000,"Residential",2489,5,3
92+
305000,"Residential",1851,4,3
93+
325000,"Residential",2347,5,3
94+
351000,"Residential",2789,4,2
95+
355000,"Residential",3499,5,3.5
96+
360552,"Residential",1871,4,2
97+
362305,"Residential",1800,3,2
98+
395100,"Residential",3281,5,3
99+
408431,"Residential",2085,4,3
100+
445000,"Residential",2002,4,2
101+
500000,"Residential",1905,3,2
102+
677048,"Residential",2025,3,2
103+
95625,"Residential",1089,3,2
104+
115000,"Residential",911,2,1
105+
115000,"Condo",846,1,1
106+
115620,"Residential",1410,3,2
107+
131750,"Residential",1118,2,2
108+
137760,"Residential",1260,3,2
109+
176095,"Residential",1200,3,2
110+
176250,"Residential",1170,3,2
111+
178000,"Residential",1199,3,2
112+
190000,"Residential",796,2,1
113+
193000,"Residential",1452,3,2
114+
193500,"Residential",1513,3,2
115+
204918,"Residential",2306,4,2
116+
210944,"Condo",984,1,1
117+
212500,"Condo",1462,3,2.5
118+
220000,"Residential",1566,4,2
119+
220000,"Residential",1419,4,2
120+
220000,"Residential",1261,3,2
121+
232500,"Residential",2258,5,3
122+
233000,"Residential",1074,3,2
123+
242000,"Residential",1406,2,2
124+
243500,"Residential",1876,4,2
125+
247000,"Residential",1676,3,2
126+
249000,"Residential",1899,4,3
127+
260000,"Residential",1196,3,2
128+
270000,"Residential",2750,2,2
129+
271000,"Residential",1910,3,2.5
130+
280000,"Residential",1443,3,2
131+
285000,"Residential",1857,3,2
132+
289000,"Residential",2096,4,3
133+
290000,"Residential",1720,3,2
134+
294000,"Residential",1282,3,2
135+
299000,"Residential",1144,2,1
136+
300000,"Residential",1457,3,2
137+
300567,"Residential",1577,3,2
138+
310000,"Residential",1800,4,3
139+
315000,"Residential",3134,5,3
140+
326951,"Residential",1744,3,2
141+
331200,"Residential",2484,4,2
142+
335000,"Residential",1616,3,2
143+
350000,"Residential",2960,3,2
144+
375000,"Residential",2616,5,3
145+
380000,"Residential",1727,3,1
146+
400000,"Residential",3566,5,4
147+
455000,"Residential",2379,4,3
148+
600000,"Residential",3901,5,5
149+
61000,"Residential",876,2,1
150+
70000,"Residential",1011,2,1
151+
80000,"Residential",1158,4,2
152+
85500,"Residential",1092,3,2
153+
92000,"Condo",956,2,1
154+
112500,"Residential",1249,3,2
155+
114800,"Residential",1161,3,2
156+
128687,"Residential",962,3,1
157+
130000,"Residential",1127,3,2
158+
132000,"Residential",970,2,1
159+
145846,"Residential",1543,3,2
160+
150000,"Residential",1392,4,2
161+
170000,"Residential",1232,3,2
162+
171750,"Residential",1177,2,2
163+
172000,"Residential",1582,3,2
164+
176850,"Residential",1477,4,2
165+
189000,"Residential",1039,3,1
166+
191675,"Residential",1638,3,2
167+
209347,"Residential",1262,3,2
168+
216000,"Residential",1416,3,2
169+
216021,"Residential",888,3,1
170+
220000,"Residential",1770,4,2
171+
224252,"Residential",960,3,1
172+
228000,"Residential",1450,3,2
173+
235301,"Residential",1685,4,2

vetiver/model_card.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ def model_card(path="."):
1515
"""
1616
src_path = _files("vetiver") / "templates/model_card.qmd"
1717

18-
if _log is not None:
19-
_log.info("Writing model card template...")
18+
logging.info("Writing model card template:")
2019

2120
return shutil.copy(src=src_path, dst=path)

vetiver/templates/model_card.qmd

Lines changed: 74 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,64 @@
11
---
22
title: "Model Card: your model title"
3-
date: '`python date.today()`'
43
output:
54
html_document
6-
params:
7-
board: !python pins.board_rsconnect()
8-
name: isabel.zimmerman/sacramento_rf
9-
version: NULL
105
---
6+
```{python}
7+
#| echo: false
8+
from IPython.display import display, Markdown
9+
import datetime
10+
display(Markdown(f"""
11+
###### {datetime.date.today()}
12+
"""))
13+
```
14+
15+
```{python}
16+
#| tags: [parameters]
17+
#| include: false
18+
import pins
19+
20+
raw = "https://colorado.rstudio.com/rsc/"
21+
paths = {"v": "sacramento/"}
22+
board = pins.board_urls(raw, paths, allow_pickle_read=True)
23+
```
1124

12-
```{python setup, include=FALSE}
13-
from datetime import date
25+
```{python}
26+
#| include: false
27+
import datetime
28+
import pandas as pd
29+
import plotly.express as px
1430
from sklearn import metrics
1531
import vetiver
16-
import pins
1732
18-
# library(yardstick)
19-
# knitr::opts_chunk$set(echo = FALSE)
20-
v = vetiver.VetiverModel.from_pin(pins.board_rsconnect(server_url = "https://colorado.rstudio.com/rsc/"), "isabel.zimmerman/cars_mpg")
33+
v = vetiver.VetiverModel.from_pin(board, "v")
34+
v_meta = board.pin_meta("v")
2135
```
2236

37+
2338
A [model card](https://doi.org/10.1145/3287560.3287596) provides brief, transparent, responsible reporting for a trained machine learning model.
2439

2540
## Model details
2641

2742
- Developed by PERSON AND/OR TEAM
28-
- `python print(f"{v.description} using {v.ptype} features")`
43+
```{python}
44+
#| echo: false
45+
display(Markdown(f"""
46+
- A {v.description} using {len(v.ptype.construct().dict())} features.
47+
"""))
48+
```
2949
- More details about how model was developed and what it is predicting
3050
- More details on feature engineering and/or data preprocessing for model
31-
- Version `python v.metadata.version` of this model was published at `r v_meta.created`
51+
```{python}
52+
#| echo: false
53+
display(Markdown(f"""
54+
- Version {v.metadata.get("version")} was created at {
55+
datetime.datetime.strptime(
56+
v_meta.created, '%Y%m%dT%H%M%SZ')
57+
.strftime('%Y-%m-%d %H:%M:%S')
58+
}
59+
"""))
60+
```
61+
3262
- Citation and/or license details for the model
3363
- If you have questions about this model, please contact PERSON@ORG.ORG
3464

@@ -53,70 +83,64 @@ A [model card](https://doi.org/10.1145/3287560.3287596) provides brief, transpar
5383

5484
- The training dataset for this model was ...
5585
- The training dataset for this model has the "prototype" or signature:
56-
5786
```{python}
58-
v.ptype
87+
#| echo: false
88+
v.ptype.construct().schema().get("properties")
5989
```
6090

6191
- The evaluation dataset used in this model card is ...
6292
- We chose this evaluation data because ...
6393

94+
95+
## Quantitative analyses
96+
:::{.panel-tabset}
6497
```{python}
65-
## EVALUATION DATA:
66-
from vetiver.data import mtcars
98+
#| include: false
6799
## consider using a package like skimr or DataExplorer for automated
68-
## presentation of evaluation data characteristics
69-
```
70100
71-
72-
## Quantitative analyses {.tabset}
73-
74-
```{python}
75-
## compute predictions for your evaluation data
76-
## `handler_startup` is designed to get the R process ready to make predictions
77-
#suppressPackageStartupMessages(handler_startup(v))
78-
new_data["preds"] = v.model.predict(mtcars.drop(columns="mpg"))
79101
```
80-
81-
82-
### Overall model performance
102+
## Overall model performance
83103

84104
```{python}
105+
#| echo: false
106+
## compute predictions for your evaluation data
107+
from vetiver.data import sacramento
85108
86-
metric_set = [metrics.mean_absolute_error, metrics.mean_squared_error]
109+
sacramento["preds"] = v.model.predict(sacramento.drop(columns=["price"]))
110+
metric_set = [metrics.mean_absolute_error, metrics.mean_squared_error, metrics.r2_score]
87111
112+
for metric in metric_set:
113+
print(metric.__qualname__, ": ", metric(y_pred=sacramento["preds"], y_true=sacramento["price"]))
88114
```
89115

90-
### Disaggregated model performance
116+
## Disaggregated model performance
91117

92118
```{python}
119+
#| echo: false
93120
94-
preds %>%
95-
group_by(type) %>%
96-
metrics(price, .pred)
121+
dmp = pd.DataFrame()
122+
for metric in metric_set:
123+
dmp[metric.__qualname__] = sacramento.groupby("type")\
124+
.apply(lambda x: metric(y_pred=x["preds"], y_true=x["price"]))
125+
dmp
97126
```
98127

99-
### Visualize model performance
128+
## Visualize model performance
100129

101-
```{python, fig.height=3}
102-
preds %>%
103-
ggplot(aes(price, .pred, color = type)) +
104-
geom_abline(slope = 1, lty = 2, color = "gray60", size = 1.2) +
105-
geom_point(alpha = 0.5, show.legend = FALSE) +
106-
facet_wrap(vars(type))
130+
```{python}
131+
performance = px.scatter(sacramento, x="price", y = "preds", facet_row="type", trendline="ols")
132+
performance.update_yaxes(matches=None)
133+
performance.show()
107134
```
108135

109-
### Make a custom plot
136+
## Make a custom plot
110137

111-
```{r}
112-
preds %>%
113-
mutate(.resid = price - .pred) %>%
114-
ggplot(aes(longitude, latitude, color = .resid)) +
115-
geom_point(alpha = 0.8) +
116-
scale_color_gradient2() +
117-
coord_fixed()
138+
```{python}
139+
custom = px.violin(sacramento, x="beds", y = "price")
140+
custom.show()
118141
```
119142

143+
:::
120144

121145
## Ethical considerations
122146

vetiver/vetiver_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def from_pin(cls, board, name: str, version: str = None):
8787
description=meta.description,
8888
metadata=_model_meta(
8989
user=meta.user,
90-
version=meta.version.version.abc,
90+
version=meta.version.version,
9191
url=meta.user.get("url"), # None all the time, besides Connect
9292
required_pkgs=meta.user.get("required_pkgs"),
9393
),

0 commit comments

Comments
 (0)