Comparing Modlyn & Scanpy feature selection methods

!pip install 'modlyn[dev]'
!lamin init --storage test-modlyn
Hide code cell output
Requirement already satisfied: modlyn[dev] in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (0.0.7)
Requirement already satisfied: anndata>=0.12.0rc1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (0.12.1)
Requirement already satisfied: scikit-learn in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (1.7.1)
Requirement already satisfied: matplotlib in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (3.10.5)
Requirement already satisfied: lightning in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (2.5.2)
Requirement already satisfied: lamindb[jupyter] in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (1.10.1)
Requirement already satisfied: seaborn in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (0.13.2)
Requirement already satisfied: scanpy in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (1.11.4)
Requirement already satisfied: pre-commit in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (4.2.0)
Requirement already satisfied: nox in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (2025.2.9)
Requirement already satisfied: pytest>=6.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (8.4.1)
Requirement already satisfied: pytest-cov in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from modlyn[dev]) (6.2.1)
Requirement already satisfied: nbproject_test in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.12.0)
Requirement already satisfied: h5py>=3.8 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (3.14.0)
Requirement already satisfied: legacy-api-wrap in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.4.1)
Requirement already satisfied: natsort in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (2.2.6)
Requirement already satisfied: packaging>=24.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (25.0)
Requirement already satisfied: pandas!=2.1.2,>=2.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (2.3.1)
Requirement already satisfied: scipy>=1.12 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (1.14.1)
Requirement already satisfied: zarr!=3.0.*,>=2.18.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anndata>=0.12.0rc1->modlyn[dev]) (3.1.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pandas!=2.1.2,>=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.11/x64/lib/python3.12/site-packages (from pandas!=2.1.2,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (2025.2)
Requirement already satisfied: tzdata>=2022.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pandas!=2.1.2,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (2025.2)
Requirement already satisfied: iniconfig>=1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pytest>=6.0->modlyn[dev]) (2.1.0)
Requirement already satisfied: pluggy<2,>=1.5 in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from pytest>=6.0->modlyn[dev]) (2.19.2)
Requirement already satisfied: six>=1.5 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas!=2.1.2,>=2.1.0->anndata>=0.12.0rc1->modlyn[dev]) (1.17.0)
Requirement already satisfied: donfig>=0.8 in /opt/hostedtoolcache/Python/3.12.11/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: numcodecs>=0.14 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from numcodecs[crc32c]>=0.14->zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (0.16.1)
Requirement already satisfied: typing-extensions>=4.9 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (4.14.1)
Requirement already satisfied: pyyaml in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from donfig>=0.8->zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (6.0.2)
Requirement already satisfied: crc32c>=2.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from numcodecs[crc32c]>=0.14->zarr!=3.0.*,>=2.18.7->anndata>=0.12.0rc1->modlyn[dev]) (2.7.1)
Requirement already satisfied: lamin_utils==0.15.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.15.0)
Requirement already satisfied: lamin_cli==1.6.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.6.1)
Requirement already satisfied: lamindb_setup==1.9.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.9.1)
Requirement already satisfied: pyarrow in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (21.0.0)
Requirement already satisfied: pandera>=0.24.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.25.0)
Requirement already satisfied: fsspec in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2025.3.2)
Requirement already satisfied: graphviz in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.21)
Requirement already satisfied: psycopg2-binary in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.9.10)
Requirement already satisfied: nbproject==0.11.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.11.1)
Requirement already satisfied: jupytext in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.17.2)
Requirement already satisfied: nbconvert>=7.2.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (7.16.6)
Requirement already satisfied: mistune!=3.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.1.3)
Requirement already satisfied: rich-click>=1.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamin_cli==1.6.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.8.9)
Requirement already satisfied: django<5.2,>=5.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.1.11)
Requirement already satisfied: dj_database_url<3.0.0,>=1.3.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.3.0)
Requirement already satisfied: pydantic-settings in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.10.1)
Requirement already satisfied: platformdirs<5.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.3.8)
Requirement already satisfied: requests in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.32.4)
Requirement already satisfied: universal_pathlib==0.2.6 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.2.6)
Requirement already satisfied: botocore<2.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.39.11)
Requirement already satisfied: supabase<=2.15.0,>=2.8.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.15.0)
Requirement already satisfied: gotrue<=2.12.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.12.0)
Requirement already satisfied: pyjwt<3.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.10.1)
Requirement already satisfied: psutil in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (7.0.0)
Requirement already satisfied: urllib3<2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.26.20)
Requirement already satisfied: aiobotocore<3.0.0,>=2.5.4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.24.0)
Requirement already satisfied: s3fs!=2024.10.0,<=2025.3.2,>=2023.12.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2025.3.2)
Requirement already satisfied: pydantic>=2.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.11.7)
Requirement already satisfied: orjson in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.11.1)
Requirement already satisfied: importlib-metadata in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (8.7.0)
Requirement already satisfied: aiohttp<4.0.0,>=3.9.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.12.15)
Requirement already satisfied: aioitertools<1.0.0,>=0.5.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.12.0)
Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.0.1)
Requirement already satisfied: multidict<7.0.0,>=6.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.6.3)
Requirement already satisfied: wrapt<2.0.0,>=1.10.10 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.17.2)
Requirement already satisfied: boto3<1.39.12,>=1.39.9 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.39.11)
Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.6.1)
Requirement already satisfied: aiosignal>=1.4.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.4.0)
Requirement already satisfied: attrs>=17.3.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (25.3.0)
Requirement already satisfied: frozenlist>=1.1.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.7.0)
Requirement already satisfied: propcache>=0.2.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.3.2)
Requirement already satisfied: yarl<2.0,>=1.17.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from aiohttp<4.0.0,>=3.9.2->aiobotocore<3.0.0,>=2.5.4->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.20.1)
Requirement already satisfied: s3transfer<0.14.0,>=0.13.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from boto3<1.39.12,>=1.39.9->aiobotocore[boto3]<3.0.0,>=2.5.4; extra == "aws"->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.13.1)
Requirement already satisfied: asgiref<4,>=3.8.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from django<5.2,>=5.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.9.1)
Requirement already satisfied: sqlparse>=0.3.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from django<5.2,>=5.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.3)
Requirement already satisfied: httpx<0.29,>=0.26 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.28.1)
Requirement already satisfied: pytest-mock<4.0.0,>=3.14.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.14.1)
Requirement already satisfied: anyio in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.10.0)
Requirement already satisfied: certifi in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2025.8.3)
Requirement already satisfied: httpcore==1.* in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.0.9)
Requirement already satisfied: idna in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.10)
Requirement already satisfied: h11>=0.16 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpcore==1.*->httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.16.0)
Requirement already satisfied: h2<5,>=3 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.2.0)
Requirement already satisfied: hyperframe<7,>=6.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from h2<5,>=3->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.1.0)
Requirement already satisfied: hpack<5,>=4.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from h2<5,>=3->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.1.0)
Requirement already satisfied: annotated-types>=0.6.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.7.0)
Requirement already satisfied: pydantic-core==2.33.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.33.2)
Requirement already satisfied: typing-inspection>=0.4.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pydantic>=2.0.0->nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.4.1)
Requirement already satisfied: postgrest<1.1,>0.19 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.0.2)
Requirement already satisfied: realtime<2.5.0,>=2.4.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.4.3)
Requirement already satisfied: storage3<0.12,>=0.10 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.11.3)
Requirement already satisfied: supafunc<0.10,>=0.9 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.9.4)
Requirement already satisfied: deprecation<3.0.0,>=2.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from postgrest<1.1,>0.19->supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.1.0)
Requirement already satisfied: websockets<15,>=11 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from realtime<2.5.0,>=2.4.0->supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (14.2)
Requirement already satisfied: strenum<0.5.0,>=0.4.15 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from supafunc<0.10,>=0.9->supabase<=2.15.0,>=2.8.1->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.4.15)
Requirement already satisfied: beautifulsoup4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.13.4)
Requirement already satisfied: bleach!=5.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.2.0)
Requirement already satisfied: defusedxml in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.7.1)
Requirement already satisfied: jinja2>=3.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.1.6)
Requirement already satisfied: jupyter-core>=4.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.8.1)
Requirement already satisfied: jupyterlab-pygments in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.3.0)
Requirement already satisfied: markupsafe>=2.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.0.2)
Requirement already satisfied: nbclient>=0.5.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.10.2)
Requirement already satisfied: nbformat>=5.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.10.4)
Requirement already satisfied: pandocfilters>=1.4.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.5.1)
Requirement already satisfied: traitlets>=5.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (5.14.3)
Requirement already satisfied: webencodings in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.5.1)
Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from bleach[css]!=5.0.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.4.0)
Requirement already satisfied: jupyter-client>=6.1.12 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbclient>=0.5.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (8.6.3)
Requirement already satisfied: pyzmq>=23.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (27.0.1)
Requirement already satisfied: tornado>=6.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jupyter-client>=6.1.12->nbclient>=0.5.0->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (6.5.2)
Requirement already satisfied: fastjsonschema>=2.15 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbformat>=5.7->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.21.1)
Requirement already satisfied: jsonschema>=2.6 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbformat>=5.7->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.25.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2025.4.1)
Requirement already satisfied: referencing>=0.28.4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jsonschema>=2.6->nbformat>=5.7->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.27.0)
Requirement already satisfied: typeguard in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pandera>=0.24.0->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (4.4.4)
Requirement already satisfied: typing_inspect>=0.6.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pandera>=0.24.0->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.9.0)
Requirement already satisfied: click>=7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from rich-click>=1.7->lamin_cli==1.6.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (8.2.1)
Requirement already satisfied: rich>=10.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from rich-click>=1.7->lamin_cli==1.6.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (14.1.0)
Requirement already satisfied: markdown-it-py>=2.2.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from rich>=10.7->rich-click>=1.7->lamin_cli==1.6.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.0.0)
Requirement already satisfied: mdurl~=0.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from markdown-it-py>=2.2.0->rich>=10.7->rich-click>=1.7->lamin_cli==1.6.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.1.2)
Requirement already satisfied: mypy-extensions>=0.3.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from typing_inspect>=0.6.0->pandera>=0.24.0->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.1.0)
Requirement already satisfied: sniffio>=1.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from anyio->httpx<0.29,>=0.26->httpx[http2]<0.29,>=0.26->gotrue<=2.12.0->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.3.1)
Requirement already satisfied: soupsieve>1.2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from beautifulsoup4->nbconvert>=7.2.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (2.7)
Requirement already satisfied: zipp>=3.20 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from importlib-metadata->nbproject==0.11.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.23.0)
Requirement already satisfied: mdit-py-plugins in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jupytext->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (0.4.2)
Requirement already satisfied: lightning-utilities<2.0,>=0.10.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (0.15.2)
Requirement already satisfied: torch<4.0,>=2.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (2.8.0)
Requirement already satisfied: torchmetrics<3.0,>=0.7.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (1.8.1)
Requirement already satisfied: tqdm<6.0,>=4.57.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (4.67.1)
Requirement already satisfied: pytorch-lightning in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning->modlyn[dev]) (2.5.2)
Requirement already satisfied: setuptools in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from lightning-utilities<2.0,>=0.10.0->lightning->modlyn[dev]) (80.9.0)
Requirement already satisfied: filelock in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.18.0)
Requirement already satisfied: sympy>=1.13.3 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.14.0)
Requirement already satisfied: networkx in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.5)
Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.8.93 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.93)
Requirement already satisfied: nvidia-cuda-runtime-cu12==12.8.90 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.90)
Requirement already satisfied: nvidia-cuda-cupti-cu12==12.8.90 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.90)
Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (9.10.2.21)
Requirement already satisfied: nvidia-cublas-cu12==12.8.4.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.4.1)
Requirement already satisfied: nvidia-cufft-cu12==11.3.3.83 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (11.3.3.83)
Requirement already satisfied: nvidia-curand-cu12==10.3.9.90 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (10.3.9.90)
Requirement already satisfied: nvidia-cusolver-cu12==11.7.3.90 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (11.7.3.90)
Requirement already satisfied: nvidia-cusparse-cu12==12.5.8.93 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.5.8.93)
Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (0.7.1)
Requirement already satisfied: nvidia-nccl-cu12==2.27.3 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (2.27.3)
Requirement already satisfied: nvidia-nvtx-cu12==12.8.90 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.90)
Requirement already satisfied: nvidia-nvjitlink-cu12==12.8.93 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (12.8.93)
Requirement already satisfied: nvidia-cufile-cu12==1.13.1.3 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (1.13.1.3)
Requirement already satisfied: triton==3.4.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from torch<4.0,>=2.1.0->lightning->modlyn[dev]) (3.4.0)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/hostedtoolcache/Python/3.12.11/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: contourpy>=1.0.1 in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (4.59.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (1.4.8)
Requirement already satisfied: pillow>=8 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (11.3.0)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from matplotlib->modlyn[dev]) (3.2.3)
Requirement already satisfied: ipykernel in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nbproject_test->modlyn[dev]) (6.30.1)
Requirement already satisfied: comm>=0.1.1 in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (1.8.16)
Requirement already satisfied: ipython>=7.23.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (9.4.0)
Requirement already satisfied: matplotlib-inline>=0.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (0.1.7)
Requirement already satisfied: nest-asyncio>=1.4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipykernel->nbproject_test->modlyn[dev]) (1.6.0)
Requirement already satisfied: decorator in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (5.2.1)
Requirement already satisfied: ipython-pygments-lexers in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (1.1.1)
Requirement already satisfied: jedi>=0.16 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.19.2)
Requirement already satisfied: pexpect>4.3 in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (3.0.51)
Requirement already satisfied: stack_data in /opt/hostedtoolcache/Python/3.12.11/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.11/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.2.13)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.8.4)
Requirement already satisfied: ptyprocess>=0.5 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.7.0)
Requirement already satisfied: argcomplete<4,>=1.9.4 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (3.6.2)
Requirement already satisfied: colorlog<7,>=2.6.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (6.9.0)
Requirement already satisfied: dependency-groups>=1.1 in /opt/hostedtoolcache/Python/3.12.11/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.11/x64/lib/python3.12/site-packages (from nox->modlyn[dev]) (20.33.1)
Requirement already satisfied: distlib<1,>=0.3.7 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from virtualenv>=20.14.1->nox->modlyn[dev]) (0.4.0)
Requirement already satisfied: cfgv>=2.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (3.4.0)
Requirement already satisfied: identify>=1.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (2.6.12)
Requirement already satisfied: nodeenv>=0.11.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pre-commit->modlyn[dev]) (1.9.1)
Requirement already satisfied: python-dotenv>=0.21.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from pydantic-settings->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (1.1.1)
Requirement already satisfied: coverage>=7.5 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from coverage[toml]>=7.5->pytest-cov->modlyn[dev]) (7.10.2)
Requirement already satisfied: charset_normalizer<4,>=2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from requests->lamindb_setup==1.9.1->lamindb_setup[aws]==1.9.1->lamindb[jupyter]; extra == "dev"->modlyn[dev]) (3.4.2)
Requirement already satisfied: joblib in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (1.5.1)
Requirement already satisfied: numba>=0.57.1 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (0.61.2)
Requirement already satisfied: patsy!=1.0.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (1.0.1)
Requirement already satisfied: pynndescent>=0.5.13 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (0.5.13)
Requirement already satisfied: session-info2 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (0.2)
Requirement already satisfied: statsmodels>=0.14.5 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (0.14.5)
Requirement already satisfied: umap-learn>=0.5.6 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scanpy->modlyn[dev]) (0.5.9.post2)
Requirement already satisfied: llvmlite<0.45,>=0.44.0dev0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from numba>=0.57.1->scanpy->modlyn[dev]) (0.44.0)
Requirement already satisfied: threadpoolctl>=3.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from scikit-learn->modlyn[dev]) (3.6.0)
Requirement already satisfied: executing>=1.2.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from stack_data->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (2.2.0)
Requirement already satisfied: asttokens>=2.1.0 in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from stack_data->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (3.0.0)
Requirement already satisfied: pure-eval in /opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages (from stack_data->ipython>=7.23.1->ipykernel->nbproject_test->modlyn[dev]) (0.2.3)
[notice] A new release of pip is available: 25.1.1 -> 25.2
[notice] To update, run: pip install --upgrade pip
 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('55qk0w1DOg3p0000'), started new Run('n927L9ET...') at 2025-08-08 19:40:54 UTC
 notebook imports: lamindb==1.10.1 modlyn==0.0.7 pandas==2.3.1 scanpy==1.11.4 seaborn==0.13.2
 recommendation: to identify the notebook across renames, pass the uid: ln.track("55qk0w1DOg3p")

