Comparing Modlyn & Scanpy feature selection methods .md

!pip install 'modlyn[dev]'
!lamin init --storage test-modlyn
Hide code cell output
Requirement already satisfied: modlyn[dev] in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (0.0.7)
Requirement already satisfied: anndata>=0.12.0rc1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (0.12.10)
Requirement already satisfied: scikit-learn in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (1.9.0)
Requirement already satisfied: matplotlib in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (3.11.1)
Requirement already satisfied: lightning in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (2.6.5)
Requirement already satisfied: lamindb[jupyter] in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (2.8.1)
Requirement already satisfied: seaborn in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (0.13.2)
Requirement already satisfied: scanpy>=1.10 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (1.12.2)
Requirement already satisfied: pre-commit in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (4.6.1)
Requirement already satisfied: nox in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (2025.2.9)
Requirement already satisfied: pytest>=6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (9.1.1)
Requirement already satisfied: pytest-cov in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (7.1.0)
Requirement already satisfied: nbproject_test in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from modlyn[dev]) (0.6.0)
Requirement already satisfied: array-api-compat>=1.7.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.15.0)
Requirement already satisfied: h5py>=3.8 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (3.16.0)
Requirement already satisfied: legacy-api-wrap in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.5)
Requirement already satisfied: natsort in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (8.4.0)
Requirement already satisfied: numpy>=1.26 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (2.4.6)
Requirement already satisfied: packaging>=24.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (26.2)
Requirement already satisfied: pandas!=2.1.2,<3,>=2.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (2.3.3)
Requirement already satisfied: scipy!=1.17.0,>=1.12 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.16.3)
Requirement already satisfied: zarr!=3.0.*,>=2.18.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (3.2.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pandas!=2.1.2,<3,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (2.9.0.post0)
Requirement already satisfied: pytz>=2020.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pandas!=2.1.2,<3,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (2026.2)
Requirement already satisfied: tzdata>=2022.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pandas!=2.1.2,<3,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (2026.3)
Requirement already satisfied: iniconfig>=1.0.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pytest>=6.0->modlyn[dev]) (2.3.0)
Requirement already satisfied: pluggy<2,>=1.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pytest>=6.0->modlyn[dev]) (1.6.0)
Requirement already satisfied: pygments>=2.7.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pytest>=6.0->modlyn[dev]) (2.20.0)
Requirement already satisfied: six>=1.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas!=2.1.2,<3,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (1.17.0)
Requirement already satisfied: certifi in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (2026.7.22)
Requirement already satisfied: fast-array-utils>=1.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from fast-array-utils[accel,sparse]>=1.4->scanpy>=1.10->modlyn[dev]) (1.5)
Requirement already satisfied: joblib in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (1.5.3)
Requirement already satisfied: networkx>=2.8.8 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (3.6.1)
Requirement already satisfied: numba>=0.60 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.66.0)
Requirement already satisfied: patsy in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (1.0.2)
Requirement already satisfied: pynndescent>=0.5.13 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.6.0)
Requirement already satisfied: scverse-misc>=0.0.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.1.3)
Requirement already satisfied: session-info2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.4.1)
Requirement already satisfied: statsmodels>=0.14.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.14.6)
Requirement already satisfied: tqdm in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (4.69.0)
Requirement already satisfied: typing-extensions in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (4.16.0)
Requirement already satisfied: umap-learn>=0.5.12 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scanpy>=1.10->modlyn[dev]) (0.5.12)
Requirement already satisfied: contourpy>=1.0.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (1.3.3)
Requirement already satisfied: cycler>=0.10 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (0.12.1)
Requirement already satisfied: fonttools>=4.28.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (4.63.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (1.5.0)
Requirement already satisfied: pillow>=9 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (12.3.0)
Requirement already satisfied: pyparsing>=3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (3.3.2)
Requirement already satisfied: llvmlite<0.49,>=0.48.0dev0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from numba>=0.60->scanpy>=1.10->modlyn[dev]) (0.48.0)
Requirement already satisfied: narwhals>=2.0.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scikit-learn->modlyn[dev]) (2.24.0)
Requirement already satisfied: threadpoolctl>=3.5.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from scikit-learn->modlyn[dev]) (3.6.0)
Requirement already satisfied: donfig>=0.8 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (0.8.1.post1)
Requirement already satisfied: google-crc32c>=1.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (1.8.0)
Requirement already satisfied: numcodecs>=0.14 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (0.16.5)
Requirement already satisfied: pyyaml in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from donfig>=0.8->zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (6.0.3)
WARNING: lamindb 2.8.1 does not provide the extra 'jupyter'
Requirement already satisfied: lamindb-core==2.8.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.8.1)
Requirement already satisfied: lamin_utils==0.16.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.16.4)
Requirement already satisfied: lamin_cli==1.19.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.19.1)
Requirement already satisfied: lamindb_setup==1.25.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.25.5)
Requirement already satisfied: psycopg2-binary in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.9.12)
Requirement already satisfied: rich-click>=1.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamin_cli==1.19.1->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.9.8)
Requirement already satisfied: bionty<3,>=2.3.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.4.2)
Requirement already satisfied: pertdb<3,>=2.2.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.2.0)
Requirement already satisfied: jupytext in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.19.5)
Requirement already satisfied: nbconvert>=7.2.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (7.17.1)
Requirement already satisfied: nbproject==0.11.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.11.1)
Requirement already satisfied: pyarrow in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (25.0.0)
Requirement already satisfied: pandera>=0.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.32.1)
Requirement already satisfied: graphviz in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.21)
Requirement already satisfied: python-dotenv in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.2.2)
Requirement already satisfied: django<5.3,>=5.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.2.16)
Requirement already satisfied: dj_database_url<3.0.0,>=1.3.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.3.0)
Requirement already satisfied: django-pgtrigger in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.17.0)
Requirement already satisfied: pydantic-settings in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.14.2)
Requirement already satisfied: platformdirs<5.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.11.0)
Requirement already satisfied: httpx_retries<1.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.6.0)
Requirement already satisfied: requests in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.34.2)
Requirement already satisfied: universal_pathlib==0.3.10 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.3.10)
Requirement already satisfied: botocore<2.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.43.46)
Requirement already satisfied: supabase<=2.24.0,>=2.20.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: websockets>=13.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (15.0.1)
Requirement already satisfied: pyjwt<3.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.13.0)
Requirement already satisfied: psutil in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (7.2.2)
Requirement already satisfied: aiobotocore<4.0.0,>=2.12.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.8.0)
Requirement already satisfied: s3fs!=2024.10.0,<=2026.1.0,>=2023.12.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2026.1.0)
Requirement already satisfied: boto3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.43.46)
Requirement already satisfied: pydantic>=2.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.13.4)
Requirement already satisfied: orjson in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.11.9)
Requirement already satisfied: importlib-metadata in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (9.0.0)
Requirement already satisfied: fsspec>=2024.5.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from universal_pathlib==0.3.10->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2026.1.0)
Requirement already satisfied: pathlib-abc<0.6.0,>=0.5.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from universal_pathlib==0.3.10->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.2)
Requirement already satisfied: aiohttp<4.0.0,>=3.12.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.14.3)
Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.13.0)
Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.1.0)
Requirement already satisfied: multidict<7.0.0,>=6.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.7.1)
Requirement already satisfied: wrapt<3.0.0,>=1.10.10 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.2.2)
WARNING: aiobotocore 3.8.0 does not provide the extra 'boto3'
Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.7.1)
Requirement already satisfied: aiosignal>=1.4.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.4.0)
Requirement already satisfied: attrs>=17.3.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (26.1.0)
Requirement already satisfied: frozenlist>=1.1.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.8.0)
Requirement already satisfied: propcache>=0.2.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.2)
Requirement already satisfied: yarl<2.0,>=1.17.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.12.0->aiobotocore<4.0.0,>=2.12.4->aiobotocore[boto3]<4.0.0,>=2.12.4; extra == "aws"->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.24.5)
Requirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from botocore<2.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.7.0)
Requirement already satisfied: asgiref>=3.8.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from django<5.3,>=5.2->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.12.1)
Requirement already satisfied: sqlparse>=0.3.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from django<5.3,>=5.2->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.5)
Requirement already satisfied: httpx>=0.20.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpx_retries<1.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.28.1)
Requirement already satisfied: realtime==2.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: supabase-functions==2.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: storage3==2.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: supabase-auth==2.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: postgrest==2.24.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: deprecation>=2.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from postgrest==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.1.0)
Requirement already satisfied: strenum>=0.4.15 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from supabase-functions==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.4.15)
Requirement already satisfied: anyio in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpx>=0.20.0->httpx_retries<1.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.14.2)
Requirement already satisfied: httpcore==1.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpx>=0.20.0->httpx_retries<1.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.0.9)
Requirement already satisfied: idna in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpx>=0.20.0->httpx_retries<1.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.18)
Requirement already satisfied: h11>=0.16 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpcore==1.*->httpx>=0.20.0->httpx_retries<1.0.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.16.0)
Requirement already satisfied: h2<5,>=3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from httpx[http2]<0.29,>=0.26->postgrest==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.3.0)
Requirement already satisfied: hyperframe<7,>=6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from h2<5,>=3->httpx[http2]<0.29,>=0.26->postgrest==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.1.0)
Requirement already satisfied: hpack<5,>=4.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from h2<5,>=3->httpx[http2]<0.29,>=0.26->postgrest==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.2.0)
Requirement already satisfied: annotated-types>=0.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.7.0)
Requirement already satisfied: pydantic-core==2.46.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.46.4)
Requirement already satisfied: typing-inspection>=0.4.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.4.2)
Requirement already satisfied: beautifulsoup4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.15.0)
Requirement already satisfied: bleach!=5.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.4.0)
Requirement already satisfied: defusedxml in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.7.1)
Requirement already satisfied: jinja2>=3.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.1.6)
Requirement already satisfied: jupyter-core>=4.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.9.1)
Requirement already satisfied: jupyterlab-pygments in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.3.0)
Requirement already satisfied: markupsafe>=2.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.0.3)
Requirement already satisfied: mistune<4,>=2.0.3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.3.4)
Requirement already satisfied: nbclient>=0.5.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.11.0)
Requirement already satisfied: nbformat>=5.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.10.4)
Requirement already satisfied: pandocfilters>=1.4.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.5.1)
Requirement already satisfied: traitlets>=5.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.15.1)
Requirement already satisfied: webencodings in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.1)
Requirement already satisfied: tinycss2>=1.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.5.1)
Requirement already satisfied: jupyter-client>=7.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbclient>=0.5.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (8.9.1)
Requirement already satisfied: pyzmq>=25.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jupyter-client>=7.0.0->nbclient>=0.5.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (27.1.0)
Requirement already satisfied: tornado>=6.4.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jupyter-client>=7.0.0->nbclient>=0.5.0->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.5.7)
Requirement already satisfied: fastjsonschema>=2.15 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbformat>=5.7->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.21.2)
Requirement already satisfied: jsonschema>=2.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbformat>=5.7->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.26.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2025.9.1)
Requirement already satisfied: referencing>=0.28.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.37.0)
Requirement already satisfied: rpds-py>=0.25.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2026.6.3)
Requirement already satisfied: typeguard in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pandera>=0.24.0->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.5.2)
Requirement already satisfied: typing_inspect>=0.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pandera>=0.24.0->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.9.0)
Requirement already satisfied: cryptography>=3.4.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pyjwt[crypto]>=2.10.1->supabase-auth==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (49.0.0)
Requirement already satisfied: cffi>=2.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cryptography>=3.4.0->pyjwt[crypto]>=2.10.1->supabase-auth==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.1.0)
Requirement already satisfied: pycparser in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cffi>=2.0.0->cryptography>=3.4.0->pyjwt[crypto]>=2.10.1->supabase-auth==2.24.0->supabase<=2.24.0,>=2.20.0->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.0)
Requirement already satisfied: click>=8 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from rich-click>=1.7->lamin_cli==1.19.1->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (8.4.2)
Requirement already satisfied: rich>=12 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from rich-click>=1.7->lamin_cli==1.19.1->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (15.0.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from rich>=12->rich-click>=1.7->lamin_cli==1.19.1->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.2.0)
Requirement already satisfied: mdurl~=0.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=12->rich-click>=1.7->lamin_cli==1.19.1->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.1.2)
Requirement already satisfied: mypy-extensions>=0.3.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from typing_inspect>=0.6.0->pandera>=0.24.0->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.1.0)
Requirement already satisfied: soupsieve>=1.6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from beautifulsoup4->nbconvert>=7.2.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.9.1)
Requirement already satisfied: s3transfer<0.20.0,>=0.19.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from boto3->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.19.2)
Requirement already satisfied: zipp>=3.20 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from importlib-metadata->nbproject==0.11.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.1.0)
Requirement already satisfied: mdit-py-plugins in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jupytext->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.6.1)
Requirement already satisfied: lightning-utilities<2.0,>=0.10.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (0.15.3)
Requirement already satisfied: torch<4.0,>=2.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (2.13.0)
Requirement already satisfied: torchmetrics<3.0,>0.7.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (1.9.0)
Requirement already satisfied: pytorch-lightning in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (2.6.5)
Requirement already satisfied: filelock in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.32.0)
Requirement already satisfied: setuptools>=77.0.3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (83.0.0)
Requirement already satisfied: sympy>=1.13.3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.14.0)
Requirement already satisfied: cuda-toolkit==13.0.3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.0.3.0)
Requirement already satisfied: cuda-bindings<14,>=13.0.3 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.3.1)
Requirement already satisfied: nvidia-cudnn-cu13==9.20.0.48 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (9.20.0.48)
Requirement already satisfied: nvidia-cusparselt-cu13==0.8.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (0.8.1)
Requirement already satisfied: nvidia-nccl-cu13==2.29.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (2.29.7)
Requirement already satisfied: nvidia-nvshmem-cu13==3.4.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.4.5)
Requirement already satisfied: triton==3.7.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.7.1)
Requirement already satisfied: nvidia-cublas==13.1.1.3.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.1.1.3)
Requirement already satisfied: nvidia-cuda-nvrtc==13.0.88.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.0.88)
Requirement already satisfied: nvidia-cuda-runtime==13.0.96.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.0.96)
Requirement already satisfied: nvidia-cufft==12.0.0.61.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.0.0.61)
Requirement already satisfied: nvidia-nvjitlink<14,>=13.0.88 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.3.33)
Requirement already satisfied: nvidia-cufile==1.15.1.6.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.15.1.6)
Requirement already satisfied: nvidia-cuda-cupti==13.0.85.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.0.85)
Requirement already satisfied: nvidia-curand==10.4.0.35.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (10.4.0.35)
Requirement already satisfied: nvidia-cusolver==12.0.4.66.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.0.4.66)
Requirement already satisfied: nvidia-cusparse==12.6.3.3.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.6.3.3)
Requirement already satisfied: nvidia-nvtx==13.0.85.* in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-toolkit[cublas,cudart,cufft,cufile,cupti,curand,cusolver,cusparse,nvjitlink,nvrtc,nvtx]==13.0.3; platform_system == "Linux"->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (13.0.85)
Requirement already satisfied: cuda-pathfinder>=1.4.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from cuda-bindings<14,>=13.0.3->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.6.0)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from sympy>=1.13.3->torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.3.0)
Requirement already satisfied: ipykernel in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nbproject_test->modlyn[dev]) (7.3.0)
Requirement already satisfied: comm>=0.1.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (0.2.3)
Requirement already satisfied: debugpy>=1.6.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (1.8.21)
Requirement already satisfied: ipython>=7.23.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (9.15.0)
Requirement already satisfied: matplotlib-inline>=0.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (0.2.2)
Requirement already satisfied: nest-asyncio2>=1.7.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (1.7.2)
Requirement already satisfied: decorator>=5.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (5.3.1)
Requirement already satisfied: ipython-pygments-lexers>=1.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (1.1.1)
Requirement already satisfied: jedi>=0.18.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.20.0)
Requirement already satisfied: pexpect>4.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (4.9.0)
Requirement already satisfied: prompt_toolkit<3.1.0,>=3.0.41 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (3.0.52)
Requirement already satisfied: stack_data>=0.6.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.6.3)
Requirement already satisfied: wcwidth in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from prompt_toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.8.2)
Requirement already satisfied: parso<0.9.0,>=0.8.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from jedi>=0.18.2->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.8.7)
Requirement already satisfied: ptyprocess>=0.5 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pexpect>4.6->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.7.0)
Requirement already satisfied: executing>=1.2.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (2.2.1)
Requirement already satisfied: asttokens>=2.1.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (3.0.2)
Requirement already satisfied: pure-eval in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from stack_data>=0.6.0->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.2.3)
Requirement already satisfied: argcomplete<4,>=1.9.4 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (3.7.0)
Requirement already satisfied: colorlog<7,>=2.6.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (6.11.0)
Requirement already satisfied: dependency-groups>=1.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (1.3.1)
Requirement already satisfied: virtualenv>=20.14.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (21.7.0)
Requirement already satisfied: distlib<1,>=0.3.7 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from virtualenv>=20.14.1->nox->modlyn[dev]) (0.4.3)
Requirement already satisfied: python-discovery>=1.4.2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from virtualenv>=20.14.1->nox->modlyn[dev]) (1.5.0)
Requirement already satisfied: cfgv>=2.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (3.5.0)
Requirement already satisfied: identify>=1.0.0 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (2.6.19)
Requirement already satisfied: nodeenv>=0.11.1 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (1.10.0)
Requirement already satisfied: coverage>=7.10.6 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from coverage[toml]>=7.10.6->pytest-cov->modlyn[dev]) (7.15.2)
Requirement already satisfied: charset_normalizer<4,>=2 in /opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages (from requests->lamindb_setup==1.25.5->lamindb_setup[aws]==1.25.5->lamindb-core==2.8.1->lamindb-core[full]==2.8.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.4.9)
 initialized lamindb: anonymous/test-modlyn
