%22%22%22%0ANYC%20Taxi%20Marimo%20-%20Notebook%2002%3A%20Data%20Loading%20%26%20Schema%20Discovery%0A%0AThis%20notebook%20uses%20DuckDB%20to%20query%20parquet%20and%20setup%20efficient%20data%20loading%20patterns%20for%20later.%0A%0ARun%3A%20%60uv%20run%20marimo%20edit%20notebooks%2F02_data_loading.py%60%0A%0ASources%3A%0A%20%20%20%20-%20Yellow%3A%20https%3A%2F%2Fd37ci6vzurychx.cloudfront.net%2Ftrip-data%2Fyellow_tripdata_2025-01.parquet%0A%20%20%20%20-%20Green%3A%20https%3A%2F%2Fd37ci6vzurychx.cloudfront.net%2Ftrip-data%2Fgreen_tripdata_2025-01.parquet%0A%20%20%20%20-%20FHV%3A%20https%3A%2F%2Fd37ci6vzurychx.cloudfront.net%2Ftrip-data%2Ffhv_tripdata_2025-01.parquet%0A%20%20%20%20-%20FHVHV%3A%20https%3A%2F%2Fd37ci6vzurychx.cloudfront.net%2Ftrip-data%2Ffhvhv_tripdata_2025-01.parquet%0A%0ADocumentation%3A%0A%20%20%20%20-%20DuckDB%20Parquet%3A%20https%3A%2F%2Fduckdb.org%2Fdocs%2Fdata%2Fparquet%2Foverview%0A%20%20%20%20-%20Marimo%20%2B%20DuckDB%3A%20https%3A%2F%2Fdocs.marimo.io%2Fguides%2Fworking_with_data%2Fsql%2F%0A%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%20import%20duckdb%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20return%20duckdb%2C%20mo%2C%20pl%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20utils.data_urls%20import%20BASE_URL%2C%20TRIP_TYPES%2C%20build_trip_url%0A%0A%20%20%20%20URLS%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22yellow%22%3A%20build_trip_url(%22yellow%22%2C%202025%2C%201)%2C%0A%20%20%20%20%20%20%20%20%22green%22%3A%20build_trip_url(%22green%22%2C%202025%2C%201)%2C%0A%20%20%20%20%20%20%20%20%22fhv%22%3A%20build_trip_url(%22fhv%22%2C%202025%2C%201)%2C%0A%20%20%20%20%20%20%20%20%22fhvhv%22%3A%20build_trip_url(%22fhvhv%22%2C%202025%2C%201)%2C%0A%20%20%20%20%7D%0A%20%20%20%20return%20BASE_URL%2C%20TRIP_TYPES%2C%20URLS%0A%0A%0A%40app.cell%0Adef%20_(duckdb)%3A%0A%20%20%20%20conn%20%3D%20duckdb.connect()%0A%20%20%20%20return%20(conn%2C)%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20yellow_schema%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20DESCRIBE%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Yellow%20Taxi%20Schema%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20yellow_schema%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(yellow_schema%2C)%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20green_schema%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20DESCRIBE%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22green%22%5D%7D')%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Green%20Taxi%20Schema%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Note%3A%20%60lpep_pickup_datetime%60%20vs%20yellow's%20%60tpep_pickup_datetime%60*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20green_schema%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(green_schema%2C)%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20fhv_schema%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20DESCRIBE%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22fhv%22%5D%7D')%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20FHV%20Schema%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Note%3A%20No%20fare%20fields%20-%20FHV%20bases%20don't%20report%20pricing*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fhv_schema%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(fhv_schema%2C)%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20hvfhs_schema%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20DESCRIBE%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22fhvhv%22%5D%7D')%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20HVFHS%20Schema%20(Uber%2C%20Lyft%2C%20Via)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22%22%22%0A%20%20%20%20%20%20%20%20Key%20fields%3A%0A%20%20%20%20%20%20%20%20-%20%60hvfhs_license_num%60%3A%20HV0003%3DUber%2C%20HV0005%3DLyft%2C%20HV0004%3DVia%0A%20%20%20%20%20%20%20%20-%20%60base_passenger_fare%60%2C%20%60tips%60%2C%20%60driver_pay%60%3A%20Detailed%20pricing%0A%20%20%20%20%20%20%20%20-%20%60shared_request_flag%60%2C%20%60shared_match_flag%60%3A%20Pool%20rides%0A%20%20%20%20%20%20%20%20-%20%60cbd_congestion_fee%60%3A%20Congestion%20pricing%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%20hvfhs_schema%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(hvfhs_schema%2C)%0A%0A%0A%40app.cell%0Adef%20_(fhv_schema%2C%20green_schema%2C%20hvfhs_schema%2C%20mo%2C%20pl%2C%20yellow_schema)%3A%0A%20%20%20%20yellow_cols%20%3D%20set(yellow_schema%5B%22column_name%22%5D.to_list())%0A%20%20%20%20green_cols%20%3D%20set(green_schema%5B%22column_name%22%5D.to_list())%0A%20%20%20%20fhv_cols%20%3D%20set(fhv_schema%5B%22column_name%22%5D.to_list())%0A%20%20%20%20hvfhs_cols%20%3D%20set(hvfhs_schema%5B%22column_name%22%5D.to_list())%0A%0A%20%20%20%20%23%20All%20unique%20columns%0A%20%20%20%20all_cols%20%3D%20sorted(yellow_cols%20%7C%20green_cols%20%7C%20fhv_cols%20%7C%20hvfhs_cols)%0A%0A%20%20%20%20%23%20Build%20comparison%0A%20%20%20%20comparison%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%22field%22%3A%20all_cols%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22yellow%22%3A%20%5B%22Y%22%20if%20c%20in%20yellow_cols%20else%20%22%22%20for%20c%20in%20all_cols%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22green%22%3A%20%5B%22Y%22%20if%20c%20in%20green_cols%20else%20%22%22%20for%20c%20in%20all_cols%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22fhv%22%3A%20%5B%22Y%22%20if%20c%20in%20fhv_cols%20else%20%22%22%20for%20c%20in%20all_cols%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22hvfhs%22%3A%20%5B%22Y%22%20if%20c%20in%20hvfhs_cols%20else%20%22%22%20for%20c%20in%20all_cols%5D%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%23%23%23%20Schema%20Comparison%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20comparison%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_(URLS%2C%20conn%2C%20mo%2C%20pl)%3A%0A%20%20%20%20counts%20%3D%20%7B%7D%0A%20%20%20%20for%20trip_type%2C%20url%20in%20URLS.items()%3A%0A%20%20%20%20%20%20%20%20result%20%3D%20conn.execute(f%22SELECT%20COUNT(*)%20as%20cnt%20FROM%20read_parquet('%7Burl%7D')%22).fetchone()%0A%20%20%20%20%20%20%20%20counts%5Btrip_type%5D%20%3D%20result%5B0%5D%0A%0A%20%20%20%20counts_df%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%22trip_type%22%3A%20list(counts.keys())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22record_count%22%3A%20list(counts.values())%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%23%23%23%20Record%20Counts%20(January%202025)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20counts_df%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_(URLS%2C%20conn)%3A%0A%20%20%20%20yellow_sample%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%20LIMIT%201000%0A%20%20%20%20%22%22%22).pl()%0A%0A%20%20%20%20yellow_sample%0A%20%20%20%20return%20(yellow_sample%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20yellow_sample)%3A%0A%20%20%20%20min_pickup%20%3D%20yellow_sample%5B%22tpep_pickup_datetime%22%5D.min()%0A%20%20%20%20max_pickup%20%3D%20yellow_sample%5B%22tpep_pickup_datetime%22%5D.max()%0A%20%20%20%20null_count%20%3D%20yellow_sample%5B%22tpep_pickup_datetime%22%5D.null_count()%0A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%23%20Date%20Range%20Check%0A%0A%20%20%20%20-%20**Earliest%20pickup**%3A%20%7Bmin_pickup%7D%0A%20%20%20%20-%20**Latest%20pickup**%3A%20%7Bmax_pickup%7D%0A%20%20%20%20-%20**Null%20timestamps**%3A%20%7Bnull_count%7D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20cbd_distribution%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20cbd_congestion_fee%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20trips%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ROUND(100.0%20*%20COUNT(*)%20%2F%20SUM(COUNT(*))%20OVER%20()%2C%202)%20as%20pct%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20GROUP%20BY%20cbd_congestion_fee%0A%20%20%20%20%20%20%20%20ORDER%20BY%20trips%20DESC%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20CBD%20Congestion%20Fee%20Distribution%20(Yellow%20Taxi)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*NULL%20%3D%20no%20fee%20recorded%2C%200%20%3D%20explicit%20%240%20fee%2C%20%3E0%20%3D%20actual%20fee*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cbd_distribution%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_(URLS%2C%20conn%2C%20mo%2C%20pl)%3A%0A%20%20%20%20%23%20Yellow%0A%20%20%20%20yellow_cbd%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20'yellow'%20as%20type%2C%20cbd_congestion_fee%2C%20COUNT(*)%20as%20trips%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20WHERE%20cbd_congestion_fee%20IS%20NOT%20NULL%20AND%20cbd_congestion_fee%20%3E%200%0A%20%20%20%20%20%20%20%20GROUP%20BY%20cbd_congestion_fee%0A%20%20%20%20%22%22%22).pl()%0A%0A%20%20%20%20%23%20HVFHS%0A%20%20%20%20hvfhs_cbd%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20'hvfhs'%20as%20type%2C%20cbd_congestion_fee%2C%20COUNT(*)%20as%20trips%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22fhvhv%22%5D%7D')%0A%20%20%20%20%20%20%20%20WHERE%20cbd_congestion_fee%20IS%20NOT%20NULL%20AND%20cbd_congestion_fee%20%3E%200%0A%20%20%20%20%20%20%20%20GROUP%20BY%20cbd_congestion_fee%0A%20%20%20%20%22%22%22).pl()%0A%0A%20%20%20%20combined_cbd%20%3D%20pl.concat(%5Byellow_cbd%2C%20hvfhs_cbd%5D)%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%23%23%23%20Congestion%20Fees%20by%20Trip%20Type%20(non-zero%20only)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Yellow%2FGreen%3A%20%240.75%2C%20HVFHS%3A%20%241.50*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20combined_cbd%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%20data_selectors%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%22%2C%20%22green%22%2C%20%22fhv%22%2C%20%22fhvhv%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3D%22yellow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Trip%20type%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%20%22year%22%3A%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3D%5B%222024%22%2C%20%222025%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3D%222025%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Year%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%20%22month%22%3A%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options%3D%5Bstr(m)%20for%20m%20in%20range(1%2C%2013)%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3D%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Month%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%20%22sample_size%22%3A%20mo.ui.slider(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20start%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20stop%3D5000%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20step%3D100%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20value%3D1000%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22Sample%20size%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%7D%0A%20%20%20%20)%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%20data_selectors%5B%22trip_type%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20data_selectors%5B%22year%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20data_selectors%5B%22month%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20data_selectors%5B%22sample_size%22%5D%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%20(data_selectors%2C)%0A%0A%0A%40app.cell%0Adef%20_(BASE_URL%2C%20TRIP_TYPES%2C%20data_selectors%2C%20mo)%3A%0A%20%20%20%20_trip_type%20%3D%20data_selectors.value%5B%22trip_type%22%5D%0A%20%20%20%20_year%20%3D%20data_selectors.value%5B%22year%22%5D%0A%20%20%20%20_month%20%3D%20data_selectors.value%5B%22month%22%5D.zfill(2)%0A%0A%20%20%20%20%23%20Global%20so%20downstream%20cells%20can%20use%20it%0A%20%20%20%20dynamic_url%20%3D%20f%22%7BBASE_URL%7D%2F%7BTRIP_TYPES%5B_trip_type%5D%7D_%7B_year%7D-%7B_month%7D.parquet%22%0A%0A%20%20%20%20mo.md(f%22**URL**%3A%20%60%7Bdynamic_url%7D%60%22)%0A%20%20%20%20return%20(dynamic_url%2C)%0A%0A%0A%40app.cell%0Adef%20_(conn%2C%20dynamic_url%2C%20mo)%3A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20_schema%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20DESCRIBE%20SELECT%20*%20FROM%20read_parquet('%7Bdynamic_url%7D')%0A%20%20%20%20%20%20%20%20%22%22%22).pl()%0A%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%20mo.md(f%22%23%23%23%20Schema%20(%7Blen(_schema)%7D%20columns)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_schema%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%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20output%20%3D%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22**Error%20loading%20data**%3A%20%7Bstr(e)%5B%3A200%5D%7D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22danger%22%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20output%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(conn%2C%20data_selectors%2C%20dynamic_url%2C%20mo)%3A%0A%20%20%20%20_sample_size%20%3D%20data_selectors.value%5B%22sample_size%22%5D%0A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20_sample%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20SELECT%20*%20FROM%20read_parquet('%7Bdynamic_url%7D')%20LIMIT%20%7B_sample_size%7D%0A%20%20%20%20%20%20%20%20%22%22%22).pl()%0A%0A%20%20%20%20%20%20%20%20output_sample%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%20mo.md(f%22%23%23%23%20Sample%20Data%20(%7Blen(_sample)%7D%20rows%2C%20%7Blen(_sample.columns)%7D%20columns)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_sample%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%20except%20Exception%20as%20e%3A%0A%20%20%20%20%20%20%20%20output_sample%20%3D%20mo.callout(%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22**Error%20loading%20sample**%3A%20%7Bstr(e)%5B%3A200%5D%7D%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22danger%22%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20output_sample%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20import%20time%20as%20_time%0A%0A%20%20%20%20%23%20Full%20load%0A%20%20%20%20_start%20%3D%20_time.time()%0A%20%20%20%20_full%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20*%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%20LIMIT%2010000%0A%20%20%20%20%22%22%22).pl()%0A%20%20%20%20_full_time%20%3D%20_time.time()%20-%20_start%0A%0A%20%20%20%20%23%20Pruned%20load%0A%20%20%20%20_start%20%3D%20_time.time()%0A%20%20%20%20_pruned%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20tpep_pickup_datetime%2C%20PULocationID%2C%20fare_amount%2C%20cbd_congestion_fee%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%20LIMIT%2010000%0A%20%20%20%20%22%22%22).pl()%0A%20%20%20%20_pruned_time%20%3D%20_time.time()%20-%20_start%0A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%23%20Column%20Pruning%20(Projection%20Pushdown)%20Performance%0A%0A%20%20%20%20%7C%20Load%20Type%20%7C%20Columns%20%7C%20Time%20%7C%0A%20%20%20%20%7C-----------%7C---------%7C------%7C%0A%20%20%20%20%7C%20Full%20(SELECT%20*)%20%7C%20%7Blen(_full.columns)%7D%20%7C%20%7B_full_time%3A.3f%7Ds%20%7C%0A%20%20%20%20%7C%20Pruned%20(4%20cols)%20%7C%20%7Blen(_pruned.columns)%7D%20%7C%20%7B_pruned_time%3A.3f%7Ds%20%7C%0A%0A%20%20%20%20*Select%20only%20the%20columns%20you%20need.*%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20%23%20Filter%20for%20trips%20after%20congestion%20pricing%20started%20(Predicate%20pushdown%20-%20filter%20at%20source)%0A%20%20%20%20post_congestion_sample%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20tpep_pickup_datetime%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20PULocationID%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fare_amount%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cbd_congestion_fee%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20WHERE%20tpep_pickup_datetime%20%3E%3D%20'2025-01-05'%0A%20%20%20%20%20%20%20%20LIMIT%201000%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Filtered%20Data%20(Predicate%20pushdown)%20-%20Post%20Congestion%20Pricing%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22*%7Blen(post_congestion_sample)%7D%20rows%20where%20pickup%20%3E%3D%20Jan%205%2C%202025*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20post_congestion_sample%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_(BASE_URL%2C%20conn%2C%20mo)%3A%0A%20%20%20%20%23%20Build%20URLs%20for%20Q4%202024%0A%20%20%20%20_q4_urls%20%3D%20%5Bf%22%7BBASE_URL%7D%2Fyellow_tripdata_2024-%7Bstr(m).zfill(2)%7D.parquet%22%20for%20m%20in%20%5B10%2C%2011%2C%2012%5D%5D%0A%0A%20%20%20%20%23%20Query%20across%20all%20three%20months%0A%20%20%20%20q4_sample%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20tpep_pickup_datetime%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fare_amount%0A%20%20%20%20%20%20%20%20FROM%20read_parquet(%7B_q4_urls%7D)%0A%20%20%20%20%20%20%20%20LIMIT%201000%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Multi-Month%20Loading%20(Q4%202024)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22*Loaded%20from%203%20files%3A%20Oct%2C%20Nov%2C%20Dec%202024*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20q4_sample%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_(BASE_URL%2C%20TRIP_TYPES%2C%20duckdb%2C%20pl)%3A%0A%20%20%20%20def%20load_trip_data(%0A%20%20%20%20%20%20%20%20trip_type%3A%20str%2C%0A%20%20%20%20%20%20%20%20year%3A%20int%2C%0A%20%20%20%20%20%20%20%20month%3A%20int%2C%0A%20%20%20%20%20%20%20%20columns%3A%20list%5Bstr%5D%20%7C%20None%20%3D%20None%2C%0A%20%20%20%20%20%20%20%20sample_size%3A%20int%20%7C%20None%20%3D%20None%2C%0A%20%20%20%20%20%20%20%20where_clause%3A%20str%20%7C%20None%20%3D%20None%2C%0A%20%20%20%20)%20-%3E%20pl.DataFrame%3A%0A%20%20%20%20%20%20%20%20url%20%3D%20f%22%7BBASE_URL%7D%2F%7BTRIP_TYPES%5Btrip_type%5D%7D_%7Byear%7D-%7Bstr(month).zfill(2)%7D.parquet%22%0A%0A%20%20%20%20%20%20%20%20select_clause%20%3D%20%22%2C%20%22.join(columns)%20if%20columns%20else%20%22*%22%0A%20%20%20%20%20%20%20%20query%20%3D%20f%22SELECT%20%7Bselect_clause%7D%20FROM%20read_parquet('%7Burl%7D')%22%0A%0A%20%20%20%20%20%20%20%20if%20where_clause%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20query%20%2B%3D%20f%22%20WHERE%20%7Bwhere_clause%7D%22%0A%0A%20%20%20%20%20%20%20%20if%20sample_size%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20query%20%2B%3D%20f%22%20LIMIT%20%7Bsample_size%7D%22%0A%0A%20%20%20%20%20%20%20%20%23%20Fresh%20connection%20to%20avoid%20state%20issues%0A%20%20%20%20%20%20%20%20_conn%20%3D%20duckdb.connect()%0A%20%20%20%20%20%20%20%20return%20_conn.execute(query).pl()%0A%20%20%20%20return%20(load_trip_data%2C)%0A%0A%0A%40app.cell%0Adef%20_(load_trip_data%2C%20mo)%3A%0A%20%20%20%20test_df%20%3D%20load_trip_data(%0A%20%20%20%20%20%20%20%20%22yellow%22%2C%0A%20%20%20%20%20%20%20%202025%2C%0A%20%20%20%20%20%20%20%201%2C%0A%20%20%20%20%20%20%20%20columns%3D%5B%22tpep_pickup_datetime%22%2C%20%22fare_amount%22%2C%20%22cbd_congestion_fee%22%5D%2C%0A%20%20%20%20%20%20%20%20sample_size%3D100%2C%0A%20%20%20%20%20%20%20%20where_clause%3D%22cbd_congestion_fee%20%3E%200%22%2C%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%23%23%23%20Test%3A%20load_trip_data()%20function%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22*%7Blen(test_df)%7D%20trips%20with%20CBD%20fee%20%3E%200*%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20test_df%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_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20null_check%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20total_rows%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20-%20COUNT(tpep_pickup_datetime)%20as%20null_pickup%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20-%20COUNT(tpep_dropoff_datetime)%20as%20null_dropoff%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20-%20COUNT(PULocationID)%20as%20null_pu_location%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20-%20COUNT(DOLocationID)%20as%20null_do_location%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20-%20COUNT(fare_amount)%20as%20null_fare%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Null%20Value%20Check%20(Yellow%20Taxi%20Jan%202025)%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20null_check%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_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20invalid_locations%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20'Pickup'%20as%20location_type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20invalid_count%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20WHERE%20PULocationID%20%3C%201%20OR%20PULocationID%20%3E%20265%0A%0A%20%20%20%20%20%20%20%20UNION%20ALL%0A%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20'Dropoff'%20as%20location_type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20invalid_count%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20WHERE%20DOLocationID%20%3C%201%20OR%20DOLocationID%20%3E%20265%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Invalid%20Location%20IDs%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20invalid_locations%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_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20duration_check%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20CASE%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20duration_mins%20%3C%200%20THEN%20'Negative'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20duration_mins%20%3C%201%20THEN%20'Under%201%20min'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20duration_mins%20%3E%201440%20THEN%20'Over%2024%20hours'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELSE%20'Valid'%0A%20%20%20%20%20%20%20%20%20%20%20%20END%20as%20duration_category%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20trip_count%0A%20%20%20%20%20%20%20%20FROM%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EXTRACT(EPOCH%20FROM%20(tpep_dropoff_datetime%20-%20tpep_pickup_datetime))%20%2F%2060%20as%20duration_mins%0A%20%20%20%20%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20GROUP%20BY%201%0A%20%20%20%20%20%20%20%20ORDER%20BY%20trip_count%20DESC%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Trip%20Duration%20Validity%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20duration_check%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_(URLS%2C%20conn%2C%20mo)%3A%0A%20%20%20%20fare_check%20%3D%20conn.execute(f%22%22%22%0A%20%20%20%20%20%20%20%20SELECT%20%0A%20%20%20%20%20%20%20%20%20%20%20%20CASE%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20fare_amount%20%3C%200%20THEN%20'Negative'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20fare_amount%20%3D%200%20THEN%20'Zero'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHEN%20fare_amount%20%3E%201000%20THEN%20'Over%20%241000'%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELSE%20'Valid'%0A%20%20%20%20%20%20%20%20%20%20%20%20END%20as%20fare_category%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20COUNT(*)%20as%20trip_count%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ROUND(AVG(fare_amount)%2C%202)%20as%20avg_fare%0A%20%20%20%20%20%20%20%20FROM%20read_parquet('%7BURLS%5B%22yellow%22%5D%7D')%0A%20%20%20%20%20%20%20%20GROUP%20BY%201%0A%20%20%20%20%20%20%20%20ORDER%20BY%20trip_count%20DESC%0A%20%20%20%20%22%22%22).pl()%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%23%23%23%20Fare%20Amount%20Sanity%20Check%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fare_check%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%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
88a9a184406c9bde8b531d7df54c41e7