Prepare dataset

artifact = ln.Artifact.using("laminlabs/arrayloader-benchmarks").get("JNaxQe8zbljesdbK0000")
adata = artifact.load()
sc.pp.log1p(adata)
adata
Hide code cell output
 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
💡 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.
GPU available: False, used: False
TPU available: False, using: 0 TPU cores
HPU available: False, using: 0 HPUs
/opt/hostedtoolcache/Python/3.12.11/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

  | Name          | Type             | Params | Mode 
-----------------------------------------------------------
0 | linear        | Linear           | 4.5 K  | train
1 | train_metrics | MetricCollection | 0      | train
2 | val_metrics   | MetricCollection | 0      | train
-----------------------------------------------------------
4.5 K     Trainable params
0         Non-trainable params
4.5 K     Total params
0.018     Total estimated model params size (MB)
7         Modules in train mode
0         Modules in eval mode
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/lightning/pytorch/trainer/connectors/data_connector.py:425: 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.
Training: |          | 0/? [00:00<?, ?it/s]
Training:   0%|          | 0/7 [00:00<?, ?it/s]
Epoch 0:   0%|          | 0/7 [00:00<?, ?it/s] 
Epoch 0:  14%|█▍        | 1/7 [00:00<00:00, 29.28it/s]
Epoch 0:  14%|█▍        | 1/7 [00:00<00:00, 28.22it/s, v_num=0]
Epoch 0:  29%|██▊       | 2/7 [00:00<00:00, 42.72it/s, v_num=0]
Epoch 0:  29%|██▊       | 2/7 [00:00<00:00, 41.62it/s, v_num=0]
Epoch 0:  43%|████▎     | 3/7 [00:00<00:00, 51.36it/s, v_num=0]
Epoch 0:  43%|████▎     | 3/7 [00:00<00:00, 50.38it/s, v_num=0]
Epoch 0:  57%|█████▋    | 4/7 [00:00<00:00, 60.29it/s, v_num=0]
Epoch 0:  57%|█████▋    | 4/7 [00:00<00:00, 59.52it/s, v_num=0]
Epoch 0:  71%|███████▏  | 5/7 [00:00<00:00, 67.48it/s, v_num=0]
Epoch 0:  71%|███████▏  | 5/7 [00:00<00:00, 66.67it/s, v_num=0]
Epoch 0:  86%|████████▌ | 6/7 [00:00<00:00, 72.49it/s, v_num=0]
Epoch 0:  86%|████████▌ | 6/7 [00:00<00:00, 71.71it/s, v_num=0]
Epoch 0: 100%|██████████| 7/7 [00:00<00:00, 76.14it/s, v_num=0]
Epoch 0: 100%|██████████| 7/7 [00:00<00:00, 75.41it/s, v_num=0]

