Înapoi la catalog
Season 20 18 Episoade 1h 13m 2026

Biopython Fundamentals

Ediția v1.87 — 2026. Un ghid cuprinzător de 18 episoade pentru utilizarea Biopython (v1.87 - 2026) în analiza secvențelor, parsarea formatelor de date biologice, rularea BLAST, manipularea structurilor 3D, arborilor filogenetici și multe altele.

Calcul științific Bioinformatică
Biopython Fundamentals
Se redă acum
Click play to start
0:00
0:00
1
Introducere în Biopython și obiectul Seq
Descoperiți baza Biopython: obiectul Seq. Explorăm modul în care obiectele de secvență diferă de șirurile standard din Python și învățăm cum să efectuăm operațiuni biologice precum complementul invers și traducerea.
3m 37s
2
Date de secvență bogate: Obiectul SeqRecord
Învățați cum să împachetați secvențele în metadate bogate folosind obiectul SeqRecord. Acoperim modul în care identificatorii, numele, descrierile și adnotările de tip dicționar sunt stocate alături de secvența brută.
4m 47s
3
Citirea și scrierea fișierelor cu SeqIO
Stăpâniți conversiile fișierelor de secvențe și procesarea în loturi cu Bio.SeqIO. Acest episod explică diferența dintre citirea fișierelor cu o singură înregistrare și parsarea seturilor de date cu înregistrări multiple.
3m 56s
4
Extragerea genelor cu SeqFeature
Pătrundeți în lumea complexă a caracteristicilor secvențelor. Explicăm modul în care Biopython reprezintă coordonatele genelor, catenele și locațiile vagi folosind obiectul SeqFeature.
3m 37s
5
Alinierea perechilor de secvențe
Învățați cum să comparați două secvențe direct folosind modulul Bio.Align. Discutăm despre PairwiseAligner, scorurile de substituție și penalizările pentru gap-uri atât pentru alinierile globale, cât și pentru cele locale.
4m 14s
6
Gestionarea alinierilor multiple de secvențe
Treceți de la alinierile în perechi la alinierile multiple de secvențe. Acest episod acoperă parsarea fișierelor de aliniere cu AlignIO și tratarea alinierilor ca tablouri 2D pentru a extrage coloane specifice.
3m 50s
7
Interogarea programatică a bazelor de date NCBI
Automatizați căutările de literatură și secvențe. Descoperiți cum să interogați bazele de date NCBI folosind Entrez.esearch și să preluați ID-uri exacte fără a utiliza un browser web.
3m 51s
8
Rularea BLAST pe internet
Declanșați căutări BLAST de la distanță direct din Python. Învățați cum să utilizați qblast pentru a trimite secvențe către serverele NCBI și pentru a salva în siguranță rezultatele XML brute.
3m 58s
9
Parsare nativă: Despachetarea BLAST XML
Înțelegeți rezultatele complexe ale BLAST. Acest episod vă ghidează prin parsarea fișierelor BLAST XML în obiecte native Python pentru a extrage alinieri, High-scoring Segment Pairs (HSPs) și E-values.
4m 06s
10
Navigarea structurilor 3D cu Bio.PDB
Pășiți în trei dimensiuni. Explorăm modulul PDB, parsarea structurilor macromoleculare și înțelegerea arhitecturii Structure-Model-Chain-Residue-Atom (SMCRA).
4m 01s
11
Măsurarea geometriei proteinelor
Calculați relațiile spațiale din proteine. Acest episod acoperă calcularea distanțelor interatomice și utilizarea NeighborSearch pentru a găsi atomi într-o anumită rază.
4m 37s
12
Arbori filogenetici în Python
Parsați, manipulați și desenați arbori evolutivi cu Bio.Phylo. Acoperim citirea fișierelor Newick, traversarea arborilor și izolarea cladelor specifice.
4m 10s
13
Analiza motivelor de secvență
Descoperiți tipare ascunse în ADN. Aflați cum să creați motive de secvență, să construiți Position-Weight Matrices (PWMs) și să scanați secvențele țintă pentru situsuri de legare a factorilor de transcripție.
4m 07s
14
Integrarea Swiss-Prot și ExPASy
Accesați standardul de aur al bazelor de date cu proteine. Detaliem cum să preluați înregistrări prin Bio.ExPASy și să parsați fișierele plate dense Swiss-Prot pentru a extrage metadate proteice curate.
3m 50s
15
Vizualizarea genomurilor cu GenomeDiagram
Transformați fișierele GenBank brute în imagini de calitate pentru publicare. Învățați cum GenomeDiagram construiește hărți genomice circulare și liniare prin suprapunerea de piste și săgeți pentru caracteristici.
4m 00s
16
Genetica populațiilor cu Bio.PopGen
Analizați variația genetică în rândul populațiilor. Acest episod introduce Bio.PopGen pentru a parsa fișiere Genepop și a extrage cu ușurință frecvențele alelelor și valorile de heterozigozitate.
4m 00s
17
Căi biochimice cu KEGG
Conectați punctele metabolice. Învățați cum să parsați înregistrările de enzime și căi KEGG pentru a urmări reacțiile biochimice și structurile compușilor chimici.
4m 19s
18
Analiza de cluster pentru expresia genică
Grupați genele după comportamentul lor. În acest episod final, acoperim modulul Bio.Cluster, aplicând K-means și gruparea ierarhică pe datele de expresie microarray.
4m 17s

Episoade

1

Introducere în Biopython și obiectul Seq

3m 37s

Descoperiți baza Biopython: obiectul Seq. Explorăm modul în care obiectele de secvență diferă de șirurile standard din Python și învățăm cum să efectuăm operațiuni biologice precum complementul invers și traducerea.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 1 din 18. Tratarea unei secvențe de ADN ca un string de text standard funcționează bine până când ai nevoie de catena opusă. Manipularea simplă de string-uri în Python nu mai face față atunci când realizezi că transcrierea biologică nu înseamnă doar înlocuirea literelor, ci implică direcționalitate și coduri genetice distincte. Tocmai de aceea folosim Introducere în Biopython și obiectul Seq. În esență, o secvență biologică este un string de litere care reprezintă molecule precum ADN, ARN sau proteine. În Biopython, structura centrală de date este obiectul Seq. Acesta încapsulează comportamentul standard de string din Python, dar atașează direct datelor un context biologic. Pentru că se comportă ca un string normal, poți face tot ce faci în mod normal cu textul. Poți verifica lungimea unei secvențe. Poți număra de câte ori apare un anumit pattern. Poți face slice pentru a extrage o bucată mai mică. Când îi faci slice unui obiect Seq, rezultatul nu este un string de text standard. Este un nou obiect Seq. Acest lucru te asigură că nu elimini niciodată accidental metodele biologice atunci când faci parse la o secvență în fragmente mai mici. Aici e partea care contează. String-urile standard nu înțeleg biologia. ADN-ul este bicatenar, iar secvențele sunt citite într-o direcție specifică. Dacă ai o secvență de ADN codificator și ai nevoie de catena opusă, o simplă inversare a textului este biologic incorectă. Trebuie să inversezi ordinea literelor și să schimbi fiecare bază cu perechea ei structurală. Obiectul Seq gestionează acest lucru cu o singură metodă reverse complement, returnând o catenă opusă corectă din punct de vedere biologic. Dincolo de structură, obiectul Seq gestionează direct dogma centrală a biologiei moleculare. Ia în considerare o secvență scurtă de ADN codificator. Pentru a o converti în ARN mesager, apelezi metoda transcribe pe secvența ta. În spate, asta gestionează substituțiile specifice de litere, înlocuind timina cu uracil, și îți returnează o secvență de ARN. Dacă începi cu ARN și ai nevoie de echivalentul ADN, o metodă back transcribe inversează acest proces. Odată ce ai secvența pregătită, în general vrei proteina rezultată. Apelezi metoda translate. Aceasta grupează automat literele secvenței în triplete, le evaluează drept codoni și returnează un nou obiect Seq care conține secvența de aminoacizi. Biologia este rareori uniformă, iar codul genetic standard nu se aplică peste tot. Organisme precum anumite bacterii, sau organite precum mitocondriile vertebratelor, citesc codonii diferit. Metoda translate ia în considerare acest lucru prin translation tables. În loc să scrii o logică custom pentru o secvență mitocondrială, pur și simplu pasezi argumentul translation table metodei. Poți furniza numărul oficial al tabelului NCBI, cum ar fi tabelul doi pentru mitocondriile vertebratelor, sau numele tabelului ca text. Obiectul Seq recalculează aminoacizii folosind acele reguli specifice organismului. Adevărata putere a obiectului Seq este că te scutește să scrii funcții de text parsing fragile și predispuse la erori pentru procese biologice stabilite. Dacă vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
2

Date de secvență bogate: Obiectul SeqRecord

4m 47s

