[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XF6D6ECCEX8N18HW7M7ZCG":3,"skill-same:01M6XF6D6ECCEX8N18HW7M7ZCG":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6XF6D6ECCEX8N18HW7M7ZCG","curated-bio-datasets",null,"Guide to accessing curated biological datasets for computational biology. COSMIC cancer data, GTEx expression, GWAS catalog, GeneBass exome variants, BioGRID interactions, MSigDB gene sets, DisGeNET disease-gene associations, and GO ontology. For specific database APIs use individual database skills (cosmic-database, gwas-database, etc.).","fadrienne\u002FMyGitHub","fadrienne","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F197874571?v=4","01M6X64V8VWCRSMFZ4EPS2BWXG","Francesca Adrienne","01M6X64VD5MW4F9PHDWQKS7ZAF",0,"MIT","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"datasets","curated bio datasets","go","database","data","catalog","guide","use","ontology","computational biology","computational","expression","biology","for","gene","variants","2026-11-10 10:12:30",false,"---\nname: curated-bio-datasets\ndescription: Guide to accessing curated biological datasets for computational biology. COSMIC cancer data, GTEx expression, GWAS catalog, GeneBass exome variants, BioGRID interactions, MSigDB gene sets, DisGeNET disease-gene associations, and GO ontology. For specific database APIs use individual database skills (cosmic-database, gwas-database, etc.).\ncategory: biology\nlicense: MIT license\nmetadata:\n    skill-author: InkVell Inc.\n---\n\n# Curated Bio-Datasets: Biological Datasets Guide\n\n## Overview\n\nCurated Bio-Datasets provides a comprehensive guide to accessing and working with major curated biological datasets. This skill covers COSMIC cancer genomics data, GTEx tissue expression data, GWAS Catalog SNP-trait associations, GeneBass exome-wide association results, BioGRID protein-protein interaction data, MSigDB gene set collections, DisGeNET disease-gene associations, and Gene Ontology resources. Each section includes download patterns, file formats, parsing code, and integration examples.\n\n## When to Use This Skill\n\n- Downloading and parsing COSMIC cancer gene census data\n- Accessing GTEx tissue-level expression data (TPM matrices, eQTLs)\n- Querying the GWAS Catalog for SNP-trait associations\n- Working with GeneBass exome-wide burden test results\n- Building protein-protein interaction networks from BioGRID\n- Loading MSigDB gene sets for pathway enrichment analysis\n- Querying DisGeNET for disease-gene associations\n- Working with Gene Ontology terms and hierarchies\n\n**Related Skills:** For specific database API access use dedicated skills: `cosmic-database`, `gwas-database`, `ensembl-database`, `kegg-database`, `reactome-database`.\n\n## Installation\n\n```bash\nuv pip install pandas requests networkx gseapy numpy\n```\n\n## Quick Start\n\n```python\nimport pandas as pd\n\n# Load MSigDB gene sets (GMT format) for enrichment analysis\ndef parse_gmt(gmt_path):\n    gene_sets = {}\n    with open(gmt_path) as f:\n        for line in f:\n            parts = line.strip().split('\\t')\n            name = parts[0]\n            genes = parts[2:]  # Skip description\n            gene_sets[name] = genes\n    return gene_sets\n\n# Example: run enrichment with gseapy\nimport gseapy as gp\nenr = gp.enrichr(gene_list=['TP53', 'BRCA1', 'ATM', 'CHEK2', 'PTEN'],\n                 gene_sets='MSigDB_Hallmark_2020', outdir=None)\nprint(enr.results[['Term', 'Adjusted P-value', 'Overlap']].head())\n```\n\n## Core Capabilities\n\n### 1. COSMIC Cancer Datasets\n\nAccess the Catalogue of Somatic Mutations in Cancer.\n\n```python\nimport pandas as pd\n\n# COSMIC Cancer Gene Census\n# Download from: https:\u002F\u002Fcancer.sanger.ac.uk\u002Fcensus (requires free registration)\n# File: cancer_gene_census.csv\n\ndef load_cosmic_census(census_path='cancer_gene_census.csv'):\n    \"\"\"Load and parse COSMIC Cancer Gene Census.\"\"\"\n    df = pd.read_csv(census_path)\n\n    print(f\"Total cancer genes: {len(df)}\")\n    print(f\"\\nTier distribution:\")\n    print(df['Tier'].value_counts())\n\n    print(f\"\\nRole in Cancer:\")\n    roles = df['Role in Cancer'].str.split(', ').explode()\n    print(roles.value_counts())\n\n    print(f\"\\nTop mutation types:\")\n    mut_types = df['Mutation Types'].str.split(', ').explode()\n    print(mut_types.value_counts().head(5))\n\n    return df\n\ndef filter_census_by_cancer(census_df, cancer_type):\n    \"\"\"Filter census for a specific cancer type.\"\"\"\n    mask = census_df['Tumour Types(Somatic)'].str.contains(cancer_type, case=False, na=False)\n    filtered = census_df[mask]\n    print(f\"Genes associated with '{cancer_type}': {len(filtered)}\")\n    return filtered\n\n# COSMIC somatic mutations\n# Download: CosmicMutantExportCensus.tsv.gz\ndef load_cosmic_mutations(mutations_path):\n    \"\"\"Load COSMIC somatic mutation data.\"\"\"\n    df = pd.read_csv(mutations_path, sep='\\t', low_memory=False)\n    print(f\"Total mutations: {len(df)}\")\n    print(f\"Unique genes: {df['Gene name'].nunique()}\")\n    print(f\"Mutation types:\\n{df['Mutation Description'].value_counts().head()}\")\n    return df\n\n# COSMIC resistance mutations\n# Useful for pharmacogenomics studies\ndef get_resistance_genes(census_df):\n    \"\"\"Extract genes with known drug resistance mutations.\"\"\"\n    mask = census_df['Mutation Types'].str.contains('resistance', case=False, na=False) | \\\n           census_df['Role in Cancer'].str.contains('resistance', case=False, na=False)\n    return census_df[mask][['Gene Symbol', 'Mutation Types', 'Role in Cancer']]\n```\n\n### 2. GTEx Tissue Expression\n\nAccess the Genotype-Tissue Expression project data.\n\n```python\nimport pandas as pd\nimport requests\n\n# GTEx Portal API\nGTEX_API = 'https:\u002F\u002Fgtexportal.org\u002Fapi\u002Fv2'\n\ndef get_gtex_gene_expression(gene_symbol, dataset_id='gtex_v8'):\n    \"\"\"Get median gene expression across tissues from GTEx API.\"\"\"\n    url = f\"{GTEX_API}\u002Fexpression\u002FmedianGeneExpression\"\n    params = {\n        'geneSymbol': gene_symbol,\n        'datasetId': dataset_id,\n    }\n    response = requests.get(url, params=params)\n    if response.status_code != 200:\n        print(f\"Error: {response.status_code}\")\n        return None\n\n    data = response.json()\n    if 'data' not in data:\n        print(\"No data returned\")\n        return None\n\n    df = pd.DataFrame(data['data'])\n    df = df.sort_values('median', ascending=False)\n\n    print(f\"Expression of {gene_symbol} across {len(df)} tissues:\")\n    print(df[['tissueSiteDetailId', 'median']].head(10).to_string(index=False))\n    return df\n\n# GTEx bulk download patterns\n# TPM matrix: GTEx_Analysis_2017-06-05_v8_RNASeQCv1.1.9_gene_tpm.gct.gz\n# Sample annotations: GTEx_Analysis_v8_Annotations_SampleAttributesDS.txt\n# eQTL: GTEx_Analysis_v8_eQTL.tar\n\ndef load_gtex_tpm(tpm_path):\n    \"\"\"Load GTEx TPM matrix (GCT format).\"\"\"\n    df = pd.read_csv(tpm_path, sep='\\t', skiprows=2)\n    genes = df['Name']\n    descriptions = df['Description']\n    expression = df.iloc[:, 2:]\n\n    print(f\"Genes: {len(genes)}\")\n    print(f\"Samples: {expression.shape[1]}\")\n    return df\n```\n\n### 3. GWAS Catalog\n\nAccess SNP-trait association data.\n\n```python\nimport pandas as pd\n\n# Download: https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002Fapi\u002Fsearch\u002Fdownloads\u002Ffull\n# File: gwas_catalog_v1.0.2-associations_e*.tsv\n\ndef load_gwas_catalog(catalog_path):\n    \"\"\"Load GWAS Catalog associations.\"\"\"\n    df = pd.read_csv(catalog_path, sep='\\t', low_memory=False)\n\n    print(f\"Total associations: {len(df)}\")\n    print(f\"Unique traits: {df['DISEASE\u002FTRAIT'].nunique()}\")\n    print(f\"Unique SNPs: {df['SNPS'].nunique()}\")\n\n    return df\n\ndef search_gwas_by_trait(catalog_df, trait_keyword, pvalue_threshold=5e-8):\n    \"\"\"Search GWAS catalog for a trait.\"\"\"\n    mask = catalog_df['DISEASE\u002FTRAIT'].str.contains(trait_keyword, case=False, na=False)\n\n    # Filter by p-value\n    filtered = catalog_df[mask].copy()\n    filtered['P-VALUE'] = pd.to_numeric(filtered['P-VALUE'], errors='coerce')\n    filtered = filtered[filtered['P-VALUE'] \u003C pvalue_threshold]\n\n    filtered = filtered.sort_values('P-VALUE')\n\n    print(f\"Associations for '{trait_keyword}': {len(filtered)}\")\n    if len(filtered) > 0:\n        print(filtered[['SNPS', 'MAPPED_GENE', 'P-VALUE', 'OR or BETA']].head(10))\n    return filtered\n\ndef search_gwas_by_gene(catalog_df, gene_symbol):\n    \"\"\"Search GWAS catalog for associations near a gene.\"\"\"\n    mask = catalog_df['MAPPED_GENE'].str.contains(gene_symbol, case=False, na=False) | \\\n           catalog_df['REPORTED GENE(S)'].str.contains(gene_symbol, case=False, na=False)\n    results = catalog_df[mask].sort_values('P-VALUE')\n    print(f\"GWAS hits near {gene_symbol}: {len(results)}\")\n    return results\n```\n\n### 4. GeneBass Exome Data\n\nAccess exome-wide association results.\n\n```python\nimport pandas as pd\n\n# GeneBass: https:\u002F\u002Fgenebass.org\u002F\n# Bulk download: results per phenotype in TSV format\n\ndef load_genebass_results(results_path, gene=None, pvalue_threshold=2.5e-6):\n    \"\"\"Load GeneBass exome-wide association results.\n\n    Args:\n        results_path: path to GeneBass results TSV\n        gene: optional gene filter\n        pvalue_threshold: exome-wide significance threshold\n    \"\"\"\n    df = pd.read_csv(results_path, sep='\\t')\n\n    if gene:\n        df = df[df['gene_symbol'] == gene]\n\n    # Filter significant results\n    sig = df[df['pvalue'] \u003C pvalue_threshold]\n\n    print(f\"Total results: {len(df)}\")\n    print(f\"Significant (p \u003C {pvalue_threshold}): {len(sig)}\")\n\n    if len(sig) > 0:\n        print(\"\\nTop hits:\")\n        print(sig[['gene_symbol', 'annotation', 'pvalue', 'beta']].head(10))\n\n    return df\n\n# Burden test categories\n# pLoF: predicted loss of function\n# missense: missense variants\n# synonymous: synonymous (used as negative control)\ndef compare_burden_tests(results_df, gene):\n    \"\"\"Compare burden test results across variant categories.\"\"\"\n    gene_data = results_df[results_df['gene_symbol'] == gene]\n    for ann in ['pLoF', 'missense|LC', 'synonymous']:\n        subset = gene_data[gene_data['annotation'] == ann]\n        if len(subset) > 0:\n            row = subset.iloc[0]\n            print(f\"{ann}: p={row['pvalue']:.2e}, beta={row.get('beta', 'N\u002FA')}\")\n```\n\n### 5. Protein Interaction Networks\n\nBuild and analyze networks from BioGRID data.\n\n```python\nimport pandas as pd\nimport networkx as nx\n\n# Download: https:\u002F\u002Fthebiogrid.org\u002Fdownloads\u002Farchives\u002FLatest%20Release\n# File: BIOGRID-ALL-LATEST.tab3.zip\n\ndef load_biogrid(biogrid_path, organism=9606, experiment_types=None):\n    \"\"\"Load BioGRID protein-protein interaction data.\n\n    Args:\n        biogrid_path: path to BioGRID tab3 file\n        organism: NCBI taxonomy ID (9606 = human)\n        experiment_types: list of experiment types to include\n    \"\"\"\n    cols = ['BioGRID Interaction ID', 'Official Symbol Interactor A',\n            'Official Symbol Interactor B', 'Organism ID Interactor A',\n            'Organism ID Interactor B', 'Experimental System',\n            'Experimental System Type', 'Throughput']\n\n    df = pd.read_csv(biogrid_path, sep='\\t', usecols=cols, low_memory=False)\n\n    # Filter by organism\n    df = df[(df['Organism ID Interactor A'] == organism) &\n            (df['Organism ID Interactor B'] == organism)]\n\n    # Filter by experiment type\n    if experiment_types:\n        df = df[df['Experimental System'].isin(experiment_types)]\n\n    print(f\"Interactions: {len(df)}\")\n    print(f\"Unique proteins: {pd.concat([df['Official Symbol Interactor A'],\n                                          df['Official Symbol Interactor B']]).nunique()}\")\n    print(f\"\\nExperiment types:\\n{df['Experimental System'].value_counts().head()}\")\n    return df\n\ndef build_ppi_network(biogrid_df, genes_of_interest=None):\n    \"\"\"Build NetworkX graph from BioGRID interactions.\"\"\"\n    G = nx.Graph()\n\n    for _, row in biogrid_df.iterrows():\n        a = row['Official Symbol Interactor A']\n        b = row['Official Symbol Interactor B']\n        if a != b:  # Exclude self-interactions\n            if G.has_edge(a, b):\n                G[a][b]['weight'] += 1\n            else:\n                G.add_edge(a, b, weight=1)\n\n    print(f\"Network: {G.number_of_nodes()} nodes, {G.number_of_edges()} edges\")\n\n    # Subnetwork for genes of interest\n    if genes_of_interest:\n        # Include 1st-degree neighbors\n        neighbors = set()\n        for gene in genes_of_interest:\n            if gene in G:\n                neighbors.update(G.neighbors(gene))\n        subgraph_nodes = set(genes_of_interest) | neighbors\n        subG = G.subgraph(subgraph_nodes)\n        print(f\"Subnetwork: {subG.number_of_nodes()} nodes, {subG.number_of_edges()} edges\")\n\n        # Hub analysis\n        degrees = dict(subG.degree())\n        hubs = sorted(degrees.items(), key=lambda x: x[1], reverse=True)[:10]\n        print(\"Top hubs:\")\n        for gene, deg in hubs:\n            print(f\"  {gene}: degree={deg}\")\n\n        return subG\n\n    return G\n```\n\n### 6. MSigDB Gene Sets\n\nLoad and use MSigDB gene set collections.\n\n```python\nimport pandas as pd\n\n# Download GMT files from: https:\u002F\u002Fwww.gsea-msigdb.org\u002Fgsea\u002Fmsigdb\u002Fcollections.jsp\n# Collections: H (hallmark), C1-C8\n\ndef parse_gmt(gmt_path):\n    \"\"\"Parse GMT (Gene Matrix Transposed) file format.\"\"\"\n    gene_sets = {}\n    with open(gmt_path) as f:\n        for line in f:\n            parts = line.strip().split('\\t')\n            name = parts[0]\n            description = parts[1]\n            genes = [g for g in parts[2:] if g]\n            gene_sets[name] = {'description': description, 'genes': genes}\n\n    print(f\"Loaded {len(gene_sets)} gene sets from {gmt_path}\")\n    sizes = [len(gs['genes']) for gs in gene_sets.values()]\n    print(f\"Gene set sizes: {min(sizes)}-{max(sizes)} (median: {sorted(sizes)[len(sizes)\u002F\u002F2]})\")\n    return gene_sets\n\ndef enrichment_with_msigdb(gene_list, collection='MSigDB_Hallmark_2020'):\n    \"\"\"Run enrichment analysis using MSigDB via gseapy.\"\"\"\n    import gseapy as gp\n\n    enr = gp.enrichr(gene_list=gene_list, gene_sets=collection, outdir=None)\n    results = enr.results[enr.results['Adjusted P-value'] \u003C 0.05]\n\n    print(f\"Significant pathways (padj \u003C 0.05): {len(results)}\")\n    if len(results) > 0:\n        print(results[['Term', 'Adjusted P-value', 'Overlap', 'Combined Score']].head(10))\n    return enr\n\n# Available collections via gseapy\nMSIGDB_COLLECTIONS = {\n    'H': 'MSigDB_Hallmark_2020',          # 50 hallmark gene sets\n    'C2_CP': 'KEGG_2021_Human',           # Canonical pathways\n    'C5_GO_BP': 'GO_Biological_Process_2021',  # GO biological process\n    'C5_GO_MF': 'GO_Molecular_Function_2021',  # GO molecular function\n    'C5_GO_CC': 'GO_Cellular_Component_2021',  # GO cellular component\n    'C7': 'Immunologic_Signature',        # Immunologic signatures\n}\n```\n\n### 7. DisGeNET & OMIM\n\nAccess disease-gene association databases.\n\n```python\nimport pandas as pd\nimport requests\n\n# DisGeNET: https:\u002F\u002Fwww.disgenet.org\u002Fdownloads\n# Download: curated_gene_disease_associations.tsv.gz\n\ndef load_disgenet(disgenet_path):\n    \"\"\"Load DisGeNET disease-gene associations.\"\"\"\n    df = pd.read_csv(disgenet_path, sep='\\t')\n\n    print(f\"Total associations: {len(df)}\")\n    print(f\"Unique genes: {df['geneSymbol'].nunique()}\")\n    print(f\"Unique diseases: {df['diseaseName'].nunique()}\")\n    return df\n\ndef search_disgenet_by_gene(disgenet_df, gene_symbol, min_score=0.3):\n    \"\"\"Find diseases associated with a gene.\"\"\"\n    results = disgenet_df[disgenet_df['geneSymbol'] == gene_symbol]\n    results = results[results['score'] >= min_score]\n    results = results.sort_values('score', ascending=False)\n\n    print(f\"Diseases associated with {gene_symbol} (score >= {min_score}): {len(results)}\")\n    if len(results) > 0:\n        print(results[['diseaseName', 'score', 'NofPmids']].head(10))\n    return results\n\ndef search_disgenet_by_disease(disgenet_df, disease_keyword, min_score=0.3):\n    \"\"\"Find genes associated with a disease.\"\"\"\n    mask = disgenet_df['diseaseName'].str.contains(disease_keyword, case=False, na=False)\n    results = disgenet_df[mask]\n    results = results[results['score'] >= min_score]\n    results = results.sort_values('score', ascending=False)\n\n    print(f\"Genes associated with '{disease_keyword}': {len(results)}\")\n    if len(results) > 0:\n        print(results[['geneSymbol', 'diseaseName', 'score']].head(15))\n    return results\n```\n\n### 8. Gene Ontology\n\nWork with GO terms and hierarchies.\n\n```python\nimport json\nimport requests\n\n# GO OBO file: http:\u002F\u002Fpurl.obolibrary.org\u002Fobo\u002Fgo.obo\n# GO JSON: https:\u002F\u002Fpurl.obolibrary.org\u002Fobo\u002Fgo.json\n\ndef parse_go_obo(obo_path):\n    \"\"\"Parse Gene Ontology OBO file.\"\"\"\n    terms = {}\n    current = None\n\n    with open(obo_path) as f:\n        for line in f:\n            line = line.strip()\n            if line == '[Term]':\n                current = {}\n            elif line == '' and current is not None:\n                if 'id' in current:\n                    terms[current['id']] = current\n                current = None\n            elif current is not None and ':' in line:\n                key, value = line.split(': ', 1)\n                if key in ('id', 'name', 'namespace', 'def'):\n                    current[key] = value\n                elif key == 'is_a':\n                    current.setdefault('parents', []).append(value.split(' ! ')[0])\n                elif key == 'is_obsolete' and value == 'true':\n                    current = None\n\n    print(f\"GO terms: {len(terms)}\")\n    namespaces = {}\n    for t in terms.values():\n        ns = t.get('namespace', 'unknown')\n        namespaces[ns] = namespaces.get(ns, 0) + 1\n    print(f\"Namespaces: {namespaces}\")\n    return terms\n\ndef get_ancestors(terms, go_id, max_depth=10):\n    \"\"\"Get all ancestor terms of a GO term.\"\"\"\n    ancestors = set()\n    queue = [go_id]\n    depth = 0\n\n    while queue and depth \u003C max_depth:\n        next_queue = []\n        for term_id in queue:\n            if term_id in terms:\n                parents = terms[term_id].get('parents', [])\n                for parent in parents:\n                    if parent not in ancestors:\n                        ancestors.add(parent)\n                        next_queue.append(parent)\n        queue = next_queue\n        depth += 1\n\n    return ancestors\n\ndef lookup_go_term(go_id):\n    \"\"\"Look up a GO term using the QuickGO API.\"\"\"\n    url = f\"https:\u002F\u002Fwww.ebi.ac.uk\u002FQuickGO\u002Fservices\u002Fontology\u002Fgo\u002Fterms\u002F{go_id}\"\n    response = requests.get(url, headers={'Accept': 'application\u002Fjson'})\n\n    if response.status_code == 200:\n        data = response.json()\n        if 'results' in data and len(data['results']) > 0:\n            term = data['results'][0]\n            print(f\"GO:{go_id}\")\n            print(f\"  Name: {term.get('name')}\")\n            print(f\"  Namespace: {term.get('aspect')}\")\n            print(f\"  Definition: {term.get('definition', {}).get('text', 'N\u002FA')[:200]}\")\n            return term\n    return None\n```\n\n## Typical Workflows\n\n### Workflow 1: Download and Filter COSMIC Cancer Gene Census\n\n```python\ncensus = load_cosmic_census('cancer_gene_census.csv')\nbreast_genes = filter_census_by_cancer(census, 'breast')\nprint(f\"\\nBreast cancer genes: {list(breast_genes['Gene Symbol'].head(20))}\")\n```\n\n### Workflow 2: Build Protein Interaction Network from BioGRID\n\n```python\nbiogrid = load_biogrid('BIOGRID-ALL-LATEST.tab3.txt',\n                        experiment_types=['Affinity Capture-MS', 'Two-hybrid'])\nG = build_ppi_network(biogrid, genes_of_interest=['TP53', 'BRCA1', 'ATM'])\n```\n\n### Workflow 3: Run Pathway Enrichment with MSigDB Gene Sets\n\n```python\ngene_list = ['TP53', 'BRCA1', 'ATM', 'CHEK2', 'PTEN', 'RB1', 'CDKN2A']\nenr = enrichment_with_msigdb(gene_list, collection='MSigDB_Hallmark_2020')\n```\n\n## Best Practices\n\n1. **COSMIC access** — requires free registration; respect data license terms; use COSMIC CGC for curated cancer genes, full dataset for comprehensive analysis\n2. **GTEx** — use median TPM for tissue comparisons; raw counts for differential analysis; eQTL data for variant interpretation\n3. **GWAS Catalog** — apply genome-wide significance threshold (5e-8); check LD with lead SNP; use mapped genes, not just reported genes\n4. **BioGRID** — filter by experiment type for quality; \"Affinity Capture-MS\" and \"Two-hybrid\" are highest confidence; weight edges by evidence count\n5. **MSigDB** — Hallmark gene sets are most interpretable; use C2 (curated) for canonical pathways; C5 (GO) for biological process analysis\n6. **DisGeNET** — filter by score (>0.3 for moderate confidence); prioritize curated sources; cross-reference with OMIM for Mendelian diseases\n7. **File sizes** — COSMIC full mutation export is ~30GB; GTEx TPM matrix is ~2GB; download and process locally, don't reload repeatedly\n\n## Troubleshooting\n\n**Problem:** COSMIC download requires authentication\n**Solution:** Register for free account at cancer.sanger.ac.uk. Use SFTP or download from the web portal. Academic license is free.\n\n**Problem:** GTEx API returns empty results\n**Solution:** Check gene symbol is HUGO-approved. Try ENSG ID instead. GTEx v8 uses GRCh38 coordinates.\n\n**Problem:** BioGRID file too large to load\n**Solution:** Use organism filter during loading. Read in chunks with `chunksize` parameter. Pre-filter with command-line tools (grep).\n\n**Problem:** gseapy enrichment returns no results\n**Solution:** Ensure gene symbols match the gene set database (HUGO symbols). Check that gene list has >5 genes. Try different collections.\n\n## Resources\n\n- [COSMIC](https:\u002F\u002Fcancer.sanger.ac.uk\u002Fcosmic)\n- [GTEx Portal](https:\u002F\u002Fgtexportal.org\u002F)\n- [GWAS Catalog](https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002F)\n- [GeneBass](https:\u002F\u002Fgenebass.org\u002F)\n- [BioGRID](https:\u002F\u002Fthebiogrid.org\u002F)\n- [MSigDB](https:\u002F\u002Fwww.gsea-msigdb.org\u002Fgsea\u002Fmsigdb\u002F)\n- [DisGeNET](https:\u002F\u002Fwww.disgenet.org\u002F)\n- [Gene Ontology](http:\u002F\u002Fgeneontology.org\u002F)\n","# Curated Bio-Datasets: Biological Datasets Guide\n\n## Overview\n\nCurated Bio-Datasets provides a comprehensive guide to accessing and working with major curated biological datasets. This skill covers COSMIC cancer genomics data, GTEx tissue expression data, GWAS Catalog SNP-trait associations, GeneBass exome-wide association results, BioGRID protein-protein interaction data, MSigDB gene set collections, DisGeNET disease-gene associations, and Gene Ontology resources. Each section includes download patterns, file formats, parsing code, and integration examples.\n\n## When to Use This Skill\n\n- Downloading and parsing COSMIC cancer gene census data\n- Accessing GTEx tissue-level expression data (TPM matrices, eQTLs)\n- Querying the GWAS Catalog for SNP-trait associations\n- Working with GeneBass exome-wide burden test results\n- Building protein-protein interaction networks from BioGRID\n- Loading MSigDB gene sets for pathway enrichment analysis\n- Querying DisGeNET for disease-gene associations\n- Working with Gene Ontology terms and hierarchies\n\n**Related Skills:** For specific database API access use dedicated skills: `cosmic-database`, `gwas-database`, `ensembl-database`, `kegg-database`, `reactome-database`.\n\n## Installation\n\n```bash\nuv pip install pandas requests networkx gseapy numpy\n```\n\n## Quick Start\n\n```python\nimport pandas as pd\n\n# Load MSigDB gene sets (GMT format) for enrichment analysis\ndef parse_gmt(gmt_path):\n    gene_sets = {}\n    with open(gmt_path) as f:\n        for line in f:\n            parts = line.strip().split('\\t')\n            name = parts[0]\n            genes = parts[2:]  # Skip description\n            gene_sets[name] = genes\n    return gene_sets\n\n# Example: run enrichment with gseapy\nimport gseapy as gp\nenr = gp.enrichr(gene_list=['TP53', 'BRCA1', 'ATM', 'CHEK2', 'PTEN'],\n                 gene_sets='MSigDB_Hallmark_2020', outdir=None)\nprint(enr.results[['Term', 'Adjusted P-value', 'Overlap']].head())\n```\n\n## Core Capabilities\n\n### 1. COSMIC Cancer Datasets\n\nAccess the Catalogue of Somatic Mutations in Cancer.\n\n```python\nimport pandas as pd\n\n# COSMIC Cancer Gene Census\n# Download from: https:\u002F\u002Fcancer.sanger.ac.uk\u002Fcensus (requires free registration)\n# File: cancer_gene_census.csv\n\ndef load_cosmic_census(census_path='cancer_gene_census.csv'):\n    \"\"\"Load and parse COSMIC Cancer Gene Census.\"\"\"\n    df = pd.read_csv(census_path)\n\n    print(f\"Total cancer genes: {len(df)}\")\n    print(f\"\\nTier distribution:\")\n    print(df['Tier'].value_counts())\n\n    print(f\"\\nRole in Cancer:\")\n    roles = df['Role in Cancer'].str.split(', ').explode()\n    print(roles.value_counts())\n\n    print(f\"\\nTop mutation types:\")\n    mut_types = df['Mutation Types'].str.split(', ').explode()\n    print(mut_types.value_counts().head(5))\n\n    return df\n\ndef filter_census_by_cancer(census_df, cancer_type):\n    \"\"\"Filter census for a specific cancer type.\"\"\"\n    mask = census_df['Tumour Types(Somatic)'].str.contains(cancer_type, case=False, na=False)\n    filtered = census_df[mask]\n    print(f\"Genes associated with '{cancer_type}': {len(filtered)}\")\n    return filtered\n\n# COSMIC somatic mutations\n# Download: CosmicMutantExportCensus.tsv.gz\ndef load_cosmic_mutations(mutations_path):\n    \"\"\"Load COSMIC somatic mutation data.\"\"\"\n    df = pd.read_csv(mutations_path, sep='\\t', low_memory=False)\n    print(f\"Total mutations: {len(df)}\")\n    print(f\"Unique genes: {df['Gene name'].nunique()}\")\n    print(f\"Mutation types:\\n{df['Mutation Description'].value_counts().head()}\")\n    return df\n\n# COSMIC resistance mutations\n# Useful for pharmacogenomics studies\ndef get_resistance_genes(census_df):\n    \"\"\"Extract genes with known drug resistance mutations.\"\"\"\n    mask = census_df['Mutation Types'].str.contains('resistance', case=False, na=False) | \\\n           census_df['Role in Cancer'].str.contains('resistance', case=False, na=False)\n    return census_df[mask][['Gene Symbol', 'Mutation Types', 'Role in Cancer']]\n```\n\n### 2. GTEx Tissue Expression\n\nAccess the Genotype-Tissue Expression project data.\n\n```python\nimport pandas as pd\nimport requests\n\n# GTEx Portal API\nGTEX_API = 'https:\u002F\u002Fgtexportal.org\u002Fapi\u002Fv2'\n\ndef get_gtex_gene_expression(gene_symbol, dataset_id='gtex_v8'):\n    \"\"\"Get median gene expression across tissues from GTEx API.\"\"\"\n    url = f\"{GTEX_API}\u002Fexpression\u002FmedianGeneExpression\"\n    params = {\n        'geneSymbol': gene_symbol,\n        'datasetId': dataset_id,\n    }\n    response = requests.get(url, params=params)\n    if response.status_code != 200:\n        print(f\"Error: {response.status_code}\")\n        return None\n\n    data = response.json()\n    if 'data' not in data:\n        print(\"No data returned\")\n        return None\n\n    df = pd.DataFrame(data['data'])\n    df = df.sort_values('median', ascending=False)\n\n    print(f\"Expression of {gene_symbol} across {len(df)} tissues:\")\n    print(df[['tissueSiteDetailId', 'median']].head(10).to_string(index=False))\n    return df\n\n# GTEx bulk download patterns\n# TPM matrix: GTEx_Analysis_2017-06-05_v8_RNASeQCv1.1.9_gene_tpm.gct.gz\n# Sample annotations: GTEx_Analysis_v8_Annotations_SampleAttributesDS.txt\n# eQTL: GTEx_Analysis_v8_eQTL.tar\n\ndef load_gtex_tpm(tpm_path):\n    \"\"\"Load GTEx TPM matrix (GCT format).\"\"\"\n    df = pd.read_csv(tpm_path, sep='\\t', skiprows=2)\n    genes = df['Name']\n    descriptions = df['Description']\n    expression = df.iloc[:, 2:]\n\n    print(f\"Genes: {len(genes)}\")\n    print(f\"Samples: {expression.shape[1]}\")\n    return df\n```\n\n### 3. GWAS Catalog\n\nAccess SNP-trait association data.\n\n```python\nimport pandas as pd\n\n# Download: https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002Fapi\u002Fsearch\u002Fdownloads\u002Ffull\n# File: gwas_catalog_v1.0.2-associations_e*.tsv\n\ndef load_gwas_catalog(catalog_path):\n    \"\"\"Load GWAS Catalog associations.\"\"\"\n    df = pd.read_csv(catalog_path, sep='\\t', low_memory=False)\n\n    print(f\"Total associations: {len(df)}\")\n    print(f\"Unique traits: {df['DISEASE\u002FTRAIT'].nunique()}\")\n    print(f\"Unique SNPs: {df['SNPS'].nunique()}\")\n\n    return df\n\ndef search_gwas_by_trait(catalog_df, trait_keyword, pvalue_threshold=5e-8):\n    \"\"\"Search GWAS catalog for a trait.\"\"\"\n    mask = catalog_df['DISEASE\u002FTRAIT'].str.contains(trait_keyword, case=False, na=False)\n\n    # Filter by p-value\n    filtered = catalog_df[mask].copy()\n    filtered['P-VALUE'] = pd.to_numeric(filtered['P-VALUE'], errors='coerce')\n    filtered = filtered[filtered['P-VALUE'] \u003C pvalue_threshold]\n\n    filtered = filtered.sort_values('P-VALUE')\n\n    print(f\"Associations for '{trait_keyword}': {len(filtered)}\")\n    if len(filtered) > 0:\n        print(filtered[['SNPS', 'MAPPED_GENE', 'P-VALUE', 'OR or BETA']].head(10))\n    return filtered\n\ndef search_gwas_by_gene(catalog_df, gene_symbol):\n    \"\"\"Search GWAS catalog for associations near a gene.\"\"\"\n    mask = catalog_df['MAPPED_GENE'].str.contains(gene_symbol, case=False, na=False) | \\\n           catalog_df['REPORTED GENE(S)'].str.contains(gene_symbol, case=False, na=False)\n    results = catalog_df[mask].sort_values('P-VALUE')\n    print(f\"GWAS hits near {gene_symbol}: {len(results)}\")\n    return results\n```\n\n### 4. GeneBass Exome Data\n\nAccess exome-wide association results.\n\n```python\nimport pandas as pd\n\n# GeneBass: https:\u002F\u002Fgenebass.org\u002F\n# Bulk download: results per phenotype in TSV format\n\ndef load_genebass_results(results_path, gene=None, pvalue_threshold=2.5e-6):\n    \"\"\"Load GeneBass exome-wide association results.\n\n    Args:\n        results_path: path to GeneBass results TSV\n        gene: optional gene filter\n        pvalue_threshold: exome-wide significance threshold\n    \"\"\"\n    df = pd.read_csv(results_path, sep='\\t')\n\n    if gene:\n        df = df[df['gene_symbol'] == gene]\n\n    # Filter significant results\n    sig = df[df['pvalue'] \u003C pvalue_threshold]\n\n    print(f\"Total results: {len(df)}\")\n    print(f\"Significant (p \u003C {pvalue_threshold}): {len(sig)}\")\n\n    if len(sig) > 0:\n        print(\"\\nTop hits:\")\n        print(sig[['gene_symbol', 'annotation', 'pvalue', 'beta']].head(10))\n\n    return df\n\n# Burden test categories\n# pLoF: predicted loss of function\n# missense: missense variants\n# synonymous: synonymous (used as negative control)\ndef compare_burden_tests(results_df, gene):\n    \"\"\"Compare burden test results across variant categories.\"\"\"\n    gene_data = results_df[results_df['gene_symbol'] == gene]\n    for ann in ['pLoF', 'missense|LC', 'synonymous']:\n        subset = gene_data[gene_data['annotation'] == ann]\n        if len(subset) > 0:\n            row = subset.iloc[0]\n            print(f\"{ann}: p={row['pvalue']:.2e}, beta={row.get('beta', 'N\u002FA')}\")\n```\n\n### 5. Protein Interaction Networks\n\nBuild and analyze networks from BioGRID data.\n\n```python\nimport pandas as pd\nimport networkx as nx\n\n# Download: https:\u002F\u002Fthebiogrid.org\u002Fdownloads\u002Farchives\u002FLatest%20Release\n# File: BIOGRID-ALL-LATEST.tab3.zip\n\ndef load_biogrid(biogrid_path, organism=9606, experiment_types=None):\n    \"\"\"Load BioGRID protein-protein interaction data.\n\n    Args:\n        biogrid_path: path to BioGRID tab3 file\n        organism: NCBI taxonomy ID (9606 = human)\n        experiment_types: list of experiment types to include\n    \"\"\"\n    cols = ['BioGRID Interaction ID', 'Official Symbol Interactor A',\n            'Official Symbol Interactor B', 'Organism ID Interactor A',\n            'Organism ID Interactor B', 'Experimental System',\n            'Experimental System Type', 'Throughput']\n\n    df = pd.read_csv(biogrid_path, sep='\\t', usecols=cols, low_memory=False)\n\n    # Filter by organism\n    df = df[(df['Organism ID Interactor A'] == organism) &\n            (df['Organism ID Interactor B'] == organism)]\n\n    # Filter by experiment type\n    if experiment_types:\n        df = df[df['Experimental System'].isin(experiment_types)]\n\n    print(f\"Interactions: {len(df)}\")\n    print(f\"Unique proteins: {pd.concat([df['Official Symbol Interactor A'],\n                                          df['Official Symbol Interactor B']]).nunique()}\")\n    print(f\"\\nExperiment types:\\n{df['Experimental System'].value_counts().head()}\")\n    return df\n\ndef build_ppi_network(biogrid_df, genes_of_interest=None):\n    \"\"\"Build NetworkX graph from BioGRID interactions.\"\"\"\n    G = nx.Graph()\n\n    for _, row in biogrid_df.iterrows():\n        a = row['Official Symbol Interactor A']\n        b = row['Official Symbol Interactor B']\n        if a != b:  # Exclude self-interactions\n            if G.has_edge(a, b):\n                G[a][b]['weight'] += 1\n            else:\n                G.add_edge(a, b, weight=1)\n\n    print(f\"Network: {G.number_of_nodes()} nodes, {G.number_of_edges()} edges\")\n\n    # Subnetwork for genes of interest\n    if genes_of_interest:\n        # Include 1st-degree neighbors\n        neighbors = set()\n        for gene in genes_of_interest:\n            if gene in G:\n                neighbors.update(G.neighbors(gene))\n        subgraph_nodes = set(genes_of_interest) | neighbors\n        subG = G.subgraph(subgraph_nodes)\n        print(f\"Subnetwork: {subG.number_of_nodes()} nodes, {subG.number_of_edges()} edges\")\n\n        # Hub analysis\n        degrees = dict(subG.degree())\n        hubs = sorted(degrees.items(), key=lambda x: x[1], reverse=True)[:10]\n        print(\"Top hubs:\")\n        for gene, deg in hubs:\n            print(f\"  {gene}: degree={deg}\")\n\n        return subG\n\n    return G\n```\n\n### 6. MSigDB Gene Sets\n\nLoad and use MSigDB gene set collections.\n\n```python\nimport pandas as pd\n\n# Download GMT files from: https:\u002F\u002Fwww.gsea-msigdb.org\u002Fgsea\u002Fmsigdb\u002Fcollections.jsp\n# Collections: H (hallmark), C1-C8\n\ndef parse_gmt(gmt_path):\n    \"\"\"Parse GMT (Gene Matrix Transposed) file format.\"\"\"\n    gene_sets = {}\n    with open(gmt_path) as f:\n        for line in f:\n            parts = line.strip().split('\\t')\n            name = parts[0]\n            description = parts[1]\n            genes = [g for g in parts[2:] if g]\n            gene_sets[name] = {'description': description, 'genes': genes}\n\n    print(f\"Loaded {len(gene_sets)} gene sets from {gmt_path}\")\n    sizes = [len(gs['genes']) for gs in gene_sets.values()]\n    print(f\"Gene set sizes: {min(sizes)}-{max(sizes)} (median: {sorted(sizes)[len(sizes)\u002F\u002F2]})\")\n    return gene_sets\n\ndef enrichment_with_msigdb(gene_list, collection='MSigDB_Hallmark_2020'):\n    \"\"\"Run enrichment analysis using MSigDB via gseapy.\"\"\"\n    import gseapy as gp\n\n    enr = gp.enrichr(gene_list=gene_list, gene_sets=collection, outdir=None)\n    results = enr.results[enr.results['Adjusted P-value'] \u003C 0.05]\n\n    print(f\"Significant pathways (padj \u003C 0.05): {len(results)}\")\n    if len(results) > 0:\n        print(results[['Term', 'Adjusted P-value', 'Overlap', 'Combined Score']].head(10))\n    return enr\n\n# Available collections via gseapy\nMSIGDB_COLLECTIONS = {\n    'H': 'MSigDB_Hallmark_2020',          # 50 hallmark gene sets\n    'C2_CP': 'KEGG_2021_Human',           # Canonical pathways\n    'C5_GO_BP': 'GO_Biological_Process_2021',  # GO biological process\n    'C5_GO_MF': 'GO_Molecular_Function_2021',  # GO molecular function\n    'C5_GO_CC': 'GO_Cellular_Component_2021',  # GO cellular component\n    'C7': 'Immunologic_Signature',        # Immunologic signatures\n}\n```\n\n### 7. DisGeNET & OMIM\n\nAccess disease-gene association databases.\n\n```python\nimport pandas as pd\nimport requests\n\n# DisGeNET: https:\u002F\u002Fwww.disgenet.org\u002Fdownloads\n# Download: curated_gene_disease_associations.tsv.gz\n\ndef load_disgenet(disgenet_path):\n    \"\"\"Load DisGeNET disease-gene associations.\"\"\"\n    df = pd.read_csv(disgenet_path, sep='\\t')\n\n    print(f\"Total associations: {len(df)}\")\n    print(f\"Unique genes: {df['geneSymbol'].nunique()}\")\n    print(f\"Unique diseases: {df['diseaseName'].nunique()}\")\n    return df\n\ndef search_disgenet_by_gene(disgenet_df, gene_symbol, min_score=0.3):\n    \"\"\"Find diseases associated with a gene.\"\"\"\n    results = disgenet_df[disgenet_df['geneSymbol'] == gene_symbol]\n    results = results[results['score'] >= min_score]\n    results = results.sort_values('score', ascending=False)\n\n    print(f\"Diseases associated with {gene_symbol} (score >= {min_score}): {len(results)}\")\n    if len(results) > 0:\n        print(results[['diseaseName', 'score', 'NofPmids']].head(10))\n    return results\n\ndef search_disgenet_by_disease(disgenet_df, disease_keyword, min_score=0.3):\n    \"\"\"Find genes associated with a disease.\"\"\"\n    mask = disgenet_df['diseaseName'].str.contains(disease_keyword, case=False, na=False)\n    results = disgenet_df[mask]\n    results = results[results['score'] >= min_score]\n    results = results.sort_values('score', ascending=False)\n\n    print(f\"Genes associated with '{disease_keyword}': {len(results)}\")\n    if len(results) > 0:\n        print(results[['geneSymbol', 'diseaseName', 'score']].head(15))\n    return results\n```\n\n### 8. Gene Ontology\n\nWork with GO terms and hierarchies.\n\n```python\nimport json\nimport requests\n\n# GO OBO file: http:\u002F\u002Fpurl.obolibrary.org\u002Fobo\u002Fgo.obo\n# GO JSON: https:\u002F\u002Fpurl.obolibrary.org\u002Fobo\u002Fgo.json\n\ndef parse_go_obo(obo_path):\n    \"\"\"Parse Gene Ontology OBO file.\"\"\"\n    terms = {}\n    current = None\n\n    with open(obo_path) as f:\n        for line in f:\n            line = line.strip()\n            if line == '[Term]':\n                current = {}\n            elif line == '' and current is not None:\n                if 'id' in current:\n                    terms[current['id']] = current\n                current = None\n            elif current is not None and ':' in line:\n                key, value = line.split(': ', 1)\n                if key in ('id', 'name', 'namespace', 'def'):\n                    current[key] = value\n                elif key == 'is_a':\n                    current.setdefault('parents', []).append(value.split(' ! ')[0])\n                elif key == 'is_obsolete' and value == 'true':\n                    current = None\n\n    print(f\"GO terms: {len(terms)}\")\n    namespaces = {}\n    for t in terms.values():\n        ns = t.get('namespace', 'unknown')\n        namespaces[ns] = namespaces.get(ns, 0) + 1\n    print(f\"Namespaces: {namespaces}\")\n    return terms\n\ndef get_ancestors(terms, go_id, max_depth=10):\n    \"\"\"Get all ancestor terms of a GO term.\"\"\"\n    ancestors = set()\n    queue = [go_id]\n    depth = 0\n\n    while queue and depth \u003C max_depth:\n        next_queue = []\n        for term_id in queue:\n            if term_id in terms:\n                parents = terms[term_id].get('parents', [])\n                for parent in parents:\n                    if parent not in ancestors:\n                        ancestors.add(parent)\n                        next_queue.append(parent)\n        queue = next_queue\n        depth += 1\n\n    return ancestors\n\ndef lookup_go_term(go_id):\n    \"\"\"Look up a GO term using the QuickGO API.\"\"\"\n    url = f\"https:\u002F\u002Fwww.ebi.ac.uk\u002FQuickGO\u002Fservices\u002Fontology\u002Fgo\u002Fterms\u002F{go_id}\"\n    response = requests.get(url, headers={'Accept': 'application\u002Fjson'})\n\n    if response.status_code == 200:\n        data = response.json()\n        if 'results' in data and len(data['results']) > 0:\n            term = data['results'][0]\n            print(f\"GO:{go_id}\")\n            print(f\"  Name: {term.get('name')}\")\n            print(f\"  Namespace: {term.get('aspect')}\")\n            print(f\"  Definition: {term.get('definition', {}).get('text', 'N\u002FA')[:200]}\")\n            return term\n    return None\n```\n\n## Typical Workflows\n\n### Workflow 1: Download and Filter COSMIC Cancer Gene Census\n\n```python\ncensus = load_cosmic_census('cancer_gene_census.csv')\nbreast_genes = filter_census_by_cancer(census, 'breast')\nprint(f\"\\nBreast cancer genes: {list(breast_genes['Gene Symbol'].head(20))}\")\n```\n\n### Workflow 2: Build Protein Interaction Network from BioGRID\n\n```python\nbiogrid = load_biogrid('BIOGRID-ALL-LATEST.tab3.txt',\n                        experiment_types=['Affinity Capture-MS', 'Two-hybrid'])\nG = build_ppi_network(biogrid, genes_of_interest=['TP53', 'BRCA1', 'ATM'])\n```\n\n### Workflow 3: Run Pathway Enrichment with MSigDB Gene Sets\n\n```python\ngene_list = ['TP53', 'BRCA1', 'ATM', 'CHEK2', 'PTEN', 'RB1', 'CDKN2A']\nenr = enrichment_with_msigdb(gene_list, collection='MSigDB_Hallmark_2020')\n```\n\n## Best Practices\n\n1. **COSMIC access** — requires free registration; respect data license terms; use COSMIC CGC for curated cancer genes, full dataset for comprehensive analysis\n2. **GTEx** — use median TPM for tissue comparisons; raw counts for differential analysis; eQTL data for variant interpretation\n3. **GWAS Catalog** — apply genome-wide significance threshold (5e-8); check LD with lead SNP; use mapped genes, not just reported genes\n4. **BioGRID** — filter by experiment type for quality; \"Affinity Capture-MS\" and \"Two-hybrid\" are highest confidence; weight edges by evidence count\n5. **MSigDB** — Hallmark gene sets are most interpretable; use C2 (curated) for canonical pathways; C5 (GO) for biological process analysis\n6. **DisGeNET** — filter by score (>0.3 for moderate confidence); prioritize curated sources; cross-reference with OMIM for Mendelian diseases\n7. **File sizes** — COSMIC full mutation export is ~30GB; GTEx TPM matrix is ~2GB; download and process locally, don't reload repeatedly\n\n## Troubleshooting\n\n**Problem:** COSMIC download requires authentication\n**Solution:** Register for free account at cancer.sanger.ac.uk. Use SFTP or download from the web portal. Academic license is free.\n\n**Problem:** GTEx API returns empty results\n**Solution:** Check gene symbol is HUGO-approved. Try ENSG ID instead. GTEx v8 uses GRCh38 coordinates.\n\n**Problem:** BioGRID file too large to load\n**Solution:** Use organism filter during loading. Read in chunks with `chunksize` parameter. Pre-filter with command-line tools (grep).\n\n**Problem:** gseapy enrichment returns no results\n**Solution:** Ensure gene symbols match the gene set database (HUGO symbols). Check that gene list has >5 genes. Try different collections.\n\n## Resources\n\n- [COSMIC](https:\u002F\u002Fcancer.sanger.ac.uk\u002Fcosmic)\n- [GTEx Portal](https:\u002F\u002Fgtexportal.org\u002F)\n- [GWAS Catalog](https:\u002F\u002Fwww.ebi.ac.uk\u002Fgwas\u002F)\n- [GeneBass](https:\u002F\u002Fgenebass.org\u002F)\n- [BioGRID](https:\u002F\u002Fthebiogrid.org\u002F)\n- [MSigDB](https:\u002F\u002Fwww.gsea-msigdb.org\u002Fgsea\u002Fmsigdb\u002F)\n- [DisGeNET](https:\u002F\u002Fwww.disgenet.org\u002F)\n- [Gene Ontology](http:\u002F\u002Fgeneontology.org\u002F)\n",{"name":5,"license":40,"category":31,"metadata":41,"description":7},"MIT license",{"skill-author":42},"InkVell Inc.","main","4aa39efd1cdab0b4657ecee16c92a92011a5b10f","openscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub","https:\u002F\u002Fgithub.com\u002Ffadrienne","2026-10-28 00:43:09",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add fadrienne\u002FMyGitHub --skill curated-bio-datasets",{"tool":55,"command":56},"bunx","bunx skills add fadrienne\u002FMyGitHub --skill curated-bio-datasets",{"tool":58,"command":59},"pnpm","pnpm dlx skills add fadrienne\u002FMyGitHub --skill curated-bio-datasets","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets\u002FSKILL.md",true,[63,69,73],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"scripts\u002Fbuild_ppi_network.py","SCRIPT","脚本",14393,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets\u002Fscripts\u002Fbuild_ppi_network.py",{"path":70,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":71,"sourceHtmlUrl":72},"scripts\u002Fdownload_cosmic.py",14701,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets\u002Fscripts\u002Fdownload_cosmic.py",{"path":74,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":75,"sourceHtmlUrl":76},"scripts\u002Fparse_msigdb.py",17108,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fcurated-bio-datasets\u002Fscripts\u002Fparse_msigdb.py",[78,110,134,168,195,222],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":89,"publishedAt":35},"01M7167B28PK20HP7R7ZED2DY0","statistical-power","Sample size calculation, power analysis, and effect size conversion for scientific studies. Use BEFORE data collection (a priori) to determine required N, or after (post-hoc) to compute achieved power. Covers parametric tests (t-test, ANOVA, chi-square, proportions, correlation, regression), simulation-based power for complex\u002Fclustered\u002Fnested designs, and power curves. Use this skill when someone asks 'how many samples do I need', 'what is my power', 'what effect size can I detect', or any variant. Pairs with \u002Fexperimental-design (choose design first, then compute power) and \u002Fstatistical-analysis (analyze data after collection).","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fstatistical-power\u002FSKILL.md",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109],"power","statistical power","effect","scipy","regression","choose","design","uv","when","Bash","collection","analysis","calculation","ANOVA","conversion","analyze","t-test","chi-square","simulation","sample",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":119,"publishedAt":35},"01M71677EBCM8EPCE9BZCK8505","statistical-analysis","Guided statistical analysis with test selection and reporting. Use when you need help choosing appropriate tests for your data, assumption checking, power analysis, and APA-formatted results. Best for academic research reporting, test selection guidance. For implementing specific models programmatically use statsmodels.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fstatistical-analysis\u002FSKILL.md",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000008","测试与质量",[101,120,90,121,122,123,98,124,125,23,32,126,26,127,128,129,130,131,132,133],"statistical analysis","academic research","implementing","selection","you","reporting","tests","with","test","research","results","statsmodels","models","help",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":149,"publishedAt":35},"01M71673R93XAHFH81DBNVNG7H","scientific-writing","Core skill for the deep research and writing tool. Write scientific manuscripts in full paragraphs (never bullet points). Use two-stage process with (1) section outlines with key points using research-lookup then (2) convert to flowing prose. IMRAD structure, citations (APA\u002FAMA\u002FVancouver), figures\u002Ftables, reporting guidelines (CONSORT\u002FSTROBE\u002FPRISMA), for research papers and journal submissions.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fscientific-writing\u002FSKILL.md",[140,143,144],{"categoryNo":141,"categoryName":142,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},{"categoryNo":145,"categoryName":146,"taxonomyType":147,"taxonomyTypeDesc":148},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[150,151,152,153,154,155,156,157,158,159,99,160,161,162,163,164,165,166,125,167],"writing","scientific","scientific writing","Citations","deep","deep research","never","papers","journal","false","api","prisma","structure","openrouter","Outlines","core skill","read","features",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":178,"publishedAt":35},"01M7166ZPKXBF4EBPHVTJPQBB1","scientific-visualization","Meta-skill for publication-ready figures. Use when creating journal submission figures requiring multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and specific journal formatting (Nature, Science, Cell). Orchestrates matplotlib\u002Fseaborn\u002Fplotly with publication styles. For quick exploration use seaborn or plotly directly.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fscientific-visualization\u002FSKILL.md",[174,177],{"categoryNo":175,"categoryName":176,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[179,151,180,181,182,183,184,185,186,158,98,187,188,189,190,191,192,193,32,194],"visualization","scientific visualization","error","ready","quick","exploration","meta-skill","Meta","safe","plotly","annotations","formatting","Publication","figures","panel","submission",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":207,"publishedAt":35},"01M7166VXJWQSSC3RQZP60WBGR","research-code","Debug, profile, review, and restructure Python research and analysis code. Use when analysis scripts crash, produce wrong results, run too slowly, or need a correctness review. Covers: reading tracebacks and diagnosing root causes, hypothesis-driven debugging, reviewing code for common statistical\u002Fnumerical errors, profiling data pipelines, improving reproducibility (seeds, environments, determinism), and structuring analysis scripts for sharing. Distinct from \u002Fexploratory-data-analysis (which understands data) and \u002Fstatistical-analysis (which chooses and runs tests) — this skill focuses on the code itself.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fresearch-code\u002FSKILL.md",[201,204],{"categoryNo":202,"categoryName":203,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":205,"categoryName":206,"taxonomyType":147,"taxonomyTypeDesc":148},"01JBSEEDCAT000000000000030","开发工程师",[208,209,129,210,211,212,213,97,214,98,99,101,215,216,217,218,219,220,166,221],"code","research code","which","memory","data-analysis","errors","debugging","common","review","data pipelines","run","scripts","line","write",{"skillNo":223,"name":224,"nameZh":6,"description":225,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":226,"licenseFileUrl":6,"sourceHtmlUrl":227,"categories":228,"keywords":235,"publishedAt":35},"01M7166CF5HSR7SVZYZFWTDX55","markdown-mermaid-writing","Comprehensive markdown and Mermaid diagram writing skill. Use when creating any scientific document, report, analysis, or visualization. Establishes text-based diagrams as the default documentation standard with full style guides (markdown + mermaid), 24 diagram type references, and 9 document templates.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fmarkdown-mermaid-writing\u002FSKILL.md",[229,232,233,234],{"categoryNo":230,"categoryName":231,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":141,"categoryName":142,"taxonomyType":87,"taxonomyTypeDesc":88},{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},{"categoryNo":145,"categoryName":146,"taxonomyType":147,"taxonomyTypeDesc":148},[150,236,237,238,239,240,179,241,242,98,99,101,243,244,245,246,247,248,151,166],"markdown mermaid writing","mermaid","markdown","community","diagrams","project","default","team","guides","text","documentation","references","diagram"]