Validation: |          | 0/? [00:00<?, ?it/s]


Validation:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   5%|▌         | 1/20 [00:00<00:00, 91.77it/s]


Validation DataLoader 0:  10%|█         | 2/20 [00:00<00:00, 113.92it/s]


Validation DataLoader 0:  15%|█▌        | 3/20 [00:00<00:00, 121.48it/s]


Validation DataLoader 0:  20%|██        | 4/20 [00:00<00:00, 126.94it/s]


Validation DataLoader 0:  25%|██▌       | 5/20 [00:00<00:00, 129.26it/s]


Validation DataLoader 0:  30%|███       | 6/20 [00:00<00:00, 130.69it/s]


Validation DataLoader 0:  35%|███▌      | 7/20 [00:00<00:00, 131.67it/s]


Validation DataLoader 0:  40%|████      | 8/20 [00:00<00:00, 133.32it/s]


Validation DataLoader 0:  45%|████▌     | 9/20 [00:00<00:00, 133.97it/s]


Validation DataLoader 0:  50%|█████     | 10/20 [00:00<00:00, 135.12it/s]


Validation DataLoader 0:  55%|█████▌    | 11/20 [00:00<00:00, 136.12it/s]


Validation DataLoader 0:  60%|██████    | 12/20 [00:00<00:00, 136.78it/s]


Validation DataLoader 0:  65%|██████▌   | 13/20 [00:00<00:00, 137.09it/s]


Validation DataLoader 0:  70%|███████   | 14/20 [00:00<00:00, 137.15it/s]


Validation DataLoader 0:  75%|███████▌  | 15/20 [00:00<00:00, 137.25it/s]


Validation DataLoader 0:  80%|████████  | 16/20 [00:00<00:00, 137.55it/s]


Validation DataLoader 0:  85%|████████▌ | 17/20 [00:00<00:00, 138.02it/s]


Validation DataLoader 0:  90%|█████████ | 18/20 [00:00<00:00, 138.36it/s]


Validation DataLoader 0:  95%|█████████▌| 19/20 [00:00<00:00, 138.48it/s]


Validation DataLoader 0: 100%|██████████| 20/20 [00:00<00:00, 138.52it/s]


                                                                         

