Skip to content

Commit 5c49296

Browse files
committed
add examples to docstrings
1 parent 0754ad8 commit 5c49296

File tree

8 files changed

+121
-20
lines changed

8 files changed

+121
-20
lines changed

docs/source/index.rst

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,12 @@ Monitor
7070

7171
Model Handlers
7272
==================
73+
7374
.. autosummary::
7475
:toctree: reference/
75-
:caption: Monitor
76+
:caption: Model Handlers
7677

77-
~BaseHandler
78+
~handlers.BaseHandler
7879
~SKLearnHandler
7980
~TorchHandler
8081
~StatsmodelsHandler

vetiver/pin_read_write.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@ def vetiver_pin_write(board, model: VetiverModel, versioned: bool = True):
3030
VetiverModel to be written to board
3131
versioned: bool
3232
Whether or not the pin should be versioned
33+
34+
Example
35+
-------
36+
>>> import vetiver
37+
>>> from pins import board_temp
38+
>>> model_board = board_temp(versioned = True, allow_pickle_read = True)
39+
>>> X, y = vetiver.get_mock_data()
40+
>>> model = vetiver.get_mock_model().fit(X, y)
41+
>>> v = vetiver.VetiverModel(model = model, model_name = "my_model", ptype_data = X)
42+
>>> vetiver.vetiver_pin_write(model_board, v)
3343
"""
3444
if not board.allow_pickle_read:
3545
raise NotImplementedError # must be pickle-able

vetiver/rsconnect.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def deploy_rsconnect(
2626
2727
Parameters
2828
----------
29-
connect_server:
29+
connect_server: rsconnect.api.RSConnectServer
3030
RSConnect Server
3131
board:
3232
Pins board
@@ -52,6 +52,26 @@ def deploy_rsconnect(
5252
Callback to use to write the log to
5353
image: str
5454
Docker image to be specified for off-host execution
55+
56+
Example
57+
-------
58+
>>> import vetiver
59+
>>> import pins
60+
>>> import rsconnect
61+
>>> board = pins.board_temp(allow_pickle_read=True)
62+
>>> connect_server = rsconnect.api.RSConnectServer(
63+
... url = url,
64+
... api_key = api_key) # doctest: +SKIP
65+
>>> X, y = vetiver.get_mock_data()
66+
>>> model = vetiver.get_mock_model().fit(X, y)
67+
>>> v = vetiver.VetiverModel(model = model,
68+
... model_name = "my_model",
69+
... ptype_data = X)
70+
>>> vetiver.deploy_rsconnect(
71+
... connect_server = connect_server,
72+
... board = board,
73+
... pin_name = "my_model"
74+
... ) # doctest: +SKIP
5575
"""
5676
if not title:
5777
title = pin_name + "_vetiver"

vetiver/server.py

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,22 @@
1515
class VetiverAPI:
1616
"""Create model aware API
1717
18-
Attributes
18+
Parameters
1919
----------
2020
model : VetiverModel
2121
Model to be deployed in API
2222
check_ptype : bool
2323
Determine if data prototype should be enforced
2424
app_factory :
2525
Type of API to be deployed
26-
app :
27-
API that is deployed
26+
27+
Example
28+
-------
29+
>>> import vetiver
30+
>>> X, y = vetiver.get_mock_data()
31+
>>> model = vetiver.get_mock_model().fit(X, y)
32+
>>> v = vetiver.VetiverModel(model = model, model_name = "my_model", ptype_data = X)
33+
>>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
2834
"""
2935