Învățați cum să împachetați secvențele în metadate bogate folosind obiectul SeqRecord. Acoperim modul în care identificatorii, numele, descrierile și adnotările de tip dicționar sunt stocate alături de secvența brută.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 2 din 18. Un string de zece mii de litere ADN este tehnic o secvență, dar analitic, este inutil. Fără a cunoaște specia de la care provine, tipul de moleculă sau calitatea citirii, ai doar text brut. Legarea acestor metadate cruciale de secvența brută este treaba Rich Sequence Data: The SeqRecord Object. SeqRecord este un container. Preia o secvență de bază și o împachetează cu identificatorii și informațiile descriptive necesare pentru a o folosi efectiv într-un pipeline de bioinformatică. Fiecare SeqRecord se bazează pe câteva atribute de bază. Primul este dot seq, care conține datele secvenței propriu-zise. Pe lângă acesta, mai sunt trei atribute standard de tip string. Dot id conține identificatorul principal, de obicei un număr de acces dintr-o bază de date publică. Dot name conține un nume comun mai scurt sau un identificator de clonă. Dot description conține un text human-readable care explică ce reprezintă de fapt secvența. Uneori, trei atribute de tip string nu sunt de ajuns. Când ai nevoie să stochezi metadate complexe sau custom, folosești atributul dot annotations. Acesta este un dicționar standard Python. El gestionează metadatele la nivel de record. Poți stoca orice aici. Dacă vrei să urmărești cum a fost verificată o secvență, pur și simplu adaugi o nouă cheie numită evidence în dicționar și îi setezi valoarea la experimental. Iată ideea cheie. Nu toate metadatele se aplică întregii secvențe în ansamblu. Uneori ai nevoie de date atribuite fiecărei litere în parte. Asta face dot letter annotations. Este un alt dicționar, dar vine cu o regulă strictă. Orice listă, array sau string pe care îl atribui ca valoare în acest dicționar trebuie să aibă exact aceeași lungime ca secvența în sine. Un use case clasic este stocarea scorurilor de calitate Phred de la un aparat de secvențiere. Dacă secvența ta dummy de ADN are exact douăzeci de litere lungime, poți atribui o listă de douăzeci de integers dicționarului dot letter annotations sub cheia phred quality. Dacă încerci să atribui nouăsprezece sau douăzeci și unu de integers, Biopython va arunca imediat o eroare. Poți construi ușor un SeqRecord de la zero. Mai întâi, definești un obiect de tip secvență. Apoi, pasezi acea secvență în constructorul SeqRecord. Poți pasa identificatorul, numele și descrierea chiar acolo, ca argumente. Odată ce obiectul există, îi poți accesa dicționarele pentru a injecta manual string-urile tale custom de evidence sau listele de scoruri de calitate per literă. În practică, rareori le construiești complet manual. De obicei, le obții prin parsarea fișierelor, iar Biopython gestionează diferite formate de fișiere prin maparea datelor la atributele SeqRecord în moduri specifice. Ia în considerare un fișier FASTA standard. FASTA este un format foarte simplu. Când Biopython îl citește, ia primul cuvânt de după simbolul mai mare decât de pe linia de header și îl atribuie atributului dot id. Atributul dot name primește pur și simplu exact aceeași valoare ca identificatorul. Restul liniei de header este pus direct în atributul dot description. Pentru că FASTA nu are metadate structurate, dicționarul dot annotations rămâne complet gol. Fișierele GenBank oferă un contrast puternic. Acestea conțin date bogate, structurate. Când parsează GenBank, Biopython atribuie locusul și numărul versiunii lui dot id. Numele locusului merge în atributul dot name. Linia de definiție se mapează la dot description. În mod crucial, Biopython populează activ dicționarul dot annotations. Extrage detaliile de taxonomie, tipul moleculei, diviziunea fișierului de date și lista de referințe publicate, plasându-le pe toate frumos în dicționar, sub chei standardizate. Secvența îți spune codul biologic din spate, dar obiectul SeqRecord este cel care, în cele din urmă, oferă acelui cod contextul său. Îți mulțumesc că ai petrecut câteva minute cu mine. Până data viitoare, numai bine.
3

Citirea și scrierea fișierelor cu SeqIO

3m 56s

Stăpâniți conversiile fișierelor de secvențe și procesarea în loturi cu Bio.SeqIO. Acest episod explică diferența dintre citirea fișierelor cu o singură înregistrare și parsarea seturilor de date cu înregistrări multiple.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 3 din 18. Pipeline-ul tău de bioinformatică se blochează la jumătatea unei rulări. Verifici log-urile și realizezi că un script downstream aștepta un fișier FASTA, dar tool-ul upstream i-a pasat un fișier GenBank. Acum trebuie să rescrii un parser de la zero doar pentru a extrage datele secvenței. Sau, ai putea folosi Bio dot SeqIO. SeqIO este modulul standard din Biopython pentru input-ul și output-ul secvențelor. El se ocupă de parsing-ul diferitelor formate de fișiere biologice, așa că nu trebuie să scrii expresii regulate custom sau funcții de manipulare de string-uri. Tu îi dai file path-ul și format string-ul, iar SeqIO gestionează structura fișierului din spate. Când citești fișiere, SeqIO îți oferă două funcții distincte, iar alegerea celei greșite este o sursă comună de bug-uri. Prima este read. Folosești funcția read atunci când ești absolut sigur că fișierul tău conține exact un singur sequence record. Îi pasezi file path-ul și formatul, cum ar fi fasta, și îți returnează un singur obiect de tip sequence record. Dacă fișierul este gol sau dacă conține două sau mai multe record-uri, funcția read va arunca imediat o excepție și îți va opri scriptul. Este strict pentru o mapare one-to-one. Cel mai des, ai de-a face cu fișiere care conțin multe secvențe. Pentru asta, folosești funcția parse. Spre deosebire de read, parse nu încarcă totul în memorie deodată. În schimb, returnează un iterator. Asta e partea care contează. Un iterator face yield la un singur sequence record pe rând, ceea ce îți menține memory footprint-ul redus, chiar dacă procesezi dataset-uri genomice masive, de mai mulți gigabytes. Ia în considerare un scenariu specific. Ai un fișier GenBank care conține date pentru mai multe specii de orhidee. Vrei să extragi aceste record-uri, dar te interesează doar secvențele care au mai mult de o sută de perechi de baze. În plus, următorul tool din pipeline-ul tău cere formatul FASTA, nu GenBank. Poți gestiona citirea, filtrarea și conversia formatului secvențial. Mai întâi, creezi o listă goală care să îți țină secvențele filtrate. Apoi, setezi un loop folosind funcția parse, pe care o îndrepți către fișierul tău GenBank cu orhidee și specifici genbank ca input format string. În interiorul loop-ului, funcția parse îți dă un obiect sequence record la fiecare iterație. Verifici lungimea secvenței atașate acelui record. Dacă lungimea este mai mare de o sută, dai append la record în lista ta. Dacă este mai scurtă, pur și simplu o ignori și treci la următoarea iterație. Acum ai o listă de record-uri valide, filtrate, în memorie. Pentru a le salva, folosești funcția write. Funcția write cere trei parametri: secvența de record-uri pe care vrei să le salvezi, output file path-ul și output format string-ul. Pasezi lista ta de record-uri filtrate cu orhidee, specifici un nou nume de fișier și oferi fasta ca format string. Asta e tot ce trebuie să faci. SeqIO extrage automat identificatorii și secvențele relevante din record-urile tale GenBank și le formatează corect ca text FASTA. Nu este nevoie să construiești manual liniile de header sau să formatezi blocurile de secvență. Prin asocierea parse cu write, traduci fără efort între formate de fișiere. Cea mai utilă idee de reținut aici este că SeqIO acționează ca o punte standardizată. Prin forțarea tuturor formatelor de fișiere într-o structură universală de sequence record în timpul etapei de parse, decuplează complet formatul pe care îl citești de formatul pe care îl scrii în cele din urmă. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
4

Extragerea genelor cu SeqFeature

3m 37s

Pătrundeți în lumea complexă a caracteristicilor secvențelor. Explicăm modul în care Biopython reprezintă coordonatele genelor, catenele și locațiile vagi folosind obiectul SeqFeature.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 4 din 18. Faci slice manual pe un string de secvență pentru a extrage o genă de pe catena inversă. Calculezi coordonatele, inversezi string-ul, faci complementul bazelor și rulezi script-ul. În jumătate din cazuri, te alegi cu o eroare off-by-one sau cu date fără sens. Să încerci să faci aceste calcule de secvență manual este o capcană clasică. În schimb, ar trebui să lași parser-ul să facă treaba, extrăgând genele cu SeqFeature. Un obiect SeqFeature descrie o regiune sau un reper specific pe o secvență părinte. Când faci parse pe un format de fișier bogat, Biopython îți populează record-ul secvenței cu o listă a acestor obiecte de tip feature. Fiecare feature are trei atribute principale pe care le vei folosi constant. Primul este atributul type. Acesta este pur și simplu un string care îți spune ce reprezintă acel feature, cum ar fi genă, CDS sau ARNm. Al doilea este atributul qualifiers. Acesta este un dictionary care conține toate metadatele atașate acelui feature specific. Dacă ai nevoie de numele genei, de tag-ul locus sau de o notă despre produsul traducerii, le extragi din dictionary-ul qualifiers. Al treilea, și cel mai important, este atributul location. Acesta dictează exact unde se află matematic acel feature pe secvența părinte. Acesta vine în două forme principale. Un SimpleLocation gestionează porțiuni continue, neîntrerupte de secvență. Conține o poziție exactă de start, o poziție exactă de end și catena. Catena este reprezentată ca un integer. Este unu pentru catena forward și minus unu pentru catena reverse. Biologia se opune adesea simplității. Genele cu splicing la eucariote sunt împărțite în mai mulți exoni de-a lungul genomului. Pentru a gestiona asta, atributul location va fi în schimb un CompoundLocation. Un CompoundLocation este în esență o colecție de SimpleLocation-uri unite. Grupează acele coordonate fragmentate de exoni și le tratează ca pe o singură unitate logică. Iată ideea cheie. Nu trebuie să te uiți la aceste coordonate de location și să scrii propria ta notație de slice în Python pentru a scoate datele secvenței din record-ul părinte. Folosești metoda extract atașată acelui feature în sine. Pentru a o folosi, iei obiectul SeqFeature, apelezi metoda extract și pasezi secvența părinte completă ca argument. Acel feature se uită la propriile date de location și face munca grea pentru tine. Dacă acel feature este un SimpleLocation pe catena forward, face slice pe secvență exact așa cum te-ai aștepta. Dacă acel feature se află pe catena reverse, extract gestionează automat acel slice, generează reverse complement-ul acelei secvențe și returnează rezultatul biologic precis. Nu trebuie să inversezi string-urile sau să-ți amintești să faci complementul bazelor. Face și mai multă muncă pentru tine atunci când ai de-a face cu un CompoundLocation. Dacă apelezi extract pe o genă cu splicing, Biopython merge la secvența părinte, extrage fiecare exon individual pe baza SimpleLocation-urilor respective, le face automat reverse complement dacă gena se află pe catena minus și le coase pe toate laolaltă în ordinea corectă. Îți dă înapoi o bucată de secvență continuă și curată, gata pentru traducere sau analiză downstream. Bazându-te pe metoda extract, elimini calculele manuale de index care cauzează erori silențioase de date în pipeline-urile de bioinformatică. Aș vrea să îmi iau un moment să îți mulțumesc pentru că asculți — ne ajută foarte mult. Să ai o zi faină!
5

