%22%22%22%0ANYC%20Taxi%20Marimo%20-%20Notebook%2001%3A%20Marimo%20Fundamentals%0A%0AThe%20document%20links%20below%20provide%20more%20detailed%20information%20on%20the%20concepts%20covered%20in%20this%20notebook.%0A%0ADocumentation%3A%0A%20%20%20%20-%20Marimo%20basics%3A%20https%3A%2F%2Fdocs.marimo.io%2Fguides%2Freactivity%2F%0A%20%20%20%20-%20UI%20elements%3A%20https%3A%2F%2Fdocs.marimo.io%2Fapi%2Finputs%2F%0A%22%22%22%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.19.5%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20datetime%20import%20date%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20plotly.express%20as%20px%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20from%20utils.styling%20import%20TAXI_COLORS%0A%20%20%20%20return%20TAXI_COLORS%2C%20date%2C%20mo%2C%20pl%2C%20px%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%20Marimo%20101%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20firstName%20%3D%20%22Etty%22%0A%20%20%20%20return%20(firstName%2C)%0A%0A%0A%40app.cell%0Adef%20_(firstName%2C%20mo)%3A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20Welcome%20to%20Marimo%20**%7BfirstName%7D**%2C%20here%20we%20can%20see%20how%20to%20interpolate%20%0A%20%20%20%20Python%20values%20into%20Markdown%20strings.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20a%20%3D%2010%0A%20%20%20%20b%20%3D%2030%0A%20%20%20%20return%20a%2C%20b%0A%0A%0A%40app.cell%0Adef%20_(a%2C%20b%2C%20mo)%3A%0A%20%20%20%20c%20%3D%20a%20%2B%20b%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20The%20value%20of%20c%20is%20**%7Bc%7D**%20-%20changing%20a%20or%20b%20will%20trigger%20a%20re-execution.%0A%0A%20%20%20%20Check%20the%20dependency%20graph%20on%20the%20sidebar!%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20slider%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D100%2C%20label%3D%22Select%20a%20value%22%2C%20value%3D50)%0A%20%20%20%20slider%0A%20%20%20%20return%20(slider%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20slider)%3A%0A%20%20%20%20_output_val%20%3D%20%22%22%0A%20%20%20%20if%20slider.value%20%3C%2030%3A%0A%20%20%20%20%20%20%20%20_output_val%20%3D%20%22Low%22%0A%20%20%20%20elif%20slider.value%20%3E%2070%3A%0A%20%20%20%20%20%20%20%20_output_val%20%3D%20%22High%22%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20_output_val%20%3D%20%22Medium%22%0A%0A%20%20%20%20mo.md(f%22The%20slider%20value%20is%20%7B_output_val%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20dropdown%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22Yellow%20Taxi%22%2C%20%22Green%20Taxi%22%2C%20%22Uber%22%2C%20%22Lyft%22%2C%20%22Via%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22Yellow%20Taxi%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Select%20service%20type%22%2C%0A%20%20%20%20%20%20%20%20searchable%3DTrue%2C%0A%20%20%20%20)%0A%20%20%20%20dropdown%0A%20%20%20%20return%20(dropdown%2C)%0A%0A%0A%40app.cell%0Adef%20_(TAXI_COLORS%2C%20dropdown%2C%20mo)%3A%0A%20%20%20%20%22%22%22Use%20imported%20TAXI_COLORS%20from%20utils.styling%22%22%22%0A%20%20%20%20colour%20%3D%20TAXI_COLORS.get(dropdown.value%2C%20%22%2395A5A6%22)%0A%20%20%20%20mo.md(f'Selected%3A%20%3Cspan%20style%3D%22color%3A%20%7Bcolour%7D%3B%20font-weight%3A%20bold%3B%22%3E%7Bdropdown.value%7D%3C%2Fspan%3E')%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20text_input%20%3D%20mo.ui.text(placeholder%3D%22Enter%20text%22)%0A%20%20%20%20checkbox%20%3D%20mo.ui.checkbox(label%3D%22Check%20me%22)%0A%20%20%20%20date_picker%20%3D%20mo.ui.date()%0A%0A%20%20%20%20text_input%2C%20checkbox%2C%20date_picker%0A%20%20%20%20return%20checkbox%2C%20date_picker%2C%20text_input%0A%0A%0A%40app.cell%0Adef%20_(checkbox%2C%20date_picker%2C%20mo%2C%20text_input)%3A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20**Input%20selections%3A**%0A%0A%20%20%20%20-%20Text%3A%20%7Btext_input.value%7D%0A%20%20%20%20-%20Checkbox%3A%20%7Bcheckbox.value%7D%0A%20%20%20%20-%20Date%3A%20%7Bdate_picker.value%7D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20items%2C%20set_items%20%3D%20mo.state(%5B%5D)%0A%0A%20%20%20%20item_input%20%3D%20mo.ui.text(placeholder%3D%22Enter%20an%20item%22)%0A%0A%20%20%20%20add_button%20%3D%20mo.ui.button(%0A%20%20%20%20%20%20%20%20label%3D%22Add%22%2C%0A%20%20%20%20%20%20%20%20on_change%3Dlambda%20_%3A%20set_items(%0A%20%20%20%20%20%20%20%20%20%20%20%20lambda%20lst%3A%20lst%20%2B%20%5Bitem_input.value%5D%20if%20item_input.value%20else%20lst%0A%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20clear_button%20%3D%20mo.ui.button(%0A%20%20%20%20%20%20%20%20label%3D%22Clear%22%2C%0A%20%20%20%20%20%20%20%20on_change%3Dlambda%20_%3A%20set_items(%5B%5D)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20mo.hstack(%5Bitem_input%2C%20add_button%2C%20clear_button%5D)%0A%20%20%20%20return%20(items%2C)%0A%0A%0A%40app.cell%0Adef%20_(items%2C%20mo)%3A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20**Items%3A**%20%7Bitems()%7D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20%20%20%20%20slider%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D100%2C%20label%3D%22Value%22)%0A%20%20%20%20%20%20%20%20dropdown%20%3D%20mo.ui.dropdown(options%3D%5B%22A%22%2C%20%22B%22%2C%20%22C%22%5D)%0A%20%20%20%20%20%20%20%20button%20%3D%20mo.ui.button(label%3D%22Click%22)%0A%20%20%20%20%20%20%20%20return%20mo.hstack(%5Bslider%2C%20dropdown%2C%20button%5D)%0A%0A%20%20%20%20_()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20%20%20%20%20return%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Name**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.text(placeholder%3D%22Enter%20your%20name%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Date%20of%20Birth**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.date()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Subscribe%3F**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.checkbox(label%3D%22Yes%2C%20send%20me%20updates%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20_()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20form%20%3D%20mo.ui.dictionary(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20mo.ui.text(placeholder%3D%22Enter%20your%20name%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22dob%22%3A%20mo.ui.date()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22subscribe%22%3A%20mo.ui.checkbox(label%3D%22Send%20me%20updates%22)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Name**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20form%5B%22name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Date%20of%20Birth**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20form%5B%22dob%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Subscribe%3F**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20form%5B%22subscribe%22%5D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(form%2C)%0A%0A%0A%40app.cell%0Adef%20_(form)%3A%0A%20%20%20%20print(f%22Form%20value%20%7Bform.value%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20%20%20%20%20return%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.slider(start%3D0%2C%20stop%3D100%2C%20label%3D%22A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.slider(start%3D0%2C%20stop%3D100%2C%20label%3D%22B%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.checkbox(label%3D%22Option%201%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.ui.checkbox(label%3D%22Option%202%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gap%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20_()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20congestion_charge_form%20%3D%20mo.ui.dictionary(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22trip_type%22%3A%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3D%5B%22Yellow%20Taxi%22%2C%20%22Green%20Taxi%22%2C%20%22Uber%22%2C%20%22Lyft%22%5D%2C%20value%3D%22Yellow%20Taxi%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22cbd_applicable%22%3A%20mo.ui.checkbox(label%3D%22Trip%20enters%20Congestion%20Relief%20Zone%3F%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22time_of_day%22%3A%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3D%5B%22Peak%20(5am-9pm)%22%2C%20%22Overnight%22%5D%2C%20value%3D%22Peak%20(5am-9pm)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22distance_miles%22%3A%20mo.ui.number(start%3D0.1%2C%20stop%3D50%2C%20step%3D0.1%2C%20value%3D2.0)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(congestion_charge_form%2C)%0A%0A%0A%40app.cell%0Adef%20_(congestion_charge_form%2C%20mo)%3A%0A%20%20%20%20base_fields%20%3D%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Trip%20Type**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20congestion_charge_form%5B%22trip_type%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Distance%20(miles)**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20congestion_charge_form%5B%22distance_miles%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20congestion_charge_form%5B%22cbd_applicable%22%5D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20)%0A%0A%20%20%20%20if%20congestion_charge_form.value%5B%22cbd_applicable%22%5D%3A%0A%20%20%20%20%20%20%20%20output%20%3D%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20base_fields%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22**Congestion%20Zone%20Details**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22Time%20of%20entry%3A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20congestion_charge_form%5B%22time_of_day%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22info%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gap%3D1%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20output%20%3D%20base_fields%0A%0A%20%20%20%20output%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(congestion_charge_form%2C%20mo)%3A%0A%20%20%20%20CBD_FEES%20%3D%20%7B%22Yellow%20Taxi%22%3A%200.75%2C%20%22Green%20Taxi%22%3A%200.75%2C%20%22Uber%22%3A%201.50%2C%20%22Lyft%22%3A%201.50%7D%0A%20%20%20%20fee%20%3D%20(%0A%20%20%20%20%20%20%20%20CBD_FEES%5Bcongestion_charge_form.value%5B%22trip_type%22%5D%5D%0A%20%20%20%20%20%20%20%20if%20congestion_charge_form.value%5B%22cbd_applicable%22%5D%0A%20%20%20%20%20%20%20%20else%200%0A%20%20%20%20)%0A%0A%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20mo.md(f%22**CBD%20Congestion%20Fee%3A%20%24%7Bfee%3A.2f%7D**%22)%2C%0A%20%20%20%20%20%20%20%20kind%3D%22success%22%20if%20fee%20%3D%3D%200%20else%20%22warn%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20trip_inputs%20%3D%20mo.ui.dictionary(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22distance_miles%22%3A%20mo.ui.number(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%3D0.5%2C%20stop%3D50%2C%20step%3D0.5%2C%20value%3D3.0%2C%20label%3D%22Distance%20(miles)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22time_minutes%22%3A%20mo.ui.number(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%3D1%2C%20stop%3D120%2C%20step%3D1%2C%20value%3D15%2C%20label%3D%22Trip%20time%20(minutes)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22enters_cbd%22%3A%20mo.ui.checkbox(label%3D%22Enters%20Congestion%20Relief%20Zone%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22taxi_type%22%3A%20mo.ui.dropdown(options%3D%5B%22Yellow%20Taxi%22%2C%20%22Green%20Taxi%22%5D%2C%20value%3D%22Yellow%20Taxi%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22rideshare_company%22%3A%20mo.ui.dropdown(options%3D%5B%22Uber%22%2C%20%22Lyft%22%5D%2C%20value%3D%22Uber%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22shared_ride%22%3A%20mo.ui.checkbox(label%3D%22Shared%2FPool%20ride%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22surge_multiplier%22%3A%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%3D1.0%2C%20stop%3D3.0%2C%20step%3D0.1%2C%20value%3D1.0%2C%20label%3D%22Surge%20multiplier%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(trip_inputs%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20trip_inputs)%3A%0A%20%20%20%20tabs%20%3D%20mo.ui.tabs(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Taxi%22%3A%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Yellow%2FGreen%20Taxi%20Fare%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22taxi_type%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22distance_miles%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22time_minutes%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22enters_cbd%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*NYC%20taxi%20rates%3A%20%243.00%20base%20%2B%20%242.50%2Fmile%20%2B%20%240.50%2Fmin*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Rideshare%22%3A%20mo.vstack(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Uber%2FLyft%20Fare%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22rideshare_company%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22distance_miles%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22time_minutes%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22enters_cbd%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22shared_ride%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trip_inputs%5B%22surge_multiplier%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gap%3D0.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Compare%22%3A%20mo.md(%22*See%20summary%20below*%22)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20tabs%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20trip_inputs)%3A%0A%20%20%20%20distance%20%3D%20trip_inputs.value%5B%22distance_miles%22%5D%0A%20%20%20%20time_mins%20%3D%20trip_inputs.value%5B%22time_minutes%22%5D%0A%20%20%20%20cbd%20%3D%20trip_inputs.value%5B%22enters_cbd%22%5D%0A%20%20%20%20surge%20%3D%20trip_inputs.value%5B%22surge_multiplier%22%5D%0A%20%20%20%20shared%20%3D%20trip_inputs.value%5B%22shared_ride%22%5D%0A%0A%20%20%20%20taxi_base%20%3D%203.00%0A%20%20%20%20taxi_per_mile%20%3D%202.50%0A%20%20%20%20taxi_per_min%20%3D%200.50%0A%20%20%20%20taxi_cbd_fee%20%3D%200.75%20if%20cbd%20else%200%0A%20%20%20%20taxi_fare%20%3D%20taxi_base%20%2B%20(distance%20*%20taxi_per_mile)%20%2B%20(time_mins%20*%20taxi_per_min)%20%2B%20taxi_cbd_fee%0A%0A%20%20%20%20rideshare_base%20%3D%202.50%0A%20%20%20%20rideshare_per_mile%20%3D%201.75%0A%20%20%20%20rideshare_per_min%20%3D%200.35%0A%20%20%20%20rideshare_cbd_fee%20%3D%201.50%20if%20cbd%20else%200%0A%20%20%20%20rideshare_fare%20%3D%20(%0A%20%20%20%20%20%20%20%20rideshare_base%20%2B%20(distance%20*%20rideshare_per_mile)%20%2B%20(time_mins%20*%20rideshare_per_min)%0A%20%20%20%20)%20*%20surge%0A%20%20%20%20rideshare_fare%20%3D%20rideshare_fare%20*%200.7%20if%20shared%20else%20rideshare_fare%0A%20%20%20%20rideshare_fare%20%2B%3D%20rideshare_cbd_fee%0A%0A%20%20%20%20cheaper%20%3D%20%22Taxi%22%20if%20taxi_fare%20%3C%20rideshare_fare%20else%20%22Rideshare%22%0A%20%20%20%20savings%20%3D%20abs(taxi_fare%20-%20rideshare_fare)%0A%0A%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**%7Btrip_inputs.value%5B%22taxi_type%22%5D%7D**%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20Base%20fare%3A%20%243.00%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Distance%20(%7Bdistance%7D%20mi)%3A%20%24%7Bdistance%20*%20taxi_per_mile%3A.2f%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Time%20(%7Btime_mins%7D%20min)%3A%20%24%7Btime_mins%20*%20taxi_per_min%3A.2f%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20CBD%20fee%3A%20%24%7Btaxi_cbd_fee%3A.2f%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20**Total%3A%20%24%7Btaxi_fare%3A.2f%7D**%0A%20%20%20%20%20%20%20%20%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22neutral%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**%7Btrip_inputs.value%5B%22rideshare_company%22%5D%7D**%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20Base%20fare%3A%20%242.50%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Distance%20(%7Bdistance%7D%20mi)%3A%20%24%7Bdistance%20*%20rideshare_per_mile%3A.2f%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Time%20(%7Btime_mins%7D%20min)%3A%20%24%7Btime_mins%20*%20rideshare_per_min%3A.2f%7D%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20Surge%20(%7Bsurge%7Dx)%3A%20applied%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%22Pool%20discount%3A%20-30%25%22%20if%20shared%20else%20%22%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20CBD%20fee%3A%20%24%7Brideshare_cbd_fee%3A.2f%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20**Total%3A%20%24%7Brideshare_fare%3A.2f%7D**%0A%20%20%20%20%20%20%20%20%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22neutral%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20**Winner**%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%7Bcheaper%7D%20is%20cheaper%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20by%20**%24%7Bsavings%3A.2f%7D**%0A%20%20%20%20%20%20%20%20%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22success%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D1%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(date%2C%20pl)%3A%0A%20%20%20%20sample_trips%20%3D%20pl.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22date%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date(2025%2C%201%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date(2025%2C%201%2C%205)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date(2025%2C%201%2C%206)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date(2025%2C%201%2C%206)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20date(2025%2C%201%2C%207)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22trip_type%22%3A%20%5B%22Yellow%20Taxi%22%2C%20%22Uber%22%2C%20%22Yellow%20Taxi%22%2C%20%22Lyft%22%2C%20%22Green%20Taxi%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22distance_miles%22%3A%20%5B2.3%2C%205.1%2C%201.8%2C%203.2%2C%204.5%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22fare%22%3A%20%5B12.50%2C%2018.75%2C%209.25%2C%2014.00%2C%2016.50%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22cbd_fee%22%3A%20%5B0.75%2C%201.50%2C%200.75%2C%201.50%2C%200.00%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%20%20%20%20sample_trips%0A%20%20%20%20return%20(sample_trips%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20%22%22%22Filter%20slider%20-%20defined%20in%20separate%20cell.%22%22%22%0A%20%20%20%20fare_filter%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D20%2C%20step%3D0.5%2C%20value%3D10%2C%20label%3D%22Minimum%20fare%20(%24)%22)%0A%20%20%20%20fare_filter%0A%20%20%20%20return%20(fare_filter%2C)%0A%0A%0A%40app.cell%0Adef%20_(fare_filter%2C%20mo%2C%20pl%2C%20sample_trips)%3A%0A%20%20%20%20%22%22%22Filtered%20DataFrame%20display%20-%20reads%20fare_filter.value.%22%22%22%0A%20%20%20%20filtered_trips%20%3D%20sample_trips.filter(pl.col(%22fare%22)%20%3E%3D%20fare_filter.value)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22**Showing%20%7Blen(filtered_trips)%7D%20trips%20with%20fare%20%E2%89%A5%20%24%7Bfare_filter.value%3A.2f%7D**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20filtered_trips%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(TAXI_COLORS%2C%20px%2C%20sample_trips)%3A%0A%20%20%20%20%22%22%22Bar%20chart%20using%20imported%20TAXI_COLORS.%22%22%22%0A%20%20%20%20fig%20%3D%20px.bar(%0A%20%20%20%20%20%20%20%20sample_trips.to_pandas()%2C%0A%20%20%20%20%20%20%20%20x%3D%22trip_type%22%2C%0A%20%20%20%20%20%20%20%20y%3D%22fare%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22trip_type%22%2C%0A%20%20%20%20%20%20%20%20color_discrete_map%3DTAXI_COLORS%2C%0A%20%20%20%20%20%20%20%20title%3D%22Fares%20by%20Trip%20Type%22%2C%0A%20%20%20%20)%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20%22%22%22Column%20selector%20for%20dynamic%20chart.%22%22%22%0A%20%20%20%20y_column%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22fare%22%2C%20%22distance_miles%22%2C%20%22cbd_fee%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22fare%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22Select%20metric%20to%20plot%22%2C%0A%20%20%20%20)%0A%20%20%20%20y_column%0A%20%20%20%20return%20(y_column%2C)%0A%0A%0A%40app.cell%0Adef%20_(TAXI_COLORS%2C%20px%2C%20sample_trips%2C%20y_column)%3A%0A%20%20%20%20%22%22%22Dynamic%20chart%20based%20on%20column%20selection.%22%22%22%0A%20%20%20%20fig_dynamic%20%3D%20px.bar(%0A%20%20%20%20%20%20%20%20sample_trips.to_pandas()%2C%0A%20%20%20%20%20%20%20%20x%3D%22trip_type%22%2C%0A%20%20%20%20%20%20%20%20y%3Dy_column.value%2C%0A%20%20%20%20%20%20%20%20color%3D%22trip_type%22%2C%0A%20%20%20%20%20%20%20%20color_discrete_map%3DTAXI_COLORS%2C%0A%20%20%20%20%20%20%20%20title%3Df%22%7By_column.value.replace('_'%2C%20'%20').title()%7D%20by%20Trip%20Type%22%2C%0A%20%20%20%20)%0A%20%20%20%20fig_dynamic%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%23%23%20What%20I%20Learned%0A%0A%20%20%20%20%23%23%23%20The%20Split%20Cell%20Pattern%0A%0A%20%20%20%20The%20most%20important%20lesson%3A%20**define%20UI%20elements%20in%20one%20cell%2C%20read%20%60.value%60%20in%20another**.%0A%0A%20%20%20%20Marimo%20won't%20let%20you%20access%20%60.value%60%20in%20the%20same%20cell%20that%20creates%20the%20element.%0A%0A%20%20%20%20%23%23%23%20%60mo.ui.dictionary()%60%20is%20the%20Answer%0A%0A%20%20%20%20When%20I%20wanted%20to%20avoid%20polluting%20the%20global%20namespace%20with%20lots%20of%20variables%3A%0A%20%20%20%20%60%60%60python%0A%20%20%20%20%23%20Cell%201%3A%20define%0A%20%20%20%20form%20%3D%20mo.ui.dictionary(%7B%0A%20%20%20%20%22name%22%3A%20mo.ui.text()%2C%0A%20%20%20%20%22age%22%3A%20mo.ui.number(start%3D0%2C%20stop%3D120)%2C%0A%20%20%20%20%7D)%0A%20%20%20%20form%20%20%23%20display%20it%0A%0A%20%20%20%20%23%20Cell%202%3A%20read%20values%0A%20%20%20%20form.value%5B%22name%22%5D%0A%20%20%20%20form.value%5B%22age%22%5D%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20One%20global%20variable%2C%20multiple%20named%20inputs%2C%20fully%20reactive.%0A%0A%20%20%20%20%23%23%23%20%60def%20_()%3A%20...%20_()%60%20for%20Display-Only%0A%0A%20%20%20%20When%20I%20don't%20need%20to%20access%20values%20elsewhere%3A%0A%20%20%20%20%60%60%60python%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20slider%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D100)%0A%20%20%20%20return%20mo.hstack(%5Bslider%2C%20mo.md(%22Demo%22)%5D)%0A%20%20%20%20_()%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20But%20the%20trade-off%3A%20those%20variables%20don't%20exist%20outside%20the%20function.%0A%0A%20%20%20%20%23%23%23%20Import%20from%20Utils%0A%0A%20%20%20%20Instead%20of%20defining%20%60TAXI_COLORS%60%20everywhere%3A%0A%20%20%20%20%60%60%60python%0A%20%20%20%20from%20utils.styling%20import%20TAXI_COLORS%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20%23%23%23%20Gotchas%20I%20Hit%0A%0A%20%20%20%20-%20%60if%2Felse%60%20doesn't%20display%20anything%20-%20need%20to%20assign%20to%20a%20variable%20and%20put%20it%20as%20the%20last%20line%0A%20%20%20%20-%20A%20cell%20doesn't%20re-run%20itself%20when%20its%20own%20state%20changes%0A%20%20%20%20-%20Importing%20the%20same%20module%20in%20multiple%20cells%20causes%20a%20redefinition%20error%0A%0A%20%20%20%20%23%23%23%20The%20EDA%20Pattern%0A%0A%20%20%20%20For%20data%20exploration%2C%20it's%20always%3A%0A%20%20%20%201.%20**Cell%20A**%3A%20UI%20element%20(filter%2Fselector)%0A%20%20%20%202.%20**Cell%20B**%3A%20Filter%20data%20%2B%20display%20chart%2Ftable%0A%0A%20%20%20%20Change%20the%20UI%2C%20cell%20B%20re-runs.%20Simple.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
d0bd5d9f2e4d1fb488aa17c4ad4cc2a2