import%20marimo%0A%0A__generated_with%20%3D%20%220.14.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20time%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20from%20slaf.integrations%20import%20scanpy%20as%20slaf_scanpy%0A%20%20%20%20from%20slaf.integrations.anndata%20import%20read_slaf%0A%0A%20%20%20%20return%20mo%2C%20read_slaf%2C%20slaf_scanpy%2C%20time%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%23%20SLAF%20Lazy%20Processing%20Deep%20Dive%0A%0A%20%20%20%20This%20notebook%20explores%20SLAF's%20lazy%20evaluation%20capabilities%20in%20detail.%20You'll%20learn%20how%20to%3A%0A%0A%20%20%20%20-%20Build%20complex%20analysis%20pipelines%20without%20loading%20data%0A%20%20%20%20-%20Apply%20multiple%20transformations%20efficiently%0A%20%20%20%20-%20Use%20different%20slicing%20patterns%0A%20%20%20%20-%20Control%20when%20computation%20happens%0A%20%20%20%20-%20Understand%20performance%20benefits%0A%0A%20%20%20%20**Key%20Concept**%3A%20Lazy%20evaluation%20means%20operations%20are%20stored%20as%20instructions%20and%20only%20executed%20when%20you%20explicitly%20request%20the%20results.%0A%0A%20%20%20%20**Key%20Benefits%3A**%0A%20%20%20%20-%20%F0%9F%9A%80%20**Instant%20Pipeline%20Building**%3A%20No%20waiting%20for%20data%20loading%0A%20%20%20%20-%20%F0%9F%92%BE%20**Memory%20Efficient**%3A%20Only%20load%20what%20you%20need%0A%20%20%20%20-%20%F0%9F%94%84%20**Composable**%3A%20Operations%20can%20be%20combined%20and%20preserved%0A%20%20%20%20-%20%E2%9A%A1%20**SQL%20Performance**%3A%20Leverage%20database-level%20optimizations%0A%20%20%20%20-%20%F0%9F%A7%AC%20**Scanpy%20Compatible**%3A%20Familiar%20interface%20with%20performance%20benefits%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_(read_slaf)%3A%0A%20%20%20%20%23%20Load%20data%20for%20lazy%20processing%20examples%0A%20%20%20%20adata%20%3D%20read_slaf(%22..%2Fslaf-datasets%2Fpbmc3k_processed.slaf%22)%0A%20%20%20%20print(f%22%E2%9C%85%20Loaded%20dataset%3A%20%7Badata.shape%5B0%5D%3A%2C%7D%20cells%20%C3%97%20%7Badata.shape%5B1%5D%3A%2C%7D%20genes%22)%0A%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(adata)%7D%22)%0A%20%20%20%20print(f%22%20%20%20Expression%20matrix%20type%3A%20%7Btype(adata.X)%7D%22)%0A%20%20%20%20return%20(adata%2C)%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%23%23%201.%20Understanding%20Lazy%20Objects%0A%0A%20%20%20%20SLAF%20provides%20two%20main%20lazy%20object%20types%3A%0A%0A%20%20%20%20-%20**LazyAnnData**%3A%20Lazy%20version%20of%20AnnData%20with%20scanpy%20compatibility%0A%0A%20%20%20%20-%20**LazyExpressionMatrix**%3A%20Lazy%20version%20of%20the%20expression%20matrix%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_(adata)%3A%0A%20%20%20%20%23%20Demonstrate%20lazy%20object%20types%0A%20%20%20%20print(%22%F0%9F%94%8D%20Lazy%20Object%20Types%22)%0A%20%20%20%20print(%22%3D%22%20*%2030)%0A%0A%20%20%20%20print(f%221.%20LazyAnnData%20type%3A%20%7Btype(adata)%7D%22)%0A%20%20%20%20print(f%22%20%20%20-%20Shape%3A%20%7Badata.shape%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20-%20Obs%20columns%3A%20%7Blist(adata.obs.columns)%20if%20hasattr(adata%2C%20'obs')%20and%20adata.obs%20is%20not%20None%20else%20'Not%20loaded'%7D%22%0A%20%20%20%20)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20-%20Var%20columns%3A%20%7Blist(adata.var.columns)%20if%20hasattr(adata%2C%20'var')%20and%20adata.var%20is%20not%20None%20else%20'Not%20loaded'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(f%22%5Cn2.%20LazyExpressionMatrix%20type%3A%20%7Btype(adata.X)%7D%22)%0A%20%20%20%20print(f%22%20%20%20-%20Shape%3A%20%7Badata.X.shape%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20-%20Parent%3A%20%7Btype(adata.X.parent_adata)%20if%20hasattr(adata.X%2C%20'parent_adata')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22%5Cn3.%20Key%20insight%3A%20These%20objects%20store%20operations%2C%20not%20data!%22)%0A%20%20%20%20print(%22%20%20%20-%20No%20data%20is%20loaded%20until%20you%20call%20.compute()%22)%0A%20%20%20%20print(%22%20%20%20-%20Operations%20are%20composed%20efficiently%22)%0A%20%20%20%20print(%22%20%20%20-%20Memory%20usage%20stays%20low%22)%0A%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%23%23%202.%20Explicit%20Computation%20Control%0A%0A%20%20%20%20You%20control%20when%20data%20is%20actually%20computed%20using%20these%20methods%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_(adata%2C%20time)%3A%0A%20%20%20%20def%20demonstrate_computation_control()%3A%0A%20%20%20%20%20%20%20%20%23%20Demonstrate%20explicit%20computation%20control%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%8E%9B%EF%B8%8F%20Explicit%20Computation%20Control%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20%20%20%20%20print(%22Available%20computation%20methods%3A%22)%0A%20%20%20%20%20%20%20%20print(%221.%20adata.compute()%20%E2%86%92%20native%20AnnData%20object%22)%0A%20%20%20%20%20%20%20%20print(%222.%20adata.X.compute()%20%E2%86%92%20scipy.sparse.csr_matrix%22)%0A%20%20%20%20%20%20%20%20print(%223.%20adata.obs%20%E2%86%92%20pandas.DataFrame%20(cell%20metadata)%22)%0A%20%20%20%20%20%20%20%20print(%224.%20adata.var%20%E2%86%92%20pandas.DataFrame%20(gene%20metadata)%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5CnLet's%20demonstrate%3A%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Compute%20just%20the%20expression%20matrix%0A%20%20%20%20%20%20%20%20print(%22%5Cn1.%20Computing%20expression%20matrix...%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20sparse_matrix%20%3D%20adata.X.compute()%0A%20%20%20%20%20%20%20%20compute_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Bcompute_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(sparse_matrix)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bsparse_matrix.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Memory%3A%20%7Bsparse_matrix.data.nbytes%20%2F%201024%20%2F%201024%3A.1f%7D%20MB%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Access%20cell%20metadata%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Accessing%20cell%20metadata...%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20obs_df%20%3D%20adata.obs%0A%20%20%20%20%20%20%20%20obs_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Accessed%20in%20%7Bobs_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(obs_df)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bobs_df.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20(sparse_matrix%2C%20obs_df)%0A%0A%20%20%20%20sparse_matrix%2C%20obs_df%20%3D%20demonstrate_computation_control()%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%23%23%203.%20Slicing%20Patterns%20-%20All%20the%20Ways%20to%20Slice%0A%0A%20%20%20%20SLAF%20supports%20multiple%20slicing%20patterns%2C%20all%20of%20which%20are%20lazy%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_(adata)%3A%0A%20%20%20%20%23%20Demonstrate%20different%20slicing%20patterns%0A%20%20%20%20def%20demonstrate_slicing_patterns(adata)%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%82%EF%B8%8F%20Slicing%20Patterns%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2025)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Basic%20integer%20slicing%3A%22)%0A%20%20%20%20%20%20%20%20slice1%20%3D%20adata%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20adata%5B%3A100%2C%20%3A50%5D%20%E2%86%92%20%7Btype(slice1)%7D%20with%20shape%20%7Bslice1.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Expression%20matrix%20slicing%3A%22)%0A%20%20%20%20%20%20%20%20slice2%20%3D%20adata.X%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20adata.X%5B%3A100%2C%20%3A50%5D%20%E2%86%92%20%7Btype(slice2)%7D%20with%20shape%20%7Bslice2.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Boolean%20indexing%20(after%20QC%20metrics%20are%20available)%3A%22)%0A%20%20%20%20%20%20%20%20%23%20First%20add%20some%20QC%20metrics%0A%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20hasattr(adata%2C%20%22obs%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20adata.obs%20is%20not%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20and%20%22n_genes_by_counts%22%20in%20adata.obs.columns%0A%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20high_quality_mask%20%3D%20adata.obs%5B%22n_genes_by_counts%22%5D%20%3E%201000%0A%20%20%20%20%20%20%20%20%20%20%20%20slice3%20%3D%20adata%5Bhigh_quality_mask%2C%20%3A%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20adata%5Bhigh_quality_mask%2C%20%3A%5D%20%E2%86%92%20%7Btype(slice3)%7D%20with%20shape%20%7Bslice3.shape%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%20%20%20(QC%20metrics%20not%20available%20yet%20-%20will%20be%20computed%20in%20preprocessing%20section)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn4.%20Mixed%20indexing%3A%22)%0A%20%20%20%20%20%20%20%20slice4%20%3D%20adata%5B%3A100%2C%20adata.var.index%5B%3A50%5D%5D%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20adata%5B%3A100%2C%20adata.var.index%5B%3A50%5D%5D%20%E2%86%92%20%7Btype(slice4)%7D%20with%20shape%20%7Bslice4.shape%7D%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5CnKey%20insight%3A%20All%20slicing%20returns%20lazy%20objects!%22)%0A%0A%20%20%20%20demonstrate_slicing_patterns(adata)%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%23%23%204.%20Transformation%20Patterns%0A%0A%20%20%20%20SLAF%20supports%20lazy%20transformations%20that%20are%20stored%20and%20applied%20when%20needed%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_(read_slaf)%3A%0A%20%20%20%20%23%20Load%20fresh%20data%20for%20transformation%20examples%0A%20%20%20%20adata_fresh%20%3D%20read_slaf(%22..%2Fslaf-datasets%2Fpbmc3k_processed.slaf%22)%0A%20%20%20%20print(%22%E2%9C%85%20Loaded%20fresh%20dataset%20for%20transformations%22)%0A%20%20%20%20return%20(adata_fresh%2C)%0A%0A%0A%40app.cell%0Adef%20_(adata_fresh%2C%20slaf_scanpy)%3A%0A%20%20%20%20%23%20Demonstrate%20transformation%20patterns%0A%20%20%20%20print(%22%F0%9F%94%84%20Transformation%20Patterns%22)%0A%20%20%20%20print(%22%3D%22%20*%2030)%0A%0A%20%20%20%20print(%221.%20Single%20transformation%3A%22)%0A%20%20%20%20adata_norm%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20adata_fresh%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20print(f%22%20%20%20normalize_total()%20%E2%86%92%20%7Btype(adata_norm)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%20stored%3A%20%7Blist(adata_norm._transformations.keys())%20if%20hasattr(adata_norm%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22%5Cn2.%20Chained%20transformations%3A%22)%0A%20%20%20%20adata_processed%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20adata_fresh%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20adata_processed%20%3D%20slaf_scanpy.pp.log1p(adata_processed%2C%20inplace%3DFalse)%0A%20%20%20%20print(f%22%20%20%20normalize_total().log1p()%20%E2%86%92%20%7Btype(adata_processed)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%20stored%3A%20%7Blist(adata_processed._transformations.keys())%20if%20hasattr(adata_processed%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22%5Cn3.%20Transformation%20on%20sliced%20data%3A%22)%0A%20%20%20%20%23%20First%20slice%2C%20then%20apply%20transformation%20(safer%20pattern)%0A%20%20%20%20slice_data%20%3D%20adata_fresh%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20slice_transformed%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20slice_data%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20print(f%22%20%20%20adata%5B%3A100%2C%20%3A50%5D.normalize_total()%20%E2%86%92%20%7Btype(slice_transformed)%7D%22)%0A%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bslice_transformed.shape%7D%22)%0A%0A%20%20%20%20print(%22%5Cn4.%20Multiple%20transformations%20on%20slice%3A%22)%0A%20%20%20%20%23%20First%20slice%2C%20then%20apply%20transformations%20(safer%20pattern)%0A%20%20%20%20slice_data%20%3D%20adata_fresh%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20slice_multi%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20slice_data%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20slice_multi%20%3D%20slaf_scanpy.pp.log1p(slice_multi%2C%20inplace%3DFalse)%0A%20%20%20%20print(f%22%20%20%20Multiple%20transformations%20on%20slice%20%E2%86%92%20%7Btype(slice_multi)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%3A%20%7Blist(slice_multi._transformations.keys())%20if%20hasattr(slice_multi%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20return%20adata_processed%2C%20slice_multi%2C%20slice_transformed%0A%0A%0A%40app.cell%0Adef%20_(adata_processed%2C%20slice_multi%2C%20slice_transformed%2C%20time)%3A%0A%20%20%20%20def%20demonstrate_transformation_application()%3A%0A%20%20%20%20%20%20%20%20%23%20Demonstrate%20transformation%20application%0A%20%20%20%20%20%20%20%20print(%22%E2%9A%A1%20Applying%20Transformations%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2030)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Computing%20transformed%20data%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20native_processed%20%3D%20adata_processed.compute()%0A%20%20%20%20%20%20%20%20process_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Bprocess_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(native_processed)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bnative_processed.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Computing%20transformed%20slice%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20native_slice_matrix%20%3D%20slice_transformed.X.compute()%0A%20%20%20%20%20%20%20%20slice_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Bslice_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(native_slice_matrix)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bnative_slice_matrix.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Computing%20multi-transformed%20slice%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20native_multi_matrix%20%3D%20slice_multi.X.compute()%0A%20%20%20%20%20%20%20%20multi_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Bmulti_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(native_multi_matrix)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bnative_multi_matrix.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20return%20(native_processed%2C%20native_slice_matrix%2C%20native_multi_matrix)%0A%0A%20%20%20%20demonstrate_transformation_application()%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%23%23%205.%20Transformation%20Preservation%20Through%20Operations%0A%0A%20%20%20%20Transformations%20are%20preserved%20through%20slicing%20and%20other%20operations%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_(read_slaf)%3A%0A%20%20%20%20%23%20Load%20fresh%20data%20for%20preservation%20examples%0A%20%20%20%20adata_preserve%20%3D%20read_slaf(%22..%2Fslaf-datasets%2Fpbmc3k.slaf%22)%0A%20%20%20%20return%20(adata_preserve%2C)%0A%0A%0A%40app.cell%0Adef%20_(adata_preserve%2C%20slaf_scanpy)%3A%0A%20%20%20%20%23%20Demonstrate%20transformation%20preservation%0A%20%20%20%20print(%22%F0%9F%94%84%20Transformation%20Preservation%22)%0A%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20print(%221.%20Apply%20transformations%20first%2C%20then%20slice%3A%22)%0A%20%20%20%20adata_transformed%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20adata_preserve%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20adata_transformed%20%3D%20slaf_scanpy.pp.log1p(adata_transformed%2C%20inplace%3DFalse)%0A%20%20%20%20slice_after%20%3D%20adata_transformed%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Original%20transformations%3A%20%7Blist(adata_transformed._transformations.keys())%20if%20hasattr(adata_transformed%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Slice%20transformations%3A%20%7Blist(slice_after._transformations.keys())%20if%20hasattr(slice_after%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22%5Cn2.%20Slice%20first%2C%20then%20apply%20transformations%3A%22)%0A%20%20%20%20slice_before%20%3D%20adata_preserve%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20transformed_slice%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20slice_before%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20)%0A%20%20%20%20transformed_slice%20%3D%20slaf_scanpy.pp.log1p(transformed_slice%2C%20inplace%3DFalse)%0A%20%20%20%20print(f%22%20%20%20Transformed%20slice%3A%20%7Btype(transformed_slice)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%3A%20%7Blist(transformed_slice._transformations.keys())%20if%20hasattr(transformed_slice%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22%5Cn3.%20Complex%20slicing%20patterns%20preserve%20transformations%3A%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%22%20%20%20Note%3A%20Chained%20slicing%20(e.g.%2C%20adata%5B%3A200%2C%20%3A100%5D%5B%3A50%2C%20%3A25%5D)%20is%20not%20supported.%22%0A%20%20%20%20)%0A%20%20%20%20print(%22%20%20%20Use%20single-step%20slicing%20instead%3A%20adata%5B50%3A250%2C%2025%3A125%5D%22)%0A%0A%20%20%20%20%23%20Single-step%20slicing%20(equivalent%20to%20nested%20slicing)%0A%20%20%20%20single_step_slice%20%3D%20adata_transformed%5B50%3A250%2C%2025%3A125%5D%0A%20%20%20%20print(f%22%20%20%20Single-step%20slice%3A%20%7Btype(single_step_slice)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%20preserved%3A%20%7Blist(single_step_slice._transformations.keys())%20if%20hasattr(single_step_slice%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Boolean%20mask%20slicing%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20cell_mask%20%3D%20np.zeros(adata_transformed.shape%5B0%5D%2C%20dtype%3Dbool)%0A%20%20%20%20cell_mask%5B50%3A250%5D%20%3D%20True%0A%20%20%20%20gene_mask%20%3D%20np.zeros(adata_transformed.shape%5B1%5D%2C%20dtype%3Dbool)%0A%20%20%20%20gene_mask%5B25%3A125%5D%20%3D%20True%0A%20%20%20%20boolean_slice%20%3D%20adata_transformed%5Bcell_mask%2C%20gene_mask%5D%0A%20%20%20%20print(f%22%20%20%20Boolean%20mask%20slice%3A%20%7Btype(boolean_slice)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%20preserved%3A%20%7Blist(boolean_slice._transformations.keys())%20if%20hasattr(boolean_slice%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Step%20slicing%0A%20%20%20%20step_slice%20%3D%20adata_transformed%5B%3A%3A4%2C%20%3A%3A2%5D%20%20%23%20Every%204th%20cell%2C%20every%202nd%20gene%0A%20%20%20%20print(f%22%20%20%20Step%20slice%3A%20%7Btype(step_slice)%7D%22)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%20preserved%3A%20%7Blist(step_slice._transformations.keys())%20if%20hasattr(step_slice%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20)%0A%0A%20%20%20%20return%20single_step_slice%2C%20slice_after%2C%20transformed_slice%0A%0A%0A%40app.cell%0Adef%20_(single_step_slice%2C%20slice_after%2C%20time%2C%20transformed_slice)%3A%0A%20%20%20%20def%20verify_transformation_preservation()%3A%0A%20%20%20%20%20%20%20%20%23%20Verify%20transformation%20preservation%20by%20computing%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%85%20Verifying%20Transformation%20Preservation%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2040)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Computing%20slice%20with%20preserved%20transformations%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20result1%20%3D%20slice_after.X.compute()%0A%20%20%20%20%20%20%20%20time1%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Btime1%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(result1)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bresult1.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Computing%20slice%20with%20applied%20transformations%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20result2%20%3D%20transformed_slice.X.compute()%0A%20%20%20%20%20%20%20%20time2%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Btime2%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(result2)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bresult2.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Computing%20single-step%20slice%20with%20preserved%20transformations%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20result3%20%3D%20single_step_slice.X.compute()%0A%20%20%20%20%20%20%20%20time3%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Btime3%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(result3)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bresult3.shape%7D%22)%0A%0A%20%20%20%20verify_transformation_preservation()%0A%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%23%23%206.%20Performance%20Benefits%20-%20Building%20Complex%20Pipelines%0A%0A%20%20%20%20Let's%20see%20how%20lazy%20evaluation%20enables%20efficient%20complex%20pipelines%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_(adata%2C%20slaf_scanpy%2C%20time)%3A%0A%20%20%20%20%23%20Demonstrate%20performance%20benefits%0A%0A%20%20%20%20def%20demonstrate_complex_pipeline(adata)%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9A%A1%20Performance%20Benefits%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2025)%0A%0A%20%20%20%20%20%20%20%20print(%221.%20Building%20complex%20pipeline%20(no%20computation%20yet)%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%0A%20%20%20%20%20%20%20%20%23%20Build%20a%20complex%20pipeline%0A%20%20%20%20%20%20%20%20pipeline%20%3D%20slaf_scanpy.pp.normalize_total(adata%2C%20target_sum%3D1e4%2C%20inplace%3DFalse)%0A%20%20%20%20%20%20%20%20pipeline%20%3D%20slaf_scanpy.pp.log1p(pipeline%2C%20inplace%3DFalse)%0A%0A%20%20%20%20%20%20%20%20%23%20Note%3A%20highly_variable_genes%20returns%20a%20DataFrame%2C%20not%20a%20LazyAnnData%20object%0A%20%20%20%20%20%20%20%20%23%20so%20it%20can't%20be%20chained%20in%20the%20pipeline%20like%20other%20transformations%0A%0A%20%20%20%20%20%20%20%20%23%20Slice%20the%20processed%20data%0A%20%20%20%20%20%20%20%20final_slice%20%3D%20pipeline%5B%3A500%2C%20%3A200%5D%0A%0A%20%20%20%20%20%20%20%20build_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Pipeline%20built%20in%20%7Bbuild_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Final%20object%3A%20%7Btype(final_slice)%7D%22)%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%20%20%20Expected%20shape%3A%20(500%2C%20200)%22%0A%20%20%20%20%20%20%20%20)%20%20%23%20Avoid%20accessing%20.shape%20on%20transformed%20slice%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22%20%20%20Transformations%3A%20%7Blist(final_slice._transformations.keys())%20if%20hasattr(final_slice%2C%20'_transformations')%20else%20'None'%7D%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Computing%20the%20final%20result%3A%22)%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20final_result%20%3D%20final_slice.X.compute()%0A%20%20%20%20%20%20%20%20compute_time%20%3D%20time.time()%20-%20start_time%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Computed%20in%20%7Bcompute_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Type%3A%20%7Btype(final_result)%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Shape%3A%20%7Bfinal_result.shape%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(f%22%5Cn3.%20Total%20time%3A%20%7Bbuild_time%20%2B%20compute_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%20%20%20Key%20insight%3A%20Pipeline%20building%20is%20instant%2C%20computation%20happens%20only%20when%20needed!%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20demonstrate_complex_pipeline(adata)%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%23%23%207.%20Memory%20Efficiency%20Comparison%0A%0A%20%20%20%20Let's%20compare%20memory%20usage%20between%20lazy%20and%20eager%20approaches%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_(read_slaf)%3A%0A%20%20%20%20%23%20Memory%20efficiency%20comparison%0A%20%20%20%20print(%22%F0%9F%92%BE%20Memory%20Efficiency%20Comparison%22)%0A%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20import%20gc%0A%0A%20%20%20%20import%20psutil%0A%0A%20%20%20%20def%20get_memory_usage()%3A%0A%20%20%20%20%20%20%20%20%22%22%22Get%20current%20memory%20usage%20in%20MB%22%22%22%0A%20%20%20%20%20%20%20%20process%20%3D%20psutil.Process()%0A%20%20%20%20%20%20%20%20return%20process.memory_info().rss%20%2F%201024%20%2F%201024%0A%0A%20%20%20%20%23%20Load%20fresh%20data%0A%20%20%20%20adata_mem%20%3D%20read_slaf(%22..%2Fslaf-datasets%2Fpbmc3k_processed.slaf%22)%0A%0A%20%20%20%20print(%221.%20Memory%20after%20loading%20lazy%20data%3A%22)%0A%20%20%20%20gc.collect()%0A%20%20%20%20lazy_memory%20%3D%20get_memory_usage()%0A%20%20%20%20print(f%22%20%20%20Lazy%20loading%3A%20%7Blazy_memory%3A.1f%7D%20MB%22)%0A%0A%20%20%20%20print(%22%5Cn2.%20Memory%20after%20computing%20full%20dataset%3A%22)%0A%20%20%20%20gc.collect()%0A%20%20%20%20start_memory%20%3D%20get_memory_usage()%0A%20%20%20%20_%20%3D%20adata_mem.compute()%0A%20%20%20%20end_memory%20%3D%20get_memory_usage()%0A%20%20%20%20print(f%22%20%20%20Eager%20loading%3A%20%7Bend_memory%3A.1f%7D%20MB%22)%0A%20%20%20%20print(f%22%20%20%20Memory%20increase%3A%20%7Bend_memory%20-%20start_memory%3A.1f%7D%20MB%22)%0A%0A%20%20%20%20print(%22%5Cn3.%20Memory%20after%20computing%20small%20slice%3A%22)%0A%20%20%20%20gc.collect()%0A%20%20%20%20slice_memory_before%20%3D%20get_memory_usage()%0A%20%20%20%20_%20%3D%20adata_mem%5B%3A100%2C%20%3A50%5D.compute()%0A%20%20%20%20slice_memory_after%20%3D%20get_memory_usage()%0A%20%20%20%20print(f%22%20%20%20Small%20slice%3A%20%7Bslice_memory_after%3A.1f%7D%20MB%22)%0A%20%20%20%20print(f%22%20%20%20Memory%20increase%3A%20%7Bslice_memory_after%20-%20slice_memory_before%3A.1f%7D%20MB%22)%0A%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%5CnKey%20insight%3A%20Lazy%20loading%20uses%20%7Blazy_memory%3A.1f%7D%20MB%20vs%20eager%20loading%20%7Bend_memory%3A.1f%7D%20MB%22%0A%20%20%20%20)%0A%20%20%20%20print(f%22Memory%20savings%3A%20%7B((end_memory%20-%20lazy_memory)%20%2F%20end_memory%20*%20100)%3A.1f%7D%25%22)%0A%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%23%23%208.%20Advanced%20Slicing%20Patterns%0A%0A%20%20%20%20Let's%20explore%20more%20advanced%20slicing%20patterns%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_(read_slaf%2C%20slaf_scanpy)%3A%0A%20%20%20%20%23%20Advanced%20slicing%20patterns%0A%20%20%20%20print(%22%F0%9F%94%AC%20Advanced%20Slicing%20Patterns%22)%0A%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20%23%20Load%20data%20and%20add%20QC%20metrics%0A%20%20%20%20adata_advanced%20%3D%20read_slaf(%22..%2Fslaf-datasets%2Fpbmc3k_processed.slaf%22)%0A%20%20%20%20slaf_scanpy.pp.calculate_qc_metrics(adata_advanced%2C%20inplace%3DTrue)%0A%0A%20%20%20%20print(%221.%20Boolean%20indexing%20with%20QC%20metrics%3A%22)%0A%20%20%20%20high_quality_mask%20%3D%20adata_advanced.obs%5B%22n_genes_by_counts%22%5D%20%3E%201000%0A%20%20%20%20high_quality_cells%20%3D%20adata_advanced%5Bhigh_quality_mask%2C%20%3A%5D%0A%20%20%20%20print(f%22%20%20%20High%20quality%20cells%3A%20%7Bhigh_quality_cells.shape%7D%22)%0A%0A%20%20%20%20print(%22%5Cn2.%20Gene-based%20filtering%3A%22)%0A%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20hasattr(adata_advanced%2C%20%22var%22)%0A%20%20%20%20%20%20%20%20and%20adata_advanced.var%20is%20not%20None%0A%20%20%20%20%20%20%20%20and%20%22highly_variable%22%20in%20adata_advanced.var.columns%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20hvg_mask%20%3D%20adata_advanced.var%5B%22highly_variable%22%5D%0A%20%20%20%20%20%20%20%20hvg_genes%20%3D%20adata_advanced%5B%3A%2C%20hvg_mask%5D%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Highly%20variable%20genes%3A%20%7Bhvg_genes.shape%7D%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20print(%22%20%20%20(Highly%20variable%20genes%20not%20available%20yet)%22)%0A%0A%20%20%20%20print(%22%5Cn3.%20Combined%20cell%20and%20gene%20filtering%3A%22)%0A%20%20%20%20combined%20%3D%20adata_advanced%5Bhigh_quality_mask%2C%20%3A100%5D%0A%20%20%20%20print(f%22%20%20%20Combined%20filtering%3A%20%7Bcombined.shape%7D%22)%0A%0A%20%20%20%20print(%22%5Cn4.%20Expression-based%20filtering%3A%22)%0A%20%20%20%20%23%20Get%20cells%20with%20high%20total%20counts%0A%20%20%20%20high_counts_mask%20%3D%20adata_advanced.obs%5B%22total_counts%22%5D%20%3E%202000%0A%20%20%20%20high_counts_cells%20%3D%20adata_advanced%5Bhigh_counts_mask%2C%20%3A%5D%0A%20%20%20%20print(f%22%20%20%20High%20count%20cells%3A%20%7Bhigh_counts_cells.shape%7D%22)%0A%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%23%23%209.%20Lazy%20vs%20Eager%20Performance%20Comparison%0A%0A%20%20%20%20Let's%20compare%20the%20performance%20of%20lazy%20vs%20eager%20approaches%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_(adata%2C%20slaf_scanpy%2C%20time)%3A%0A%20%20%20%20%23%20Performance%20comparison%0A%20%20%20%20def%20compare_lazy_vs_eager_performance(adata)%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9A%A1%20Lazy%20vs%20Eager%20Performance%22)%0A%20%20%20%20%20%20%20%20print(%22%3D%22%20*%2035)%0A%0A%20%20%20%20%20%20%20%20%23%20Test%20scenario%3A%20Apply%20transformations%20and%20slice%0A%20%20%20%20%20%20%20%20print(%22Scenario%3A%20normalize_total%20%E2%86%92%20log1p%20%E2%86%92%20slice%5B%3A100%2C%20%3A50%5D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Lazy%20approach%0A%20%20%20%20%20%20%20%20print(%22%5Cn1.%20Lazy%20approach%3A%22)%0A%20%20%20%20%20%20%20%20adata_lazy%20%3D%20adata%0A%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20lazy_pipeline%20%3D%20slaf_scanpy.pp.normalize_total(%0A%20%20%20%20%20%20%20%20%20%20%20%20adata_lazy%2C%20target_sum%3D1e4%2C%20inplace%3DFalse%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20lazy_pipeline%20%3D%20slaf_scanpy.pp.log1p(lazy_pipeline%2C%20inplace%3DFalse)%0A%20%20%20%20%20%20%20%20lazy_slice%20%3D%20lazy_pipeline%5B%3A100%2C%20%3A50%5D%0A%20%20%20%20%20%20%20%20lazy_build_time%20%3D%20time.time()%20-%20start_time%0A%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20%23%20Use%20.X.compute()%20to%20avoid%20the%20metadata%20mismatch%20issue%0A%20%20%20%20%20%20%20%20_%20%3D%20lazy_slice.X.compute()%0A%20%20%20%20%20%20%20%20lazy_compute_time%20%3D%20time.time()%20-%20start_time%0A%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Build%20time%3A%20%7Blazy_build_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Compute%20time%3A%20%7Blazy_compute_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Total%20time%3A%20%7Blazy_build_time%20%2B%20lazy_compute_time%3A.4f%7Ds%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Eager%20approach%20(simulated)%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Eager%20approach%20(simulated)%3A%22)%0A%0A%20%20%20%20%20%20%20%20start_time%20%3D%20time.time()%0A%20%20%20%20%20%20%20%20_%20%3D%20adata.compute()%0A%20%20%20%20%20%20%20%20eager_load_time%20%3D%20time.time()%20-%20start_time%0A%0A%20%20%20%20%20%20%20%20%23%20Simulate%20eager%20transformations%20(this%20would%20be%20done%20in%20memory)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Load%20time%3A%20%7Beager_load_time%3A.4f%7Ds%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Transformations%20would%20be%20done%20in%20memory%20(slower%20for%20large%20datasets)%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Key%20benefits%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%3A%20Build%20complex%20pipelines%20instantly%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%3A%20Only%20compute%20what%20you%20need%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%3A%20Memory%20efficient%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%3A%20SQL-level%20performance%20for%20operations%22)%0A%0A%20%20%20%20compare_lazy_vs_eager_performance(adata)%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%23%23%2010.%20Best%20Practices%20and%20Tips%0A%0A%20%20%20%20Here%20are%20some%20best%20practices%20for%20using%20SLAF's%20lazy%20evaluation%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%20%23%20Best%20practices%0A%20%20%20%20print(%22%F0%9F%92%A1%20Best%20Practices%20and%20Tips%22)%0A%20%20%20%20print(%22%3D%22%20*%2030)%0A%0A%20%20%20%20print(%221.%20Pipeline%20Building%3A%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Build%20complete%20pipelines%20before%20computing%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Chain%20transformations%3A%20adata.normalize_total().log1p()%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Slice%20after%20transformations%20for%20efficiency%22)%0A%0A%20%20%20%20print(%22%5Cn2.%20Computation%20Control%3A%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20.compute()%20only%20when%20you%20need%20the%20data%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20.obs%20or%20.var%20for%20metadata%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20.X.compute()%20for%20expression%20matrix%20only%22)%0A%0A%20%20%20%20print(%22%5Cn3.%20Memory%20Management%3A%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Keep%20lazy%20objects%20for%20intermediate%20results%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Compute%20only%20final%20results%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20slicing%20to%20reduce%20memory%20usage%22)%0A%0A%20%20%20%20print(%22%5Cn4.%20Performance%20Optimization%3A%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Leverage%20SQL-level%20operations%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20boolean%20indexing%20for%20filtering%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Combine%20operations%20in%20single%20queries%20when%20possible%22)%0A%0A%20%20%20%20print(%22%5Cn5.%20Debugging%3A%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Check%20object%20types%3A%20type(adata)%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Check%20transformations%3A%20adata._transformations%22)%0A%20%20%20%20print(%22%20%20%20%E2%9C%85%20Use%20.info()%20for%20dataset%20overview%22)%0A%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%23%23%20Summary%0A%0A%20%20%20%20**What%20you've%20learned%20about%20SLAF's%20lazy%20processing%3A**%0A%0A%20%20%20%201.%20**Lazy%20Objects**%3A%20LazyAnnData%20and%20LazyExpressionMatrix%20store%20operations%2C%20not%20data%0A%20%20%20%202.%20**Explicit%20Control**%3A%20Use%20.compute()%20methods%20to%20control%20when%20data%20is%20processed%0A%20%20%20%203.%20**Slicing%20Patterns**%3A%20Multiple%20slicing%20patterns%2C%20all%20lazy%20and%20composable%0A%20%20%20%204.%20**Transformations**%3A%20Lazy%20transformations%20that%20are%20preserved%20through%20operations%0A%20%20%20%205.%20**Performance**%3A%20Build%20complex%20pipelines%20instantly%2C%20compute%20only%20when%20needed%0A%20%20%20%206.%20**Memory%20Efficiency**%3A%20Significant%20memory%20savings%20compared%20to%20eager%20loading%0A%20%20%20%207.%20**Best%20Practices**%3A%20Guidelines%20for%20optimal%20lazy%20evaluation%20usage%0A%0A%20%20%20%20**Next%20Steps%3A**%0A%20%20%20%20-%20**03-ml-training-pipeline.py**%3A%20Complete%20ML%20training%20workflows%20with%20tokenizers%20and%20dataloaders%0A%20%20%20%20%22%22%22%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
fd028d92f5a9a2d27f3abcf7257a49672f335e10727bf04e3d88c47dfd3d9ae2