Alinierea perechilor de secvențe

4m 14s

Învățați cum să comparați două secvențe direct folosind modulul Bio.Align. Discutăm despre PairwiseAligner, scorurile de substituție și penalizările pentru gap-uri atât pentru alinierile globale, cât și pentru cele locale.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 5 din 18. Algoritmii clasici de aliniere prin programare dinamică sunt extrem de lenți când sunt scriși în Python pur. Dacă încerci să procesezi mii de perechi de secvențe, scriptul tău se va bloca ore în șir. Biopython rezolvă asta trecând la C pentru munca grea, oferindu-ți performanță de milisecunde. Acest episod este despre Pairwise Sequence Alignment folosind obiectul PairwiseAligner. Pentru a compara exact două secvențe, instanțiezi un PairwiseAligner. Acest singur obiect acționează ca un motor de configurare pentru întregul proces. By default, efectuează o aliniere globală, ceea ce înseamnă că forțează un match de la un capăt la altul între cele două secvențe. Dacă vrei doar să găsești cea mai bună subsecvență care face match, ascunsă undeva într-un string mai mare, schimbi atributul mode al aligner-ului din global în local. Aligner-ul are nevoie de reguli pentru a decide ce constituie un match bun. Setezi aceste reguli direct ca atribute pe obiectul aligner. Atribui un număr pozitiv atributului match score și un număr negativ atributului mismatch score. Dar secvențele biologice suferă mutații și prin inserarea sau ștergerea unor bucăți întregi de litere, ceea ce creează gap-uri în aliniere. Aici e ideea cheie. Biologia favorizează puternic o singură ștergere lungă în detrimentul mai multor ștergeri mici și dispersate. Pentru a modela această realitate fizică, configurezi două gap penalties separate. Atribui o valoare negativă mare pentru open gap score, pentru a penaliza crearea unui nou gap. Apoi, atribui o valoare negativă mult mai mică pentru extend gap score. Acest dezechilibru matematic forțează aligner-ul să grupeze gap-urile ori de câte ori este posibil. Odată ce aligner-ul tău este configurat, apelezi metoda sa align și îi pasezi cele două secvențe. Metoda nu returnează doar un singur string sau un număr final. Returnează un iterator de obiecte de aliniere. Mai multe căi printr-o matrice de programare dinamică pot produce exact același scor maxim. Aligner-ul îți oferă acces la toate aceste alinieri optime din punct de vedere matematic. Pentru că returnează un iterator, face o evaluare lazy. Calculează următoarea cale optimă doar atunci când o ceri, ceea ce îți protejează sistemul de memory overload dacă secvențele extrem de repetitive generează mii de alinieri la fel de valide. Ia în considerare un exemplu concret folosind două secvențe scurte de ADN. Secvența unu este A C C G T. Secvența doi este A C G, ceea ce înseamnă că îi lipsesc al doilea C și ultimul T. Mai întâi, creezi obiectul aligner. Setezi match score-ul la doi, și mismatch score-ul la minus unu. Setezi open gap score-ul la minus cinci, și extend gap score-ul la minus unu. Apoi, pasezi ambele secvențe metodei align. Când faci un loop prin iteratorul returnat și dai print la rezultate, Biopython formatează automat output-ul. Acesta stivuiește secvențele vizual, trasând linii verticale între bazele care fac match și liniuțe unde lipsește o literă. Vei vedea exact cum aligner-ul a plasat caractere de tip gap în a doua secvență pentru a alinia literele care fac match, maximizând scorul total pe baza penalizării severe de tip open gap pe care ai definit-o. Reține că configurarea unui aligner este, în esență, un tuning al unui model matematic; output-ul are semnificație biologică numai dacă scorurile tale de match, mismatch și gap reflectă cu acuratețe relația evolutivă specifică dintre secvențele tale de input. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
6

Gestionarea alinierilor multiple de secvențe

3m 50s

Treceți de la alinierile în perechi la alinierile multiple de secvențe. Acest episod acoperă parsarea fișierelor de aliniere cu AlignIO și tratarea alinierilor ca tablouri 2D pentru a extrage coloane specifice.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 6 din 18. Deschizi un fișier de aliniere într-un editor de text și arată perfect structurat, ca o grilă simplă. Dar încearcă să faci parse doar la a treia poziție pentru cincizeci de specii diferite și, dintr-o dată, scrii nested loops și ții evidența la string indices. Gestionarea alinierilor multiple de secvențe nu trebuie să fie atât de frustrantă. Pentru a aduce o aliniere în codul tău, folosești modulul Bio AlignIO. Presupunând că fișierul tău de aliniere este deja generat, te bazezi pe funcția read. Pasezi acestei funcții calea fișierului și un string care denumește formatul, cum ar fi phylip sau stockholm. Funcția read procesează fișierul text și îți returnează un obiect MultipleSeqAlignment. Iată ideea cheie. Obiectul MultipleSeqAlignment se comportă exact ca un array 2D. Dacă ai lucrat vreodată cu o matrice NumPy, logica este identică. Rândurile din această grilă sunt secvențele tale individuale, reprezentând de obicei organisme sau gene diferite. Coloanele reprezintă pozițiile specifice de nucleotide sau aminoacizi aliniate pe toate acele secvențe. Deoarece se comportă ca un array 2D, folosești sintaxa standard de slicing din Python pentru a manipula ambele dimensiuni simultan. Dacă trebuie doar să iei o secvență specifică, faci slice pe rânduri. Accesarea indexului zero al alinierii tale returnează prima secvență din fișier. Acest rând este returnat ca un obiect SeqRecord standard, complet cu ID-ul secvenței, descrierea și datele secvenței biologice în sine. De asemenea, poți face loop direct peste obiectul de aliniere, iar acesta îți va da fiecare SeqRecord rând cu rând. Asta rezolvă partea de secvențe. Acum să trecem la coloane, unde logica 2D îți economisește cu adevărat timp. Să presupunem că ai încărcat o aliniere Stockholm și vrei să izolezi o regiune de început extrem de conservată. Te interesează doar primele zece poziții din fiecare specie. În loc să iterezi prin cincizeci de secvențe și să faci slice pe cincizeci de stringuri individuale, aplici un slice 2D direct pe obiectul de aliniere. Ceri toate rândurile folosind două puncte pentru prima dimensiune, urmate de o virgulă, apoi slice-ul zero la zece pentru a doua dimensiune. Sintaxa este pur și simplu paranteză pătrată deschisă, două puncte, virgulă, două puncte zece, paranteză pătrată închisă. Această singură operație returnează un obiect MultipleSeqAlignment complet nou care conține doar primele zece coloane pentru fiecare secvență. Toate ID-urile și metadatele secvenței originale sunt păstrate automat în noua grilă, mai mică. Există o mică diferență de comportament în funcție de cât de lat este slice-ul tău. Când faci slice pe un range de coloane, Biopython menține structura grilei și returnează un obiect de aliniere. Dar dacă extragi exact o singură coloană - să zicem, toate rândurile de la indexul coloanei cinci - obiectul returnează un singur string plain text care conține doar acele caractere de sus în jos. Acest string facilitează extrem de mult calcularea scorurilor de conservare sau identificarea polimorfismelor cu un singur nucleotid la un anumit loc fără a face unpack la niciun obiect. Poți combina aceste slice-uri de rând și coloană pentru a extrage orice subbloc de care ai nevoie. Ai putea cere rândurile de la doi la cinci și coloanele de la cincizeci la șaizeci, izolând un domeniu specific pentru un subset de specii. Tratează alinierile ca pe niște matrici, lasă obiectul MultipleSeqAlignment să se ocupe de string tracking, iar codul tău de extragere a datelor se va reduce aproape la zero. Asta e tot pentru acest episod. Pe data viitoare!
7

