import%20marimo%0A%0A__generated_with%20%3D%20%220.13.7%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%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%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Eager%20vs%20Lazy%20DataFrames%3A%20One%20Fix%20to%20Make%20Your%20Code%20Work%20Anywhere%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Motivation%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20datetime%20import%20datetime%0A%20%20%20%20import%20pandas%20as%20pd%20%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20data1%20%3D%20%7B%22store%22%3A%20%5B1%2C%201%2C%202%5D%2C%20%22date_id%22%3A%20%5B4%2C%205%2C%206%5D%7D%0A%20%20%20%20data2%20%3D%20%7B%22store%22%3A%20%5B1%2C%202%5D%2C%20%22sales%22%3A%20%5B7%2C%208%5D%7D%0A%0A%20%20%20%20pandas_df1%20%3D%20pd.DataFrame(data1)%0A%20%20%20%20pandas_df2%20%3D%20pd.DataFrame(data2)%0A%0A%20%20%20%20%23%20The%20outputs%20are%20%20the%20same%0A%20%20%20%20for%20_%20in%20range(5)%3A%0A%20%20%20%20%20%20%20%20%23%20Left%20join%0A%20%20%20%20%20%20%20%20pandas_df%20%3D%20pd.merge(pandas_df1%2C%20pandas_df2%2C%20on%3D%22store%22%2C%20how%3D%22left%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Cumulative%20sum%20of%20sales%20within%20each%20store%0A%20%20%20%20%20%20%20%20pandas_df%5B%22cumulative_sales%22%5D%20%3D%20pandas_df.groupby(%22store%22)%5B%22sales%22%5D.cumsum()%0A%0A%20%20%20%20%20%20%20%20print(pandas_df)%0A%20%20%20%20return%20data1%2C%20data2%2C%20datetime%2C%20pd%2C%20pl%0A%0A%0A%40app.cell%0Adef%20_(data1%2C%20data2%2C%20pl)%3A%0A%20%20%20%20polars_df1%20%3D%20pl.DataFrame(data1).lazy()%0A%20%20%20%20polars_df2%20%3D%20pl.DataFrame(data2).lazy()%0A%0A%20%20%20%20%23%20The%20outputs%20are%20not%20the%20same%0A%20%20%20%20for%20_%20in%20range(5)%3A%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20polars_df1.join(polars_df2%2C%20on%3D%22store%22%2C%20how%3D%22left%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.with_columns(cumulative_sales%3Dpl.col(%22sales%22).cum_sum().over(%22store%22))%0A%20%20%20%20%20%20%20%20%20%20%20%20.collect(engine%3D%22streaming%22)%0A%20%20%20%20%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.md(r%22%22%22%23%23%20Eager-only%20solution%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(datetime%2C%20pd)%3A%0A%20%20%20%20data%20%3D%20%7B%0A%20%20%20%20%09%22sale_date%22%3A%20%5B%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2022)%2C%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2023)%2C%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2024)%2C%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2022)%2C%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2023)%2C%0A%20%20%20%20%09%09datetime(2025%2C%205%2C%2024)%2C%0A%20%20%20%20%09%5D%2C%0A%20%20%20%20%09%22store%22%3A%20%5B%0A%20%20%20%20%09%09%22Thimphu%22%2C%0A%20%20%20%20%09%09%22Thimphu%22%2C%0A%20%20%20%20%09%09%22Thimphu%22%2C%0A%20%20%20%20%09%09%22Paro%22%2C%0A%20%20%20%20%09%09%22Paro%22%2C%0A%20%20%20%20%09%09%22Paro%22%2C%0A%20%20%20%20%09%5D%2C%0A%20%20%20%20%09%22sales%22%3A%20%5B1100%2C%20None%2C%201450%2C%20501%2C%20500%2C%20None%5D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20pdf%20%3D%20pd.DataFrame(data)%0A%20%20%20%20print(pdf)%0A%20%20%20%20return%20(data%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20narwhals%20as%20nw%0A%20%20%20%20from%20narwhals.typing%20import%20IntoFrameT%0A%0A%0A%20%20%20%20def%20agnostic_ffill_by_store(df_native%3A%20IntoFrameT)%20-%3E%20IntoFrameT%3A%0A%20%20%20%20%09%23%20Supports%20pandas%20and%20Polars.DataFrame%2C%20but%20not%20lazy%20ones.%0A%20%20%20%20%09return%20(%0A%20%20%20%20%09%09nw.from_native(df_native)%0A%20%20%20%20%09%09.with_columns(%0A%20%20%20%20%09%09%09nw.col(%22sales%22).fill_null(strategy%3D%22forward%22).over(%22store%22)%0A%20%20%20%20%09%09)%0A%20%20%20%20%09%09.to_native()%0A%20%20%20%20%09)%0A%20%20%20%20return%20IntoFrameT%2C%20agnostic_ffill_by_store%2C%20nw%0A%0A%0A%40app.cell%0Adef%20_(agnostic_ffill_by_store%2C%20data%2C%20pd)%3A%0A%20%20%20%20%23%20pandas.DataFrame%0A%20%20%20%20df_pandas%20%3D%20pd.DataFrame(data)%0A%20%20%20%20agnostic_ffill_by_store(df_pandas)%0A%20%20%20%20return%20(df_pandas%2C)%0A%0A%0A%40app.cell%0Adef%20_(agnostic_ffill_by_store%2C%20data%2C%20pl)%3A%0A%20%20%20%20%23%20polars.DataFrame%0A%20%20%20%20df_polars%20%3D%20pl.DataFrame(data)%0A%20%20%20%20agnostic_ffill_by_store(df_polars)%0A%20%20%20%20return%20(df_polars%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20duckdb%0A%0A%20%20%20%20duckdb_rel%20%3D%20duckdb.table(%22df_polars%22)%0A%20%20%20%20duckdb_rel%0A%20%20%20%20return%20(duckdb_rel%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20agnostic_ffill_by_store(duckdb_rel)%0A%20%20%20%20%23%20Error%3A%20narwhals.exceptions.OrderDependentExprError%3A%20Order-dependent%20expressions%20are%20not%20supported%20for%20use%20in%20LazyFrame.%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Eager%20and%20lazy%20solution%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(IntoFrameT%2C%20nw)%3A%0A%20%20%20%20def%20agnostic_ffill_by_store_improved(df_native%3A%20IntoFrameT)%20-%3E%20IntoFrameT%3A%0A%20%20%20%20%09return%20(%0A%20%20%20%20%09%09nw.from_native(df_native)%0A%20%20%20%20%09%09.with_columns(%0A%20%20%20%20%09%09%09nw.col(%22sales%22)%0A%20%20%20%20%09%09%09.fill_null(strategy%3D%22forward%22)%0A%20%20%20%20%09%09%09%23%20Note%20the%20%60order_by%60%20statement%0A%20%20%20%20%09%09%09.over(%22store%22%2C%20order_by%3D%22sale_date%22)%0A%20%20%20%20%09%09)%0A%20%20%20%20%09%09.to_native()%0A%20%20%20%20%09)%0A%20%20%20%20return%20(agnostic_ffill_by_store_improved%2C)%0A%0A%0A%40app.cell%0Adef%20_(agnostic_ffill_by_store_improved%2C%20duckdb_rel)%3A%0A%20%20%20%20agnostic_ffill_by_store_improved(duckdb_rel)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(agnostic_ffill_by_store_improved%2C%20df_polars)%3A%0A%20%20%20%20agnostic_ffill_by_store_improved(df_polars.lazy()).collect()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(agnostic_ffill_by_store_improved%2C%20df_pandas)%3A%0A%20%20%20%20%23%20Note%20that%20it%20still%20supports%20pandas%0A%20%20%20%20print(agnostic_ffill_by_store_improved(df_pandas))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%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
47ff29f469f236e9874487ccfb4a8ac868121e11b11009ebc9762f1560081151