Epoch 0: 100%|██████████| 7/7 [00:00<00:00, 27.48it/s, v_num=0]
Epoch 0: 100%|██████████| 7/7 [00:00<00:00, 27.24it/s, v_num=0]
Epoch 0:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]        
Epoch 1:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]
Epoch 1:  14%|█▍        | 1/7 [00:00<00:00,  9.17it/s, v_num=0]
Epoch 1:  14%|█▍        | 1/7 [00:00<00:00,  8.87it/s, v_num=0]
Epoch 1:  29%|██▊       | 2/7 [00:00<00:00, 16.18it/s, v_num=0]
Epoch 1:  29%|██▊       | 2/7 [00:00<00:00, 16.06it/s, v_num=0]
Epoch 1:  43%|████▎     | 3/7 [00:00<00:00, 22.12it/s, v_num=0]
Epoch 1:  43%|████▎     | 3/7 [00:00<00:00, 21.97it/s, v_num=0]
Epoch 1:  57%|█████▋    | 4/7 [00:00<00:00, 27.83it/s, v_num=0]
Epoch 1:  57%|█████▋    | 4/7 [00:00<00:00, 27.60it/s, v_num=0]
Epoch 1:  71%|███████▏  | 5/7 [00:00<00:00, 32.93it/s, v_num=0]
Epoch 1:  71%|███████▏  | 5/7 [00:00<00:00, 32.71it/s, v_num=0]
Epoch 1:  86%|████████▌ | 6/7 [00:00<00:00, 37.28it/s, v_num=0]
Epoch 1:  86%|████████▌ | 6/7 [00:00<00:00, 37.01it/s, v_num=0]
Epoch 1: 100%|██████████| 7/7 [00:00<00:00, 41.03it/s, v_num=0]
Epoch 1: 100%|██████████| 7/7 [00:00<00:00, 40.81it/s, v_num=0]

Validation: |          | 0/? [00:00<?, ?it/s]


Validation:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   5%|▌         | 1/20 [00:00<00:00, 94.77it/s]


Validation DataLoader 0:  10%|█         | 2/20 [00:00<00:00, 115.23it/s]


Validation DataLoader 0:  15%|█▌        | 3/20 [00:00<00:00, 124.18it/s]


Validation DataLoader 0:  20%|██        | 4/20 [00:00<00:00, 129.09it/s]


Validation DataLoader 0:  25%|██▌       | 5/20 [00:00<00:00, 132.27it/s]


Validation DataLoader 0:  30%|███       | 6/20 [00:00<00:00, 134.21it/s]


Validation DataLoader 0:  35%|███▌      | 7/20 [00:00<00:00, 134.79it/s]


Validation DataLoader 0:  40%|████      | 8/20 [00:00<00:00, 134.96it/s]


Validation DataLoader 0:  45%|████▌     | 9/20 [00:00<00:00, 135.13it/s]


Validation DataLoader 0:  50%|█████     | 10/20 [00:00<00:00, 135.26it/s]


Validation DataLoader 0:  55%|█████▌    | 11/20 [00:00<00:00, 136.25it/s]


Validation DataLoader 0:  60%|██████    | 12/20 [00:00<00:00, 137.25it/s]


Validation DataLoader 0:  65%|██████▌   | 13/20 [00:00<00:00, 136.89it/s]


Validation DataLoader 0:  70%|███████   | 14/20 [00:00<00:00, 137.39it/s]


Validation DataLoader 0:  75%|███████▌  | 15/20 [00:00<00:00, 137.66it/s]


Validation DataLoader 0:  80%|████████  | 16/20 [00:00<00:00, 138.00it/s]


Validation DataLoader 0:  85%|████████▌ | 17/20 [00:00<00:00, 137.96it/s]


Validation DataLoader 0:  90%|█████████ | 18/20 [00:00<00:00, 138.07it/s]


Validation DataLoader 0:  95%|█████████▌| 19/20 [00:00<00:00, 138.63it/s]


Validation DataLoader 0: 100%|██████████| 20/20 [00:00<00:00, 138.96it/s]


                                                                         

Epoch 1: 100%|██████████| 7/7 [00:00<00:00, 21.22it/s, v_num=0]
Epoch 1: 100%|██████████| 7/7 [00:00<00:00, 21.06it/s, v_num=0]
Epoch 1:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]        
Epoch 2:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]
Epoch 2:  14%|█▍        | 1/7 [00:00<00:00,  9.13it/s, v_num=0]
Epoch 2:  14%|█▍        | 1/7 [00:00<00:00,  8.84it/s, v_num=0]
Epoch 2:  29%|██▊       | 2/7 [00:00<00:00, 16.05it/s, v_num=0]
Epoch 2:  29%|██▊       | 2/7 [00:00<00:00, 15.93it/s, v_num=0]
Epoch 2:  43%|████▎     | 3/7 [00:00<00:00, 21.71it/s, v_num=0]
Epoch 2:  43%|████▎     | 3/7 [00:00<00:00, 21.51it/s, v_num=0]
Epoch 2:  57%|█████▋    | 4/7 [00:00<00:00, 26.98it/s, v_num=0]
Epoch 2:  57%|█████▋    | 4/7 [00:00<00:00, 26.82it/s, v_num=0]
Epoch 2:  71%|███████▏  | 5/7 [00:00<00:00, 31.59it/s, v_num=0]
Epoch 2:  71%|███████▏  | 5/7 [00:00<00:00, 31.43it/s, v_num=0]
Epoch 2:  86%|████████▌ | 6/7 [00:00<00:00, 35.59it/s, v_num=0]
Epoch 2:  86%|████████▌ | 6/7 [00:00<00:00, 35.41it/s, v_num=0]
Epoch 2: 100%|██████████| 7/7 [00:00<00:00, 38.95it/s, v_num=0]
Epoch 2: 100%|██████████| 7/7 [00:00<00:00, 38.77it/s, v_num=0]

Validation: |          | 0/? [00:00<?, ?it/s]


Validation:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   5%|▌         | 1/20 [00:00<00:00, 93.02it/s]


Validation DataLoader 0:  10%|█         | 2/20 [00:00<00:00, 111.08it/s]


Validation DataLoader 0:  15%|█▌        | 3/20 [00:00<00:00, 119.64it/s]


Validation DataLoader 0:  20%|██        | 4/20 [00:00<00:00, 123.19it/s]


Validation DataLoader 0:  25%|██▌       | 5/20 [00:00<00:00, 125.66it/s]


Validation DataLoader 0:  30%|███       | 6/20 [00:00<00:00, 127.33it/s]


Validation DataLoader 0:  35%|███▌      | 7/20 [00:00<00:00, 128.65it/s]


Validation DataLoader 0:  40%|████      | 8/20 [00:00<00:00, 129.79it/s]


Validation DataLoader 0:  45%|████▌     | 9/20 [00:00<00:00, 130.69it/s]


Validation DataLoader 0:  50%|█████     | 10/20 [00:00<00:00, 131.17it/s]


Validation DataLoader 0:  55%|█████▌    | 11/20 [00:00<00:00, 131.48it/s]


Validation DataLoader 0:  60%|██████    | 12/20 [00:00<00:00, 131.88it/s]


Validation DataLoader 0:  65%|██████▌   | 13/20 [00:00<00:00, 131.95it/s]


Validation DataLoader 0:  70%|███████   | 14/20 [00:00<00:00, 132.29it/s]


Validation DataLoader 0:  75%|███████▌  | 15/20 [00:00<00:00, 132.07it/s]


Validation DataLoader 0:  80%|████████  | 16/20 [00:00<00:00, 132.65it/s]


Validation DataLoader 0:  85%|████████▌ | 17/20 [00:00<00:00, 133.10it/s]


Validation DataLoader 0:  90%|█████████ | 18/20 [00:00<00:00, 133.72it/s]