3036
app = None
@@ -133,7 +139,7 @@ async def rapidoc():
133139
def vetiver_post(
134140
self, endpoint_fx: Callable, endpoint_name: str = "custom_endpoint"
135141
):
136-
"""Create new POST endpoint
142+
"""Create new POST endpoint that is aware of model input data
137143
138144
Parameters
139145
----------
@@ -142,25 +148,31 @@ def vetiver_post(
142148
endpoint_name : str
143149
Name of endpoint
144150
145-
Returns
151+
Example
146152
-------
147-
dict
148-
Key: endpoint_name Value: Output of endpoint_fx, in list format
153+
>>> import vetiver
154+
>>> X, y = vetiver.get_mock_data()
155+
>>> model = vetiver.get_mock_model().fit(X, y)
156+
>>> v = vetiver.VetiverModel(model = model, model_name = "model", ptype_data = X)
157+
>>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
158+
>>> def sum_values(x):
159+
... return x.sum()
160+
>>> v_api.vetiver_post(sum_values, "sums")
149161
"""
150162
if self.check_ptype is True:
151163

152164
@self.app.post("/" + endpoint_name)
153165
async def custom_endpoint(input_data: self.model.ptype):
154166
y = _prepare_data(input_data)
155-
new = endpoint_fx(pd.Series(y))
167+
new = endpoint_fx(pd.DataFrame(y))
156168
return {endpoint_name: new.tolist()}
157169

158170
else:
159171

160172
@self.app.post("/" + endpoint_name)
161173
async def custom_endpoint(input_data: Request):
162174
y = await input_data.json()
163-
new = endpoint_fx(pd.Series(y))
175+
new = endpoint_fx(pd.DataFrame(y))
164176

165177
return {endpoint_name: new.tolist()}
166178

@@ -174,6 +186,15 @@ def run(self, port: int = 8000, host: str = "127.0.0.1", **kw):
174186
An integer that indicates the server port that should be listened on.
175187
host : str
176188
A valid IPv4 or IPv6 address, which the application will listen on.
189+
190+
Example
191+
-------
192+
>>> import vetiver
193+
>>> X, y = vetiver.get_mock_data()
194+
>>> model = vetiver.get_mock_model().fit(X, y)
195+
>>> v = vetiver.VetiverModel(model = model, model_name = "model", ptype_data = X)
196+
>>> v_api = vetiver.VetiverAPI(model = v, check_ptype = True)
197+
>>> v_api.run() # doctest: +SKIP
177198
"""
178199
_jupyter_nb()
179200
uvicorn.run(self.app, port=port, host=host, **kw)
@@ -209,6 +230,13 @@ def predict(endpoint, data: Union[dict, pd.DataFrame, pd.Series], **kw):
209230
-------
210231
dict
211232
Endpoint_name and list of endpoint_fx output
233+
234+
Example
235+
-------
236+
>>> import vetiver
237+
>>> X, y = vetiver.get_mock_data()
238+
>>> endpoint = vetiver.vetiver_endpoint(url='http://127.0.0.1:8000/predict')
239+
>>> vetiver.predict(endpoint, X) # doctest: +SKIP
212240
"""
213241
if isinstance(endpoint, testclient.TestClient):
214242
requester = endpoint
@@ -273,5 +301,10 @@ def vetiver_endpoint(url="http://127.0.0.1:8000/predict"):
273301
-------
274302
url : str
275303
URI path to endpoint
304+
305+
Example
306+
-------
307+
>>> import vetiver
308+
>>> endpoint = vetiver.vetiver_endpoint(url='http://127.0.0.1:8000/predict')
276309
"""
277310
return url

vetiver/tests/test_add_endpoint.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_endpoint_adds_ptype():
3030
data = {"B": 0, "C": 0, "D": 0}
3131
response = client.post("/sum", json=data)
3232
assert response.status_code == 200, response.text
33-
assert response.json() == {"sum": 0}, response.json()
33+
assert response.json() == {"sum": [0]}, response.json()
3434

3535

3636
def test_endpoint_adds_no_ptype():
@@ -40,4 +40,4 @@ def test_endpoint_adds_no_ptype():
4040
data = [0, 0, 0]
4141
response = client.post("/sum", json=data)
4242
assert response.status_code == 200, response.text
43-
assert response.json() == {"sum": 0}, response.json()
43+
assert response.json() == {"sum": [0]}, response.json()

vetiver/vetiver_model.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class VetiverModel:
2525
----------
2626
model :
2727
A trained model, such as an sklearn or torch model
28-
name : string
28+
model_name : string
2929
Model name or ID
3030
ptype_data : pd.DataFrame, np.array
3131
Sample of data model should expect when it is being served
@@ -49,6 +49,14 @@ class VetiverModel:
4949
VetiverModel can also take an initialized custom VetiverHandler
5050
as a model, for advanced use cases or non-supported model types.
5151
52+
Example
53+
-------
54+
>>> from vetiver import mock, VetiverModel
55+
>>> X, y = mock.get_mock_data()
56+
>>> model = mock.get_mock_model().fit(X, y)
57+
>>> v = VetiverModel(model = model, model_name = "my_model", ptype_data = X)
58+
>>> v.description
59+
"Scikit-learn <class 'sklearn.dummy.DummyRegressor'> model"
5260
"""
5361

5462
def __init__(

vetiver/write_docker.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def write_docker(
2929
):
3030
"""Writes a Dockerfile to run VetiverAPI in a container
3131
32-
Args
33-
----
32+
Parameters
33+
----------
3434
app_file: str
3535
File containing VetiverAPI to be deployed into container
3636
path: str
@@ -41,6 +41,22 @@ def write_docker(
4141
Host address to run VetiverAPI from Dockerfile
4242
port: str
4343
Port to run VetiverAPI from Dockerfile
44+
45+
Example
46+
-------
47+
>>> import vetiver
48+
>>> import tempfile
49+
>>> import pins
50+
>>> tmp = tempfile.TemporaryDirectory()
51+
>>> board = pins.board_temp(allow_pickle_read=True)
52+
>>> X, y = vetiver.get_mock_data()
53+
>>> model = vetiver.get_mock_model().fit(X, y)
54+
>>> v = vetiver.VetiverModel(model = model, model_name = "my_model", ptype_data = X)
55+
>>> vetiver.vetiver_pin_write(board, v)
56+
>>> vetiver.write_app(board,
57+
... "my_model",
58+
... file = tmp.name + "/app.py") # need file for model
59+
>>> vetiver.write_docker(app_file = "app.py", path = tmp.name)
4460
"""
4561
py_version = str(sys.version_info.major) + "." + str(sys.version_info.minor)
4662

vetiver/write_fastapi.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,29 @@ def write_app(
5656
):
5757
"""Write VetiverAPI app to a file
5858
59-
Args
60-
----
61-
board : pinse.BaseBoard
59+
Parameters
60+
----------
61+
board :
6262
API to be written
6363
pin_name : string
6464
Name of pin containing VetiverModel
6565
version :
6666
Pins version of VetiverModel
6767
file :
6868
Name of file
69+
70+
Example
71+
-------
72+
>>> import vetiver
73+
>>> import pins
74+
>>> import tempfile
75+
>>> tmp = tempfile.TemporaryFile()
76+
>>> board = pins.board_temp(allow_pickle_read=True)
77+
>>> X, y = vetiver.get_mock_data()
78+
>>> model = vetiver.get_mock_model().fit(X, y)
79+
>>> v = vetiver.VetiverModel(model = model, model_name = "my_model", ptype_data = X)
80+
>>> vetiver.vetiver_pin_write(board, v)
81+
>>> vetiver.write_app(board, "my_model", file = tmp.name)
6982
"""
7083

7184
if board.versioned:

0 commit comments

Comments
 (0)