Interogarea programatică a bazelor de date NCBI

3m 51s

Automatizați căutările de literatură și secvențe. Descoperiți cum să interogați bazele de date NCBI folosind Entrez.esearch și să preluați ID-uri exacte fără a utiliza un browser web.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 7 din 18. Trebuie să descarci zece mii de înregistrări de secvențe. Dacă scrii un web scraper standard ca să accesezi site-ul NCBI, adresa ta de IP va fi blocată înainte să termini primele o sută. Centrul Național pentru Informații Biotehnologice interzice în mod explicit scraping-ul automat. Ca să extragi date legal și fiabil, trebuie să interoghezi bazele de date NCBI programatic folosind Bio dot Entrez. Înainte să faci orice network requests, trebuie să urmezi instrucțiunile API-ului NCBI. În primul rând, trebuie să le spui cine ești. Faci asta setând variabila Entrez dot email la adresa ta reală de email. Dacă scriptul tău scapă de sub control și le supraîncarcă serverele, vor folosi acest email ca să te contacteze înainte să îți taie definitiv accesul. În al doilea rând, trebuie să le respecți rate limits-urile. NCBI restricționează utilizatorii neautentificați la trei request-uri pe secundă. Biopython gestionează asta automat prin impunerea unui delay în background. Totuși, dacă încerci să lansezi mai multe scripturi în paralel ca să ocolești acest delay, NCBI va detecta abuzul și îți va bana IP-ul. Respectă regulile. Workflow-ul pentru extragerea datelor din Entrez necesită de obicei un proces în doi pași: găsirea identificatorilor unici și apoi descărcarea fișierelor propriu-zise. Începi prin a căuta cu funcția Entrez dot esearch. Să presupunem că vrei să găsești gena matK la orhidee. Apelezi esearch și îi pasezi numele bazei de date, care este nucleotide, împreună cu termenul tău de search, cum ar fi orchid organism AND matK gene. Această funcție de search nu returnează date despre secvențele biologice. Returnează un HTTP response care se comportă ca un fișier text deschis ce conține un document XML. Iată ideea cheie. Nu trebuie să scrii un XML parser custom sau să extragi string-uri manual. Iei acel network file handle și îl pasezi direct în funcția Entrez dot read. Asta parsează XML-ul și îl traduce într-un dicționar Python standard. În interiorul acelui dicționar, pur și simplu cauți cheia numită IdList. Asta îți dă o listă Python care conține identificatorii GenBank exacți ce corespund query-ului tău despre orhidee. Odată ce ai acea listă de identificatori, treci la al doilea pas: descărcarea înregistrărilor complete. Pentru asta, folosești funcția Entrez dot efetch. Îi pasezi același nume de bază de date, nucleotide, împreună cu un identificator din rezultatele tale de search. De asemenea, trebuie să specifici formatul datelor pe care vrei să le primești înapoi. Ca să obții un fișier text GenBank standard, setezi argumentul retrieval type la gb și argumentul retrieval mode la text. La fel ca funcția de search, efetch returnează un network stream, nu un raw string. Pentru că acest stream imită un fișier local, nu trebuie să salvezi mai întâi datele descărcate pe hard drive. Poți pasa network handle-ul direct către SeqIO dot read, specifici că formatul este genbank, iar acesta parsează imediat stream-ul într-un obiect Biopython SeqRecord. Acum ai secvența și toate adnotările ei biologice încărcate în memorie. Când ai terminat, închide handle-ul ca să eliberezi resursele de rețea. Cel mai important obicei atunci când interoghezi NCBI este să tratezi API responses ca file streams, mai degrabă decât ca text strings. Pasarea acestor streams direct în Entrez dot read sau SeqIO dot read evită un memory overhead inutil și îți menține automation pipelines perfect curate. Dacă găsești aceste episoade utile, poți susține emisiunea căutând DevStoriesEU pe Patreon. Mulțumesc pentru ascultare, happy coding tuturor!
8

Rularea BLAST pe internet

3m 58s

Declanșați căutări BLAST de la distanță direct din Python. Învățați cum să utilizați qblast pentru a trimite secvențe către serverele NCBI și pentru a salva în siguranță rezultatele XML brute.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 8 din 18. Să te uiți la o pagină web cu auto-refresh în timp ce o secvență se aliniază cu o bază de date globală este un mod groaznic de a-ți petrece după-amiaza. Automatizarea acestei căutări în background înseamnă că poți face ceva util în timp ce Python așteaptă. Astăzi vom discuta despre rularea BLAST pe internet folosind Biopython. Funcția de care ai nevoie se numește qblast, situată în modulul Bio dot Blast dot NCBIWWW. Aceasta acționează ca un wrapper peste API-ul NCBI BLAST, permițându-ți să trimiți query-uri direct din scriptul tău, exact așa cum ai face-o prin portalul lor web. Pentru a declanșa o căutare, qblast necesită trei argumente obligatorii. Primul este programul blast pe care vrei să-l execuți. De exemplu, dacă compari o secvență de nucleotide cu o bază de date de nucleotide, pasezi string-ul blastn. Dacă lucrezi cu proteine, pasezi blastp. Al doilea argument este baza de date specifică în care cauți. Cea mai comună alegere pentru nucleotide este string-ul nt, care reprezintă baza de date de nucleotide neredundantă. Dacă ai căuta proteine, ai folosi nr. Al treilea argument este query-ul secvenței în sine. Biopython face ca acest input să fie extrem de flexibil. Poți furniza un plain string al secvenței raw, un multi-line string formatat ca un record FASTA, un obiect Biopython SeqRecord, sau un identificator exact al secvenței, cum ar fi un accession number NCBI. Dacă vrei să rulezi o căutare de bază, apelezi qblast, îi dai blastn ca program, nt ca bază de date și string-ul FASTA ca query. Python va pune pe pauză execuția aici în timp ce negociază cu serverele NCBI, așteptând oricât durează ca alinierea remote să se termine. Când serverul remote termină job-ul, qblast returnează un file-like object care conține rezultatele tale. În spate, funcția solicită aceste rezultate în format XML by default. Ar trebui să te asiguri că rămâne așa, deoarece XML este formatul standard pe care se bazează Biopython pentru procesarea downstream. Iată ideea cheie. Nu pasa imediat acest web handle returnat către o funcție de parsing. Rularea unei căutări BLAST remote este costisitoare din punct de vedere computațional pentru serverele NCBI și consumatoare de timp pentru tine. Dacă parsezi data stream-ul live direct din web handle și scriptul tău întâmpină o eroare câteva linii mai jos, acele date ale secvenței se pierd din memorie. Pentru a-ți repara codul și a încerca din nou, ar trebui să execuți exact aceeași căutare remote de la zero, irosind bandwidth-ul lor și timpul tău. Workflow-ul corect este să salvezi permanent output-ul raw imediat. În momentul în care qblast returnează web handle-ul, folosește operațiunile standard de fișiere Python pentru a deschide un nou fișier local în write mode. Citește tot din web handle, scrie-l direct în noul tău fișier XML local și apoi închide web handle-ul. Acum ai o copie sigură și statică a căutării tale BLAST pe hard disk. Poți deschide acel fișier XML local mâine, săptămâna viitoare sau de cincizeci de ori la rând în timp ce faci debug la aplicație, fără a da vreodată ping API-ului NCBI a doua oară. Decuplează întotdeauna network retrieval-ul de procesarea datelor, scriind mai întâi web response-urile pe disk. Asta e tot pentru acest episod. Mulțumesc că ai ascultat și continuă să construiești!
9

Parsare nativă: Despachetarea BLAST XML

4m 06s

