import%20marimo%0A%0A__generated_with%20%3D%20%220.9.7%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20app_title%3D%22Polars%20intro%22%2C%0A%20%20%20%20layout_file%3D%22layouts%2Fpolars_intro.slides.json%22%2C%0A%20%20%20%20css_file%3D%22..%2Fcustom.css%22%2C%0A)%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Intro%20to%20%5Bpolars%5D(https%3A%2F%2Fpola.rs)%0A%0A%20%20%20%20%20%20%20%20A%20brief%20introduction%20to%20the%20incredible%20%60polars%60%20dataframe%20library.%0A%0A%20%20%20%20%20%20%20%20!%5Bpolars%20logo%5D(https%3A%2F%2Fraw.githubusercontent.com%2Fpola-rs%2Fpolars-static%2Fmaster%2Fbanner%2Fpolars_github_banner.svg)%0A%0A%20%20%20%20%20%20%20%20Created%20by%3A%20%5BRyan%20Parker%5D(https%3A%2F%2Fgithub.com%2Frparkr)%2C%20August%202024.%20Last%20updated%20in%20October%202024.%0A%0A%20%20%20%20%20%20%20%20This%20demo%20is%20a%20%5Bmarimo%20notebook%5D(https%3A%2F%2Fmarimo.io%2F)%2C%20so%20it%20is%20interactive%20and%20reactive%20--%20try%20experimenting%20with%20the%20widgets%20later%20on!%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Aasync%20def%20__(mo)%3A%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20import%20download_data%0A%0A%20%20%20%20callout_download%20%3D%20None%0A%20%20%20%20%23%20Download%20data%0A%20%20%20%20if%20not%20Path(%22data%22).exists()%3A%0A%20%20%20%20%20%20%20%20callout_download%20%3D%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22info%22%2C%20value%3D%22Downloading%20NYC%20Taxi%20and%20weather%20data%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20await%20download_data.download_taxi_data()%0A%20%20%20%20%20%20%20%20download_data.download_weather_data()%0A%20%20%20%20%20%20%20%20download_data.download_weather_codes()%0A%20%20%20%20callout_download%0A%20%20%20%20return%20Path%2C%20callout_download%2C%20download_data%2C%20pl%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Data%20analysis%20in%20Python%0A%20%20%20%20%20%20%20%20As%20an%20interpreted%20language%20with%20an%20easy-to-read%20syntax%2C%20Python%20is%20fantastic%20for%20data%20analysis%2C%20where%20rapid%20iteration%20enables%20exploration%20and%20accelerates%20development.%0A%0A%20%20%20%20%20%20%20%20Since%20its%20first%20release%20in%202008%2C%20%5Bpandas%5D(https%3A%2F%2Fpandas.pydata.org%2Fdocs%2F)%20has%20been%20the%20de-facto%20standard%20for%20data%20analysis%20in%20Python%2C%20but%20in%20recent%20years%20other%20libraries%20have%20been%20created%20which%20offer%20distinct%20advantages.%20Some%20of%20those%20include%3A%0A%0A%20%20%20%20%20%20%20%20-%20%5BcuDF%5D(https%3A%2F%2Fdocs.rapids.ai%2Fapi%2Fcudf%2Fstable%2F)%3A%20GPU-accelerated%20dataframe%20operations%20with%20pandas%20API%20support%0A%20%20%20%20%20%20%20%20-%20%5Bmodin%5D(https%3A%2F%2Fmodin.readthedocs.io%2Fen%2Fstable%2F)%3A%20pandas%20API%20running%20on%20distributed%20compute%20using%20%5BRay%5D(https%3A%2F%2Fwww.ray.io%2F)%20or%20%5BDask%5D(https%3A%2F%2Fwww.dask.org%2F)%20as%20a%20backend%0A%20%20%20%20%20%20%20%20-%20%5Bibis%5D(https%3A%2F%2Fibis-project.org%2F)%3A%20dataframe%20library%20supporting%20dozens%20of%20backends%20(including%20pandas%2C%20polars%2C%20DuckDB%2C%20and%20many%20SQL%20databases)%0A%20%20%20%20%20%20%20%20-%20%5BDuckDB%5D(https%3A%2F%2Fduckdb.org%2F)%3A%20in-process%20database%20engine%20for%20running%20SQL%20queries%20on%20local%20or%20remote%20data%0A%20%20%20%20%20%20%20%20-%20%5Btemporian%5D(https%3A%2F%2Ftemporian.readthedocs.io%2Fen%2Fstable%2F)%3A%20efficient%20data%20processing%20for%20timeseries%20data%0A%20%20%20%20%20%20%20%20-%20%5Bpolars%5D(https%3A%2F%2Fpola.rs%2F)%3A%20ultra-fast%20dataframe%20library%20written%20in%20Rust%0A%20%20%20%20%20%20%20%20-%20and%20others...%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Polars%20advantages%0A%20%20%20%20%20%20%20%20-%20Easy%20to%20use%0A%20%20%20%20%20%20%20%20-%20Parallelized%20across%20all%20CPU%20cores%0A%20%20%20%20%20%20%20%20-%20Zero%20dependencies%0A%20%20%20%20%20%20%20%20-%20Built%20on%20the%20Apache%20Arrow%20in-memory%20data%20format%3A%20enables%20zero-copy%20interoperability%20with%20other%20libraries%20(e.g.%2C%20DuckDB%2C%20Snowflake)%0A%20%20%20%20%20%20%20%20-%20Handles%20datasets%20larger%20than%20RAM%0A%20%20%20%20%20%20%20%20-%20Powerful%20query%20optimizer%0A%20%20%20%20%20%20%20%20-%20Fully%20compatible%20with%20scikit-learn%20and%20a%20growing%20ecosystem%20of%20other%20libraries%2C%20thanks%20to%20the%20%5BDataframe%20Interchange%20Protocol%5D(https%3A%2F%2Fdata-apis.org%2Fdataframe-protocol%2Flatest%2F)%20and%20%5Bnarwhals%5D(https%3A%2F%2Fgithub.com%2Fnarwhals-dev%2Fnarwhals)%0A%0A%20%20%20%20%20%20%20%20-%20%7Bmo.icon('fluent-mdl2%3Arust-language-logo')%7D%20written%20in%20%5BRust%5D(https%3A%2F%2Frust-lang.org)%2C%20a%20compiled%20language%20that%20has%20experienced%20rapid%20adoption%20since%20its%20first%20stable%20release%20in%202015%20thanks%20to%20its%20C%2FC%2B%2B%20performance%2C%20concurrency%2C%20and%20memory%20safety%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Key%20concepts%0A%0A%20%20%20%20%20%20%20%20Polars%20uses%20the%20Apache%20Arrow%20in-memory%20data%20format%2C%20which%20is%20column-oriented.%20The%20primary%20data%20structures%20for%20polars%20are%20Series%20and%20DataFrames%2C%20similar%20to%20pandas.%0A%0A%20%20%20%20%20%20%20%20Apache%20Arrow%20supports%20many%20useful%20data%20types%20(many%20more%20than%20those%20which%20are%20supported%20by%20NumPy)%2C%20so%20you%20can%20perform%20fast%2C%20vectorized%20operations%20on%20all%20kinds%20of%20data%20(nested%20JSON%20%60structs%60%2C%20strings%2C%20datetimes%2C%20etc.)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Contexts%0A%20%20%20%20%20%20%20%20In%20Polars%2C%20a%20_context_%20refers%20to%20the%20data%20available%20to%20operate%20on.%0A%0A%20%20%20%20%20%20%20%20The%20primary%20contexts%20are%3A%0A%0A%20%20%20%20%20%20%20%20**Selection**%3A%0A%0A%20%20%20%20%20%20%20%20-%20%60.select()%60%3A%20choose%20a%20subset%20of%20columns%20and%20perform%20operations%20on%20them%0A%20%20%20%20%20%20%20%20-%20%60.with_columns()%60%3A%20add%20to%20the%20columns%20already%20available%0A%0A%20%20%20%20%20%20%20%20**Filtering**%3A%0A%0A%20%20%20%20%20%20%20%20-%20%60.filter()%60%3A%20filter%20the%20data%20using%20boolean%20conditions%20on%20row%20values%0A%0A%20%20%20%20%20%20%20%20**Aggregation**%3A%0A%0A%20%20%20%20%20%20%20%20-%20%60.group_by()%60%3A%20perform%20aggregations%20on%20groups%20of%20values%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Expressions%0A%0A%20%20%20%20%20%20%20%20_Expressions_%20are%20the%20operations%20performed%20in%20Polars%2C%20things%20like%3A%0A%0A%20%20%20%20%20%20%20%20-%20%60.sum()%60%0A%20%20%20%20%20%20%20%20-%20%60.len()%60%0A%20%20%20%20%20%20%20%20-%20%60.mean().over()...%60%0A%20%20%20%20%20%20%20%20-%20%60when().then().otherwise()%60%0A%20%20%20%20%20%20%20%20-%20%60.str.replace()%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Lazy%20vs.%20Eager%20mode%0A%20%20%20%20%20%20%20%20-%20%60scan_csv()%60%20vs.%20%60read_csv()%60%0A%0A%20%20%20%20%20%20%20%20%23%23%23%20Recommendation%3A%20use%20Lazy%20mode%0A%20%20%20%20%20%20%20%20-%20In%20Lazy%20mode%2C%20Polars%20will%20optimize%20the%20query%20plan%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%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(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plugin%20ecosystem%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20You%20can%20create%20custom%20expressions%20to%20use%20in%20Polars%2C%20which%20will%20also%20be%20vectorized%20and%20run%20in%20parallel%20like%20standard%20Polars%20expressions.%20If%20there's%20an%20operation%20you'd%20like%20to%20run%20on%20your%20data%2C%20chances%20are%20someone%20has%20already%20implemented%20it%20and%20it's%20just%20a%20%60pip%20install%60%20away.%20Here%20are%20%5Bsome%20examples%5D(https%3A%2F%2Fdocs.pola.rs%2Fuser-guide%2Fexpressions%2Fplugins%2F%23community-plugins)...%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%20mo.accordion(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%23%23%23%20%5B%60polars_ds%60%5D(https%3A%2F%2Fgithub.com%2Fabstractqqq%2Fpolars_ds_extension)%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Polars%20extension%20for%20data%20science%20tasks%0A%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-%20A%20combination%20of%20functions%20and%20operations%20from%20scikit-learn%2C%20SciPy%2C%20and%20edit%20distance%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-%20Polars%20is%20the%20only%20dependency%20(unless%20you%20want%20to%20create%20plots%3B%20that%20adds%20Plotly%20as%20a%20dependency)%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-%20Can%20create%20bar%20plots%20within%20dataframe%20outputs%20(HTML%20%60__repr__%60%20in%20a%20notebook)%20--%20like%20sparklines%2C%20and%20similar%20to%20what%20is%20available%20in%20pandas'%20advanced%20dataframe%20styling%20options%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%22%22%22%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%20%22%23%23%23%20%5B%60polars_distance%60%5D(https%3A%2F%2Fgithub.com%2Fion-elgreco%2Fpolars-distance)%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Distance%20calculations%20(e.g.%2C%20word%20similarity)%20in%20polars.%20Also%20includes%20haversine%20distance%20(lat%2Flon)%2C%20cosine%20similarity%2C%20etc.%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%22%22%22%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%20%22%23%23%23%20%5B%60polars_reverse_geocode%60%5D(https%3A%2F%2Fgithub.com%2FMarcoGorelli%2Fpolars-reverse-geocode)%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Offline%20reverse%20geocoding%3A%20find%20a%20city%20based%20on%20provided%20lat%2Flon%3B%20using%20an%20offline%20lookup%20table%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%22%22%22%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%20%22%23%23%23%20Tutorial%3A%20%5Bhow%20to%20create%20a%20polars%20plugin%5D(https%3A%2F%2Fmarcogorelli.github.io%2Fpolars-plugins-tutorial%2F)%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20You%20can%20create%20your%20own%20plugin!%20This%20tutorial%20teaches%20you%20enough%20Rust%20to%20write%20a%20polars%20plugin%2C%20which%20can%20published%20to%20PyPI%20and%20installed%20by%20other%20Polars%20users.%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%22%22%22%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%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%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__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Final%20thoughts%0A%0A%20%20%20%20%20%20%20%20%23%23%20Upgrade%20weekly%0A%20%20%20%20%20%20%20%20%E2%AD%90%20Polars%20development%20%5Badvances%20rapidly%5D(https%3A%2F%2Fgithub.com%2Fpola-rs%2Fpolars%2Freleases)%2C%20so%20I%20recommend%20upgrading%20often%20(weekly)%20to%20get%20the%20latest%20features%0A%0A%20%20%20%20%20%20%20%20%23%23%20Try%20it%20out%0A%20%20%20%20%20%20%20%20The%20best%20way%20to%20learn%20is%20by%20doing.%20Try%20using%20Polars%20any%20time%20you%20create%20a%20new%20notebook%20or%20start%20a%20new%20project.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Resources%0A%20%20%20%20%20%20%20%20-%20%5BPolars%20user%20guide%5D(https%3A%2F%2Fdocs.pola.rs%2Fuser-guide%2Fmigration%2Fpandas%2F)%3A%20fantastic%20guide%20to%20learning%20Polars%20alongside%20helpful%20explanations%0A%20%20%20%20%20%20%20%20-%20%5BComing%20from%20%60pandas%60%5D(https%3A%2F%2Fdocs.pola.rs%2Fuser-guide%2Fmigration%2Fpandas%2F)%3A%20are%20you%20familiar%20with%20%60pandas%60%20and%20want%20to%20learn%20the%20differences%20you'll%20notice%20when%20switching%20to%20polars%3F%20This%20guide%20translates%20common%20concepts%20to%20help%20you.%0A%20%20%20%20%20%20%20%20%20%20-%20%5BThis%20series%20of%20articles%20from%202022%5D(https%3A%2F%2Fkevinheavey.github.io%2Fmodern-polars%2F)%20demonstrates%20some%20operations%20in%20pandas%20and%20polars%2C%20side-by-side.%20_Polars%20development%20advances%20rapidly%2C%20so%20many%20of%20the%20concepts%20covered%20in%20that%20series%20are%20already%20different.%20Still%20it%20will%20help%20you%20get%20a%20general%20feel%20for%20the%20flow%20of%20using%20Polars%20compared%20to%20pandas._%0A%20%20%20%20%20%20%20%20-%20%5BPolars%20Python%20API%5D(https%3A%2F%2Fdocs.pola.rs%2Fapi%2Fpython%2Fstable%2Freference%2Findex.html)%3A%20detailed%20info%20on%20every%20expression%2C%20method%2C%20and%20function%20in%20Polars.%20I%20recommend%20browsing%20this%20list%20to%20get%20a%20feel%20for%20what%20Polars%20can%20do.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20__(mo)%3A%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(r%22%22%22%0A%20%20%20%20%23%20Demo%0A%20%20%20%20In%20this%20section%2C%20I%20demonstrate%20basic%20Polars%20usage%20on%20the%20NYC%20Taxi%20Yellow%20Cab%20dataset.%20You%20can%20find%20more%20information%20about%20that%20dataset%20on%20the%20%5BNYC%20Trip%20Record%20Data%20page%5D(https%3A%2F%2Fwww.nyc.gov%2Fsite%2Ftlc%2Fabout%2Ftlc-trip-record-data.page).%0A%20%20%20%20%22%22%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.accordion(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%23%23%20Data%20dictionary%20(from%20the%20%5BPDF%20file%20published%20by%20NYC%20Trip%20Record%20Data%5D(https%3A%2F%2Fwww.nyc.gov%2Fassets%2Ftlc%2Fdownloads%2Fpdf%2Fdata_dictionary_trip_records_yellow.pdf))%22%3A%20r%22%22%22%0A%20%20%20%201.%20**VendorID**%3A%20A%20code%20indicating%20the%20TPEP%20provider%20that%20provided%20the%20record.%201%3D%20Creative%20Mobile%20Technologies%2C%20LLC%3B%202%3D%20VeriFone%20Inc.%0A%20%20%20%202.%20**tpep_pickup_datetime**%3A%20The%20date%20and%20time%20when%20the%20meter%20was%20engaged%0A%20%20%20%203.%20**tpep_dropoff_datetime**%3A%20The%20date%20and%20time%20when%20the%20meter%20was%20disengaged%0A%20%20%20%204.%20**Passenger_count**%3A%20The%20number%20of%20passengers%20in%20the%20vehicle.%20This%20is%20a%20driver-entered%20value.%0A%20%20%20%205.%20**Trip_distance**%3A%20The%20elapsed%20trip%20distance%20in%20miles%20reported%20by%20the%20taximeter%0A%20%20%20%206.%20**PULocationID**%3A%20TLC%20Taxi%20Zone%20in%20which%20the%20taximeter%20was%20engaged%0A%20%20%20%20%20%20%20%20-%20%5BSee%20here%5D(http%3A%2F%2Fwww.nyc.gov%2Fhtml%2Ftlc%2Fhtml%2Fabout%2Ftrip_record_data.shtml)%20for%20a%20map%20of%20the%20TLC%20Taxi%20Zones%0A%20%20%20%207.%20**DOLocationID**%3A%20TLC%20Taxi%20Zone%20in%20which%20the%20taximeter%20was%20disengaged%0A%20%20%20%208.%20**RateCodeID**%3A%20The%20final%20rate%20code%20in%20effect%20at%20the%20end%20of%20the%20trip.%0A%20%20%20%20%20%20%20%20-%201%20%3D%20Standard%20rate%0A%20%20%20%20%20%20%20%20-%202%20%3D%20JFK%0A%20%20%20%20%20%20%20%20-%203%20%3D%20Newark%0A%20%20%20%20%20%20%20%20-%204%20%3D%20Nassau%20or%20Westchester%0A%20%20%20%20%20%20%20%20-%205%20%3D%20Negotiated%20fare%0A%20%20%20%20%20%20%20%20-%206%20%3D%20Group%20ride%0A%20%20%20%209.%20**Store_and_fwd_flag**%3A%20This%20flag%20indicates%20whether%20the%20trip%20record%20was%20held%20in%20vehicle%20memory%20before%20sending%20to%20the%20vendor%2C%20aka%20%E2%80%9Cstore%20and%20forward%2C%E2%80%9D%20because%20the%20vehicle%20did%20not%20have%20a%20connection%20to%20the%20server%0A%20%20%20%20%20%20%20%20-%20Y%20%3D%20store%20and%20forward%20trip%0A%20%20%20%20%20%20%20%20-%20N%20%3D%20not%20a%20store%20and%20forward%20trip%0A%20%20%20%2010.%20**Payment_type**%3A%20A%20numeric%20code%20signifying%20how%20the%20passenger%20paid%20for%20the%20trip%0A%20%20%20%20%20%20%20%20-%201%20%3D%20Credit%20card%0A%20%20%20%20%20%20%20%20-%202%20%3D%20Cash%0A%20%20%20%20%20%20%20%20-%203%20%3D%20No%20charge%0A%20%20%20%20%20%20%20%20-%204%20%3D%20Dispute%0A%20%20%20%20%20%20%20%20-%205%20%3D%20Unknown%0A%20%20%20%20%20%20%20%20-%206%20%3D%20Voided%20trip%0A%20%20%20%2011.%20**Fare_amount**%3A%20The%20time-and-distance%20fare%20calculated%20by%20the%20meter%0A%20%20%20%2012.%20**Extra**%3A%20Miscellaneous%20extras%20and%20surcharges.%20Currently%2C%20this%20only%20includes%20the%20%240.50%20and%20%241%20rush%20hour%20and%20overnight%20charges.%0A%20%20%20%2013.%20**MTA_tax**%3A%20%240.50%20MTA%20tax%20that%20is%20automatically%20triggered%20based%20on%20the%20metered%20rate%20in%20use%0A%20%20%20%2014.%20**Improvement_surcharge**%3A%20%240.30%20improvement%20surcharge%20assessed%20trips%20at%20the%20flag%20drop.%20The%20improvement%20surcharge%20began%20being%20levied%20in%202015.%0A%20%20%20%2015.%20**Tip_amount**%3A%20Tip%20amount%20%E2%80%93%20This%20field%20is%20automatically%20populated%20for%20credit%20card%20tips.%20Cash%20tips%20are%20not%20included.%0A%20%20%20%2016.%20**Tolls_amount**%3A%20Total%20amount%20of%20all%20tolls%20paid%20in%20trip.%0A%20%20%20%2017.%20**Total_amount**%3A%20The%20total%20amount%20charged%20to%20passengers.%20Does%20not%20include%20cash%20tips%0A%20%20%20%2018.%20**Congestion_Surcharge**%3A%20Total%20amount%20collected%20in%20trip%20for%20NYS%20congestion%20surcharge.%0A%20%20%20%2019.%20**Airport_fee**%3A%20%241.25%20for%20pick%20up%20only%20at%20LaGuardia%20and%20John%20F.%20Kennedy%20Airports%0A%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20)%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__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Lazy-load%20the%20data%0A%20%20%20%20%20%20%20%20Polars%20can%20read%20Parquet%20files%20(local%20or%20hosted%20on%20a%20network)%2C%20determine%20their%20schema%20(columns%20and%20data%20types)%2C%20apply%20filter%20pushdowns%2C%20and%20download%20only%20the%20data%20that%20is%20needed%20for%20the%20operations%20being%20performed.%0A%0A%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20dataframe%20from%20a%20collection%20of%20parquet%20files%0A%20%20%20%20%20%20%20%20df%20%3D%20pl.scan_parquet(%22data%2Fyellow_tripdata_*.parquet)%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo%2C%20pl)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Let's%20check%20the%20schema%3A%0A%0A%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%23%20Polars%20will%20scan%20the%20data%20and%20return%0A%20%20%20%20%20%20%20%20%23%20the%20column%20names%20and%20datatypes%0A%20%20%20%20%20%20%20%20df.collect_schema()%0A%0A%20%20%20%20%20%20%20%20%23%20If%20the%20file%20is%20stored%20locally%2C%20you%20can%0A%20%20%20%20%20%20%20%20%23%20also%20read%20the%20schema%20without%20collecting%20fist%0A%20%20%20%20%20%20%20%20pl.read_parquet_schema(%22path%2Fto%2Fa%2Flocal%2Ffile.parquet%22)%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Create%20a%20LazyFrame%20that%20will%20use%20the%20data%20from%20all%20the%20files%20specified%20above%0A%20%20%20%20df%20%3D%20pl.scan_parquet(%22data%2Fyellow_tripdata_*.parquet%22)%0A%20%20%20%20_output%20%3D%20mo.plain(df.collect_schema())%0A%20%20%20%20mo.vstack(%5B_md%2C%20_output%5D)%0A%20%20%20%20return%20(df%2C)%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20mo%2C%20pl)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20**Preview%20the%20first%20few%20rows%3A**%0A%0A%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20df.head(n%3D10).collect()%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20with%20pl.Config(tbl_cols%3D20%2C%20tbl_width_chars%3D1000%2C%20thousands_separator%3DTrue)%3A%0A%20%20%20%20%20%20%20%20_output%20%3D%20mo.plain_text(df.head(n%3D10).collect())%0A%0A%20%20%20%20mo.vstack(%5B_md%2C%20_output%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20mo%2C%20pl)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20**You%20can%20also%20preview%20the%20first%20few%20rows%20like%20this%3A**%0A%0A%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20df.collect().glimpse()%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20with%20mo.capture_stdout()%20as%20buffer%3A%0A%20%20%20%20%20%20%20%20with%20pl.Config(thousands_separator%3DTrue)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20df.collect().glimpse()%0A%20%20%20%20_output%20%3D%20mo.plain_text(buffer.getvalue())%0A%20%20%20%20print(buffer.getvalue())%0A%20%20%20%20mo.vstack(%5B_md%2C%20_output%2C%20%22Full%20list%3A%22%2C%20buffer.getvalue().strip().split(%22%5Cn%22)%5D)%0A%20%20%20%20return%20(buffer%2C)%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20pl)%3A%0A%20%20%20%20with%20pl.Config(thousands_separator%3DTrue)%3A%0A%20%20%20%20%20%20%20%20df.collect().glimpse()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20mo%2C%20pl)%3A%0A%20%20%20%20_month_list%20%3D%20(%0A%20%20%20%20%20%20%20%20df.select(month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22))%0A%20%20%20%20%20%20%20%20.group_by(%22month%22)%0A%20%20%20%20%20%20%20%20.agg(num_trips%3Dpl.len())%0A%20%20%20%20%20%20%20%20.filter(pl.col(%22num_trips%22)%20%3E%20100)%20%20%23%20Remove%20erroneous%20timestamps%0A%20%20%20%20%20%20%20%20.unique()%0A%20%20%20%20%20%20%20%20.sort(by%3D%22month%22)%0A%20%20%20%20%20%20%20%20.collect()%0A%20%20%20%20%20%20%20%20.to_series()%0A%20%20%20%20%20%20%20%20.to_list()%0A%20%20%20%20)%0A%20%20%20%20print(_month_list)%0A%20%20%20%20month_selection%20%3D%20mo.ui.multiselect(value%3D_month_list%2C%20options%3D_month_list)%0A%20%20%20%20return%20(month_selection%2C)%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20mo%2C%20month_selection%2C%20pl)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Explore%20the%20data%0A%0A%20%20%20%20%20%20%20%20**Find%20the%20average%20cost%20per%20trip%2C%20by%20month**%0A%0A%20%20%20%20%20%20%20%20Month%20selection%3A%20%7Bmonth_selection%7D%0A%0A%20%20%20%20%20%20%20%20Note%20that%20the%20operations%20below%20are%20performed%20in%20parallel%20across%20all%20available%20CPU%20cores%2C%20and%20that%20only%20the%20data%20needed%20will%20be%20downloaded.%0A%0A%20%20%20%20%20%20%20%20In%20this%20case%2C%20since%20I%20have%20filtered%20to%20%7Blen(month_selection.value)%7D%20months%2C%20only%20the%20files%20with%20those%20months%20of%20data%20will%20be%20accessed.%20Also%20notice%20that%20only%205%20columns%20are%20accessed%2C%20since%20those%20are%20the%20ones%20I%20have%20requested.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20query_plan%20%3D%20(%0A%20%20%20%20%20%20%20%20df.with_columns(month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22))%0A%20%20%20%20%20%20%20%20.filter(pl.col(%22month%22).is_in(month_selection.value))%0A%20%20%20%20%20%20%20%20.group_by(pl.col(%22month%22))%0A%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%2C%20%20%23%20count%20the%20number%20of%20trips%0A%20%20%20%20%20%20%20%20%20%20%20%20cost_per_trip%3Dpl.col(%22total_amount%22).mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20avg_passengers_per_trip%3Dpl.col(%22passenger_count%22).mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20avg_distance%3Dpl.col(%22trip_distance%22).mean()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20num_airport_trips%3D(pl.col(%22Airport_fee%22)%20%3E%200).sum()%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%20%20%20%20_output%20%3D%20mo.plain_text(%0A%20%20%20%20%20%20%20%20query_plan.explain(format%3D%22plain%22)%20%20%23%20see%20also%3A%20format%3D%22tree%22%0A%20%20%20%20)%0A%20%20%20%20_output_with_streaming%20%3D%20mo.plain_text(query_plan.explain(streaming%3DTrue))%0A%0A%20%20%20%20_accordion%20%3D%20mo.accordion(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Here's%20a%20way%20we%20could%20answer%20this%20question%20in%20Polars%22%3A%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rf%22%22%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Let's%20see%20this%20in%20Polars%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20query_plan%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df.with_columns(month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.filter(pl.col(%22month%22).is_in(%7Bmonth_selection.value%7D))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.group_by(pl.col(%22month%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%2C%20%20%23%20count%20the%20number%20of%20trips%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cost_per_trip%3Dpl.col(%22total_amount%22).mean()%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%20avg_passengers_per_trip%3Dpl.col(%22passenger_count%22).mean()%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%20avg_distance%3Dpl.col(%22trip_distance%22).mean()%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%20num_airport_trips%3D(pl.col(%22Airport_fee%22)%20%3E%200).sum()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Let's%20see%20how%20Polars%20will%20optimize%20this%20query%22%3A%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20the%20optimized%20query%20plan%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20query_plan.explain()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Query%20plan%22%3A%20_output%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22You%20can%20also%20run%20this%20in%20streaming%20mode%20for%20memory-constrained%20environments%22%3A%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20query_plan.explain(streaming%3DTrue)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Query%20plan%20with%20streaming%22%3A%20_output_with_streaming%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%0A%20%20%20%20mo.vstack(%5B_md%2C%20_accordion%5D)%0A%20%20%20%20return%20(query_plan%2C)%0A%0A%0A%40app.cell%0Adef%20__(mo%2C%20month_selection%2C%20pl%2C%20query_plan)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%20Perform%20the%20calculation%20(%22collect%22)%0A%0A%20%20%20%20%20%20%20%20Month%20selection%3A%20%7Bmonth_selection%7D%0A%0A%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20df_avg%20%3D%20query_plan.collect().sort(by%3Dpl.col(%22month%22))%0A%20%20%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20%20%20%20%20Some%20options%20to%20%60.collect()%60%3A%20%60engine%3D%22cpu%22%60%2C%20%60streaming%3DFalse%60%2C%20%60background%3DFalse%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20df_avg%20%3D%20query_plan.collect().sort(by%3Dpl.col(%22month%22))%0A%0A%20%20%20%20with%20pl.Config(tbl_cols%3D20%2C%20tbl_width_chars%3D1000%2C%20thousands_separator%3DTrue)%3A%0A%20%20%20%20%20%20%20%20_output%20%3D%20mo.plain_text(df_avg)%0A%0A%20%20%20%20mo.vstack(%5B_md%2C%20_output%5D)%0A%20%20%20%20return%20(df_avg%2C)%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20mo%2C%20month_selection%2C%20pl)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20How%20does%20trip%20count%20vary%20by%20hour%20of%20the%20day%3F%0A%0A%20%20%20%20%20%20%20%20Months%3A%20%7Bmonth_selection%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20_result%20%3D%20(%0A%20%20%20%20%20%20%20%20df.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hour%3Dpl.col(%22tpep_pickup_datetime%22).dt.hour()%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.filter(pl.col(%22month%22).is_in(month_selection.value))%0A%20%20%20%20%20%20%20%20.group_by(%5B%22month%22%2C%20%22hour%22%5D)%0A%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%2C%20%20%23%20count%20the%20number%20of%20trips%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.filter(pl.col(%22num_trips%22)%20%3E%20100)%20%20%23%20exclude%20erroneous%20timestamps%0A%20%20%20%20%20%20%20%20.sort(by%3D%5B%22month%22%2C%20%22hour%22%5D%2C%20descending%3D%5BFalse%2C%20False%5D)%0A%20%20%20%20)%0A%0A%20%20%20%20_plot%20%3D%20_result.collect().plot.line(x%3D%22hour%22%2C%20y%3D%22num_trips%22%2C%20color%3D%22month%22)%0A%0A%20%20%20%20_accordion%20%3D%20mo.accordion(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Let's%20see%20this%20in%20Polars%3A%22%3A%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rf%22%22%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%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%20hour%3Dpl.col(%22tpep_pickup_datetime%22).dt.hour()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.filter(pl.col(%22month%22).is_in(%7Bmonth_selection.value%7D))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.group_by(%5B%22month%22%2C%20%22hour%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%2C%20%20%23%20count%20the%20number%20of%20trips%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.filter(pl.col(%22num_trips%22)%20%3E%20100)%20%20%23%20exclude%20erroneous%20timestamps%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.sort(by%3D%5B%22month%22%2C%20%22hour%22%5D%2C%20descending%3D%5BFalse%2C%20False%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Plot%20with%20Altair%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.collect()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3D%22hour%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%20y%3D%22num_trips%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%20color%3D%22month%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%0A%20%20%20%20mo.vstack(%5B_md%2C%20_accordion%2C%20_plot%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20%23%20Explore%20the%20weather%20codes%3A%0A%20%20%20%20import%20json%0A%0A%20%20%20%20with%20open(%22data%2Fweather_codes.json%22%2C%20mode%3D%22rt%22%2C%20encoding%3D%22utf8%22)%20as%20json_file%3A%0A%20%20%20%20%20%20%20%20weather_codes_dict%20%3D%20json.load(json_file)%0A%0A%20%20%20%20with%20open(%22data%2Fweather.json%22%2C%20mode%3D%22rt%22%2C%20encoding%3D%22utf8%22)%20as%20json_file%3A%0A%20%20%20%20%20%20%20%20weather_data_dict%20%3D%20json.load(json_file)%0A%20%20%20%20return%20json%2C%20json_file%2C%20weather_codes_dict%2C%20weather_data_dict%0A%0A%0A%40app.cell%0Adef%20__(df%2C%20pl)%3A%0A%20%20%20%20%23%20import%20polars.selectors%20as%20cs%20%20%23%20for%20%22column%20selectors%22%0A%0A%20%20%20%20%23%20Load%20the%20weather%20codes%20data%20and%20convert%20to%20a%20LazyFrame%0A%20%20%20%20weather_codes%20%3D%20(%0A%20%20%20%20%20%20%20%20pl.read_json(%22data%2Fweather_codes.json%22)%0A%20%20%20%20%20%20%20%20.unpivot()%0A%20%20%20%20%20%20%20%20.select(pl.col(%22variable%22).alias(%22weather_code%22)%2C%20pl.col(%22value%22))%0A%20%20%20%20%20%20%20%20.unnest(%22value%22)%0A%20%20%20%20%20%20%20%20%23%20Expand%20the%20descriptions%20for%20night%20only%2C%0A%20%20%20%20%20%20%20%20%23%20which%20uses%20%22clear%22%20rather%20than%20%22sunny%22%0A%20%20%20%20%20%20%20%20.unnest(%22night%22)%0A%20%20%20%20%20%20%20%20.select(%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%20%23%20Must%20be%20the%20same%20data%20type%20(Int64)%20for%20joining%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.col(%22weather_code%22).cast(pl.Int64)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.col(%22description%22).alias(%22weather_description%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20).lazy()%20%20%23%20must%20be%20a%20LazyFrame%20to%20join%20with%20another%20LazyFrame%0A%0A%20%20%20%20%23%20Get%20the%20names%20of%20the%20weather%20variables%2C%20so%20their%20lists%20can%20be%20%22exploded%22%0A%20%20%20%20%23%20down%20the%20rows%20of%20the%20LazyFrame%0A%20%20%20%20data_fields%20%3D%20(%0A%20%20%20%20%20%20%20%20pl.scan_ndjson(%22data%2Fweather.json%22)%0A%20%20%20%20%20%20%20%20.select(%22hourly_units%22)%0A%20%20%20%20%20%20%20%20.collect()%20%20%23%20you%20have%20to%20.collect()%20to%20access%20a%20Series%0A%20%20%20%20%20%20%20%20.to_series()%20%20%23%20the%20.struct%20accessor%20is%20available%20only%20for%20Series%0A%20%20%20%20%20%20%20%20.struct.fields%20%20%23%20.fields%20holds%20the%20keys%20(column%20names%2C%20after%20unnesting)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20LazyFrame%20with%20weather%20data%20and%20weather%20descriptions%0A%20%20%20%20df_weather%20%3D%20(%0A%20%20%20%20%20%20%20%20pl.scan_ndjson(%22data%2Fweather.json%22)%0A%20%20%20%20%20%20%20%20.unnest(%22hourly%22)%20%20%23%20expand%20a%20dict%20into%20columns%0A%20%20%20%20%20%20%20%20.explode(%0A%20%20%20%20%20%20%20%20%20%20%20%20columns%3Ddata_fields%2C%20%20%23%20expand%20a%20list%20into%20rows%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Alternatively%2C%20using%20column%20selectors%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20columns%3Dcs.by_name(data_fields)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.select(data_fields)%0A%20%20%20%20%20%20%20%20.join(weather_codes%2C%20on%3D%22weather_code%22)%0A%20%20%20%20%20%20%20%20.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Replace%20the%20%22time%22%20column%20and%20update%20its%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20datatype%20so%20it%20can%20be%20joined%20to%20the%20trip%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20pl.col(%22time%22).cast(pl.Datetime(time_unit%3D%22ns%22))%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.sort(by%3D%22time%22)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Combine%20with%20the%20Taxi%20data%0A%20%20%20%20%23%20for%20a%20join_asof%2C%20both%20DataFrames%20need%20to%0A%20%20%20%20%23%20be%20sorted%20by%20the%20join_asof%20key%0A%20%20%20%20df_combined%20%3D%20df.sort(%22tpep_pickup_datetime%22).join_asof(%0A%20%20%20%20%20%20%20%20df_weather%2C%0A%20%20%20%20%20%20%20%20left_on%3D%22tpep_pickup_datetime%22%2C%0A%20%20%20%20%20%20%20%20right_on%3D%22time%22%2C%0A%20%20%20%20%20%20%20%20%23%20Use%20the%20weather%20data%20closest%20to%20the%20time%20of%20pickup%0A%20%20%20%20%20%20%20%20strategy%3D%22nearest%22%2C%20%20%23%20alternatives%3A%20%22backward%22%2C%20%22forward%22%0A%20%20%20%20%20%20%20%20tolerance%3D%222h%22%2C%20%20%23%20weather%20data%20must%20be%20within%202%20hours%20of%20trip%20time%0A%20%20%20%20)%0A%20%20%20%20return%20data_fields%2C%20df_combined%2C%20df_weather%2C%20weather_codes%0A%0A%0A%40app.cell%0Adef%20__(df_combined%2C%20df_weather%2C%20mo%2C%20weather_codes_dict%2C%20weather_data_dict)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20How%20does%20weather%20impact%20trips%3F%0A%0A%20%20%20%20%20%20%20%20For%20this%20analysis%2C%20we'll%20take%20advantage%20of%20Polar's%20ability%20to%20load%20and%20join%20multiple%20data%20types%20and%20join%20them%20together%20using%20approximate%20timestamp%20matching%20--%20all%20using%20%22lazy%2C%22%20optimized%20computations.%0A%0A%20%20%20%20%20%20%20%20The%20time%20zone%20for%20both%20taxi%20trip%20data%20and%20weather%20is%20**America%2FNew_York**.%0A%0A%20%20%20%20%20%20%20%20%3E%20%5BWeather%20data%20from%20Open-Meteo.com%5D(https%3A%2F%2Fopen-meteo.com%2F)%2C%20weather%20codes%20from%20%5Bstellasphere%5D(https%3A%2F%2Fgist.github.com%2Fstellasphere%2F9490c195ed2b53c707087c8c2db4ec0c).%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%0A%20%20%20%20_accordion%20%3D%20mo.accordion(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Here's%20the%20plain%20JSON%20weather%20data%22%3A%20weather_data_dict%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22And%20here%20are%20the%20weather%20codes%22%3A%20weather_codes_dict%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Let's%20load%20the%20weather%20data%20in%20Polars%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20This%20is%20also%20a%20LazyFrame%20(you%20can%20tell%20from%20%60scan_%60)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20LazyFrame%20with%20weather%20data%20and%20weather%20descriptions%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_weather%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.scan_ndjson(%22data%2Fweather.json%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.unnest(%22hourly%22)%20%20%23%20expand%20a%20dict%20into%20columns%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.explode(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20columns%3Ddata_fields%2C%20%20%23%20expand%20a%20list%20into%20rows%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.select(data_fields)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.join(weather_codes%2C%20on%3D%22weather_code%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.with_columns(%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%23%20Replace%20the%20%22time%22%20column%20and%20update%20its%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%23%20datatype%20so%20it%20can%20be%20joined%20to%20the%20trip%20data%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.col(%22time%22).cast(pl.Datetime(time_unit%3D%22ns%22))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.sort(by%3D%22time%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Here's%20what%20the%20data%20looks%20like%22%3A%20df_weather.head(100).collect()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Combine%20with%20the%20Taxi%20trips%20data%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20for%20a%20join_asof%2C%20both%20DataFrames%20need%20to%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20be%20sorted%20by%20the%20join_asof%20key%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_combined%20%3D%20df.sort(%22tpep_pickup_datetime%22).join_asof(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_weather%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20left_on%3D%22tpep_pickup_datetime%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right_on%3D%22time%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Use%20the%20weather%20data%20closest%20to%20the%20time%20of%20pickup%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20strategy%3D%22nearest%22%2C%20%20%23%20alternatives%3A%20%22backward%22%2C%20%22forward%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tolerance%3D%222h%22%2C%20%20%23%20weather%20data%20must%20be%20within%202%20hours%20of%20trip%20time%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Preview%20the%20combined%20dataset%22%3A%20df_combined.head(100).collect()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Here's%20the%20Polars%20code%20for%20the%20weather%20codes%20and%20data%20fields%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Load%20the%20weather%20codes%20data%20and%20convert%20to%20a%20LazyFrame%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20weather_codes%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.read_json(%22data%2Fweather_codes.json%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.unpivot()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.select(pl.col(%22variable%22).alias(%22weather_code%22)%2C%20pl.col(%22value%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.unnest(%22value%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Expand%20the%20descriptions%20for%20night%20only%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20which%20uses%20%22clear%22%20rather%20than%20%22sunny%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.unnest(%22night%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.select(%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%20%23%20Must%20be%20the%20same%20data%20type%20(Int64)%20for%20joining%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%20pl.col(%22weather_code%22).cast(pl.Int64)%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%20pl.col(%22description%22).alias(%22weather_description%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%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20).lazy()%20%20%23%20must%20be%20a%20LazyFrame%20to%20join%20with%20another%20LazyFrame%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Get%20the%20names%20of%20the%20weather%20variables%2C%20so%20their%20lists%20can%20be%20%22exploded%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20down%20the%20rows%20of%20the%20LazyFrame%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20data_fields%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.scan_ndjson(%22data%2Fweather.json%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.select(%22hourly_units%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.collect()%20%20%23%20you%20have%20to%20.collect()%20to%20access%20a%20Series%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.to_series()%20%20%23%20the%20.struct%20accessor%20is%20available%20only%20for%20Series%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.struct.fields%20%20%23%20.fields%20holds%20the%20keys%20(column%20names%2C%20after%20unnesting)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%0A%20%20%20%20mo.vstack(%5B_md%2C%20_accordion%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo%2C%20weather_codes)%3A%0A%20%20%20%20weather_selection%20%3D%20mo.ui.multiselect.from_series(%0A%20%20%20%20%20%20%20%20weather_codes.select(%22weather_description%22).collect().to_series()%2C%0A%20%20%20%20%20%20%20%20label%3D%22%22%2C%0A%20%20%20%20%20%20%20%20value%3D%5B%22Clear%22%2C%20%22Rain%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(weather_selection%2C)%0A%0A%0A%40app.cell%0Adef%20__(df_combined%2C%20mo%2C%20pl%2C%20weather_selection)%3A%0A%20%20%20%20_md%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%23%20How%20much%20does%20weather%20impact%20average%20cost%3F%0A%0A%20%20%20%20%20%20%20%20Weather%20to%20compare%3A%20%7Bweather_selection%7D%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%20%20%20%20_result%20%3D%20(%0A%20%20%20%20%20%20%20%20df_combined.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.group_by(%5B%22month%22%2C%20%22weather_description%22%5D)%0A%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cost_per_person%3Dpl.col(%22total_amount%22).sum()%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%20pl.col(%22passenger_count%22).sum()%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.filter(pl.col(%22num_trips%22)%20%3E%20100)%0A%20%20%20%20%20%20%20%20%23%20Filter%20based%20on%20our%20selection%0A%20%20%20%20%20%20%20%20%23%20Joins%20are%20highly%20optimized%20and%20can%20be%20faster%20than%20.is_in()%0A%20%20%20%20%20%20%20%20.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20pl.LazyFrame(%7B%22weather_description%22%3A%20weather_selection.value%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20on%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20.sort(by%3D%5B%22month%22%2C%20%22weather_description%22%5D)%0A%20%20%20%20)%0A%0A%20%20%20%20_plot_bar%20%3D%20_result.collect().plot.bar(%0A%20%20%20%20%20%20%20%20x%3D%22month%22%2C%0A%20%20%20%20%20%20%20%20y%3D%22cost_per_person%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20xOffset%3D%22weather_description%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20_plot_line%20%3D%20_result.collect().plot.line(%0A%20%20%20%20%20%20%20%20x%3D%22month%22%2C%0A%20%20%20%20%20%20%20%20y%3D%22num_trips%22%2C%0A%20%20%20%20%20%20%20%20color%3D%22weather_description%22%2C%0A%20%20%20%20)%0A%20%20%20%20%23%20Show%20the%20plots%20side%20by%20side%20(use%20%2B%20to%20layer%20on%20top%20of%20one%20another)%0A%20%20%20%20_plot%20%3D%20_plot_bar%20%7C%20_plot_line%0A%0A%20%20%20%20_accordion%20%3D%20mo.accordion(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Polars%20operations%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20result%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_combined.with_columns(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20month%3Dpl.col(%22tpep_pickup_datetime%22).dt.strftime(%22%25Y-%25m%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.group_by(%5B%22month%22%2C%20%22weather_description%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.agg(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20num_trips%3Dpl.len()%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%20cost_per_person%3Dpl.col(%22total_amount%22).sum()%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%2F%20pl.col(%22passenger_count%22).sum()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.filter(pl.col(%22num_trips%22)%20%3E%20100)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Filter%20based%20on%20our%20selection%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Joins%20are%20highly%20optimized%20and%20can%20be%20faster%20than%20.is_in()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.join(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pl.LazyFrame(%7B%22weather_description%22%3A%20weather_selection.value%7D)%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%20on%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.sort(by%3D%5B%22month%22%2C%20%22weather_description%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%22Let's%20check%20the%20query%20plan%20(**%60result.explain()%60**)%22%3A%20mo.plain_text(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_result.explain()%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%22Now%2C%20we'll%20visualize%20this%20with%20an%20interactive%20plot%22%3A%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60python%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_bar%20%3D%20result.collect().plot.bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3D%22month%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3D%22cost_per_person%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20xOffset%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot_line%20%3D%20result.collect().plot.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3D%22month%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3D%22num_trips%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22weather_description%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Show%20the%20plots%20side%20by%20side%20(use%20%2B%20to%20layer%20on%20top%20of%20one%20another)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20plot%20%3D%20plot_bar%20%7C%20plot_line%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%22%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%0A%20%20%20%20mo.vstack(%5B_md%2C%20_accordion%2C%20_plot%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Keep%20exploring!%0A%20%20%20%20%20%20%20%20Polars%20has%20many%20additional%20powerful%20features.%20Try%20exploring%20with%20some%20of%20them%20through%20this%20dataset%20and%20what%20you%20find%20on%20Polars'%20%5BUser%20Guide%5D(https%3A%2F%2Fdocs.pola.rs%2F)%20and%20%5BAPI%20reference%5D(https%3A%2F%2Fdocs.pola.rs%2Fapi%2Fpython%2Fstable%2Freference%2Findex.html).%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20__()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
2d6b7e4cdcc120bdd049db3ef3b61d1482f01defe921d6f4bb3599be0818104c