solara 1.24.0__py2.py3-none-any.whl → 1.25.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. solara/__init__.py +1 -1
  2. solara/__main__.py +4 -1
  3. solara/cache.py +9 -4
  4. solara/checks.py +9 -4
  5. solara/lab/components/__init__.py +1 -0
  6. solara/lab/components/chat.py +203 -0
  7. solara/minisettings.py +1 -1
  8. solara/server/assets/style.css +1545 -0
  9. solara/server/flask.py +1 -1
  10. solara/server/kernel.py +3 -3
  11. solara/server/patch.py +2 -0
  12. solara/server/reload.py +1 -1
  13. solara/server/server.py +58 -0
  14. solara/server/settings.py +1 -0
  15. solara/server/starlette.py +32 -13
  16. solara/server/static/solara_bootstrap.py +1 -1
  17. solara/server/telemetry.py +8 -3
  18. solara/server/templates/loader-plain.html +1 -1
  19. solara/server/templates/loader-solara.html +1 -1
  20. solara/server/templates/solara.html.j2 +20 -25
  21. solara/util.py +15 -2
  22. solara/website/components/notebook.py +44 -1
  23. solara/website/pages/__init__.py +3 -0
  24. solara/website/pages/api/__init__.py +1 -0
  25. solara/website/pages/api/chat.py +109 -0
  26. solara/website/pages/apps/jupyter-dashboard-1.py +116 -0
  27. solara/website/pages/apps/scatter.py +4 -4
  28. solara/website/pages/doc_use_download.py +1 -1
  29. solara/website/pages/docs/content/04-tutorial/00-overview.md +1 -0
  30. solara/website/pages/docs/content/04-tutorial/60-jupyter-dashboard-part1.py +18 -1
  31. solara/website/pages/docs/content/04-tutorial/_jupyter_dashboard_1.ipynb +607 -14
  32. solara/website/pages/docs/content/10-howto/ipywidget_libraries.md +1 -1
  33. solara/website/pages/docs/content/95-changelog.md +31 -0
  34. solara/website/pages/examples/ai/chatbot.py +96 -0
  35. solara/website/public/success.html +16 -7
  36. solara/website/templates/index.html.j2 +16 -15
  37. {solara-1.24.0.dist-info → solara-1.25.1.dist-info}/METADATA +9 -8
  38. {solara-1.24.0.dist-info → solara-1.25.1.dist-info}/RECORD +43 -40
  39. {solara-1.24.0.dist-info → solara-1.25.1.dist-info}/WHEEL +1 -1
  40. solara/server/assets/index.css +0 -14480
  41. {solara-1.24.0.data → solara-1.25.1.data}/data/prefix/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
  42. {solara-1.24.0.data → solara-1.25.1.data}/data/prefix/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
  43. {solara-1.24.0.dist-info → solara-1.25.1.dist-info}/entry_points.txt +0 -0
  44. {solara-1.24.0.dist-info → solara-1.25.1.dist-info}/licenses/LICENSE +0 -0
@@ -7,12 +7,12 @@
7
7
  "source": [
8
8
  "# Build your Jupyter dashboard using Solara\n",
9
9
  "\n",
10
- "Welcome to **the** first part of a series of tutorial**s** that will show you how to create a dashboard in Jupyter and deploy it as a standalone web **app**. **Importantly, there will be** no need to rewrite your app in a different framework, no need to use a non-Python solution, **and** no need to use JavaScript or CSS.\n",
10
+ "Welcome to the first part of a series of tutorials that will show you how to create a dashboard in Jupyter and deploy it as a standalone web app. Importantly, there will be no need to rewrite your app in a different framework, no need to use a non-Python solution, and no need to use JavaScript or CSS.\n",
11
11
  "\n",
12
- "Jupyter notebooks are an incredible tool for data analysis, **since they enable** blending code, visualization and narrative in**to** a single document.\n",
12
+ "Jupyter notebooks are an incredible tool for data analysis, since they enable blending code, visualization and narrative into a single document.\n",
13
13
  "However, if the insights need to be presented to a non-technical audience, we usually do not want to show the code.\n",
14
14
  "\n",
15
- "In this tutorial, we will create a simple dashboard using Solara's UI components. **The final product will** allow an end-user to filter,\n",
15
+ "In this tutorial, we will create a simple dashboard using Solara's UI components. The final product will allow an end-user to filter,\n",
16
16
  "visualize and explore a dataset on a map.\n",
17
17
  "\n",
18
18
  "![image](/static/public/docs/tutorial/jupyter-dashboard1.jpg)\n",
@@ -33,7 +33,7 @@
33
33
  "\n",
34
34
  "## The start\n",
35
35
  "\n",
36
- "We will use a subsample of the [San Fanfrisco crime dataset](https://www.kaggle.com/competitions/sf-crime/data) which **contains information on types of crimes and where they were committed**.\n",
36
+ "We will use a subsample of the [San Fanfrisco crime dataset](https://www.kaggle.com/competitions/sf-crime/data) which contains information on types of crimes and where they were committed.\n",
37
37
  "\n",
38
38
  "[Download the CSV file](https://raw.githubusercontent.com/widgetti/solara/master/solara/website/pages/docs/content/04-tutorial/SF_crime_sample.csv.gz) if you want to run this locally, or let the code below sort it out."
39
39
  ]