Înțelegeți rezultatele complexe ale BLAST. Acest episod vă ghidează prin parsarea fișierelor BLAST XML în obiecte native Python pentru a extrage alinieri, High-scoring Segment Pairs (HSPs) și E-values.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 9 din 18. Scrierea de expresii regulate pentru a face scrape pe fișiere de output plain-text este un rit de trecere în bioinformatică. Este, de asemenea, un anti-pattern. În momentul în care un search tool își actualizează formatarea vizuală, scriptul tău crapă. Pentru a obține garanții structurale, trebuie să te bazezi pe date structurate. Acest episod acoperă Parsing nativ: Unpacking pentru BLAST XML. Biopython gestionează acest lucru folosind modulul NCBIXML din pachetul Bio dot Blast. În loc să îți salvezi rezultatele căutării ca un bloc de text human-readable, le salvezi ca un fișier XML. Când deschizi acest fișier și pasezi handle-ul funcției parse din modulul NCBIXML, acesta nu încarcă un blob masiv de text în memorie. În schimb, returnează un iterator. Acest iterator face yield la obiecte structurate unul câte unul, menținându-ți memory footprint-ul scăzut, chiar dacă căutarea ta a returnat cantități masive de date. Pentru a utiliza acest lucru eficient, trebuie să înțelegi ierarhia pe trei niveluri pe care Biopython o folosește pentru a modela rezultatele. Nivelul superior este BLAST Record-ul. Un record corespunde exact unei secvențe pe care ai trimis-o ca query. Dacă ai trimis o singură secvență, iteratorul face yield la un record. Dacă ai trimis cincizeci de secvențe, face yield la cincizeci de record-uri. În interiorul fiecărui BLAST Record, vei găsi o listă de Alignments. Un alignment reprezintă un singur hit în database. Îți spune că o anumită secvență din database a făcut match cu query-ul tău, împreună cu metadata despre acel entry din database. În interiorul fiecărui Alignment se află al treilea nivel: High-scoring Segment Pairs, cunoscute universal ca HSP-uri. Aceasta este partea care contează. Un alignment indică pur și simplu că două secvențe sunt înrudite. HSP-ul conține dovada matematică și structurală a acestei relații. Un singur alignment poate conține mai multe HSP-uri dacă secvențele au în comun mai multe regiuni distincte de similaritate, separate de gap-uri nealiniate. Extragerea datelor înseamnă scrierea a trei loop-uri nested. Mai întâi, iterezi peste record-urile din XML-ul parsat. În al doilea rând, iterezi peste alignment-urile din interiorul fiecărui record. În al treilea rând, iterezi peste HSP-urile din interiorul fiecărui alignment. Odată ce te afli în interiorul acelui innermost loop, ai acces la datele de match efective. Aici îți aplici filtrele statistice. Cel mai comun filtru este e-value, care reprezintă numărul de hit-uri de calitate similară pe care te-ai aștepta să le vezi din întâmplare. Accesezi asta prin intermediul atributului expect de pe obiectul HSP. Scrii un conditional check: dacă HSP dot expect este mai mic decât threshold-ul tău, să zicem zero virgulă zero patru, procesezi match-ul. Dacă este mai mare, match-ul este prea slab și îl ignori. Pentru hit-urile care trec de filtrul tău, obiectul HSP conține string-urile exacte de alignment. Atributul query conține secvența ta de input cu orice gap-uri introduse de algoritm. Atributul sbjct conține secvența de database care a făcut match. Atributul match se află conceptual între ele, conținând reprezentarea alignment-ului, mapând match-urile exacte, substituțiile pozitive sau gap-urile. Adevăratul avantaj aici este stabilitatea. Lăsând modulul NCBIXML să facă unpack la fișier, nu te mai bazezi pe text scraping fragil și începi să interacționezi cu data objects definite care fac map perfect la realitatea biologică a record-urilor, alignment-urilor și perechilor de segmente. Mulțumesc pentru ascultare, happy coding tuturor!
10

Navigarea structurilor 3D cu Bio.PDB

4m 01s

Pășiți în trei dimensiuni. Explorăm modulul PDB, parsarea structurilor macromoleculare și înțelegerea arhitecturii Structure-Model-Chain-Residue-Atom (SMCRA).

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 10 din 18. Proteinele sunt adesea stocate ca un string plat, unidimensional de litere, dar funcționează într-o realitate tridimensională complexă. Maparea unei secvențe 1D la un spațiu de coordonate 3D necesită o ierarhie strictă și previzibilă. Navigarea în structurile 3D cu Bio.PDB oferă exact această hartă. Când descarci un fișier din Protein Data Bank, acesta vine ca un bloc masiv de text. Istoric vorbind, acesta era formatul dot pdb. Astăzi, standardul este formatul dot cif. Să scrii propriul cod pentru a citi aceste blocuri de text linie cu linie este un exercițiu de gestionare a edge case-urilor. Bio.PDB rezolvă asta convertind textul într-un tree object-oriented. Pentru a face asta, folosești fie PDBParser, fie MMCIFParser. Creezi o instanță a parser-ului, apelezi metoda sa get structure, oferi un nume arbitrar pentru structura ta și îi pasezi calea fișierului. Ce primești înapoi este un obiect Structure. Acest obiect Structure urmează o arhitectură de date strictă cunoscută sub numele de SMCRA. Asta vine de la Structure, Model, Chain, Residue, Atom. Fiecare fișier 3D parsat de Biopython este organizat în aceste cinci niveluri nested. Nivelul root este Structure. Un Structure conține unul sau mai multe Models. Dacă proteina a fost rezolvată folosind cristalografia cu raze X, există de obicei un singur model. Dacă a fost rezolvată folosind RMN, ar putea exista zeci de modele care reprezintă diferite fluctuații structurale. De obicei, îl iei pur și simplu pe primul, care se află la indexul zero. În interiorul unui Model, ai Chains. Multe proteine sunt complexe formate din mai multe chains polipeptidice care interacționează. Acestea sunt de obicei etichetate cu o singură literă mare, cum ar fi chain A și chain B. În interiorul unui Chain, găsești Residues. Aceștia sunt aminoacizii individuali care alcătuiesc secvența. Acest nivel conține, de asemenea, liganzi și molecule de apă atașate acelui chain specific. În cele din urmă, în interiorul unui Residue, ai Atoms. Aici e ideea de bază. Poți naviga prin tot acest tree folosind o iterație simplă sau acces de tip dictionary. Dacă scrii un for loop peste un chain, acesta returnează residues. Dacă iterezi peste un residue, îți dă atoms. Dacă știi exact ce cauți, poți să cobori direct fără să folosești un loop. Dacă ai nevoie de coordonatele spațiale ale carbonului alfa din al o sutălea residue din chain A, pur și simplu îți înlănțui lookup-urile. Iei obiectul structure, ceri modelul zero, apoi chain A, apoi residue o sută, apoi atomul numit CA. Ia în considerare un scenariu practic: extragerea coordonatelor 3D ale tuturor atomilor dintr-un singur residue specific. Mai întâi, inițializezi parser-ul și încarci fișierul într-o variabilă. Apoi, izolezi acel residue țintă. Creezi o variabilă și îi atribui rezultatul lookup-ului pentru modelul zero, chain A și residue cincizeci din structure-ul tău. Acum, scrii un for loop standard. Pentru fiecare atom din acel residue țintă, îi ceri coordonatele. Biopython le returnează ca un array NumPy reprezentând pozițiile exacte X, Y și Z în spațiu. Dai print la numele atomului și la array-ul său de coordonate. În doar câteva linii de cod, ai ocolit mii de linii de raw text și ai extras exact datele spațiale de care ai nevoie. Ierarhia SMCRA asigură că fiecare atom din fiecare fișier structure este găsit folosind exact aceeași logică. Asta e tot pentru acest episod. Ne auzim data viitoare!
11

Măsurarea geometriei proteinelor

4m 37s

Calculați relațiile spațiale din proteine. Acest episod acoperă calcularea distanțelor interatomice și utilizarea NeighborSearch pentru a găsi atomi într-o anumită rază.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 11 din 18. Dacă scrii un nested loop naiv pentru a calcula distanța dintre fiecare atom dintr-o proteină și fiecare atom dintr-un ligand, scriptul tău se va bloca. Indexarea spațială rezolvă asta instantaneu, și exact asta acoperim astăzi în Măsurarea Geometriei Proteinelor. Cea mai fundamentală operație geometrică din Bio dot PDB este găsirea distanței dintre două puncte în spațiul tridimensional. Biopython face override la operatorul standard de scădere pentru obiectele Atom. Dacă iei un obiect Atom și scazi un al doilea obiect Atom, rezultatul este un float care reprezintă distanța euclidiană dintre ele. Unitatea este mereu în Angstromi. Nu trebuie să extragi coordonatele, să le ridici la pătrat sau să calculezi tu rădăcina pătrată. Doar scade un atom din celălalt și ai distanța exactă. Acest truc cu scăderea este perfect pentru a verifica o interacțiune specifică, cunoscută, cum ar fi o singură legătură de hidrogen suspectată. Dar nu mai face față atunci când trebuie să explorezi o proximitate necunoscută. Să presupunem că ai un ligand de tip moleculă mică legat de un receptor mare și trebuie să identifici fiecare reziduu proteic aflat pe o rază de cinci Angstromi de acel ligand. O proteină tipică conține mii de atomi. Verificarea fiecărui atom din ligand cu fiecare atom din proteină te penalizează enorm din punct de vedere computațional. Time complexity-ul crește geometric, iar scriptul tău se blochează. Pentru a rezolva asta, Bio dot PDB oferă modulul Neighbor Search. În loc să compare perechile una câte una, Neighbor Search construiește un index spațial. Under the hood, construiește un KD-tree care mapează unde se află totul în spațiul tridimensional, permițând query-uri de proximitate extrem de rapide. Construiești un obiect Neighbor Search pasându-i o listă flat cu toți atomii pe care vrei să faci query. De obicei, extragi fiecare atom din structura ta target, faci cast acelui generator la o listă standard și o pasezi constructorului Neighbor Search. Acest pas de inițializare durează o fracțiune de secundă, dar face toată munca grea de calcul pentru organizarea datelor spațiale încă de la început. Odată ce indexul este construit, poți face query pe el. Metoda principală de search necesită două argumente: o coordonată target și o rază în Angstromi. Când rulezi search-ul, acesta traversează rapid arborele spațial și returnează doar entitățile aflate în interiorul acelei limite sferice. Iată ideea cheie. Search-ul nu returnează doar atomi. Pentru că Bio dot PDB se bazează pe arhitectura SMCRA, Neighbor Search înțelege ierarhia structurală. Poți pasa un parametru opțional level către query-ul tău de search. Dacă specifici litera R pentru reziduu, indexul se va uita la toți atomii din raza ta de cinci Angstromi, va determina căror reziduuri părinte le aparțin acei atomi și va returna o listă curată de obiecte Residue unice. Faci bypass complet la nivelul de atom în rezultatele tale. Pentru a mapa buzunarul de legare al ligandului, urmezi un flow simplu. Mai întâi, inițializezi Neighbor Search cu toți atomii din lanțul proteic. În al doilea rând, iterezi doar prin atomii din ligandul tău. Pentru fiecare atom din ligand, apelezi metoda de search cu o rază de cinci Angstromi și ceri level-ul de reziduu. În cele din urmă, colectezi acele reziduuri returnate într-un set Python pentru a elimina automat orice duplicate. Tocmai ai mapat situsul de legare în milisecunde. Dacă trebuie să găsești clash-uri interne într-un singur lanț pliat, Neighbor Search include și o metodă search all. Pur și simplu oferi o rază, iar ea returnează absolut fiecare pereche de atomi din întreaga structură care se află mai aproape unul de celălalt decât distanța specificată, evitând complet problema de nested loop. Tratarea datelor moleculare ca un index geografic searchable, în loc de o listă nested, îți schimbă codul din lent și structural, în rapid și spațial. Asta e tot pentru acest episod. Mulțumesc că m-ai ascultat și continuă să construiești!
12