Validation DataLoader 0:  95%|█████████▌| 19/20 [00:00<00:00, 133.86it/s]


Validation DataLoader 0: 100%|██████████| 20/20 [00:00<00:00, 134.20it/s]


                                                                         

Epoch 2: 100%|██████████| 7/7 [00:00<00:00, 20.32it/s, v_num=0]
Epoch 2: 100%|██████████| 7/7 [00:00<00:00, 20.19it/s, v_num=0]
Epoch 2:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]        
Epoch 3:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]
Epoch 3:  14%|█▍        | 1/7 [00:00<00:00,  8.43it/s, v_num=0]
Epoch 3:  14%|█▍        | 1/7 [00:00<00:00,  8.21it/s, v_num=0]
Epoch 3:  29%|██▊       | 2/7 [00:00<00:00, 15.12it/s, v_num=0]
Epoch 3:  29%|██▊       | 2/7 [00:00<00:00, 15.02it/s, v_num=0]
Epoch 3:  43%|████▎     | 3/7 [00:00<00:00, 21.07it/s, v_num=0]
Epoch 3:  43%|████▎     | 3/7 [00:00<00:00, 20.95it/s, v_num=0]
Epoch 3:  57%|█████▋    | 4/7 [00:00<00:00, 25.85it/s, v_num=0]
Epoch 3:  57%|█████▋    | 4/7 [00:00<00:00, 25.71it/s, v_num=0]
Epoch 3:  71%|███████▏  | 5/7 [00:00<00:00, 30.35it/s, v_num=0]
Epoch 3:  71%|███████▏  | 5/7 [00:00<00:00, 30.20it/s, v_num=0]
Epoch 3:  86%|████████▌ | 6/7 [00:00<00:00, 34.34it/s, v_num=0]
Epoch 3:  86%|████████▌ | 6/7 [00:00<00:00, 34.16it/s, v_num=0]
Epoch 3: 100%|██████████| 7/7 [00:00<00:00, 37.90it/s, v_num=0]
Epoch 3: 100%|██████████| 7/7 [00:00<00:00, 37.71it/s, v_num=0]

Validation: |          | 0/? [00:00<?, ?it/s]


Validation:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   5%|▌         | 1/20 [00:00<00:00, 99.71it/s]


Validation DataLoader 0:  10%|█         | 2/20 [00:00<00:00, 118.56it/s]


Validation DataLoader 0:  15%|█▌        | 3/20 [00:00<00:00, 125.78it/s]


Validation DataLoader 0:  20%|██        | 4/20 [00:00<00:00, 130.19it/s]


Validation DataLoader 0:  25%|██▌       | 5/20 [00:00<00:00, 133.24it/s]


Validation DataLoader 0:  30%|███       | 6/20 [00:00<00:00, 135.32it/s]


Validation DataLoader 0:  35%|███▌      | 7/20 [00:00<00:00, 136.51it/s]


Validation DataLoader 0:  40%|████      | 8/20 [00:00<00:00, 136.82it/s]


Validation DataLoader 0:  45%|████▌     | 9/20 [00:00<00:00, 136.98it/s]


Validation DataLoader 0:  50%|█████     | 10/20 [00:00<00:00, 137.25it/s]


Validation DataLoader 0:  55%|█████▌    | 11/20 [00:00<00:00, 137.14it/s]


Validation DataLoader 0:  60%|██████    | 12/20 [00:00<00:00, 137.70it/s]


Validation DataLoader 0:  65%|██████▌   | 13/20 [00:00<00:00, 137.86it/s]


Validation DataLoader 0:  70%|███████   | 14/20 [00:00<00:00, 137.94it/s]


Validation DataLoader 0:  75%|███████▌  | 15/20 [00:00<00:00, 138.03it/s]


Validation DataLoader 0:  80%|████████  | 16/20 [00:00<00:00, 137.61it/s]


Validation DataLoader 0:  85%|████████▌ | 17/20 [00:00<00:00, 138.22it/s]


Validation DataLoader 0:  90%|█████████ | 18/20 [00:00<00:00, 138.18it/s]


Validation DataLoader 0:  95%|█████████▌| 19/20 [00:00<00:00, 138.30it/s]


Validation DataLoader 0: 100%|██████████| 20/20 [00:00<00:00, 138.67it/s]


                                                                         

Epoch 3: 100%|██████████| 7/7 [00:00<00:00, 20.24it/s, v_num=0]
Epoch 3: 100%|██████████| 7/7 [00:00<00:00, 20.14it/s, v_num=0]
Epoch 3:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]        
Epoch 4:   0%|          | 0/7 [00:00<?, ?it/s, v_num=0]
Epoch 4:  14%|█▍        | 1/7 [00:00<00:00,  8.88it/s, v_num=0]
Epoch 4:  14%|█▍        | 1/7 [00:00<00:00,  8.63it/s, v_num=0]
Epoch 4:  29%|██▊       | 2/7 [00:00<00:00, 15.58it/s, v_num=0]
Epoch 4:  29%|██▊       | 2/7 [00:00<00:00, 15.48it/s, v_num=0]
Epoch 4:  43%|████▎     | 3/7 [00:00<00:00, 21.28it/s, v_num=0]
Epoch 4:  43%|████▎     | 3/7 [00:00<00:00, 21.14it/s, v_num=0]
Epoch 4:  57%|█████▋    | 4/7 [00:00<00:00, 26.02it/s, v_num=0]
Epoch 4:  57%|█████▋    | 4/7 [00:00<00:00, 25.87it/s, v_num=0]
Epoch 4:  71%|███████▏  | 5/7 [00:00<00:00, 30.54it/s, v_num=0]
Epoch 4:  71%|███████▏  | 5/7 [00:00<00:00, 30.35it/s, v_num=0]
Epoch 4:  86%|████████▌ | 6/7 [00:00<00:00, 34.50it/s, v_num=0]
Epoch 4:  86%|████████▌ | 6/7 [00:00<00:00, 34.34it/s, v_num=0]
Epoch 4: 100%|██████████| 7/7 [00:00<00:00, 38.09it/s, v_num=0]
Epoch 4: 100%|██████████| 7/7 [00:00<00:00, 37.80it/s, v_num=0]

Validation: |          | 0/? [00:00<?, ?it/s]


Validation:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   0%|          | 0/20 [00:00<?, ?it/s]


Validation DataLoader 0:   5%|▌         | 1/20 [00:00<00:00, 98.77it/s]


Validation DataLoader 0:  10%|█         | 2/20 [00:00<00:00, 117.85it/s]


Validation DataLoader 0:  15%|█▌        | 3/20 [00:00<00:00, 125.98it/s]


Validation DataLoader 0:  20%|██        | 4/20 [00:00<00:00, 130.84it/s]


Validation DataLoader 0:  25%|██▌       | 5/20 [00:00<00:00, 133.41it/s]


Validation DataLoader 0:  30%|███       | 6/20 [00:00<00:00, 135.46it/s]


Validation DataLoader 0:  35%|███▌      | 7/20 [00:00<00:00, 136.15it/s]


Validation DataLoader 0:  40%|████      | 8/20 [00:00<00:00, 135.77it/s]


Validation DataLoader 0:  45%|████▌     | 9/20 [00:00<00:00, 137.20it/s]


Validation DataLoader 0:  50%|█████     | 10/20 [00:00<00:00, 137.88it/s]


Validation DataLoader 0:  55%|█████▌    | 11/20 [00:00<00:00, 138.64it/s]


