import%20marimo%0A%0A__generated_with%20%3D%20%220.17.0%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup(hide_code%3DTrue)%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20narwhals%20as%20nw%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20import%20framelib%20as%20fl%0A%0A%0A%20%20%20%20class%20Sales(fl.Schema)%3A%0A%20%20%20%20%20%20%20%20transaction_id%20%3D%20fl.UInt32(primary_key%3DTrue)%0A%20%20%20%20%20%20%20%20customer_id%20%3D%20fl.UInt16()%0A%20%20%20%20%20%20%20%20amount%20%3D%20fl.Float32()%0A%0A%0A%20%20%20%20class%20Analytics(fl.DataBase)%3A%0A%20%20%20%20%20%20%20%20sales%20%3D%20fl.Table(Sales)%0A%0A%0A%20%20%20%20class%20MyProject(fl.Folder)%3A%0A%20%20%20%20%20%20%20%20raw_sales%20%3D%20fl.CSV(model%3DSales)%0A%20%20%20%20%20%20%20%20analytics_db%20%3D%20Analytics()%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Declare%20Your%20Data%20Architecture%0A%0A%20%20%20%20Root%20folder%20for%20the%20project%20automatically%20set%20to%20**Path(%22myproject%22)**%0A%0A%20%20%20%20%60%60%60python%0A%20%20%20%20import%20framelib%20as%20fl%0A%0A%20%20%20%20class%20Sales(fl.Schema)%3A%0A%20%20%20%20%20%20%20%20%23Schema%20for%20the%20sales.%0A%0A%20%20%20%20%20%20%20%20transaction_id%20%3D%20fl.UInt32(primary_key%3DTrue)%0A%20%20%20%20%20%20%20%20customer_id%20%3D%20fl.UInt16()%0A%20%20%20%20%20%20%20%20amount%20%3D%20fl.Float32()%0A%0A%0A%20%20%20%20class%20Analytics(fl.DataBase)%3A%0A%20%20%20%20%20%20%20%20%23Embedded%20DuckDB%20database%20for%20analytics.%20Contain%20a%20sales%20table.%0A%0A%20%20%20%20%20%20%20%20sales%20%3D%20fl.Table(Sales)%0A%0A%0A%20%20%20%20class%20MyProject(fl.Folder)%3A%0A%20%20%20%20%20%20%20%20%23%23%20Files%20are%20defined%20as%20attributes%0A%20%20%20%20%20%20%20%20raw_sales%20%3D%20fl.CSV(model%3DSales)%20%20%23%20Located%20at%20'myproject%2Fraw_sales.csv'%0A%0A%20%20%20%20%20%20%20%20%23%23%20Instantiate%20the%20embedded%20database%0A%20%20%20%20%20%20%20%20analytics_db%20%3D%20Analytics()%20%20%23%20Located%20at%20'myproject%2Fanalytics_db.ddb'%0A%20%20%20%20%60%60%60%0A%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_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Create%20the%20structure%20on%20disk%0A%0A%20%20%20%20Call%20the%20source()%20method%20to%20directly%20interact%20with%20the%20underlying%20path%0A%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%20MyProject.source().mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20MyProject.source().as_posix()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Create%20mock%20sales%20data%0A%0A%20%20%20%20Write%20data%20to%20the%20CSV%2C%20automatically%20passing%20the%20path%20argument.%0A%0A%20%20%20%20Since%20write%2Fread%2Fscan%20properties%20returns%20partials%2C%20pass%20any%20native%20polars%20argument%20with%20IDE%20support%20for%20documentation%20and%20argument%20validity.%0A%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%20mock_sales_data%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%22transaction_id%22%3A%20%5B101%2C%20102%2C%20103%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22customer_id%22%3A%20%5B1%2C%202%2C%201%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22amount%22%3A%20%5B120.50%2C%2075.00%2C%2050.25%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20MyProject.raw_sales.write(mock_sales_data%2C%20retries%3D2)%0A%20%20%20%20MyProject.raw_sales.read()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Load%20data%20into%20the%20DuckDB%20database%20and%20generate%20a%20report%0A%0A%20%20%20%20Query%20the%20data%20directly%20from%20the%20database%20using%20the%20Narwhals%20API.%0A%0A%20%20%20%20You%20can%20then%20easily%20convert%20it%20to%20polars%20for%20example.%0A%0A%20%20%20%20%F0%9F%93%8A%20Generated%20Report%3A%0A%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%20def%20get_report(db%3A%20Analytics)%20-%3E%20pl.DataFrame%3A%0A%20%20%20%20%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20db.sales.create_or_replace_from(MyProject.raw_sales.scan_cast())%0A%20%20%20%20%20%20%20%20%20%20%20%20.scan()%0A%20%20%20%20%20%20%20%20%20%20%20%20.group_by(%22customer_id%22)%0A%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%20total_spent%3Dnw.col(%22amount%22).sum()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transaction_count%3Dnw.len()%2C%0A%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.to_native()%0A%20%20%20%20%20%20%20%20%20%20%20%20.pl()%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%20%20%20%20MyProject.analytics_db.apply(get_report)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Read%20and%20cast%20data%0A%0A%20%20%20%20Reading%20the%20data%20directly%20from%20the%20database%20will%20give%20you%20this%20schema%3A%0A%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%20MyProject.raw_sales.read().schema%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22Once%20casted%20to%20the%20defined%20schema%3A%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20MyProject.raw_sales.read_cast().schema%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Show%20the%20project%20structure%0A%0A%0A%20%20%20%20the%20Reports%20folder%20here%20inerhit%20from%20ProductionData.%0A%0A%20%20%20%20No%20schema%20defined%20in%20the%20files%2C%20so%20they%20default%20to%20framelib.Schema.%0A%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%20class%20ProductionData(fl.Folder)%3A%0A%20%20%20%20%20%20%20%20sales%20%3D%20fl.CSV(model%3DSales)%0A%0A%0A%20%20%20%20class%20Reports(ProductionData)%3A%0A%20%20%20%20%20%20%20%20sales%20%3D%20fl.CSV()%0A%20%20%20%20%20%20%20%20sales_formatted%20%3D%20fl.Parquet()%0A%0A%0A%20%20%20%20print(%22%5Cn%F0%9F%93%81%20Inheritance%20Example%3A%5Cn%22)%0A%20%20%20%20print(ProductionData.sales.source)%0A%20%20%20%20print(Reports.sales.source)%0A%20%20%20%20print(Reports.sales_formatted.source)%0A%20%20%20%20print(%22%5Cn%F0%9F%93%82%20Project%20Structure%3A%5Cn%22)%0A%20%20%20%20print(Reports.show_tree())%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%23%23%20Append%20data%20and%20perform%20various%20database%20operations%0A%0A%20%20%20%20High-level%20methods%20simplify%20common%20database%20operations%0A%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%20new_sales%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%22transaction_id%22%3A%20%5B104%2C%20105%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22customer_id%22%3A%20%5B3%2C%202%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22amount%22%3A%20%5B200.00%2C%20150.75%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%0A%0A%20%20%20%20def%20database_op(dba%3A%20Analytics)%3A%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%A6%20Sales%20Data%20in%20DB%20before%20insert_into%3A%22)%0A%20%20%20%20%20%20%20%20print(dba.sales.scan().to_native())%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%A6%20Sales%20Data%20in%20DB%20after%20insert_into%3A%22)%0A%20%20%20%20%20%20%20%20print(dba.sales.insert_into(new_sales).scan().to_native())%0A%20%20%20%20%20%20%20%20%23%23%20Intelligently%20insert%20rows%2C%20skipping%20duplicates%20based%20on%20the%20primary%20key%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%A6%20Sales%20Data%20in%20DB%20after%20insert_or_ignore%20(no%20duplicates)%3A%22)%0A%20%20%20%20%20%20%20%20print(dba.sales.insert_or_ignore(new_sales).scan().to_native())%0A%20%20%20%20%20%20%20%20print(%22%5Cn%F0%9F%93%A6%20Sales%20Data%20in%20DB%20after%20truncate%3A%22)%0A%20%20%20%20%20%20%20%20print(dba.sales.truncate().scan().to_native())%0A%0A%0A%20%20%20%20MyProject.analytics_db.apply(database_op).close()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%23%20Clean%20up%20the%20project%20structure%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20MyProject.clean()%0A%20%20%20%20print(%22%5Cn%E2%9C%85%20Project%20structure%20cleaned%20up.%22)%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20MyProject.raw_sales.read()%0A%20%20%20%20except%20FileNotFoundError%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20Confirmed%3A%20Raw%20sales%20file%20no%20longer%20exists.%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
6fb6ad34e5c84d93fadc6195de4a4efde6e0ead9e14e44fca7e3d613c37e72f8