Arbori filogenetici în Python

4m 10s

Parsați, manipulați și desenați arbori evolutivi cu Bio.Phylo. Acoperim citirea fișierelor Newick, traversarea arborilor și izolarea cladelor specifice.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 12 din 18. Dacă te-ai uitat vreodată la un fișier Newick raw, știi că este doar un coșmar dens, nested, de paranteze și virgule. Să scrii propriul tău string parser pentru a-ți da seama care specie este înrudită cu care este un exercițiu groaznic. Ce ai nevoie este o modalitate de a încărca acel text direct într-o data structure traversabilă. Exact asta oferă Bio dot Phylo pentru Phylogenetic Trees în Python. Bio dot Phylo se ocupă de parsarea, manipularea și desenarea arborilor evolutivi. Punctul principal de intrare este funcția read. Îi dai un file path și un format string, cum ar fi newick sau phyloxml. Funcția read consumă acel fișier și returnează un singur tree object. Dacă fișierul tău conține mai mulți arbori, folosești în schimb funcția parse pentru a obține o secvență iterabilă de arbori. Odată ce încarci fișierul, lucrezi cu două componente distincte: obiectul Tree și obiectul Clade. Obiectul Tree reprezintă întreaga structură în ansamblu. Acesta conține metadata globale, cum ar fi numele arborelui și dacă este rooted sau unrooted. Dar datele efective de branching nu se află direct în obiectul Tree. Acestea se află în obiectele Clade. Un Clade reprezintă un nod specific și fiecare descendent care se ramifică din el. Obiectul Tree are un atribut root, care este pur și simplu Clade-ul de început pentru întreaga ierarhie. Fiecare branch din acel root este un alt Clade, care conține propriile sale sub-clade-uri, mergând în cascadă până la vârfuri. Navigarea în această ierarhie este punctul forte al modulului. Nu scrii manual loop-uri recursive. Pentru a căuta în structură, apelezi metoda find clades pe tree-ul tău. Această metodă caută prin toate branch-urile nested și returnează un iterabil de clade-uri care corespund proprietăților pe care le specifici. Poți căuta după nume, după branch length, sau chiar printr-o funcție de evaluare custom. Dacă te interesează doar capetele absolute ale branch-urilor, reprezentând speciile vii curente, folosești metoda get terminals. Aceasta returnează imediat un flat list al clade-urilor leaf. De asemenea, poți calcula instantaneu metrici structurale. Apelarea metodei total branch length pe tree însumează lungimile fiecărui branch din întreaga structură, oferindu-ți distanța evolutivă totală. Ia în considerare un scenariu în care încarci un arbore evolutiv masiv al mamiferelor. Vrei să izolezi doar branch-ul care conține primate pentru a rula o analiză localizată. Apelezi find clades și cauți numele target Primates. Aceasta returnează obiectul Clade specific care reprezintă strămoșul comun al tuturor primatelor. Deoarece un Clade conține în mod natural toți descendenții săi, ai acum un subtree complet, izolat. Poți pasa acel clade de primate în alte funcții de analiză exact așa cum ai face cu un tree complet. Uneori, trebuie doar să te uiți la structură pentru a verifica dacă extracția a funcționat. Bio dot Phylo include o funcție draw ascii. Pasezi tree-ul sau clade-ul izolat acestei funcții, iar aceasta printează o reprezentare plain text direct în terminalul tău. Nu este destinată publicării, dar îți oferă feedback vizual imediat asupra topologiei, fără a fi nevoie să configurezi plotting libraries externe. Iată ideea cheie. Traducerea parantezelor nested în obiecte native înseamnă că topologia devine un API, permițându-ți să segmentezi istoriile evolutive cu method calls standard. Dacă ai găsit acest episod util și vrei să susții emisiunea, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
13

Analiza motivelor de secvență

4m 07s

Descoperiți tipare ascunse în ADN. Aflați cum să creați motive de secvență, să construiți Position-Weight Matrices (PWMs) și să scanați secvențele țintă pentru situsuri de legare a factorilor de transcripție.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 13 din 18. Dacă încerci să găsești un situs de legare a factorilor de transcripție folosind un string match strict, vei rata o mare majoritate a semnalelor biologice reale. Siturile de legare a ADN-ului fluctuează, iar proteinele tolerează variații la anumite poziții din secvență. Pentru a le găsi în mod fiabil, trebuie să te oprești din a căuta string-uri fixe și să începi să cauți profiluri de probabilitate, exact ceea ce îți permite să faci analiza de sequence motif. În Biopython, gestionezi acest lucru cu modulul motifs. Începi cu un set cunoscut de secvențe aliniate care reprezintă situsul tău de legare. Să folosim clasicul TATA box ca exemplu. Ai putea avea o mână de secvențe scurte cunoscute, cum ar fi T A T A A A, T A T A A T și T A T A A C. Le definești ca obiecte Seq standard și le transmiți ca o singură listă funcției create din modulul motifs. Biopython preia această listă de instanțe și le împachetează într-un singur obiect motif. Rezultatul imediat al creării acestui obiect motif este un count matrix. La fiecare poziție de-a lungul secvenței tale, Biopython numără aparițiile totale ale literelor A, C, G și T. Dacă te uiți la prima poziție a exemplelor noastre de TATA box, count-ul pentru T este trei, iar count-ul pentru celelalte trei litere este zero. Această matrice este fundamentul literal al tuturor analizelor downstream, dar count-urile raw au o limitare matematică severă. Dacă o nucleotidă nu apare niciodată la o anumită poziție în micul tău eșantion de referință, probabilitatea sa devine un zero absolut. Mai târziu, când înmulțești probabilitățile pentru a scora o secvență, un singur zero anulează întregul scor. Pentru a remedia această vulnerabilitate, convertești acel count matrix într-un Position-Weight Matrix, sau PWM. Iată ideea cheie. Generezi PWM-ul aplicând pseudocounts. Un pseudocount adaugă o mică fracție de bază la fiecare nucleotidă posibilă, la fiecare poziție. Recunoaște matematic că, doar pentru că nu ai văzut încă o citozină la poziția doi, asta nu înseamnă că o substituție acolo este biologic imposibilă. Prin netezirea zerourilor, acel Position-Weight Matrix transformă count-urile tale raw în distribuții de probabilitate robuste. Probabilitățile în sine sunt încă dificil de utilizat pentru scanarea secvențelor. Trebuie să știi dacă o porțiune de ADN face match cu motif-ul tău mai bine decât o face cu un background sequence aleatoriu. Gestionezi acest lucru convertind PWM-ul tău într-un Position-Specific Scoring Matrix, sau PSSM. PSSM-ul calculează scoruri log-odds pe baza unei distribuții de nucleotide de background. Compară probabilitatea apariției unei litere pentru că face parte din motif-ul tău, cu probabilitatea apariției acesteia pur și simplu din întâmplare. Un scor pozitiv înseamnă că secvența arată în mod activ ca motif-ul tău. Un scor negativ înseamnă că arată ca un background noise. Odată ce ai PSSM-ul tău, poți căuta situsuri de legare neanotate într-o secvență target lungă. Apelezi metoda calculate pe PSSM și îi transmiți secvența ta de ADN target. Această metodă glisează efectiv motif-ul tău pe întregul target, scorând fiecare fereastră posibilă de acea lungime. Returnează un array de scoruri numerice care reprezintă valoarea log-odds la fiecare poziție a secvenței. Iterezi peste aceste scoruri și cauți valori care depășesc un threshold strict definit. Dacă scorul este suficient de mare, probabil ai găsit un TATA box funcțional. Un string match strict necesită perfecțiune, dar sistemele biologice funcționează pe bază de probabilitate, iar trecerea de la raw counts la scoring matrices surprinde această realitate. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
14

Integrarea Swiss-Prot și ExPASy

3m 50s