Validation DataLoader 0:  60%|██████    | 12/20 [00:00<00:00, 139.06it/s]


Validation DataLoader 0:  65%|██████▌   | 13/20 [00:00<00:00, 139.58it/s]


Validation DataLoader 0:  70%|███████   | 14/20 [00:00<00:00, 140.04it/s]


Validation DataLoader 0:  75%|███████▌  | 15/20 [00:00<00:00, 140.47it/s]


Validation DataLoader 0:  80%|████████  | 16/20 [00:00<00:00, 140.44it/s]


Validation DataLoader 0:  85%|████████▌ | 17/20 [00:00<00:00, 140.15it/s]


Validation DataLoader 0:  90%|█████████ | 18/20 [00:00<00:00, 139.73it/s]


Validation DataLoader 0:  95%|█████████▌| 19/20 [00:00<00:00, 139.53it/s]


Validation DataLoader 0: 100%|██████████| 20/20 [00:00<00:00, 139.46it/s]


                                                                         

Epoch 4: 100%|██████████| 7/7 [00:00<00:00, 20.45it/s, v_num=0]
Epoch 4: 100%|██████████| 7/7 [00:00<00:00, 20.30it/s, v_num=0]
`Trainer.fit` stopped: `max_epochs=5` reached.
Epoch 4: 100%|██████████| 7/7 [00:00<00:00, 19.89it/s, v_num=0]

