import%20marimo%0A%0A__generated_with%20%3D%20%220.17.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%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20scipy.sparse%20import%20csr_matrix%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%20%20%20%20return%20csr_matrix%2C%20mo%2C%20np%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%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%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%20np%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%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%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%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%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%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%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%2011.%20Working%20with%20Layers%0A%0A%20%20%20%20SLAF%20supports%20AnnData%20layers%20(alternative%20expression%20matrices)%20stored%20in%20the%20%60layers.lance%60%20table.%0A%0A%20%20%20%20Let's%20create%20a%20synthetic%20dataset%20with%20layers%2C%20convert%20it%20to%20SLAF%2C%20and%20demonstrate%20layer%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_(csr_matrix%2C%20np)%3A%0A%20%20%20%20%23%20Create%20synthetic%20AnnData%20with%20layers%2C%20obsm%2C%20varm%2C%20and%20uns%20for%20demonstration%0A%20%20%20%20import%20scanpy%20as%20sc%0A%0A%20%20%20%20%23%20Create%20a%20small%20synthetic%20dataset%0A%20%20%20%20n_cells%2C%20n_genes%20%3D%20200%2C%20500%0A%20%20%20%20np.random.seed(42)%0A%0A%20%20%20%20%23%20Main%20expression%20matrix%0A%20%20%20%20X%20%3D%20csr_matrix(np.random.lognormal(0%2C%201%2C%20(n_cells%2C%20n_genes)).astype(np.float32))%0A%0A%20%20%20%20%23%20Create%20AnnData%20object%0A%20%20%20%20adata_synthetic%20%3D%20sc.AnnData(X%3DX)%0A%0A%20%20%20%20%23%20Add%20obs%20metadata%0A%20%20%20%20adata_synthetic.obs%5B%22cell_type%22%5D%20%3D%20np.random.choice(%0A%20%20%20%20%20%20%20%20%5B%22T_cell%22%2C%20%22B_cell%22%2C%20%22NK_cell%22%5D%2C%20n_cells%0A%20%20%20%20)%0A%20%20%20%20adata_synthetic.obs%5B%22total_counts%22%5D%20%3D%20X.sum(axis%3D1).A1%0A%0A%20%20%20%20%23%20Add%20var%20metadata%0A%20%20%20%20adata_synthetic.var%5B%22highly_variable%22%5D%20%3D%20np.random.choice(%0A%20%20%20%20%20%20%20%20%5BTrue%2C%20False%5D%2C%20n_genes%2C%20p%3D%5B0.2%2C%200.8%5D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Add%20layers%20(alternative%20expression%20matrices)%0A%20%20%20%20adata_synthetic.layers%5B%22spliced%22%5D%20%3D%20csr_matrix(%0A%20%20%20%20%20%20%20%20np.random.lognormal(0%2C%201%2C%20(n_cells%2C%20n_genes)).astype(np.float32)%0A%20%20%20%20)%0A%20%20%20%20adata_synthetic.layers%5B%22unspliced%22%5D%20%3D%20csr_matrix(%0A%20%20%20%20%20%20%20%20np.random.lognormal(0%2C%201%2C%20(n_cells%2C%20n_genes)).astype(np.float32)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Add%20obsm%20(cell%20embeddings)%0A%20%20%20%20adata_synthetic.obsm%5B%22X_umap%22%5D%20%3D%20np.random.randn(n_cells%2C%202).astype(np.float32)%0A%20%20%20%20adata_synthetic.obsm%5B%22X_pca%22%5D%20%3D%20np.random.randn(n_cells%2C%2050).astype(np.float32)%0A%0A%20%20%20%20%23%20Add%20varm%20(gene%20embeddings)%0A%20%20%20%20adata_synthetic.varm%5B%22PCs%22%5D%20%3D%20np.random.randn(n_genes%2C%2050).astype(np.float32)%0A%0A%20%20%20%20%23%20Add%20uns%20(unstructured%20metadata)%0A%20%20%20%20adata_synthetic.uns%5B%22neighbors%22%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22params%22%3A%20%7B%22n_neighbors%22%3A%2015%2C%20%22metric%22%3A%20%22euclidean%22%7D%0A%20%20%20%20%7D%0A%20%20%20%20adata_synthetic.uns%5B%22pca%22%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22variance_ratio%22%3A%20np.random.rand(50).tolist()%2C%0A%20%20%20%20%20%20%20%20%22variance%22%3A%20np.random.rand(50).tolist()%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%E2%9C%85%20Created%20synthetic%20AnnData%3A%20%7Badata_synthetic.shape%5B0%5D%7D%20cells%20%C3%97%20%7Badata_synthetic.shape%5B1%5D%7D%20genes%22%0A%20%20%20%20)%0A%20%20%20%20print(f%22%20%20%20Layers%3A%20%7Blist(adata_synthetic.layers.keys())%7D%22)%0A%20%20%20%20print(f%22%20%20%20Obsm%3A%20%7Blist(adata_synthetic.obsm.keys())%7D%22)%0A%20%20%20%20print(f%22%20%20%20Varm%3A%20%7Blist(adata_synthetic.varm.keys())%7D%22)%0A%20%20%20%20print(f%22%20%20%20Uns%3A%20%7Blist(adata_synthetic.uns.keys())%7D%22)%0A%20%20%20%20return%20(adata_synthetic%2C)%0A%0A%0A%40app.cell%0Adef%20_(adata_synthetic)%3A%0A%20%20%20%20%23%20Convert%20synthetic%20AnnData%20to%20SLAF%20format%0A%20%20%20%20import%20os%0A%20%20%20%20import%20tempfile%0A%0A%20%20%20%20from%20slaf.data.converter%20import%20SLAFConverter%0A%0A%20%20%20%20%23%20Create%20temporary%20directory%20for%20SLAF%20dataset%0A%20%20%20%20temp_dir%20%3D%20tempfile.mkdtemp()%0A%20%20%20%20slaf_path%20%3D%20os.path.join(temp_dir%2C%20%22synthetic_with_metadata.slaf%22)%0A%0A%20%20%20%20%23%20Convert%20to%20SLAF%20(use%20chunked%3DFalse%20for%20small%20in-memory%20AnnData%20objects)%0A%20%20%20%20converter%20%3D%20SLAFConverter(chunked%3DFalse)%0A%20%20%20%20converter.convert_anndata(adata_synthetic%2C%20slaf_path)%0A%20%20%20%20print(f%22%E2%9C%85%20Converted%20synthetic%20dataset%20to%20SLAF%3A%20%7Bslaf_path%7D%22)%0A%20%20%20%20return%20(slaf_path%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%2012.%20Working%20with%20Metadata%20Views%0A%0A%20%20%20%20SLAF%20provides%20lazy%20views%20for%20all%20AnnData%20metadata%20objects%20(obs%2C%20var%2C%20obsm%2C%20varm%2C%20uns)%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_path)%3A%0A%20%20%20%20%23%20Load%20the%20converted%20SLAF%20dataset%20with%20all%20metadata%0A%20%20%20%20adata_metadata%20%3D%20read_slaf(slaf_path)%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20f%22%E2%9C%85%20Loaded%20SLAF%20dataset%3A%20%7Badata_metadata.shape%5B0%5D%7D%20cells%20%C3%97%20%7Badata_metadata.shape%5B1%5D%7D%20genes%22%0A%20%20%20%20)%0A%20%20%20%20return%20(adata_metadata%2C)%0A%0A%0A%40app.cell%0Adef%20_(adata_metadata%2C%20csr_matrix)%3A%0A%20%20%20%20def%20demonstrate_layers()%3A%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%93%9A%20Working%20with%20Layers%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.%20Check%20available%20layers%3A%22)%0A%20%20%20%20%20%20%20%20available_layers%20%3D%20list(adata_metadata.layers.keys())%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20layers%3A%20%7Bavailable_layers%7D%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Number%20of%20layers%3A%20%7Blen(available_layers)%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Access%20a%20layer%3A%22)%0A%20%20%20%20%20%20%20%20if%20available_layers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20layer_name%20%3D%20available_layers%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20layer_matrix%20%3D%20adata_metadata.layers%5Blayer_name%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Layer%20'%7Blayer_name%7D'%20type%3A%20%7Btype(layer_matrix)%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Layer%20shape%3A%20%7Blayer_matrix.shape%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Layer%20is%20lazy%3A%20%7Bhasattr(layer_matrix%2C%20'compute')%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Compute%20a%20layer%20(lazy%20evaluation)%3A%22)%0A%20%20%20%20%20%20%20%20if%20available_layers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20layer_name%20%3D%20available_layers%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20layer_matrix%20%3D%20adata_metadata.layers%5Blayer_name%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20layer_data%20%3D%20layer_matrix.compute()%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%20Computed%20'%7Blayer_name%7D'%3A%20%7Btype(layer_data)%7D%2C%20shape%20%7Blayer_data.shape%7D%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.%20Create%20a%20new%20layer%3A%22)%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20simple%20normalized%20layer%20as%20example%0A%20%20%20%20%20%20%20%20normalized%20%3D%20adata_metadata.X.compute()%0A%20%20%20%20%20%20%20%20%23%20Simple%20normalization%20example%0A%20%20%20%20%20%20%20%20normalized%20%3D%20normalized%20%2F%20normalized.sum(axis%3D1)%20*%2010000%0A%20%20%20%20%20%20%20%20adata_metadata.layers%5B%22normalized%22%5D%20%3D%20csr_matrix(normalized)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Created%20'normalized'%20layer%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Updated%20layers%3A%20%7Blist(adata_metadata.layers.keys())%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn5.%20Layer%20operations%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Dictionary-like%20interface%3A%20layers%5B'name'%5D%2C%20'name'%20in%20layers%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%20evaluation%3A%20layers%5B'name'%5D.compute()%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Immutability%3A%20Converted%20layers%20are%20protected%20from%20deletion%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Wide%20format%3A%20Stored%20in%20layers.lance%20table%20(one%20column%20per%20layer)%22)%0A%0A%20%20%20%20demonstrate_layers()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(adata_metadata)%3A%0A%20%20%20%20def%20demonstrate_metadata_views()%3A%0A%20%20%20%20%20%20%20%20print(%22%F0%9F%93%8A%20Working%20with%20Metadata%20Views%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(%221.%20Obs%20(cell%20metadata)%20-%20DataFrame-like%20interface%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20columns%3A%20%7Blist(adata_metadata.obs.columns)%5B%3A5%5D%7D...%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Number%20of%20columns%3A%20%7Blen(adata_metadata.obs.columns)%7D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20DataFrame-like%3A%20obs.columns%2C%20obs.head()%2C%20obs%5B'col'%5D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Dict-like%3A%20'col'%20in%20obs%2C%20len(obs)%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Mutations%3A%20obs%5B'new_col'%5D%20%3D%20values%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Var%20(gene%20metadata)%20-%20DataFrame-like%20interface%3A%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20columns%3A%20%7Blist(adata_metadata.var.columns)%5B%3A5%5D%7D...%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Number%20of%20columns%3A%20%7Blen(adata_metadata.var.columns)%7D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Same%20interface%20as%20obs%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Mutations%3A%20var%5B'new_col'%5D%20%3D%20values%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Obsm%20(cell%20embeddings)%20-%20Dictionary-like%20interface%3A%22)%0A%20%20%20%20%20%20%20%20obsm_keys%20%3D%20list(adata_metadata.obsm.keys())%0A%20%20%20%20%20%20%20%20if%20obsm_keys%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20keys%3A%20%7Bobsm_keys%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20key%20in%20obsm_keys%5B%3A2%5D%3A%20%20%23%20Show%20first%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arr%20%3D%20adata_metadata.obsm%5Bkey%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20-%20%7Bkey%7D%3A%20shape%20%7Barr.shape%7D%2C%20type%20%7Btype(arr)%7D%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20No%20obsm%20keys%20found%20(can%20add%3A%20adata.obsm%5B'X_umap'%5D%20%3D%20coords)%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn4.%20Varm%20(gene%20embeddings)%20-%20Dictionary-like%20interface%3A%22)%0A%20%20%20%20%20%20%20%20varm_keys%20%3D%20list(adata_metadata.varm.keys())%0A%20%20%20%20%20%20%20%20if%20varm_keys%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20keys%3A%20%7Bvarm_keys%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20key%20in%20varm_keys%5B%3A2%5D%3A%20%20%23%20Show%20first%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20arr%20%3D%20adata_metadata.varm%5Bkey%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20-%20%7Bkey%7D%3A%20shape%20%7Barr.shape%7D%2C%20type%20%7Btype(arr)%7D%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20No%20varm%20keys%20found%20(can%20add%3A%20adata.varm%5B'PCs'%5D%20%3D%20loadings)%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn5.%20Uns%20(unstructured%20metadata)%20-%20Dictionary-like%20interface%3A%22)%0A%20%20%20%20%20%20%20%20uns_keys%20%3D%20list(adata_metadata.uns.keys())%0A%20%20%20%20%20%20%20%20if%20uns_keys%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20keys%3A%20%7Buns_keys%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20%20Example%3A%20%7Blist(uns_keys)%5B%3A3%5D%7D%22)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22%20%20%20No%20uns%20keys%20found%20(can%20add%3A%20adata.uns%5B'analysis'%5D%20%3D%20%7B...%7D)%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn6.%20Key%20features%3A%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Lazy%20evaluation%3A%20Metadata%20accessed%20on-demand%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Immutability%3A%20Converted%20columns%2Fkeys%20are%20protected%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Subsetting%3A%20Views%20respect%20cell%2Fgene%20selectors%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20-%20Persistence%3A%20Changes%20are%20saved%20to%20Lance%20tables%22)%0A%0A%20%20%20%20demonstrate_metadata_views()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(adata_metadata%2C%20np)%3A%0A%20%20%20%20def%20demonstrate_metadata_mutations()%3A%0A%20%20%20%20%20%20%20%20print(%22%E2%9C%8F%EF%B8%8F%20Metadata%20Mutations%20Example%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(%221.%20Create%20obs%20column%3A%22)%0A%20%20%20%20%20%20%20%20cluster_labels%20%3D%20np.random.choice(%5B%22A%22%2C%20%22B%22%2C%20%22C%22%5D%2C%20adata_metadata.n_obs)%0A%20%20%20%20%20%20%20%20adata_metadata.obs%5B%22clusters%22%5D%20%3D%20cluster_labels%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%20%E2%9C%85%20Created%20'clusters'%20column%20with%20%7Blen(np.unique(cluster_labels))%7D%20unique%20values%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Column%20is%20immediately%20saved%20to%20cells.lance%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn2.%20Create%20var%20column%3A%22)%0A%20%20%20%20%20%20%20%20hvg_flags%20%3D%20np.random.choice(%5BTrue%2C%20False%5D%2C%20adata_metadata.n_vars%2C%20p%3D%5B0.3%2C%200.7%5D)%0A%20%20%20%20%20%20%20%20adata_metadata.var%5B%22is_hvg%22%5D%20%3D%20hvg_flags%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%20%E2%9C%85%20Created%20'is_hvg'%20column%3A%20%7Bhvg_flags.sum()%7D%20genes%20marked%20as%20highly%20variable%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Column%20is%20immediately%20saved%20to%20genes.lance%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn3.%20Store%20obsm%20(cell%20embeddings)%3A%22)%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20new%20embedding%20(different%20from%20existing%20X_umap)%0A%20%20%20%20%20%20%20%20new_embedding%20%3D%20np.random.randn(adata_metadata.n_obs%2C%203).astype(np.float32)%0A%20%20%20%20%20%20%20%20adata_metadata.obsm%5B%22X_custom%22%5D%20%3D%20new_embedding%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Created%20'X_custom'%20embedding%3A%20shape%20%7Bnew_embedding.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Stored%20as%20FixedSizeListArray%20in%20cells.lance%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20obsm%20keys%3A%20%7Blist(adata_metadata.obsm.keys())%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn4.%20Store%20varm%20(gene%20embeddings)%3A%22)%0A%20%20%20%20%20%20%20%20%23%20Create%20a%20new%20gene%20embedding%20(different%20from%20existing%20PCs)%0A%20%20%20%20%20%20%20%20new_loadings%20%3D%20np.random.randn(adata_metadata.n_vars%2C%2020).astype(np.float32)%0A%20%20%20%20%20%20%20%20adata_metadata.varm%5B%22custom_loadings%22%5D%20%3D%20new_loadings%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20%E2%9C%85%20Created%20'custom_loadings'%20embedding%3A%20shape%20%7Bnew_loadings.shape%7D%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Stored%20as%20FixedSizeListArray%20in%20genes.lance%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20varm%20keys%3A%20%7Blist(adata_metadata.varm.keys())%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn5.%20Store%20uns%20(unstructured%20metadata)%3A%22)%0A%20%20%20%20%20%20%20%20adata_metadata.uns%5B%22custom_analysis%22%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22params%22%3A%20%7B%22n_neighbors%22%3A%2015%2C%20%22resolution%22%3A%200.5%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Created%20'custom_analysis'%20key%20in%20uns%22)%0A%20%20%20%20%20%20%20%20print(%22%20%20%20Stored%20in%20uns.json%20file%22)%0A%20%20%20%20%20%20%20%20print(f%22%20%20%20Available%20uns%20keys%3A%20%7Blist(adata_metadata.uns.keys())%7D%22)%0A%0A%20%20%20%20%20%20%20%20print(%22%5Cn6.%20Delete%20mutable%20columns%2Fkeys%3A%22)%0A%20%20%20%20%20%20%20%20%23%20Delete%20the%20columns%2Fkeys%20we%20just%20created%20(they're%20mutable)%0A%20%20%20%20%20%20%20%20del%20adata_metadata.obs%5B%22clusters%22%5D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Deleted%20'clusters'%20column%20(mutable)%22)%0A%20%20%20%20%20%20%20%20del%20adata_metadata.var%5B%22is_hvg%22%5D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Deleted%20'is_hvg'%20column%20(mutable)%22)%0A%20%20%20%20%20%20%20%20del%20adata_metadata.obsm%5B%22X_custom%22%5D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Deleted%20'X_custom'%20embedding%20(mutable)%22)%0A%20%20%20%20%20%20%20%20del%20adata_metadata.varm%5B%22custom_loadings%22%5D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Deleted%20'custom_loadings'%20embedding%20(mutable)%22)%0A%20%20%20%20%20%20%20%20del%20adata_metadata.uns%5B%22custom_analysis%22%5D%0A%20%20%20%20%20%20%20%20print(%22%20%20%20%E2%9C%85%20Deleted%20'custom_analysis'%20key%20from%20uns%22)%0A%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%5Cn%20%20%20Note%3A%20Immutable%20columns%2Fkeys%20(converted%20from%20h5ad)%20cannot%20be%20deleted%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20demonstrate_metadata_mutations()%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%20%20%20%208.%20**Layers**%3A%20Alternative%20expression%20matrices%20stored%20in%20layers.lance%20(wide%20format)%0A%20%20%20%209.%20**Metadata%20Views**%3A%20Full%20support%20for%20obs%2C%20var%2C%20obsm%2C%20varm%2C%20and%20uns%20with%20lazy%20evaluation%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
09ccbb5e44f7fc0ea5b41c383d0b503b14085a7dbf2d8af4ce9c5f3d4df31c0a