Accesați standardul de aur al bazelor de date cu proteine. Detaliem cum să preluați înregistrări prin Bio.ExPASy și să parsați fișierele plate dense Swiss-Prot pentru a extrage metadate proteice curate.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 14 din 18. GenBank este excelent atunci când lucrezi cu acizi nucleici. Dar când ai nevoie de date atent selecționate și verificate manual de experți despre o proteină - cum ar fi situsurile sale active exacte sau locul în care traversează membrana celulară - bazele de date standard de secvențe sunt insuficiente. Ai nevoie de o bază de date specializată de proteine, iar asta ne aduce la integrarea Swiss-Prot și ExPASy. Swiss-Prot este o bază de date de secvențe de proteine de înaltă calitate, adnotată manual. ExPASy este portalul de server care oferă acces la ea. Biopython conectează aceste două componente. Folosește modulul ExPASy pentru a descărca datele de pe internet și modulul SwissProt pentru a le parsa într-un object structurat. Mai întâi, trebuie să tragi acel raw record de pe internet. Faci asta folosind modulul ExPASy, mai exact o funcție numită get_sprot_raw. Îi pasezi un accession ID Swiss-Prot. De exemplu, dacă vrei acel record pentru subunitatea alfa a hemoglobinei umane, îi pasezi accession ID-ul, care este P69905. Apelarea get_sprot_raw cu acest ID deschide o conexiune de rețea către server și returnează un handle către datele raw text. Odată ce ai acel handle de raw text, îl pasezi modulului SwissProt. Apelezi funcția read și îi pasezi handle-ul tău. Asta va parsa acel flat file și va returna un record object Swiss-Prot. Aici e partea importantă. Acest record object nu este doar un sequence string. Este un container profund structurat de metadata de la experți. Pentru că Swiss-Prot este curatoriat manual, câmpurile de pe acest object sunt excepțional de bogate. Poți accesa atributul organism pentru a confirma exact cărei specii îi aparține proteina. Poți verifica atributul sequence_length pentru a obține instantaneu numărul de aminoacizi, fără să fie nevoie să măsori tu acel sequence string. Cea mai valoroasă parte a acestui record este atributul features. Aceasta este o nested list care conține domeniile structurale și funcționale cunoscute ale proteinei. Când iterezi prin aceste features, vei găsi adnotări specifice. Vei vedea features care detaliază coordonatele exacte ale aminoacizilor pentru situsurile active, regiunile de legare a metalelor sau domeniile transmembranare. În loc să rulezi un algoritm de predicție, citești coordonate definitive, confirmate în laborator, direct dintr-o bază de date curatoriată. În practică, acel code flow arată așa. Apelezi funcția get_sprot_raw din ExPASy cu accession ID-ul tău. Iei handle-ul rezultat și îl pasezi în funcția read din SwissProt. Asta îți dă record object-ul tău. De acolo, poți citi organismul, poți verifica sequence_length sau poți face loop prin lista de features pentru a extrage situsurile funcționale. Nu uita niciodată să închizi acel network handle odată ce ai terminat de citit datele, pentru a elibera resursele sistemului. Când construiești pipelines care se bazează pe funcția biologică, mai degrabă decât doar pe similaritatea secvenței, targetarea Swiss-Prot garantează că îți bazezi logica pe date verificate, curatoriate de oameni. Asta e tot pentru acest episod. Mulțumesc pentru ascultare și continuă să construiești!
15

Vizualizarea genomurilor cu GenomeDiagram

4m 00s

Transformați fișierele GenBank brute în imagini de calitate pentru publicare. Învățați cum GenomeDiagram construiește hărți genomice circulare și liniare prin suprapunerea de piste și săgeți pentru caracteristici.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Biopython Fundamentals, episodul 15 din 18. Când trimiți o lucrare care descrie o plasmidă bacteriană recent secvențiată, recenzorii vor rareori să citească un tabel plain text cu coordonate genetice. Ei se așteaptă la o hartă circulară, colorată, clar adnotată, care face structura genomică evidentă dintr-o singură privire. Vizualizarea genomurilor cu GenomeDiagram este modul în care generezi aceste hărți direct din datele secvenței tale. Înainte să începi să desenezi, trebuie să te asiguri că librăria externă ReportLab este instalată. GenomeDiagram se bazează în întregime pe ReportLab în spate pentru a calcula geometria și a randa imaginile finale. Fără ea, exportul grafic va eșua. Arhitectura GenomeDiagram este strict ierarhică. Construiești vizualizarea prin nesting de obiecte de sus în jos. La nivelul cel mai de sus este obiectul Diagram. Acesta este canvas-ul tău gol. În interiorul Diagram-ului, adaugi unul sau mai multe Track-uri. Un Track reprezintă o zonă specifică de plotting. Pe o hartă liniară, un Track este un rând orizontal. Pe o hartă circulară de plasmidă, un Track este un singur inel concentric. În interiorul unui Track, adaugi FeatureSet-uri. Un FeatureSet este o grupare logică de date de secvență. Ai putea folosi un FeatureSet pentru secvențele de codare și un FeatureSet diferit pentru regiunile de reglare de pe exact același inel. În cele din urmă, în interiorul FeatureSet-urilor, plasezi feature-urile individuale ale secvenței. Iată ideea cheie. Nu trebuie să calculezi manual unghiuri sau coordonate de pixeli pentru a-ți plasa genele. GenomeDiagram citește nativ poziția de start, poziția de stop și orientarea catenei din obiectele feature standard din Biopython. Pentru a pune asta în practică, să presupunem că ai un record GenBank parsat pentru o plasmidă mică. Mai întâi, inițializezi un Diagram gol. Apoi, creezi un nou Track în interiorul lui, și un nou FeatureSet în interiorul acelui Track. Mai departe, iterezi prin feature-urile din recordul tău GenBank parsat. Verifici dacă tipul feature-ului curent este un CDS, adică o secvență de codare. Când găsești un CDS, îl pasezi către FeatureSet-ul tău pentru a-l adăuga la vizualizare. În timpul acestui pas, îi atribui un styling vizual. Poți seta feature-ul să se randeze ca o săgeată, care va indica automat în sensul acelor de ceasornic sau invers, în funcție de catena genei. De asemenea, poți atribui culori distincte aici. Un truc comun este să folosești un loop counter simplu pentru a alterna între două culori, astfel încât genele adiacente să nu se îmbine vizual într-un singur bloc masiv. Odată ce ierarhia ta este complet populată cu date, instruiești Diagram-ul să se deseneze. Apelezi metoda draw și setezi formatul pe circular. Poți defini dimensiunile paginii, culoarea de background și scalarea Track-ului. După ce desenul este construit în memorie, pur și simplu apelezi metoda write, pasând un nume de fișier care se termină fie în PDF, fie în PNG. ReportLab calculează instantaneu lungimile corecte ale arcului, poziționează săgețile colorate de-a lungul Track-ului circular și exportă un fișier gata de publicare. Principalul avantaj al acestei structuri ierarhice este reproductibilitatea. Deoarece regulile de layout sunt strict separate de parsarea secvenței raw, poți scrie un singur script pentru a stiliza uniform o întreagă bază de date de plasmide fără să te atingi vreodată de un tool de design grafic. Mersi că ne-ai ascultat. Până data viitoare!
16

Genetica populațiilor cu Bio.PopGen

4m 00s

Analizați variația genetică în rândul populațiilor. Acest episod introduce Bio.PopGen pentru a parsa fișiere Genepop și a extrage cu ușurință frecvențele alelelor și valorile de heterozigozitate.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 16 din 18. Ai date brute de genotip din teren și ai nevoie de metrici statistice, dar ca să acoperi această distanță trebuie să scrii încă un script custom pentru a parsa fișiere text. Conversia acelor date din teren într-un format gata de analiză este o corvoadă, asta dacă nu folosești un parser construit exact pentru formatul standard Genepop. Aici intervine genetica populațiilor cu Bio.PopGen. Genepop este un pachet software standard și un format de fișier folosit pentru a calcula metrici precum echilibrul Hardy-Weinberg, statisticile F și dezechilibrul de linkage. Formatul său de input bazat pe text, de obicei salvat ca un fișier dot gen, este rigid. Se bazează pe line breaks stricte, keywords specifice și coduri de tip integer lipite între ele pentru alele. Să scrii propria logică pentru a extrage frecvențele alelelor din mai mulți loci și populații este o treabă predispusă la erori de tip off-by-one. Modulul Bio.PopGen evită complet acest lucru citind formatul Genepop direct într-un obiect Python structurat. Ia un scenariu concret. Studiezi două populații izolate de pești. Ai genotipat fiecare pește la trei loci microsateliți. Datele tale brute stau într-un fișier standard dot gen. Partea de sus a fișierului are un titlu, urmat de numele celor trei markeri ai tăi pe linii separate. Apoi urmează keyword-ul Pop, care marchează începutul primei populații de pești. Sub acesta, fiecare linie reprezintă un pește, afișând un identificator urmat de alelele sale la toți cei trei loci. După ultimul pește din acel grup, apare un alt keyword Pop, care marchează începutul celei de-a doua populații. Pentru a procesa asta, imporți modulul GenePop din Bio.PopGen. Deschizi fișierul text și pasezi file handle-ul deschis către funcția GenePop dot read. Această funcție procesează textul și returnează un singur obiect Record. Asta este partea care contează. Obiectul Record reflectă ierarhia biologică a studiului tău. Dacă verifici atributul loci list de pe Record, acesta returnează o secvență simplă care conține numele celor trei markeri microsateliți ai tăi. Asta confirmă că parserul a citit cu succes header-ul. Apoi, te poți uita la atributul populations. Acest atribut conține o listă în care fiecare element reprezintă o întreagă populație din fișierul tău. Din moment ce ai două keyword-uri Pop în fișierul tău, această listă conține exact două elemente. Dacă te uiți cu atenție la una dintre aceste populații, găsești o listă a indivizilor pe care îi conține. Fiecare individ este stocat ca o pereche formată din string-ul său de identificare și o listă a genotipurilor sale. Pentru un organism diploid, un genotip la un singur locus este parsat ca o pereche de alele. Fișierul text Genepop stochează adesea aceste alele ca un singur string combinat de cifre, cum ar fi zero unu zero doi. Parserul împarte automat asta în alele distincte, reprezentând zero unu și zero doi ca entități separate. Nu trebuie să scrii logică de string slicing pentru a separa alelele materne și paterne. Odată ce fișierul este parsat, ai acces imediat la numele markerilor, numărul de populații și datele individuale ale alelelor. Poți itera prin populații pentru a număra frecvențe specifice ale alelelor, sau poți pasa obiectul Record direct în rutinele Biopython care interacționează cu software-ul Genepop. Poți declanșa calcule pentru heterozigozitatea așteptată sau poți măsura diferențierea genetică între cele două grupuri izolate ale tale. Valoarea parserului Bio.PopGen nu constă doar în citirea unui fișier text, ci în transformarea unei liste flat de string-uri într-o ierarhie biologică strictă de loci, populații și indivizi, așa cum cer algoritmii statistici. Asta e tot pentru acest episod. Îți mulțumesc că ai ascultat și continuă să construiești!
17