logreg.plot_losses()
Hide code cell output
_images/b9136d63c02c1da96ed21db6e4aaa7d8677690f5e278f69db4094c4647efecb7.svg
Final training loss: 3.2953
Final validation loss: 4.2238
logreg.plot_classification_report(adata)
Hide code cell output
Weighted F1: 0.097
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1731: 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.11/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1731: 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.11/x64/lib/python3.12/site-packages/sklearn/metrics/_classification.py:1731: 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/db79c97531da9ceda9b0042b78a5063fdf0eed7644d47599c2c034fbae425e5f.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 KMT2E-AS1 TSPAN9 ENSG00000286107 ENSG00000258854 DPY19L2P3-1 ENSG00000261018 SNORD115-2 ENSG00000264272 ENSG00000280206 ENSG00000267005 UBE2V1P8 FREM1 HNRNPA1P67 BAG4 ENSG00000284823 RN7SL440P EFHC2 ACOT9 LINC03038 OR5BN1P TLDC2 MTND2P14 DEFA5 PANCR MIR34B PPP1R2P6 ARHGAP23P1 ENPP7P8 RNA5SP333 CENPIP1 ENSG00000287269 ATRIP GOLGA6A PDZRN4 MIR452 ENSG00000289747 CA10 UBE2L3 HHATL RNU4-20P XXYLT1-AS2 RPL32P23 GRIK5 NIPA1 ENSG00000286637 RIOK3P1 RANP2 HDAC3 ENSG00000287195 ARID5A ENSG00000286681 ENSG00000258193 ENSG00000272905 ENSG00000212517 PARD6BP1 RNU6-679P RBM22P13 MRPL53 KCNK15-AS1 ENSG00000276884 ENSG00000291051 ENSG00000251490 AGGF1P9 MTND4P28 CCDC110 ENSG00000255368 ENSG00000236951 BLVRB ENSG00000278384 ENSG00000228776 ENSG00000272729 ENSG00000286587 LINC01100 RNU6-307P RPL7P6 ENSG00000248452 ATP5PB DEFB104A MIR924 MTND1P1 HMOX1 KRT8P28 ENSG00000271945 CHRND ADAM7-AS2 ENSG00000272384 IMP4 PSMC1P8 HOMER3 AIFM3
CVCL_0023 -0.453627 -0.502124 0.011681 -0.011156 -0.000428 -0.011572 -0.011624 0.002538 -0.034436 -0.012284 -0.144380 -0.373645 -0.000544 -0.001643 0.006187 -0.020195 0.005537 0.005944 -0.006701 -0.005201 -0.009142 -0.050585 0.003897 -0.484655 -0.006089 0.009232 0.006400 0.667398 -0.006657 0.011793 -0.126557 0.002780 -0.001410 0.000207 -0.011643 0.009486 -0.007088 -0.051778 -0.011786 -0.011574 -0.091228 -0.285022 0.011762 -0.039460 -0.011757 -0.011103 -0.086163 -0.721944 -0.004854 0.007019 -0.039534 -0.011382 -0.059938 -0.610395 -0.001220 -0.004768 0.011171 -0.130513 -0.068391 0.318157 -0.135277 -0.008863 -0.026277 -0.002987 0.004179 -0.009505 0.011694 0.005893 -0.184948 0.006944 -0.073348 0.001137 0.000748 -0.001643 0.001275 -0.005333 0.005282 -0.333182 -0.057192 0.011843 -0.001990 -0.024727 0.007155 0.006887 0.007225 0.007221 -0.571135 -0.007186 -0.005410 -0.011872 -0.097064 -0.006911 0.602242 -0.009134 0.007001 0.010231 -0.422177 -0.002167 0.442696 -0.036608
CVCL_0028 -0.103486 0.467020 -0.001893 0.012262 -0.007204 0.005271 0.017506 -0.007233 -0.011402 0.007452 -0.002406 -0.156218 -0.008758 0.003833 -0.010388 0.009991 -0.008790 -0.009918 -0.010328 0.002676 -0.004769 -0.030305 -0.011564 -0.192224 0.011818 -0.003940 -0.008772 -0.194055 -0.010748 -0.008962 -0.022489 0.009393 -0.007488 0.011629 -0.007087 -0.008689 -0.007220 -0.015417 0.002362 -0.009804 -0.026573 -0.127363 -0.007293 -0.022104 -0.006912 0.008371 -0.002700 0.205036 -0.011833 0.009870 -0.010610 0.009265 -0.017908 -0.127472 -0.008550 0.009871 -0.000356 -0.120536 -0.018070 -0.054115 -0.021620 0.005197 -0.005779 0.005812 -0.006162 0.006612 0.002059 0.003534 -0.022918 -0.000239 0.003765 0.003216 -0.010915 -0.002797 -0.012353 0.007046 0.006933 -0.094036 -0.010533 -0.006179 0.011509 0.001350 -0.012223 0.008688 0.005474 0.006062 -0.122740 0.004154 -0.006280 -0.002348 -0.093033 -0.006055 -0.023499 -0.008912 -0.002328 -0.001407 -0.168056 0.000471 -0.031850 -0.026672
CVCL_0069 0.888029 -0.307714 0.009504 0.011830 -0.009257 0.005957 0.018455 0.010179 -0.003400 0.006365 -0.075849 -0.567586 -0.009505 -0.010008 0.004917 0.002086 0.009906 -0.002591 -0.008113 0.007210 0.002278 0.710423 -0.007214 -0.358391 -0.000946 0.003583 -0.011224 -0.648159 -0.002388 0.009462 -0.037505 0.006355 -0.012045 -0.001819 -0.006163 0.008186 0.012301 -0.028284 0.007640 0.003146 -0.071284 0.509553 -0.008188 -0.050140 -0.009418 0.006601 -0.068825 -0.618353 -0.010205 -0.011288 -0.012659 0.007282 -0.045386 -0.545033 0.009416 -0.009264 -0.008921 -0.105353 -0.051309 -0.197994 -0.062763 0.012279 -0.031687 0.006609 -0.004356 -0.003983 0.002544 0.011836 -0.080831 -0.004545 -0.046005 0.011317 -0.001232 -0.009210 0.002718 -0.011986 0.012278 0.083107 -0.035172 0.005119 0.008797 -0.003806 0.011628 -0.001824 0.001663 0.001734 -0.368392 0.011572 0.012300 -0.005595 -0.331332 -0.008287 -0.055511 -0.008308 -0.010725 0.002596 -0.310499 0.005797 -0.156273 -0.044997
CVCL_0099 -0.176818 -0.192106 -0.011498 0.011774 -0.006677 -0.000457 0.014986 -0.012291 -0.028025 -0.003772 0.698218 -0.312775 0.005776 0.007228 -0.006060 0.007412 -0.004476 -0.009202 -0.010613 0.010342 0.002974 -0.032307 -0.009123 -0.220937 0.007204 -0.005368 0.008976 0.538447 0.009893 -0.008823 -0.052075 -0.011651 -0.009273 0.007601 -0.006383 0.002038 -0.000487 -0.026330 -0.001914 -0.012012 -0.007965 0.924642 0.008160 -0.035094 -0.004907 -0.003388 -0.011628 -0.298742 0.005487 -0.001704 -0.001949 0.004285 -0.038863 -0.277809 -0.006769 -0.007072 0.007684 -0.269388 -0.027038 -0.100221 -0.023720 -0.011807 -0.003934 -0.001549 -0.011181 -0.005612 -0.010466 0.000008 -0.056000 0.007196 -0.000191 0.006163 -0.008994 -0.004354 -0.014068 0.009238 -0.009695 -0.186393 -0.011181 -0.010317 -0.002767 0.000589 0.009423 -0.006533 -0.011846 0.006092 -0.231183 0.007170 0.006266 0.003622 -0.265507 0.000632 -0.015980 -0.006244 -0.009517 0.007210 -0.222188 0.006406 -0.081124 -0.007820
CVCL_0131 -0.046422 0.669492 -0.007224 -0.002227 -0.006185 0.003822 0.004404 -0.002927 -0.021845 -0.012057 0.304116 0.861971 -0.007958 -0.006847 0.003503 -0.019263 0.007371 -0.008983 0.003876 -0.007234 0.006413 -0.081075 -0.011977 -0.421795 0.006489 0.011787 -0.011539 1.301854 -0.003341 0.007732 -0.266222 0.007188 0.007233 -0.010686 0.008778 -0.004872 -0.002605 -0.083975 0.009423 -0.036805 -0.122501 0.069179 0.005813 -0.065185 0.005672 -0.005482 -0.108329 -0.142020 0.004436 0.011924 -0.044819 -0.003453 -0.140249 -0.429918 0.012114 0.000064 0.008346 0.759492 -0.110214 -0.343306 -0.133491 -0.007213 -0.033293 0.002614 -0.009722 0.000232 0.011684 -0.012158 -0.296367 0.011846 -0.243973 0.004985 0.004284 0.000117 -0.085627 -0.006341 0.002655 -0.574587 -0.137129 0.000714 0.005098 -0.015184 -0.011198 0.012217 0.007959 0.011791 0.191450 0.003533 -0.004520 -0.011901 -0.223539 -0.006880 -0.186794 0.011722 0.001574 -0.005896 -0.561008 -0.005685 -0.275717 -0.061650
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 CA10 CCDC110 CENPIP1 CHRND CTF1 DEFA5 DEFB104A DPY19L2P3-1 ECHS1 EFHC2 ENPP7P8 ENSG00000212517 ENSG00000228776 ENSG00000236951 ENSG00000248452 ENSG00000251490 ENSG00000255368 ENSG00000258193 ENSG00000258854 ENSG00000261018 ENSG00000264272 ENSG00000267005 ENSG00000271945 ENSG00000272384 ENSG00000272729 ENSG00000272905 ENSG00000274769 ENSG00000276884 ENSG00000277770 ENSG00000278384 ENSG00000280206 ENSG00000284823 ENSG00000286107 ENSG00000286587 ENSG00000286637 ENSG00000286681 ENSG00000287195 ENSG00000287269 ENSG00000289747 ENSG00000291051 FREM1 GOLGA6A GRIK5 HDAC3 HHATL HMOX1 HNRNPA1P67 HOMER3 IMP4 KCNK15-AS1 KMT2E-AS1 KRT8P28 LINC01100 LINC01312 LINC03038 LINC03049 MIR34B MIR452 MIR924 MRPL53 MTND1P1 MTND2P14 MTND4P28 NIPA1 OR5BN1P PANCR PARD6BP1 PDZRN4 PIM2 PPP1R2P6 PSMC1P8 RANP2 RBM22P13 RIOK3P1 RN7SL440P RNA5SP333 RNU4-20P RNU6-307P RNU6-679P RPL27AP5 RPL32P23 RPL7P6 SNORD115-2 TLDC2 TSPAN9 UBE2L3 UBE2V1P8 XRCC6P2 XXYLT1-AS2 Y_RNA-586
group
CVCL_0023 0.659619 0.0 0.0 -0.031030 0.0 0.231700 -0.597663 -0.293583 -0.548325 -0.266298 -0.082783 -0.045841 -0.015898 0.0 -0.010365 0.0 0.0 0.0 -0.575461 0.0 -0.055588 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.021380 0.0 0.0 0.534051 0.0 0.0 -0.021372 0.0 0.0 0.0 -0.072769 0.0 0.0 0.0 -0.010334 0.0 -0.097399 -0.062543 -0.081638 0.0 -0.083266 -0.057678 0.0 -0.081447 -0.076739 0.0 0.027629 0.0 0.380300 -0.411706 -0.201785 -0.135275 0.0 0.0 -0.020358 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.451120 0.0 0.0 0.0 -0.049817 -0.388620 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.100345 -0.296452 -0.581789 0.0 0.0 -0.026876 0.0
CVCL_0028 -0.242722 0.0 0.0 -0.004131 0.0 -0.056368 -0.127507 -0.051343 -0.118966 -0.154227 -0.012074 -0.008392 -0.004916 0.0 -0.003226 0.0 0.0 0.0 0.503187 0.0 -0.006376 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.003028 0.0 0.0 -0.017592 0.0 0.0 -0.003027 0.0 0.0 0.0 -0.012716 0.0 0.0 0.0 -0.001919 0.0 -0.016386 -0.012091 -0.014355 0.0 -0.013727 -0.008475 0.0 -0.019995 -0.196099 0.0 -0.089237 0.0 -0.033589 -0.074636 -0.029068 -0.022051 0.0 0.0 -0.003674 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.200991 0.0 0.0 0.0 -0.008840 -0.069161 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.009306 -0.237150 0.332721 0.0 0.0 -0.005290 0.0
CVCL_0069 -0.660637 0.0 0.0 -0.016866 0.0 -0.187451 -0.364054 0.430795 -0.362275 0.079542 -0.048852 -0.020147 -0.010189 0.0 -0.006503 0.0 0.0 0.0 -0.357629 0.0 -0.021883 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.012438 0.0 0.0 -0.059714 0.0 0.0 -0.012433 0.0 0.0 0.0 -0.042695 0.0 0.0 0.0 -0.009499 0.0 -0.055973 -0.036866 -0.046467 0.0 -0.036167 0.625455 0.0 -0.054923 -0.081832 0.0 -0.278417 0.0 -0.120229 -0.230591 -0.103036 -0.079745 0.0 0.0 -0.015980 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.070717 0.0 0.0 0.0 -0.027376 0.865099 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.029943 -0.612792 -0.662977 0.0 0.0 -0.017092 0.0
CVCL_0099 0.580845 0.0 0.0 -0.012109 0.0 -0.107889 -0.227719 1.138218 -0.206624 -0.275041 -0.024520 -0.013685 -0.005912 0.0 -0.004008 0.0 0.0 0.0 -0.219816 0.0 -0.016099 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.006181 0.0 0.0 -0.030592 0.0 0.0 -0.006179 0.0 0.0 0.0 -0.021131 0.0 0.0 0.0 -0.003260 0.0 -0.028204 -0.018937 -0.024585 0.0 -0.025939 -0.016734 0.0 -0.030014 -0.363001 0.0 -0.165278 0.0 -0.066894 -0.142272 -0.059129 0.599882 0.0 0.0 -0.006520 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.363288 0.0 0.0 0.0 -0.014925 -0.127938 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.028184 -0.400412 -0.420857 0.0 0.0 -0.009776 0.0
CVCL_0131 1.401372 0.0 0.0 -0.031490 0.0 -0.405170 0.233429 0.091139 0.118451 -0.426099 -0.082796 -0.141214 -0.051428 0.0 -0.011740 0.0 0.0 0.0 0.621408 0.0 -0.074962 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.021403 0.0 0.0 -0.164928 0.0 0.0 -0.021396 0.0 0.0 0.0 -0.122074 0.0 0.0 0.0 -0.010812 0.0 -0.191677 -0.109097 -0.098982 0.0 -0.285361 -0.075810 0.0 -0.190743 0.733823 0.0 0.046973 0.0 -0.323709 -0.661705 -0.381364 0.231011 0.0 0.0 -0.024485 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.230977 0.0 0.0 0.0 -0.072152 -0.011737 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.241474 0.822093 -0.169687 0.0 0.0 -0.035441 0.0
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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:456: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:458: 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.11/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, "pvals"] = pvals[global_indices]
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:471: 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.11/x64/lib/python3.12/site-packages/scanpy/tools/_rank_genes_groups.py:482: 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 CA10 CCDC110 CENPIP1 CHRND CTF1 DEFA5 DEFB104A DPY19L2P3-1 ECHS1 EFHC2 ENPP7P8 ENSG00000212517 ENSG00000228776 ENSG00000236951 ENSG00000248452 ENSG00000251490 ENSG00000255368 ENSG00000258193 ENSG00000258854 ENSG00000261018 ENSG00000264272 ENSG00000267005 ENSG00000271945 ENSG00000272384 ENSG00000272729 ENSG00000272905 ENSG00000274769 ENSG00000276884 ENSG00000277770 ENSG00000278384 ENSG00000280206 ENSG00000284823 ENSG00000286107 ENSG00000286587 ENSG00000286637 ENSG00000286681 ENSG00000287195 ENSG00000287269 ENSG00000289747 ENSG00000291051 FREM1 GOLGA6A GRIK5 HDAC3 HHATL HMOX1 HNRNPA1P67 HOMER3 IMP4 KCNK15-AS1 KMT2E-AS1 KRT8P28 LINC01100 LINC01312 LINC03038 LINC03049 MIR34B MIR452 MIR924 MRPL53 MTND1P1 MTND2P14 MTND4P28 NIPA1 OR5BN1P PANCR PARD6BP1 PDZRN4 PIM2 PPP1R2P6 PSMC1P8 RANP2 RBM22P13 RIOK3P1 RN7SL440P RNA5SP333 RNU4-20P RNU6-307P RNU6-679P RPL27AP5 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.036776 -0.036776 -0.018388 0.0 -0.009194 0.0 0.0 0.0 -0.487282 0.0 -0.027582 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.009194 0.0 0.0 0.273436 0.0 0.0 -0.009194 0.0 0.0 0.0 -0.045970 0.0 0.0 0.0 -0.009194 0.0 -0.073552 -0.036776 -0.045970 0.0 -0.055164 -0.027582 0.0 -0.073552 -0.158682 0.0 -0.041884 0.0 0.209078 -0.294208 -0.119522 -0.082746 0.0 0.0 -0.018388 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.557428 0.0 0.0 0.0 -0.027582 -0.248238 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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.013989 -0.013989 -0.006995 0.0 -0.003497 0.0 0.0 0.0 0.678483 0.0 -0.010492 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.003497 0.0 0.0 -0.024481 0.0 0.0 -0.003497 0.0 0.0 0.0 -0.017487 0.0 0.0 0.0 -0.003497 0.0 -0.027979 -0.013989 -0.017487 0.0 -0.020984 -0.010492 0.0 -0.027979 -0.314760 0.0 -0.143391 0.0 -0.048963 -0.111915 -0.045465 -0.031476 0.0 0.0 -0.006995 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.339242 0.0 0.0 0.0 -0.010492 -0.094428 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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.027242 -0.027242 -0.013621 0.0 -0.006811 0.0 0.0 0.0 -0.360961 0.0 -0.020432 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.006811 0.0 0.0 -0.047674 0.0 0.0 -0.006811 0.0 0.0 0.0 -0.034053 0.0 0.0 0.0 -0.006811 0.0 -0.054485 -0.027242 -0.034053 0.0 -0.040864 0.429975 0.0 -0.054485 -0.167086 0.0 -0.279234 0.0 -0.095348 -0.217939 -0.088538 -0.061295 0.0 0.0 -0.013621 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.214760 0.0 0.0 0.0 -0.020432 0.716019 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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.019824 -0.019824 -0.009912 0.0 -0.004956 0.0 0.0 0.0 -0.262669 0.0 -0.014868 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.004956 0.0 0.0 -0.034692 0.0 0.0 -0.004956 0.0 0.0 0.0 -0.024780 0.0 0.0 0.0 -0.004956 0.0 -0.039648 -0.019824 -0.024780 0.0 -0.029736 -0.014868 0.0 -0.039648 -0.446042 0.0 -0.203197 0.0 -0.069384 -0.158593 -0.064428 0.569323 0.0 0.0 -0.009912 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.480734 0.0 0.0 0.0 -0.014868 -0.133813 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 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.044477 -0.044477 -0.022238 0.0 -0.011119 0.0 0.0 0.0 0.552537 0.0 -0.033357 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.011119 0.0 0.0 -0.077834 0.0 0.0 -0.011119 0.0 0.0 0.0 -0.055596 0.0 0.0 0.0 -0.011119 0.0 -0.088953 -0.044477 -0.055596 0.0 -0.066715 -0.033357 0.0 -0.088953 0.959099 0.0 0.105204 0.0 -0.155668 -0.355813 -0.144549 0.182468 0.0 0.0 -0.022238 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.238634 0.0 0.0 0.0 -0.033357 -0.017677 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.055596 1.118188 -0.118889 0.0 0.0 -0.022238 0.0

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/ea6cfc1706fe3c1eb8f43757f6d0920f98e20a932d05fd7717469390404d1512.svg
compare.compute_jaccard_comparison()
compare.plot_jaccard_comparison()
Hide code cell output
_images/8c0cceffaa74a864d9c937ace48d0817e4d034216f1e4a881881a7eeb3836c9d.svg
ln.finish()
Hide code cell output
! calling anonymously, will miss private instances
 finished Run('n927L9ET') after 34s at 2025-08-08 19:41:28 UTC