` Tag:**\n",
87 | " - Defines a section/division.\n",
88 | " - Container for HTML elements.\n",
89 | " - No inherent semantic meaning.\n",
90 | " - Groups elements for CSS/JS.\n"
91 | ]
92 | },
93 | {
94 | "cell_type": "markdown",
95 | "id": "4abdb473-16b0-49ca-8395-76594a42e9f2",
96 | "metadata": {
97 | "tags": []
98 | },
99 | "source": [
100 | "### App Layout\n",
101 | "* Some html element like a div..\n",
102 | "* Div has children which are its elements"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": 2,
108 | "id": "e01f60cd-5e0f-4327-b85d-9e6cd0590ac6",
109 | "metadata": {
110 | "tags": []
111 | },
112 | "outputs": [
113 | {
114 | "data": {
115 | "text/html": [
116 | "\n",
117 | "
\n",
125 | " "
126 | ],
127 | "text/plain": [
128 | "
"
129 | ]
130 | },
131 | "metadata": {},
132 | "output_type": "display_data"
133 | }
134 | ],
135 | "source": [
136 | "from dash import html,Dash\n",
137 | "app = Dash()\n",
138 | "\n",
139 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
140 | " html.H2(\"Select a Ticker\")\n",
141 | " ])\n",
142 | "\n",
143 | "app.run()"
144 | ]
145 | },
146 | {
147 | "cell_type": "markdown",
148 | "id": "12e890ac-1268-496a-ae4c-5396e1d11dc9",
149 | "metadata": {
150 | "tags": []
151 | },
152 | "source": [
153 | "### Let's add a dropdown to select a stock \n",
154 | "* Use id to uniquely identify the component which is needed for callbacks"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 3,
160 | "id": "cf91bb26-0e4b-418f-8dcf-cfedf9a727e6",
161 | "metadata": {
162 | "tags": []
163 | },
164 | "outputs": [
165 | {
166 | "data": {
167 | "text/html": [
168 | "\n",
169 | " \n",
177 | " "
178 | ],
179 | "text/plain": [
180 | ""
181 | ]
182 | },
183 | "metadata": {},
184 | "output_type": "display_data"
185 | }
186 | ],
187 | "source": [
188 | "from dash import dcc\n",
189 | "symbol_list = ['TSLA','NVDA','AMD','META','RIVN','BABA','SPY','QQQ']\n",
190 | "\n",
191 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
192 | " html.H2(\"Select a Ticker\"),\n",
193 | " dcc.Dropdown(options=symbol_list,value='SPY',id='stock_picker')\n",
194 | " ])\n",
195 | "app.run()"
196 | ]
197 | },
198 | {
199 | "cell_type": "markdown",
200 | "id": "5e473ad7-6b0b-4b07-8cb9-ba6eb4bccf32",
201 | "metadata": {},
202 | "source": [
203 | "### Let's add a dummy graph\n",
204 | "* We will fill in the graph later via the callback"
205 | ]
206 | },
207 | {
208 | "cell_type": "code",
209 | "execution_count": 4,
210 | "id": "f0535ed1-233e-46c0-8013-cfd7cf6b133d",
211 | "metadata": {
212 | "tags": []
213 | },
214 | "outputs": [
215 | {
216 | "data": {
217 | "text/html": [
218 | "\n",
219 | " \n",
227 | " "
228 | ],
229 | "text/plain": [
230 | ""
231 | ]
232 | },
233 | "metadata": {},
234 | "output_type": "display_data"
235 | }
236 | ],
237 | "source": [
238 | "from dash import dcc\n",
239 | "import plotly.express as px\n",
240 | "\n",
241 | "\n",
242 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
243 | " html.H2(\"Select a Ticker\"),\n",
244 | " dcc.Dropdown(options=symbol_list,value='SPY',id='stock_picker'),\n",
245 | " dcc.Graph(id='stock-plot')\n",
246 | " ])\n",
247 | "app.run()"
248 | ]
249 | },
250 | {
251 | "cell_type": "markdown",
252 | "id": "e7d48737-18e0-43b1-bafd-21b9e135dfd3",
253 | "metadata": {},
254 | "source": [
255 | "### Let's add dummy data table\n",
256 | "* We will fill in the table later via the callback"
257 | ]
258 | },
259 | {
260 | "cell_type": "code",
261 | "execution_count": 5,
262 | "id": "c6df3bfa-84cb-40ed-a32d-f47e4e03aaa6",
263 | "metadata": {
264 | "tags": []
265 | },
266 | "outputs": [
267 | {
268 | "data": {
269 | "text/html": [
270 | "\n",
271 | " \n",
279 | " "
280 | ],
281 | "text/plain": [
282 | ""
283 | ]
284 | },
285 | "metadata": {},
286 | "output_type": "display_data"
287 | }
288 | ],
289 | "source": [
290 | "from dash import dash_table\n",
291 | "\n",
292 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
293 | " html.H2(\"Select a Ticker\"),\n",
294 | " dcc.Dropdown(options=symbol_list,value='SPY',id='stock_picker'),\n",
295 | " dcc.Graph(id='stock_plot'),\n",
296 | " dash_table.DataTable(id='data_table',page_size=20,)\n",
297 | " ])\n",
298 | "app.run()"
299 | ]
300 | },
301 | {
302 | "cell_type": "markdown",
303 | "id": "9bd80451",
304 | "metadata": {},
305 | "source": [
306 | "##### Asside: Datable example"
307 | ]
308 | },
309 | {
310 | "cell_type": "code",
311 | "execution_count": 6,
312 | "id": "1c0cd539",
313 | "metadata": {},
314 | "outputs": [
315 | {
316 | "data": {
317 | "text/html": [
318 | "\n",
319 | " \n",
327 | " "
328 | ],
329 | "text/plain": [
330 | ""
331 | ]
332 | },
333 | "metadata": {},
334 | "output_type": "display_data"
335 | }
336 | ],
337 | "source": [
338 | "\n",
339 | "from dash import Dash, dash_table\n",
340 | "import pandas as pd\n",
341 | "\n",
342 | "df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')\n",
343 | "\n",
344 | "app.layout = dash_table.DataTable(data=df.to_dict('records'), columns=[{\"name\": i, \"id\": i} for i in df.columns])\n",
345 | "\n",
346 | "app.run()\n"
347 | ]
348 | },
349 | {
350 | "cell_type": "markdown",
351 | "id": "ecadc9f9-e2e4-4413-8e8c-da397c03dbd8",
352 | "metadata": {},
353 | "source": [
354 | "### Let's add some callbacks to make this make more sense"
355 | ]
356 | },
357 | {
358 | "cell_type": "markdown",
359 | "id": "352110e6-b17c-479d-a9c2-bad62a304bac",
360 | "metadata": {},
361 | "source": [
362 | "##### Assside on getting data from Yahoo Finance with yfinance"
363 | ]
364 | },
365 | {
366 | "cell_type": "code",
367 | "execution_count": 7,
368 | "id": "f41b3166-63d5-446c-8345-bf9f7412835b",
369 | "metadata": {
370 | "tags": []
371 | },
372 | "outputs": [
373 | {
374 | "name": "stderr",
375 | "output_type": "stream",
376 | "text": [
377 | "[*********************100%%**********************] 1 of 1 completed\n"
378 | ]
379 | },
380 | {
381 | "data": {
382 | "text/html": [
383 | "\n",
384 | "\n",
397 | "
\n",
398 | " \n",
399 | " \n",
400 | " | \n",
401 | " Date | \n",
402 | " Open | \n",
403 | " High | \n",
404 | " Low | \n",
405 | " Close | \n",
406 | " Volume | \n",
407 | "
\n",
408 | " \n",
409 | " \n",
410 | " \n",
411 | " | 0 | \n",
412 | " 2010-06-29 | \n",
413 | " 1.266667 | \n",
414 | " 1.666667 | \n",
415 | " 1.169333 | \n",
416 | " 1.592667 | \n",
417 | " 281494500 | \n",
418 | "
\n",
419 | " \n",
420 | " | 1 | \n",
421 | " 2010-06-30 | \n",
422 | " 1.719333 | \n",
423 | " 2.028000 | \n",
424 | " 1.553333 | \n",
425 | " 1.588667 | \n",
426 | " 257806500 | \n",
427 | "
\n",
428 | " \n",
429 | " | 2 | \n",
430 | " 2010-07-01 | \n",
431 | " 1.666667 | \n",
432 | " 1.728000 | \n",
433 | " 1.351333 | \n",
434 | " 1.464000 | \n",
435 | " 123282000 | \n",
436 | "
\n",
437 | " \n",
438 | " | 3 | \n",
439 | " 2010-07-02 | \n",
440 | " 1.533333 | \n",
441 | " 1.540000 | \n",
442 | " 1.247333 | \n",
443 | " 1.280000 | \n",
444 | " 77097000 | \n",
445 | "
\n",
446 | " \n",
447 | " | 4 | \n",
448 | " 2010-07-06 | \n",
449 | " 1.333333 | \n",
450 | " 1.333333 | \n",
451 | " 1.055333 | \n",
452 | " 1.074000 | \n",
453 | " 103003500 | \n",
454 | "
\n",
455 | " \n",
456 | " | ... | \n",
457 | " ... | \n",
458 | " ... | \n",
459 | " ... | \n",
460 | " ... | \n",
461 | " ... | \n",
462 | " ... | \n",
463 | "
\n",
464 | " \n",
465 | " | 3510 | \n",
466 | " 2024-06-10 | \n",
467 | " 176.059998 | \n",
468 | " 178.570007 | \n",
469 | " 173.169998 | \n",
470 | " 173.789993 | \n",
471 | " 50869700 | \n",
472 | "
\n",
473 | " \n",
474 | " | 3511 | \n",
475 | " 2024-06-11 | \n",
476 | " 173.919998 | \n",
477 | " 174.750000 | \n",
478 | " 167.410004 | \n",
479 | " 170.660004 | \n",
480 | " 64761900 | \n",
481 | "
\n",
482 | " \n",
483 | " | 3512 | \n",
484 | " 2024-06-12 | \n",
485 | " 171.119995 | \n",
486 | " 180.550003 | \n",
487 | " 169.800003 | \n",
488 | " 177.289993 | \n",
489 | " 90389400 | \n",
490 | "
\n",
491 | " \n",
492 | " | 3513 | \n",
493 | " 2024-06-13 | \n",
494 | " 188.389999 | \n",
495 | " 191.080002 | \n",
496 | " 181.229996 | \n",
497 | " 182.470001 | \n",
498 | " 118984100 | \n",
499 | "
\n",
500 | " \n",
501 | " | 3514 | \n",
502 | " 2024-06-14 | \n",
503 | " 185.800003 | \n",
504 | " 186.000000 | \n",
505 | " 176.919998 | \n",
506 | " 178.009995 | \n",
507 | " 81361700 | \n",
508 | "
\n",
509 | " \n",
510 | "
\n",
511 | "
3515 rows × 6 columns
\n",
512 | "
"
513 | ],
514 | "text/plain": [
515 | " Date Open High Low Close Volume\n",
516 | "0 2010-06-29 1.266667 1.666667 1.169333 1.592667 281494500\n",
517 | "1 2010-06-30 1.719333 2.028000 1.553333 1.588667 257806500\n",
518 | "2 2010-07-01 1.666667 1.728000 1.351333 1.464000 123282000\n",
519 | "3 2010-07-02 1.533333 1.540000 1.247333 1.280000 77097000\n",
520 | "4 2010-07-06 1.333333 1.333333 1.055333 1.074000 103003500\n",
521 | "... ... ... ... ... ... ...\n",
522 | "3510 2024-06-10 176.059998 178.570007 173.169998 173.789993 50869700\n",
523 | "3511 2024-06-11 173.919998 174.750000 167.410004 170.660004 64761900\n",
524 | "3512 2024-06-12 171.119995 180.550003 169.800003 177.289993 90389400\n",
525 | "3513 2024-06-13 188.389999 191.080002 181.229996 182.470001 118984100\n",
526 | "3514 2024-06-14 185.800003 186.000000 176.919998 178.009995 81361700\n",
527 | "\n",
528 | "[3515 rows x 6 columns]"
529 | ]
530 | },
531 | "execution_count": 7,
532 | "metadata": {},
533 | "output_type": "execute_result"
534 | }
535 | ],
536 | "source": [
537 | "import yfinance as yf\n",
538 | "def get_data_from_yfinance(ticker):\n",
539 | " data = yf.download(ticker, period='max', auto_adjust=True)\n",
540 | " data.reset_index(inplace=True)\n",
541 | " return data\n",
542 | "get_data_from_yfinance('TSLA')"
543 | ]
544 | },
545 | {
546 | "cell_type": "markdown",
547 | "id": "7ae49234-afe1-471d-9244-44b7492c7eae",
548 | "metadata": {},
549 | "source": [
550 | "### Callbacks\n",
551 | "* Use @app.callback \n",
552 | "* Must be defined after defining app=Dash()\n",
553 | "* Input: List of Input or Single Input\n",
554 | "* Output: List of Output or Single Output\n",
555 | "* Callback function below it\n",
556 | "* component_id: tells dash what element to work on via the \"id\" field\n",
557 | "* component_property: what property type we are changing"
558 | ]
559 | },
560 | {
561 | "cell_type": "code",
562 | "execution_count": 14,
563 | "id": "49b888b6-7aa4-4d60-8e9c-76b4380cc426",
564 | "metadata": {
565 | "tags": []
566 | },
567 | "outputs": [
568 | {
569 | "data": {
570 | "text/html": [
571 | "\n",
572 | " \n",
580 | " "
581 | ],
582 | "text/plain": [
583 | ""
584 | ]
585 | },
586 | "metadata": {},
587 | "output_type": "display_data"
588 | },
589 | {
590 | "name": "stderr",
591 | "output_type": "stream",
592 | "text": [
593 | "[*********************100%%**********************] 1 of 1 completed\n",
594 | "[*********************100%%**********************] 1 of 1 completed\n",
595 | "[*********************100%%**********************] 1 of 1 completed\n",
596 | "[*********************100%%**********************] 1 of 1 completed\n"
597 | ]
598 | }
599 | ],
600 | "source": [
601 | "from dash.dependencies import Output, Input\n",
602 | "\n",
603 | "app = Dash()\n",
604 | "\n",
605 | "@app.callback(\n",
606 | " [Output(component_id='stock_plot',component_property='figure'),\n",
607 | " Output(component_id='data_table',component_property='data'),\n",
608 | " Output(component_id='data_table',component_property='columns')],\n",
609 | " Input(component_id='stock_picker',component_property='value')\n",
610 | ")\n",
611 | "def update_graph(ticker):\n",
612 | " df = get_data_from_yfinance(ticker)\n",
613 | " fig = px.line(data_frame=df,x='Date',y='Close')\n",
614 | " df.sort_values('Date',ascending=False,inplace=True)\n",
615 | " columns=[{\"name\": i, \"id\": i} for i in df.columns]\n",
616 | " data = df.to_dict('records')\n",
617 | " return fig,data,columns\n",
618 | " \n",
619 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
620 | " html.H2(\"Select a Ticker\"),\n",
621 | " dcc.Dropdown(options=symbol_list,value='SPY',id='stock_picker'),\n",
622 | " dcc.Graph(id='stock_plot'),\n",
623 | " dash_table.DataTable(id='data_table',page_size=20,)\n",
624 | " ])\n",
625 | "\n",
626 | "app.run()"
627 | ]
628 | },
629 | {
630 | "cell_type": "markdown",
631 | "id": "37f5dd3d-cc2c-4902-9cd0-524824d9f6fd",
632 | "metadata": {},
633 | "source": [
634 | "### Let's make tabs one for the chart and one for \n",
635 | "* Use dcc.Tabs\n",
636 | "* label is tab's name"
637 | ]
638 | },
639 | {
640 | "cell_type": "code",
641 | "execution_count": 16,
642 | "id": "431442ff-ccfa-4542-a160-2607704f70ec",
643 | "metadata": {
644 | "tags": []
645 | },
646 | "outputs": [
647 | {
648 | "data": {
649 | "text/html": [
650 | "\n",
651 | " \n",
659 | " "
660 | ],
661 | "text/plain": [
662 | ""
663 | ]
664 | },
665 | "metadata": {},
666 | "output_type": "display_data"
667 | },
668 | {
669 | "name": "stderr",
670 | "output_type": "stream",
671 | "text": [
672 | "[*********************100%%**********************] 1 of 1 completed\n",
673 | "[*********************100%%**********************] 1 of 1 completed\n"
674 | ]
675 | }
676 | ],
677 | "source": [
678 | "tabs = dcc.Tabs(children=\n",
679 | " [\n",
680 | " dcc.Tab(label='Chart',children=dcc.Graph(id='stock_plot')),\n",
681 | " dcc.Tab(label='Table',children=dash_table.DataTable(id='data_table',page_size=20,))\n",
682 | " \n",
683 | " ]\n",
684 | " )\n",
685 | "app.layout = html.Div(children=[html.H1(\"Trade Mamba\"),\n",
686 | " html.H2(\"Select a Ticker\"),\n",
687 | " dcc.Dropdown(options=symbol_list,value='SPY',id='stock_picker'),\n",
688 | " tabs\n",
689 | " ])\n",
690 | "\n",
691 | "app.run()"
692 | ]
693 | },
694 | {
695 | "cell_type": "markdown",
696 | "id": "9cbf61a6-ab91-48db-b881-76ac696797f8",
697 | "metadata": {},
698 | "source": [
699 | "### Full App with Style and Color\n",
700 | "* label is usually text label\n",
701 | "* style is where we add the style. We can add it to any dash component like core and html and containers and individual elements"
702 | ]
703 | },
704 | {
705 | "cell_type": "code",
706 | "execution_count": 18,
707 | "id": "fdd1b3dd-e4ed-428e-b850-1ff3140ff795",
708 | "metadata": {
709 | "tags": []
710 | },
711 | "outputs": [
712 | {
713 | "data": {
714 | "text/html": [
715 | "\n",
716 | " \n",
724 | " "
725 | ],
726 | "text/plain": [
727 | ""
728 | ]
729 | },
730 | "metadata": {},
731 | "output_type": "display_data"
732 | },
733 | {
734 | "name": "stderr",
735 | "output_type": "stream",
736 | "text": [
737 | "[*********************100%%**********************] 1 of 1 completed\n"
738 | ]
739 | }
740 | ],
741 | "source": [
742 | "from dash import html,Dash,dcc,dash_table\n",
743 | "from dash.dependencies import Input, Output\n",
744 | "import plotly.express as px\n",
745 | "import yfinance as yf\n",
746 | "\n",
747 | "# Assuming get_data_from_yfinance and symbol_list are defined elsewhere\n",
748 | "# from some_module import get_data_from_yfinance, symbol_list\n",
749 | "symbol_list = ['TSLA', 'NVDA', 'AMD', 'META', 'BABA', 'SPY', 'QQQ']\n",
750 | "\n",
751 | "app = Dash()\n",
752 | "\n",
753 | "@app.callback(\n",
754 | " [Output(component_id='stock_plot', component_property='figure'),\n",
755 | " Output(component_id='data_table', component_property='data')],\n",
756 | " [Input(component_id='ticker_selection', component_property='value')]\n",
757 | ")\n",
758 | "def update_graph(ticker):\n",
759 | " dff = get_data_from_yfinance(ticker)\n",
760 | " fig = px.line(dff, x='Date', y='Close')\n",
761 | " fig.update_layout(\n",
762 | " plot_bgcolor='#D1C4E9', # Light purplish background for the plot area\n",
763 | " paper_bgcolor='#E6B0AA', # Light reddish-purple background for the surrounding area\n",
764 | " font=dict(color='#4B0082') # Optional: Adjust the font color for better readability\n",
765 | " )\n",
766 | " dff = dff.sort_values('Date', ascending=False)\n",
767 | " columns = [{\"name\": i, \"id\": i} for i in dff.columns]\n",
768 | " data = dff.to_dict('records')\n",
769 | " return fig, data\n",
770 | "\n",
771 | "def get_data_from_yfinance(ticker):\n",
772 | " data = yf.download(ticker, period='max', auto_adjust=True)\n",
773 | " data.reset_index(inplace=True)\n",
774 | " return data\n",
775 | "\n",
776 | "\n",
777 | "background_style = {\n",
778 | " 'backgroundColor': '#A1887F', # Soft purplish background color\n",
779 | " 'padding': '20px' # Padding around the content\n",
780 | "}\n",
781 | "\n",
782 | "tab_style = {\n",
783 | " 'backgroundColor': '#D1C4E9', # Soft reddish-purple background color\n",
784 | " 'padding': '20px', # Padding around the tab content\n",
785 | " 'border': 'none'\n",
786 | "}\n",
787 | "\n",
788 | "selected_tab_style = {\n",
789 | " 'backgroundColor': '#E6B0AA', # Soft purplish background color for selected tab\n",
790 | " 'padding': '20px', # Padding around the tab content\n",
791 | " 'border': 'none'\n",
792 | "}\n",
793 | "\n",
794 | "data_table_style = {\n",
795 | " 'backgroundColor': '#E6B0AA' # Soft reddish-purple background color for the table\n",
796 | "}\n",
797 | "\n",
798 | "dropdown_style = {\n",
799 | " 'backgroundColor': '#F8BBD0', # Reddish-brown background color \n",
800 | " 'color': '#4B2E2A', # Text color\n",
801 | " 'border': 'none', # No border\n",
802 | " 'padding': '10px', # Padding inside the dropdown\n",
803 | " 'font-size': '16px' # Font size\n",
804 | "}\n",
805 | "\n",
806 | "graph_style = {'backgroundColor': '#E0F7FA'}\n",
807 | " \n",
808 | "\n",
809 | "tabs = dcc.Tabs(children=[ \n",
810 | " dcc.Tab(label='Chart', children=dcc.Graph(id='stock_plot', style=graph_style), style=tab_style, selected_style=selected_tab_style),\n",
811 | " dcc.Tab(\n",
812 | " label='Table', \n",
813 | " children=dash_table.DataTable(\n",
814 | " id='data_table', \n",
815 | " page_size=10, \n",
816 | " style_table={'backgroundColor': '#E6B0AA'}, # Table background color\n",
817 | " style_data={'backgroundColor': '#E6B0AA', 'color': '#4B0082'}, # Data cell background and text color\n",
818 | " style_header={'backgroundColor': '#E0F7FA', 'color': '#4B0082'} # Header cell background and text color\n",
819 | " ), \n",
820 | " style=tab_style, selected_style=selected_tab_style\n",
821 | " )\n",
822 | "])\n",
823 | "\n",
824 | "app.layout = html.Div(style=background_style, children=[\n",
825 | " html.H1(\"Yahoo Finance App\", style={'text-align': 'center'}),\n",
826 | " html.Div(children=[\n",
827 | " html.H2(\"Select a stock\"),\n",
828 | " dcc.Dropdown(options=[{'label': sym, 'value': sym} for sym in symbol_list], id='ticker_selection', value='QQQ',style=dropdown_style),\n",
829 | " tabs\n",
830 | " ])\n",
831 | "\n",
832 | "])\n",
833 | "\n",
834 | "app.run()\n"
835 | ]
836 | },
837 | {
838 | "cell_type": "code",
839 | "execution_count": null,
840 | "id": "3c8b37c3-092f-4881-ac03-a128239447db",
841 | "metadata": {},
842 | "outputs": [],
843 | "source": []
844 | },
845 | {
846 | "cell_type": "code",
847 | "execution_count": null,
848 | "id": "a9628713",
849 | "metadata": {},
850 | "outputs": [],
851 | "source": []
852 | },
853 | {
854 | "cell_type": "code",
855 | "execution_count": null,
856 | "id": "807fd682",
857 | "metadata": {},
858 | "outputs": [],
859 | "source": []
860 | },
861 | {
862 | "cell_type": "code",
863 | "execution_count": null,
864 | "id": "65c6d05c",
865 | "metadata": {},
866 | "outputs": [],
867 | "source": []
868 | },
869 | {
870 | "cell_type": "code",
871 | "execution_count": null,
872 | "id": "a4d35fd5",
873 | "metadata": {},
874 | "outputs": [],
875 | "source": []
876 | },
877 | {
878 | "cell_type": "code",
879 | "execution_count": null,
880 | "id": "51ff9aee",
881 | "metadata": {},
882 | "outputs": [],
883 | "source": []
884 | }
885 | ],
886 | "metadata": {
887 | "kernelspec": {
888 | "display_name": "py310",
889 | "language": "python",
890 | "name": "py310"
891 | },
892 | "language_info": {
893 | "codemirror_mode": {
894 | "name": "ipython",
895 | "version": 3
896 | },
897 | "file_extension": ".py",
898 | "mimetype": "text/x-python",
899 | "name": "python",
900 | "nbconvert_exporter": "python",
901 | "pygments_lexer": "ipython3",
902 | "version": "3.10.13"
903 | }
904 | },
905 | "nbformat": 4,
906 | "nbformat_minor": 5
907 | }
908 |
--------------------------------------------------------------------------------