Căi biochimice cu KEGG

4m 19s

Conectați punctele metabolice. Învățați cum să parsați înregistrările de enzime și căi KEGG pentru a urmări reacțiile biochimice și structurile compușilor chimici.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Fundamentele Biopython, episodul 17 din 18. Ai secvențiat o genă și ai găsit o variantă. Să cunoști secvența este rareori suficient. Pentru a înțelege daunele biologice reale, trebuie să știi exact ce rețele metabolice perturbă enzima rezultată. Căile biochimice din KEGG îți oferă exact această hartă. Kyoto Encyclopedia of Genes and Genomes menține baze de date extinse care detaliază sisteme biologice, compuși și reacții. Ei distribuie aceste date sub formă de flat files standard, de tip plain text. Aceste fișiere folosesc o structură specifică, unde un keyword se află pe marginea din stânga, iar datele asociate sunt în dreapta. Problema este că valorile datelor, cum ar fi o listă lungă de sinonime sau nume complexe de pathways, fac wrap frecvent și imprevizibil pe mai multe linii. Să scrii cod custom de string manipulation pentru a gestiona acest wrapping este o soluție fragilă. Modulul Bio dot KEGG există tocmai pentru a gestiona aceste ciudățenii de formatare și pentru a traduce acele fișiere text direct în obiecte Python predictibile. Pentru a extrage date moleculare de bază, folosești funcția Compound dot parse din modulul KEGG. Îi pasezi un file handle deschis care indică spre un fișier text cu compuși KEGG. În loc să încarce un database dump masiv în memorie dintr-o dată, parserul returnează un iterator. De fiecare dată când avansezi iteratorul, acesta dă yield la un singur obiect Python care reprezintă un compus. Din acest obiect, poți accesa atributul entry pentru a obține identificatorul unic, care de obicei arată ca un C mare urmat de cifre. Deoarece compușii au frecvent mai multe denumiri comune în literatura de specialitate, atributul name returnează o listă de string-uri care conține toate sinonimele recunoscute. De asemenea, ai acces direct la structura moleculară exactă prin atributul formula. Compușii sunt doar materialele statice din sistemul tău. Enzimele sunt cele care conduc de fapt reacțiile. Pentru a le analiza, treci la funcția Enzyme dot parse, dându-i ca input un flat file cu enzime KEGG. La fel ca parserul pentru compuși, acesta dă yield la obiecte discrete, unul câte unul. Verifici atributul entry pentru a obține numărul EC standard, și atributul name pentru denumirea enzimei. Aici e partea care contează. O enzimă nu operează într-un vid, iar obiectul enzyme reflectă acest lucru prin atributul său pathway. Parserul citește blocul de text multi-line care detaliază interacțiunile enzimei și îl structurează într-o listă curată. Fiecare element din acea listă este un tuple care conține două bucăți de date. Primul element din tuple este identificatorul de pathway KEGG, iar al doilea este numele human-readable al acelei căi metabolice. Poți face un script pentru un proces complet de mapping în doar câțiva pași. Mai întâi, deschizi fișierul cu date despre enzime pe care l-ai descărcat și îl pasezi funcției Enzyme dot parse. Creezi un loop pentru a citi printre record-urile returnate. Când dai peste un record unde atributul entry face match cu numărul EC al enzimei tale mutante, îi extragi atributul pathway. Apoi poți itera peste acea listă de tuples, extrăgând numele de pathways pentru a vedea imediat dacă mutația afectează glicoliza, ciclul citratului sau cu totul altceva. Adevărata putere a parserelor KEGG nu este doar citirea textului, ci convertirea componentelor biologice izolate în coordonate de rețea interconectate, permițându-ți să urmărești o variantă genetică localizată până la un eșec metabolic sistemic. Dacă găsești aceste episoade utile și vrei să susții podcastul, poți căuta DevStoriesEU pe Patreon. Asta e tot pentru acest episod. Mulțumesc pentru audiție și continuă să construiești!
18

Analiza de cluster pentru expresia genică

4m 17s

Grupați genele după comportamentul lor. În acest episod final, acoperim modulul Bio.Cluster, aplicând K-means și gruparea ierarhică pe datele de expresie microarray.

Descarcă
Salut, sunt Alex de la DEV STORIES DOT EU. Biopython Fundamentals, episodul 18 din 18. Tocmai ai rulat un experiment RNA-seq și acum te uiți la un expression matrix cu zece mii de rânduri. Să găsești un sens în acele raw data este imposibil până nu grupezi genele respective într-o mână de răspunsuri biologice distincte. Exact asta face Cluster Analysis pentru Gene Expression, folosind modulul Bio dot Cluster. Când analizezi date de microarray sau RNA-seq, urmărești activitatea genelor în diferite condiții. Să luăm un scenariu concret. Ai expression data pentru o mie de gene, măsurate în patru time points de heat-shock. Vrei să identifici care gene se comportă similar. Poate că cincizeci dintre ele au un spike la ora doi și un drop la ora patru. Genele cu pattern-uri similare de up și down regulation au adesea în comun aceleași biological pathways sau mecanisme de reglare. Să găsești aceste cohorte manual, printre mii de rânduri, este pur și simplu imposibil. Modulul Bio dot Cluster conține un core scris în C, conceput special pentru a procesa eficient acest tip de matrix data. Primul tău pas este să aduci datele în Biopython. În loc să scrii custom parsing logic, pasezi fișierul tău text tab-separated către funcția read a modulului. Asta returnează un obiect Record specializat. Acest obiect stochează acel numerical expression matrix, dar ține evidența și pentru gene identifiers și pentru numele condițiilor tale experimentale. Odată ce ai datele încărcate, aplici un algoritm de clustering. Cea mai comună abordare este K-means, executată folosind funcția kcluster. K-means partiționează itemii într-un număr predeterminat de grupuri, reprezentate de variabila k. Pasezi acel data matrix și valoarea k aleasă în funcția kcluster. Funcția returnează apoi un array care atribuie fiecărei gene un anumit cluster ID, împreună cu o valoare de eroare care măsoară cât de strâns sunt grupate acele clustere. Pentru că algoritmul începe cu random assignments, de obicei îl rulezi de mai multe ori și păstrezi iterația care produce cea mai mică eroare. Aici e ideea cheie. Algoritmul grupează genele pe baza unui distance metric, și trebuie să alegi cu atenție acea metrică. Dacă folosești standard Euclidean distance, algoritmul grupează genele care au absolute expression levels similare. Dar dacă vrei să grupezi genele după forma curbei lor de expresie în timp, indiferent de baseline-ul lor inițial, trebuie să instruiești funcția kcluster să folosească în schimb un correlation-based distance metric. K-means îți cere să ghicești numărul de clustere upfront. Dacă nu știi câte răspunsuri distincte există în datele tale de heat-shock, poți folosi în schimb hierarchical clustering, prin intermediul funcției treecluster. În loc să forțeze genele în flat buckets, treecluster construiește o ierarhie. Găsește cele două gene cu cele mai asemănătoare expression patterns și le leagă. Apoi găsește următoarea genă sau pereche cea mai apropiată și le leagă, construind o structură de tip branching tree, numită dendrogramă. Odată ce arborele conectează toate cele o mie de gene, poți observa structura generală a datelor și poți da slice ramurilor la orice nivel are sens biologic. Pentru că acesta este episodul final al seriei noastre Biopython Fundamentals, îți recomand cu căldură să deschizi documentația oficială Biopython și să încerci aceste funcții de clustering pe un dataset real. De asemenea, poți vizita devstories dot eu pentru a sugera subiecte pe care vrei să le acoperim în seriile viitoare. Scopul final al rulării acestor algoritmi nu este doar sortarea numerelor în buckets, ci descoperirea logicii biologice comune care forțează acele gene să se activeze împreună. Asta e tot pentru acest episod. Mersi că m-ai ascultat și keep building!