import lamindb as ln
import modlyn as mn
import scanpy as sc
import pandas as pd
import seaborn as sns

sns.set_theme()
%config InlineBackend.figure_formats = ['svg']
Hide code cell output
 connected lamindb: anonymous/test-modlyn
ln.track()
Hide code cell output
 created Transform('cMfGmSHmiInu0000', key='quickstart.ipynb'), started new Run('mmhhkAv83GkVZtqc') at 2026-07-23 11:05:33 UTC
 notebook imports: lamindb-core==2.8.1 modlyn==0.0.7 pandas==2.3.3 scanpy==1.12.2 seaborn==0.13.2
 tip: to identify the notebook across renames, pass the uid: ln.track("cMfGmSHmiInu")

Prepare dataset

artifact = ln.Artifact.using("laminlabs/arrayloader-benchmarks").get(
    "JNaxQe8zbljesdbK0000"
)
adata = artifact.load()
sc.pp.log1p(adata)
adata
Hide code cell output
/tmp/ipykernel_3396/2273553885.py:1: DeprecationWarning: Use connect instead of using, using will be removed in the future.
  artifact = ln.Artifact.using("laminlabs/arrayloader-benchmarks").get(
 transferred: Artifact(uid='JNaxQe8zbljesdbK0000'), Storage(uid='LCfy7WeXbvKN')
AnnData object with n_obs × n_vars = 1000 × 100
    obs: 'sample', 'gene_count', 'tscp_count', 'mread_count', 'drugname_drugconc', 'drug', 'cell_line', 'sublibrary', 'BARCODE', 'pcnt_mito', 'S_score', 'G2M_score', 'phase', 'pass_filter', 'cell_name', 'plate'
    uns: 'log1p'
keep = adata.obs["cell_line"].value_counts().loc[lambda x: x > 3].index
adata = adata[adata.obs["cell_line"].isin(keep)].copy()
adata
Hide code cell output
AnnData object with n_obs × n_vars = 992 × 100
    obs: 'sample', 'gene_count', 'tscp_count', 'mread_count', 'drugname_drugconc', 'drug', 'cell_line', 'sublibrary', 'BARCODE', 'pcnt_mito', 'S_score', 'G2M_score', 'phase', 'pass_filter', 'cell_name', 'plate'
    uns: 'log1p'
adata.obs["cell_line"].value_counts().tail()
Hide code cell output
cell_line
CVCL_0099    8
CVCL_1693    8
CVCL_1239    8
CVCL_0028    4
CVCL_1125    4
Name: count, dtype: int64

Train LogReg with Modlyn

logreg = mn.models.SimpleLogReg(
    adata=adata,
    label_column="cell_line",
    learning_rate=1e-1,
    weight_decay=1e-3,
)
logreg.fit(
    adata_train=adata,
    adata_val=adata[:20],
    train_dataloader_kwargs={"batch_size": 128, "drop_last": True, "num_workers": 4},
    max_epochs=5,
)
Hide code cell output
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/lightning/pytorch/trainer/connectors/logger_connector/logger_connector.py:76: Starting from v1.9.0, `tensorboardX` has been removed as a dependency of the `lightning.pytorch` package, due to potential conflicts with other packages in the ML ecosystem. For this reason, `logger=True` will use `CSVLogger` as the default logger, unless the `tensorboard` or `tensorboardX` packages are found. Please `pip install lightning[extra]` or one of them to enable TensorBoard support by default
💡 Tip: For seamless cloud logging and experiment tracking, try installing [litlogger](https://pypi.org/project/litlogger/) to enable LitLogger, which logs metrics and artifacts automatically to the Lightning Experiments platform.
💡 Tip: For seamless cloud uploads and versioning, try installing [litmodels](https://pypi.org/project/litmodels/) to enable LitModelCheckpoint, which syncs automatically with the Lightning model registry.
┏━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━┓
┃    Name           Type              Params  Mode   FLOPs ┃
┡━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━┩
│ 0 │ linear        │ Linear           │  4.5 K │ train │     0 │
│ 1 │ train_metrics │ MetricCollection │      0 │ train │     0 │
│ 2 │ val_metrics   │ MetricCollection │      0 │ train │     0 │
└───┴───────────────┴──────────────────┴────────┴───────┴───────┘
Trainable params: 4.5 K                                                                                            
Non-trainable params: 0                                                                                            
Total params: 4.5 K                                                                                                
Total estimated model params size (MB): 0.018                                                                      
Modules in train mode: 7                                                                                           
Modules in eval mode: 0                                                                                            
Total FLOPs: 0                                                                                                     
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/lightning/pytorch/utilities/_pytree.py:21: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/rich/live.py:260: UserWarning: install 
"ipywidgets" for Jupyter support
  warnings.warn('install "ipywidgets" for Jupyter support')
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/lightning/pytorch/utilities/_pytree.py:21: `isinstance(treespec, LeafSpec)` is deprecated, use `isinstance(treespec, TreeSpec) and treespec.is_leaf()` instead.
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:434: The 'val_dataloader' does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` to `num_workers=3` in the `DataLoader` to improve performance.
`Trainer.fit` stopped: `max_epochs=5` reached.

logreg.plot_losses()
Hide code cell output
_images/57c969fd0a744a8c1b37849600e40be9598362c0fadd25bbc33777af358d37d4.svg
Final training loss: 3.2961
Final validation loss: 4.2149
logreg.plot_classification_report(adata)
Hide code cell output
Weighted F1: 0.098
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1879: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1879: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1879: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior.
  _warn_prf(average, modifier, f"{metric.capitalize()} is", result.shape[0])
_images/bf317ac90ef274e8fc1f1e07bdb95ea071d8ac02e638ee61fbbbe42220f50cda.svg

Get features scores of different methods

df_modlyn_logreg = logreg.get_weights()
df_modlyn_logreg.head()
Hide code cell output
gene_name PIM2 ECHS1 LINC03049 RPL27AP5 ENSG00000274769 ENSG00000277770 CTF1 Y_RNA-586 LINC01312 XRCC6P2 ... HMOX1 KRT8P28 ENSG00000271945 CHRND ADAM7-AS2 ENSG00000272384 IMP4 PSMC1P8 HOMER3 AIFM3
CVCL_0023 -0.422666 -0.506160 -0.002956 0.010464 0.007372 0.011887 -0.010289 0.011620 -0.039496 0.003184 ... -0.100679 0.003845 0.601916 0.000430 0.010069 -0.006843 -0.434854 -0.011490 0.435216 -0.060732
CVCL_0028 -0.095305 0.469816 -0.006349 -0.004729 -0.012226 0.004879 0.004470 0.010267 -0.019992 0.004431 ... -0.138809 -0.006756 0.000416 0.002522 0.009235 0.007154 -0.112344 -0.012179 -0.044331 0.007553
CVCL_0069 0.903953 -0.345842 -0.005748 0.005704 -0.009512 -0.002293 -0.011909 0.005523 -0.033314 0.008082 ... -0.307831 0.008610 -0.066037 -0.003863 0.006472 0.006525 -0.259674 -0.003985 -0.176322 -0.040104
CVCL_0099 -0.211742 -0.161015 -0.008330 -0.009837 -0.009997 -0.006892 0.018938 0.007052 -0.033342 -0.011921 ... -0.234590 0.008841 -0.021167 0.007888 -0.006830 -0.007106 -0.219199 0.009113 -0.061126 -0.009620
CVCL_0131 -0.042574 0.669554 0.005480 -0.005993 0.007165 -0.004007 0.001241 -0.010810 -0.021955 0.009477 ... -0.189909 0.009038 -0.206123 0.002917 -0.007139 0.011839 -0.582050 0.008407 -0.288258 -0.031270

5 rows × 100 columns

sc.tl.rank_genes_groups(adata, "cell_line", method="logreg", key_added="sc_logreg")
df_scanpy_logreg = sc.get.rank_genes_groups_df(
    adata, group=None, key="sc_logreg"
).pivot(index="group", columns="names", values="scores")
df_scanpy_logreg.attrs["method_name"] = "scanpy_logreg"
df_scanpy_logreg.head()
Hide code cell output
names ACOT9 ADAM7-AS2 AGGF1P9 AIFM3 ARHGAP23P1 ARID5A ATP5PB ATRIP BAG4 BLVRB ... RPL32P23 RPL7P6 SNORD115-2 TLDC2 TSPAN9 UBE2L3 UBE2V1P8 XRCC6P2 XXYLT1-AS2 Y_RNA-586
group
CVCL_0023 0.659618 0.0 0.0 -0.031030 0.0 0.231701 -0.597661 -0.293584 -0.548324 -0.266297 ... 0.0 0.0 0.0 -0.100346 -0.296451 -0.581786 0.0 0.0 -0.026877 0.0
CVCL_0028 -0.242723 0.0 0.0 -0.004131 0.0 -0.056369 -0.127508 -0.051344 -0.118967 -0.154228 ... 0.0 0.0 0.0 -0.009306 -0.237152 0.332722 0.0 0.0 -0.005290 0.0
CVCL_0069 -0.660634 0.0 0.0 -0.016867 0.0 -0.187452 -0.364053 0.430800 -0.362276 0.079544 ... 0.0 0.0 0.0 -0.029943 -0.612790 -0.662974 0.0 0.0 -0.017092 0.0
CVCL_0099 0.580846 0.0 0.0 -0.012110 0.0 -0.107890 -0.227720 1.138230 -0.206624 -0.275042 ... 0.0 0.0 0.0 -0.028184 -0.400412 -0.420857 0.0 0.0 -0.009776 0.0
CVCL_0131 1.401364 0.0 0.0 -0.031490 0.0 -0.405170 0.233426 0.091139 0.118451 -0.426097 ... 0.0 0.0 0.0 -0.241476 0.822093 -0.169690 0.0 0.0 -0.035441 0.0

5 rows × 100 columns

sc.tl.rank_genes_groups(adata, "cell_line", method="wilcoxon", key_added="sc_wilcoxon")
df_scanpy_wilcoxon = sc.get.rank_genes_groups_df(
    adata, group=None, key="sc_wilcoxon"
).pivot(index="group", columns="names", values="scores")
df_scanpy_wilcoxon.attrs["method_name"] = "scanpy_wilcoxon"
df_scanpy_wilcoxon.head()
Hide code cell output
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:459: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "names"] = self.var_names[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:461: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "scores"] = scores[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:464: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:474: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "pvals_adj"] = pvals_adj[global_indices]
/opt/hostedtoolcache/Python/3.12.13/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:485: PerformanceWarning: DataFrame is highly fragmented.  This is usually the result of calling `frame.insert` many times, which has poor performance.  Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
  self.stats[group_name, "logfoldchanges"] = np.log2(
names ACOT9 ADAM7-AS2 AGGF1P9 AIFM3 ARHGAP23P1 ARID5A ATP5PB ATRIP BAG4 BLVRB ... RPL32P23 RPL7P6 SNORD115-2 TLDC2 TSPAN9 UBE2L3 UBE2V1P8 XRCC6P2 XXYLT1-AS2 Y_RNA-586
group
CVCL_0023 0.332005 0.0 0.0 -0.018388 0.0 0.144039 -0.533252 -0.193074 -0.478088 -0.299997 ... 0.0 0.0 0.0 -0.045970 -0.571730 -0.687506 0.0 0.0 -0.018388 0.0
CVCL_0028 -0.409188 0.0 0.0 -0.006995 0.0 -0.073444 -0.202846 -0.073444 -0.181862 -0.241316 ... 0.0 0.0 0.0 -0.017487 -0.356728 0.466895 0.0 0.0 -0.006995 0.0
CVCL_0069 -0.796838 0.0 0.0 -0.013621 0.0 -0.143022 -0.395014 0.307384 -0.354150 -0.024064 ... 0.0 0.0 0.0 -0.034053 -0.694680 -0.755975 0.0 0.0 -0.013621 0.0
CVCL_0099 0.629415 0.0 0.0 -0.009912 0.0 -0.104077 -0.287449 1.125018 -0.257713 -0.341966 ... 0.0 0.0 0.0 -0.024780 -0.505515 -0.550119 0.0 0.0 -0.009912 0.0
CVCL_0131 2.103801 0.0 0.0 -0.022238 0.0 -0.233502 0.201855 0.049323 -0.014255 -0.467575 ... 0.0 0.0 0.0 -0.055596 1.118188 -0.118889 0.0 0.0 -0.022238 0.0

5 rows × 100 columns

Compare feature selection results

compare = mn.eval.CompareScoresJaccard(
    [df_modlyn_logreg, df_scanpy_logreg, df_scanpy_wilcoxon], n_top_values=[5, 10, 25]
)
compare.plot_heatmaps()
Hide code cell output
_images/4f77c975c9c4036f29cf0721f1d36e56b0d5a757d8292c6b1539f4f2b62d0d81.svg
compare.compute_jaccard_comparison()
compare.plot_jaccard_comparison()
Hide code cell output
_images/e813e6b637a22794c67dfa8febf2898820364e2fde4e170cdbc4c2793d603562.svg
ln.finish()
Hide code cell output
! calling anonymously, will miss private instances
 finished Run('mmhhkAv83GkVZtqc') after 29s at 2026-07-23 11:06:02 UTC