@@ -48,10 +48,301 @@
48
48
  },
49
49
  {
50
50
  "cell_type": "code",
51
- "execution_count": null,
51
+ "execution_count": 1,
52
52
  "id": "4f399bdc",
53
53
  "metadata": {},
54
- "outputs": [],
54
+ "outputs": [
55
+ {
56
+ "data": {
57
+ "text/html": [
58
+ "<div>\n",
59
+ "<style scoped>\n",
60
+ " .dataframe tbody tr th:only-of-type {\n",
61
+ " vertical-align: middle;\n",
62
+ " }\n",
63
+ "\n",
64
+ " .dataframe tbody tr th {\n",
65
+ " vertical-align: top;\n",
66
+ " }\n",
67
+ "\n",
68
+ " .dataframe thead th {\n",
69
+ " text-align: right;\n",
70
+ " }\n",
71
+ "</style>\n",
72
+ "<table border=\"1\" class=\"dataframe\">\n",
73
+ " <thead>\n",
74
+ " <tr style=\"text-align: right;\">\n",
75
+ " <th></th>\n",
76
+ " <th>Unnamed: 0</th>\n",
77
+ " <th>IncidntNum</th>\n",
78
+ " <th>Category</th>\n",
79
+ " <th>Descript</th>\n",
80
+ " <th>DayOfWeek</th>\n",
81
+ " <th>Date</th>\n",
82
+ " <th>Time</th>\n",
83
+ " <th>PdDistrict</th>\n",
84
+ " <th>Resolution</th>\n",
85
+ " <th>Address</th>\n",
86
+ " <th>X</th>\n",
87
+ " <th>Y</th>\n",
88
+ " <th>Location</th>\n",
89
+ " <th>PdId</th>\n",
90
+ " </tr>\n",
91
+ " </thead>\n",
92
+ " <tbody>\n",
93
+ " <tr>\n",
94
+ " <th>0</th>\n",
95
+ " <td>50820</td>\n",
96
+ " <td>160525689</td>\n",
97
+ " <td>BURGLARY</td>\n",
98
+ " <td>BURGLARY OF STORE, FORCIBLE ENTRY</td>\n",
99
+ " <td>Tuesday</td>\n",
100
+ " <td>06/28/2016 12:00:00 AM</td>\n",
101
+ " <td>21:25</td>\n",
102
+ " <td>TARAVAL</td>\n",
103
+ " <td>ARREST, BOOKED</td>\n",
104
+ " <td>600 Block of LINCOLN WY</td>\n",
105
+ " <td>-122.464850</td>\n",
106
+ " <td>37.765888</td>\n",
107
+ " <td>(37.7658875448653, -122.464850114297)</td>\n",
108
+ " <td>16052568905051</td>\n",
109
+ " </tr>\n",
110
+ " <tr>\n",
111
+ " <th>1</th>\n",
112
+ " <td>11981</td>\n",
113
+ " <td>160334220</td>\n",
114
+ " <td>LARCENY/THEFT</td>\n",
115
+ " <td>PETTY THEFT FROM LOCKED AUTO</td>\n",
116
+ " <td>Friday</td>\n",
117
+ " <td>04/22/2016 12:00:00 AM</td>\n",
118
+ " <td>19:00</td>\n",
119
+ " <td>TARAVAL</td>\n",
120
+ " <td>NONE</td>\n",
121
+ " <td>SAN JOSE AV / LAKEVIEW AV</td>\n",
122
+ " <td>-122.450378</td>\n",
123
+ " <td>37.716169</td>\n",
124
+ " <td>(37.7161694707734, -122.450378171697)</td>\n",
125
+ " <td>16033422006243</td>\n",
126
+ " </tr>\n",
127
+ " <tr>\n",
128
+ " <th>2</th>\n",
129
+ " <td>74626</td>\n",
130
+ " <td>160740053</td>\n",
131
+ " <td>LARCENY/THEFT</td>\n",
132
+ " <td>PETTY THEFT FROM A BUILDING</td>\n",
133
+ " <td>Monday</td>\n",
134
+ " <td>09/12/2016 12:00:00 AM</td>\n",
135
+ " <td>08:40</td>\n",
136
+ " <td>INGLESIDE</td>\n",
137
+ " <td>NONE</td>\n",
138
+ " <td>0 Block of PHELAN AV</td>\n",
139
+ " <td>-122.452290</td>\n",
140
+ " <td>37.725693</td>\n",
141
+ " <td>(37.7256933575703, -122.452289660492)</td>\n",
142
+ " <td>16074005306303</td>\n",
143
+ " </tr>\n",
144
+ " <tr>\n",
145
+ " <th>3</th>\n",
146
+ " <td>60776</td>\n",
147
+ " <td>160619721</td>\n",
148
+ " <td>WARRANTS</td>\n",
149
+ " <td>WARRANT ARREST</td>\n",
150
+ " <td>Monday</td>\n",
151
+ " <td>08/01/2016 12:00:00 AM</td>\n",
152
+ " <td>16:12</td>\n",
153
+ " <td>PARK</td>\n",
154
+ " <td>ARREST, BOOKED</td>\n",
155
+ " <td>1100 Block of SCOTT ST</td>\n",
156
+ " <td>-122.437099</td>\n",
157
+ " <td>37.780352</td>\n",
158
+ " <td>(37.7803522156893, -122.43709942832)</td>\n",
159
+ " <td>16061972163010</td>\n",
160
+ " </tr>\n",
161
+ " <tr>\n",
162
+ " <th>4</th>\n",
163
+ " <td>34547</td>\n",
164
+ " <td>160345772</td>\n",
165
+ " <td>WARRANTS</td>\n",
166
+ " <td>ENROUTE TO OUTSIDE JURISDICTION</td>\n",
167
+ " <td>Wednesday</td>\n",
168
+ " <td>04/27/2016 12:00:00 AM</td>\n",
169
+ " <td>19:34</td>\n",
170
+ " <td>SOUTHERN</td>\n",
171
+ " <td>ARREST, BOOKED</td>\n",
172
+ " <td>600 Block of BRANNAN ST</td>\n",
173
+ " <td>-122.399841</td>\n",
174
+ " <td>37.775633</td>\n",
175
+ " <td>(37.7756327864282, -122.399841045579)</td>\n",
176
+ " <td>16034577262050</td>\n",
177
+ " </tr>\n",
178
+ " <tr>\n",
179
+ " <th>...</th>\n",
180
+ " <td>...</td>\n",
181
+ " <td>...</td>\n",
182
+ " <td>...</td>\n",
183
+ " <td>...</td>\n",
184
+ " <td>...</td>\n",
185
+ " <td>...</td>\n",
186
+ " <td>...</td>\n",
187
+ " <td>...</td>\n",
188
+ " <td>...</td>\n",
189
+ " <td>...</td>\n",
190
+ " <td>...</td>\n",
191
+ " <td>...</td>\n",
192
+ " <td>...</td>\n",
193
+ " <td>...</td>\n",
194
+ " </tr>\n",
195
+ " <tr>\n",
196
+ " <th>9995</th>\n",
197
+ " <td>137465</td>\n",
198
+ " <td>170013301</td>\n",
199
+ " <td>OTHER OFFENSES</td>\n",
200
+ " <td>HARASSING PHONE CALLS</td>\n",
201
+ " <td>Saturday</td>\n",
202
+ " <td>11/26/2016 12:00:00 AM</td>\n",
203
+ " <td>12:00</td>\n",
204
+ " <td>SOUTHERN</td>\n",
205
+ " <td>NONE</td>\n",
206
+ " <td>1100 Block of MISSION ST</td>\n",
207
+ " <td>-122.412834</td>\n",
208
+ " <td>37.777790</td>\n",
209
+ " <td>(37.7777903094246, -122.412834332129)</td>\n",
210
+ " <td>17001330128135</td>\n",
211
+ " </tr>\n",
212
+ " <tr>\n",
213
+ " <th>9996</th>\n",
214
+ " <td>55811</td>\n",
215
+ " <td>160573939</td>\n",
216
+ " <td>OTHER OFFENSES</td>\n",
217
+ " <td>LOST/STOLEN LICENSE PLATE</td>\n",
218
+ " <td>Thursday</td>\n",
219
+ " <td>07/07/2016 12:00:00 AM</td>\n",
220
+ " <td>19:00</td>\n",
221
+ " <td>BAYVIEW</td>\n",
222
+ " <td>NONE</td>\n",
223
+ " <td>100 Block of TEXAS ST</td>\n",
224
+ " <td>-122.395812</td>\n",
225
+ " <td>37.764531</td>\n",
226
+ " <td>(37.7645312950153, -122.395812338479)</td>\n",
227
+ " <td>16057393971010</td>\n",
228
+ " </tr>\n",
229
+ " <tr>\n",
230
+ " <th>9997</th>\n",
231
+ " <td>120115</td>\n",
232
+ " <td>166110038</td>\n",
233
+ " <td>LARCENY/THEFT</td>\n",
234
+ " <td>GRAND THEFT FROM LOCKED AUTO</td>\n",
235
+ " <td>Saturday</td>\n",
236
+ " <td>05/14/2016 12:00:00 AM</td>\n",
237
+ " <td>03:30</td>\n",
238
+ " <td>CENTRAL</td>\n",
239
+ " <td>NONE</td>\n",
240
+ " <td>BAY ST / VANNESS AV</td>\n",
241
+ " <td>-122.425111</td>\n",
242
+ " <td>37.804146</td>\n",
243
+ " <td>(37.80414615262, -122.425110613231)</td>\n",
244
+ " <td>16611003806244</td>\n",
245
+ " </tr>\n",
246
+ " <tr>\n",
247
+ " <th>9998</th>\n",
248
+ " <td>5069</td>\n",
249
+ " <td>160093943</td>\n",
250
+ " <td>NON-CRIMINAL</td>\n",
251
+ " <td>AIDED CASE</td>\n",
252
+ " <td>Monday</td>\n",
253
+ " <td>02/01/2016 12:00:00 AM</td>\n",
254
+ " <td>15:23</td>\n",
255
+ " <td>TARAVAL</td>\n",
256
+ " <td>ARREST, BOOKED</td>\n",
257
+ " <td>2600 Block of SAN JOSE AV</td>\n",
258
+ " <td>-122.450635</td>\n",
259
+ " <td>37.715772</td>\n",
260
+ " <td>(37.7157715048394, -122.450634805259)</td>\n",
261
+ " <td>16009394351040</td>\n",
262
+ " </tr>\n",
263
+ " <tr>\n",
264
+ " <th>9999</th>\n",
265
+ " <td>35667</td>\n",
266
+ " <td>160373212</td>\n",
267
+ " <td>ASSAULT</td>\n",
268
+ " <td>BATTERY</td>\n",
269
+ " <td>Friday</td>\n",
270
+ " <td>05/06/2016 12:00:00 AM</td>\n",
271
+ " <td>20:30</td>\n",
272
+ " <td>BAYVIEW</td>\n",
273
+ " <td>NONE</td>\n",
274
+ " <td>1300 Block of NEWHALL ST</td>\n",
275
+ " <td>-122.391880</td>\n",
276
+ " <td>37.735936</td>\n",
277
+ " <td>(37.7359364818345, -122.391879837176)</td>\n",
278
+ " <td>16037321204134</td>\n",
279
+ " </tr>\n",
280
+ " </tbody>\n",
281
+ "</table>\n",
282
+ "<p>10000 rows × 14 columns</p>\n",
283
+ "</div>"
284
+ ],
285
+ "text/plain": [
286
+ " Unnamed: 0 IncidntNum Category \\\n",
287
+ "0 50820 160525689 BURGLARY \n",
288
+ "1 11981 160334220 LARCENY/THEFT \n",
289
+ "2 74626 160740053 LARCENY/THEFT \n",
290
+ "3 60776 160619721 WARRANTS \n",
291
+ "4 34547 160345772 WARRANTS \n",
292
+ "... ... ... ... \n",
293
+ "9995 137465 170013301 OTHER OFFENSES \n",
294
+ "9996 55811 160573939 OTHER OFFENSES \n",
295
+ "9997 120115 166110038 LARCENY/THEFT \n",
296
+ "9998 5069 160093943 NON-CRIMINAL \n",
297
+ "9999 35667 160373212 ASSAULT \n",
298
+ "\n",
299
+ " Descript DayOfWeek Date \\\n",
300
+ "0 BURGLARY OF STORE, FORCIBLE ENTRY Tuesday 06/28/2016 12:00:00 AM \n",
301
+ "1 PETTY THEFT FROM LOCKED AUTO Friday 04/22/2016 12:00:00 AM \n",
302
+ "2 PETTY THEFT FROM A BUILDING Monday 09/12/2016 12:00:00 AM \n",
303
+ "3 WARRANT ARREST Monday 08/01/2016 12:00:00 AM \n",
304
+ "4 ENROUTE TO OUTSIDE JURISDICTION Wednesday 04/27/2016 12:00:00 AM \n",
305
+ "... ... ... ... \n",
306
+ "9995 HARASSING PHONE CALLS Saturday 11/26/2016 12:00:00 AM \n",
307
+ "9996 LOST/STOLEN LICENSE PLATE Thursday 07/07/2016 12:00:00 AM \n",
308
+ "9997 GRAND THEFT FROM LOCKED AUTO Saturday 05/14/2016 12:00:00 AM \n",
309
+ "9998 AIDED CASE Monday 02/01/2016 12:00:00 AM \n",
310
+ "9999 BATTERY Friday 05/06/2016 12:00:00 AM \n",
311
+ "\n",
312
+ " Time PdDistrict Resolution Address X \\\n",
313
+ "0 21:25 TARAVAL ARREST, BOOKED 600 Block of LINCOLN WY -122.464850 \n",
314
+ "1 19:00 TARAVAL NONE SAN JOSE AV / LAKEVIEW AV -122.450378 \n",
315
+ "2 08:40 INGLESIDE NONE 0 Block of PHELAN AV -122.452290 \n",
316
+ "3 16:12 PARK ARREST, BOOKED 1100 Block of SCOTT ST -122.437099 \n",
317
+ "4 19:34 SOUTHERN ARREST, BOOKED 600 Block of BRANNAN ST -122.399841 \n",
318
+ "... ... ... ... ... ... \n",
319
+ "9995 12:00 SOUTHERN NONE 1100 Block of MISSION ST -122.412834 \n",
320
+ "9996 19:00 BAYVIEW NONE 100 Block of TEXAS ST -122.395812 \n",
321
+ "9997 03:30 CENTRAL NONE BAY ST / VANNESS AV -122.425111 \n",
322
+ "9998 15:23 TARAVAL ARREST, BOOKED 2600 Block of SAN JOSE AV -122.450635 \n",
323
+ "9999 20:30 BAYVIEW NONE 1300 Block of NEWHALL ST -122.391880 \n",
324
+ "\n",
325
+ " Y Location PdId \n",
326
+ "0 37.765888 (37.7658875448653, -122.464850114297) 16052568905051 \n",
327
+ "1 37.716169 (37.7161694707734, -122.450378171697) 16033422006243 \n",
328
+ "2 37.725693 (37.7256933575703, -122.452289660492) 16074005306303 \n",
329
+ "3 37.780352 (37.7803522156893, -122.43709942832) 16061972163010 \n",
330
+ "4 37.775633 (37.7756327864282, -122.399841045579) 16034577262050 \n",
331
+ "... ... ... ... \n",
332
+ "9995 37.777790 (37.7777903094246, -122.412834332129) 17001330128135 \n",
333
+ "9996 37.764531 (37.7645312950153, -122.395812338479) 16057393971010 \n",
334
+ "9997 37.804146 (37.80414615262, -122.425110613231) 16611003806244 \n",
335
+ "9998 37.715772 (37.7157715048394, -122.450634805259) 16009394351040 \n",
336
+ "9999 37.735936 (37.7359364818345, -122.391879837176) 16037321204134 \n",
337
+ "\n",
338
+ "[10000 rows x 14 columns]"
339
+ ]
340
+ },
341
+ "execution_count": 1,
342
+ "metadata": {},
343
+ "output_type": "execute_result"
344
+ }
345
+ ],
55
346
  "source": [
56
347
  "import pandas as pd\n",
57
348
  "from pathlib import Path\n",
@@ -74,15 +365,306 @@
74
365
  "id": "08a9644a",
75
366
  "metadata": {},
76
367
  "source": [
77
- "The data looks clean but since we will work with the `Category` and `PdDistrict` column data, lets **convert those columns to title case**."
368
+ "The data looks clean but since we will work with the `Category` and `PdDistrict` column data, lets convert those columns to title case."
78
369
  ]
79
370
  },
80
371
  {
81
372
  "cell_type": "code",
82
- "execution_count": null,
373
+ "execution_count": 2,
83
374
  "id": "f3373227",
84
375
  "metadata": {},
85
- "outputs": [],
376
+ "outputs": [
377
+ {
378
+ "data": {
379
+ "text/html": [
380
+ "<div>\n",
381
+ "<style scoped>\n",
382
+ " .dataframe tbody tr th:only-of-type {\n",
383
+ " vertical-align: middle;\n",
384
+ " }\n",
385
+ "\n",
386
+ " .dataframe tbody tr th {\n",
387
+ " vertical-align: top;\n",
388
+ " }\n",
389
+ "\n",
390
+ " .dataframe thead th {\n",
391
+ " text-align: right;\n",
392
+ " }\n",
393
+ "</style>\n",
394
+ "<table border=\"1\" class=\"dataframe\">\n",
395
+ " <thead>\n",
396
+ " <tr style=\"text-align: right;\">\n",
397
+ " <th></th>\n",
398
+ " <th>Unnamed: 0</th>\n",
399
+ " <th>IncidntNum</th>\n",
400
+ " <th>Category</th>\n",
401
+ " <th>Descript</th>\n",
402
+ " <th>DayOfWeek</th>\n",
403
+ " <th>Date</th>\n",
404
+ " <th>Time</th>\n",
405
+ " <th>PdDistrict</th>\n",
406
+ " <th>Resolution</th>\n",
407
+ " <th>Address</th>\n",
408
+ " <th>X</th>\n",
409
+ " <th>Y</th>\n",
410
+ " <th>Location</th>\n",
411
+ " <th>PdId</th>\n",
412
+ " </tr>\n",
413
+ " </thead>\n",
414
+ " <tbody>\n",
415
+ " <tr>\n",
416
+ " <th>0</th>\n",
417
+ " <td>50820</td>\n",
418
+ " <td>160525689</td>\n",
419
+ " <td>Burglary</td>\n",
420
+ " <td>BURGLARY OF STORE, FORCIBLE ENTRY</td>\n",
421
+ " <td>Tuesday</td>\n",
422
+ " <td>06/28/2016 12:00:00 AM</td>\n",
423
+ " <td>21:25</td>\n",
424
+ " <td>Taraval</td>\n",
425
+ " <td>ARREST, BOOKED</td>\n",
426
+ " <td>600 Block of LINCOLN WY</td>\n",
427
+ " <td>-122.464850</td>\n",
428
+ " <td>37.765888</td>\n",
429
+ " <td>(37.7658875448653, -122.464850114297)</td>\n",
430
+ " <td>16052568905051</td>\n",
431
+ " </tr>\n",
432
+ " <tr>\n",
433
+ " <th>1</th>\n",
434
+ " <td>11981</td>\n",
435
+ " <td>160334220</td>\n",
436
+ " <td>Larceny/Theft</td>\n",
437
+ " <td>PETTY THEFT FROM LOCKED AUTO</td>\n",
438
+ " <td>Friday</td>\n",
439
+ " <td>04/22/2016 12:00:00 AM</td>\n",
440
+ " <td>19:00</td>\n",
441
+ " <td>Taraval</td>\n",
442
+ " <td>NONE</td>\n",
443
+ " <td>SAN JOSE AV / LAKEVIEW AV</td>\n",
444
+ " <td>-122.450378</td>\n",
445
+ " <td>37.716169</td>\n",
446
+ " <td>(37.7161694707734, -122.450378171697)</td>\n",
447
+ " <td>16033422006243</td>\n",
448
+ " </tr>\n",
449
+ " <tr>\n",
450
+ " <th>2</th>\n",
451
+ " <td>74626</td>\n",
452
+ " <td>160740053</td>\n",
453
+ " <td>Larceny/Theft</td>\n",
454
+ " <td>PETTY THEFT FROM A BUILDING</td>\n",
455
+ " <td>Monday</td>\n",
456
+ " <td>09/12/2016 12:00:00 AM</td>\n",
457
+ " <td>08:40</td>\n",
458
+ " <td>Ingleside</td>\n",
459
+ " <td>NONE</td>\n",
460
+ " <td>0 Block of PHELAN AV</td>\n",
461
+ " <td>-122.452290</td>\n",
462
+ " <td>37.725693</td>\n",
463
+ " <td>(37.7256933575703, -122.452289660492)</td>\n",
464
+ " <td>16074005306303</td>\n",
465
+ " </tr>\n",
466
+ " <tr>\n",
467
+ " <th>3</th>\n",
468
+ " <td>60776</td>\n",
469
+ " <td>160619721</td>\n",
470
+ " <td>Warrants</td>\n",
471
+ " <td>WARRANT ARREST</td>\n",
472
+ " <td>Monday</td>\n",
473
+ " <td>08/01/2016 12:00:00 AM</td>\n",
474
+ " <td>16:12</td>\n",
475
+ " <td>Park</td>\n",
476
+ " <td>ARREST, BOOKED</td>\n",
477
+ " <td>1100 Block of SCOTT ST</td>\n",
478
+ " <td>-122.437099</td>\n",
479
+ " <td>37.780352</td>\n",
480
+ " <td>(37.7803522156893, -122.43709942832)</td>\n",
481
+ " <td>16061972163010</td>\n",
482
+ " </tr>\n",
483
+ " <tr>\n",
484
+ " <th>4</th>\n",
485
+ " <td>34547</td>\n",
486
+ " <td>160345772</td>\n",
487
+ " <td>Warrants</td>\n",
488
+ " <td>ENROUTE TO OUTSIDE JURISDICTION</td>\n",
489
+ " <td>Wednesday</td>\n",
490
+ " <td>04/27/2016 12:00:00 AM</td>\n",
491
+ " <td>19:34</td>\n",
492
+ " <td>Southern</td>\n",
493
+ " <td>ARREST, BOOKED</td>\n",
494
+ " <td>600 Block of BRANNAN ST</td>\n",
495
+ " <td>-122.399841</td>\n",
496
+ " <td>37.775633</td>\n",
497
+ " <td>(37.7756327864282, -122.399841045579)</td>\n",
498
+ " <td>16034577262050</td>\n",
499
+ " </tr>\n",
500
+ " <tr>\n",
501
+ " <th>...</th>\n",
502
+ " <td>...</td>\n",
503
+ " <td>...</td>\n",
504
+ " <td>...</td>\n",
505
+ " <td>...</td>\n",
506
+ " <td>...</td>\n",
507
+ " <td>...</td>\n",
508
+ " <td>...</td>\n",
509
+ " <td>...</td>\n",
510
+ " <td>...</td>\n",
511
+ " <td>...</td>\n",
512
+ " <td>...</td>\n",
513
+ " <td>...</td>\n",
514
+ " <td>...</td>\n",
515
+ " <td>...</td>\n",
516
+ " </tr>\n",
517
+ " <tr>\n",
518
+ " <th>9995</th>\n",
519
+ " <td>137465</td>\n",
520
+ " <td>170013301</td>\n",
521
+ " <td>Other Offenses</td>\n",
522
+ " <td>HARASSING PHONE CALLS</td>\n",
523
+ " <td>Saturday</td>\n",
524
+ " <td>11/26/2016 12:00:00 AM</td>\n",
525
+ " <td>12:00</td>\n",
526
+ " <td>Southern</td>\n",
527
+ " <td>NONE</td>\n",
528
+ " <td>1100 Block of MISSION ST</td>\n",
529
+ " <td>-122.412834</td>\n",
530
+ " <td>37.777790</td>\n",
531
+ " <td>(37.7777903094246, -122.412834332129)</td>\n",
532
+ " <td>17001330128135</td>\n",
533
+ " </tr>\n",
534
+ " <tr>\n",
535
+ " <th>9996</th>\n",
536
+ " <td>55811</td>\n",
537
+ " <td>160573939</td>\n",
538
+ " <td>Other Offenses</td>\n",
539
+ " <td>LOST/STOLEN LICENSE PLATE</td>\n",
540
+ " <td>Thursday</td>\n",
541
+ " <td>07/07/2016 12:00:00 AM</td>\n",
542
+ " <td>19:00</td>\n",
543
+ " <td>Bayview</td>\n",
544
+ " <td>NONE</td>\n",
545
+ " <td>100 Block of TEXAS ST</td>\n",
546
+ " <td>-122.395812</td>\n",
547
+ " <td>37.764531</td>\n",
548
+ " <td>(37.7645312950153, -122.395812338479)</td>\n",
549
+ " <td>16057393971010</td>\n",
550
+ " </tr>\n",
551
+ " <tr>\n",
552
+ " <th>9997</th>\n",
553
+ " <td>120115</td>\n",
554
+ " <td>166110038</td>\n",
555
+ " <td>Larceny/Theft</td>\n",
556
+ " <td>GRAND THEFT FROM LOCKED AUTO</td>\n",
557
+ " <td>Saturday</td>\n",
558
+ " <td>05/14/2016 12:00:00 AM</td>\n",
559
+ " <td>03:30</td>\n",
560
+ " <td>Central</td>\n",
561
+ " <td>NONE</td>\n",
562
+ " <td>BAY ST / VANNESS AV</td>\n",
563
+ " <td>-122.425111</td>\n",
564
+ " <td>37.804146</td>\n",
565
+ " <td>(37.80414615262, -122.425110613231)</td>\n",
566
+ " <td>16611003806244</td>\n",
567
+ " </tr>\n",
568
+ " <tr>\n",
569
+ " <th>9998</th>\n",
570
+ " <td>5069</td>\n",
571
+ " <td>160093943</td>\n",
572
+ " <td>Non-Criminal</td>\n",
573
+ " <td>AIDED CASE</td>\n",
574
+ " <td>Monday</td>\n",
575
+ " <td>02/01/2016 12:00:00 AM</td>\n",
576
+ " <td>15:23</td>\n",
577
+ " <td>Taraval</td>\n",
578
+ " <td>ARREST, BOOKED</td>\n",
579
+ " <td>2600 Block of SAN JOSE AV</td>\n",
580
+ " <td>-122.450635</td>\n",
581
+ " <td>37.715772</td>\n",
582
+ " <td>(37.7157715048394, -122.450634805259)</td>\n",
583
+ " <td>16009394351040</td>\n",
584
+ " </tr>\n",
585
+ " <tr>\n",
586
+ " <th>9999</th>\n",
587
+ " <td>35667</td>\n",
588
+ " <td>160373212</td>\n",
589
+ " <td>Assault</td>\n",
590
+ " <td>BATTERY</td>\n",
591
+ " <td>Friday</td>\n",
592
+ " <td>05/06/2016 12:00:00 AM</td>\n",
593
+ " <td>20:30</td>\n",
594
+ " <td>Bayview</td>\n",
595
+ " <td>NONE</td>\n",
596
+ " <td>1300 Block of NEWHALL ST</td>\n",
597
+ " <td>-122.391880</td>\n",
598
+ " <td>37.735936</td>\n",
599
+ " <td>(37.7359364818345, -122.391879837176)</td>\n",
600
+ " <td>16037321204134</td>\n",
601
+ " </tr>\n",
602
+ " </tbody>\n",
603
+ "</table>\n",
604
+ "<p>10000 rows × 14 columns</p>\n",
605
+ "</div>"
606
+ ],
607
+ "text/plain": [
608
+ " Unnamed: 0 IncidntNum Category \\\n",
609
+ "0 50820 160525689 Burglary \n",
610
+ "1 11981 160334220 Larceny/Theft \n",
611
+ "2 74626 160740053 Larceny/Theft \n",
612
+ "3 60776 160619721 Warrants \n",
613
+ "4 34547 160345772 Warrants \n",
614
+ "... ... ... ... \n",
615
+ "9995 137465 170013301 Other Offenses \n",
616
+ "9996 55811 160573939 Other Offenses \n",
617
+ "9997 120115 166110038 Larceny/Theft \n",
618
+ "9998 5069 160093943 Non-Criminal \n",
619
+ "9999 35667 160373212 Assault \n",
620
+ "\n",
621
+ " Descript DayOfWeek Date \\\n",
622
+ "0 BURGLARY OF STORE, FORCIBLE ENTRY Tuesday 06/28/2016 12:00:00 AM \n",
623
+ "1 PETTY THEFT FROM LOCKED AUTO Friday 04/22/2016 12:00:00 AM \n",
624
+ "2 PETTY THEFT FROM A BUILDING Monday 09/12/2016 12:00:00 AM \n",
625
+ "3 WARRANT ARREST Monday 08/01/2016 12:00:00 AM \n",
626
+ "4 ENROUTE TO OUTSIDE JURISDICTION Wednesday 04/27/2016 12:00:00 AM \n",
627
+ "... ... ... ... \n",
628
+ "9995 HARASSING PHONE CALLS Saturday 11/26/2016 12:00:00 AM \n",
629
+ "9996 LOST/STOLEN LICENSE PLATE Thursday 07/07/2016 12:00:00 AM \n",
630
+ "9997 GRAND THEFT FROM LOCKED AUTO Saturday 05/14/2016 12:00:00 AM \n",
631
+ "9998 AIDED CASE Monday 02/01/2016 12:00:00 AM \n",
632
+ "9999 BATTERY Friday 05/06/2016 12:00:00 AM \n",
633
+ "\n",
634
+ " Time PdDistrict Resolution Address X \\\n",
635
+ "0 21:25 Taraval ARREST, BOOKED 600 Block of LINCOLN WY -122.464850 \n",
636
+ "1 19:00 Taraval NONE SAN JOSE AV / LAKEVIEW AV -122.450378 \n",
637
+ "2 08:40 Ingleside NONE 0 Block of PHELAN AV -122.452290 \n",
638
+ "3 16:12 Park ARREST, BOOKED 1100 Block of SCOTT ST -122.437099 \n",
639
+ "4 19:34 Southern ARREST, BOOKED 600 Block of BRANNAN ST -122.399841 \n",
640
+ "... ... ... ... ... ... \n",
641
+ "9995 12:00 Southern NONE 1100 Block of MISSION ST -122.412834 \n",
642
+ "9996 19:00 Bayview NONE 100 Block of TEXAS ST -122.395812 \n",
643
+ "9997 03:30 Central NONE BAY ST / VANNESS AV -122.425111 \n",
644
+ "9998 15:23 Taraval ARREST, BOOKED 2600 Block of SAN JOSE AV -122.450635 \n",
645
+ "9999 20:30 Bayview NONE 1300 Block of NEWHALL ST -122.391880 \n",
646
+ "\n",
647
+ " Y Location PdId \n",
648
+ "0 37.765888 (37.7658875448653, -122.464850114297) 16052568905051 \n",
649
+ "1 37.716169 (37.7161694707734, -122.450378171697) 16033422006243 \n",
650
+ "2 37.725693 (37.7256933575703, -122.452289660492) 16074005306303 \n",
651
+ "3 37.780352 (37.7803522156893, -122.43709942832) 16061972163010 \n",
652
+ "4 37.775633 (37.7756327864282, -122.399841045579) 16034577262050 \n",
653
+ "... ... ... ... \n",
654
+ "9995 37.777790 (37.7777903094246, -122.412834332129) 17001330128135 \n",
655
+ "9996 37.764531 (37.7645312950153, -122.395812338479) 16057393971010 \n",
656
+ "9997 37.804146 (37.80414615262, -122.425110613231) 16611003806244 \n",
657
+ "9998 37.715772 (37.7157715048394, -122.450634805259) 16009394351040 \n",
658
+ "9999 37.735936 (37.7359364818345, -122.391879837176) 16037321204134 \n",
659
+ "\n",
660
+ "[10000 rows x 14 columns]"
661
+ ]
662
+ },
663
+ "execution_count": 2,
664
+ "metadata": {},
665
+ "output_type": "execute_result"
666
+ }
667
+ ],
86
668
  "source": [
87
669
  "df_crime['Category'] = df_crime['Category'].str.title()\n",
88
670
  "df_crime['PdDistrict'] = df_crime['PdDistrict'].str.title()\n",
@@ -94,7 +676,7 @@
94
676
  "id": "62df988f",
95
677
  "metadata": {},
96
678
  "source": [
97
- "Using proper software engineering practices, we write a function that filter**s** a dataframe to contain only the rows that match our chosen districts and categories."
679
+ "Using proper software engineering practices, we write a function that filters a dataframe to contain only the rows that match our chosen districts and categories."
98
680
  ]
99
681
  },
100
682
  {
@@ -123,10 +705,21 @@
123
705
  },
124
706
  {
125
707
  "cell_type": "code",
126
- "execution_count": null,
708
+ "execution_count": 4,
127
709
  "id": "3254c59d",
128
710
  "metadata": {},
129
- "outputs": [],
711
+ "outputs": [
712
+ {
713
+ "data": {
714
+ "image/png": "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",
715
+ "text/plain": [
716
+ "<Figure size 1440x720 with 2 Axes>"
717
+ ]
718
+ },
719
+ "metadata": {},
720
+ "output_type": "display_data"
721
+ }
722
+ ],
130
723
  "source": [
131
724
  "import matplotlib.pyplot as plt\n",
132
725
  "\n",
@@ -347,7 +940,7 @@
347
940
  "source": [
348
941
  "## The final dashboard\n",
349
942
  "\n",
350
- "We now have two parts of our UI in separate cells. This can be an amazing experience when developing **in a** notebook, as it flows **naturally** in the data exploration process while writing your notebook.\n",
943
+ "We now have two parts of our UI in separate cells. This can be an amazing experience when developing in a notebook, as it flows naturally in the data exploration process while writing your notebook.\n",
351
944
  "\n",
352
945
  "However, your end user will probably want something more coherent. The components we created are perfectly re-usable, so we put them together in a single UI."
353
946
  ]
@@ -374,7 +967,7 @@
374
967
  "source": [
375
968
  "## Conclusions\n",
376
969
  "\n",
377
- "Using Solara, you created an interactive dashboard **within a** Jupyter notebook. Your Solara components are declarative, and **when** using reactive variables also reactive. **Whether** you change a reactive variables via code or the UI elements, your visualizations and map update automatically.\n",
970
+ "Using Solara, you created an interactive dashboard within a Jupyter notebook. Your Solara components are declarative, and when using reactive variables also reactive. Whether you change a reactive variables via code or the UI elements, your visualizations and map update automatically.\n",
378
971
  "\n",
379
972
  "Your dashboard prototype now runs in your Jupyter notebook environment, but we still have a few steps to we want to take. In our next tutorial, we will focus on deploying our notebook, without making any code changes. In our third tutorial we will expand our dashboard with a few more components and focus on creating a more advanced layout.\n",
380
973
  "\n",