Wróć do katalogu
Season 20 18 Odcinki 1h 14m 2026

Biopython Fundamentals

Wydanie v1.87 — 2026. Kompleksowy, 18-odcinkowy przewodnik po korzystaniu z biblioteki Biopython (v1.87 - 2026) do analizy sekwencji, parsowania biologicznych formatów danych, uruchamiania BLAST, obsługi struktur 3D, drzew filogenetycznych i wielu innych.

Obliczenia naukowe Bioinformatyka
Biopython Fundamentals
Teraz odtwarzane
Click play to start
0:00
0:00
1
Wprowadzenie do Biopython i obiekt Seq
Odkryj fundament biblioteki Biopython: obiekt Seq. Sprawdzamy, czym obiekty sekwencji różnią się od standardowych ciągów znaków w języku Python i uczymy się, jak wykonywać operacje biologiczne, takie jak odwrotna komplementarność i translacja.
3m 52s
2
Bogate dane sekwencyjne: Obiekt SeqRecord
Dowiedz się, jak opakować sekwencje w bogate metadane za pomocą obiektu SeqRecord. Omawiamy, w jaki sposób identyfikatory, nazwy, opisy i adnotacje słownikowe są przechowywane wraz z surową sekwencją.
4m 55s
3
Odczyt i zapis plików za pomocą SeqIO
Opanuj konwersję plików sekwencyjnych i przetwarzanie wsadowe dzięki Bio.SeqIO. W tym odcinku wyjaśniamy różnicę między odczytywaniem plików z pojedynczym rekordem a parsowaniem zbiorów danych z wieloma rekordami.
4m 06s
4
Ekstrakcja genów za pomocą SeqFeature
Zanurz się w złożony świat cech sekwencji. Wyjaśniamy, jak Biopython reprezentuje współrzędne genów, nici i rozmyte lokalizacje za pomocą obiektu SeqFeature.
3m 55s
5
Przyrównywanie par sekwencji
Dowiedz się, jak bezpośrednio porównać dwie sekwencje za pomocą modułu Bio.Align. Omawiamy PairwiseAligner, punktację podstawień i kary za przerwy dla przyrównań globalnych i lokalnych.
4m 32s
6
Obsługa przyrównań wielu sekwencji
Przejdź od przyrównywania par do przyrównywania wielu sekwencji. Ten odcinek obejmuje parsowanie plików przyrównań za pomocą AlignIO i traktowanie ich jak tablic 2D w celu wycinania określonych kolumn.
3m 58s
7
Programistyczne odpytywanie baz danych NCBI
Zautomatyzuj wyszukiwanie literatury i sekwencji. Odkryj, jak odpytywać bazy danych NCBI za pomocą Entrez.esearch i pobierać dokładne identyfikatory bez użycia przeglądarki internetowej.
3m 59s
8
Uruchamianie BLAST przez Internet
Inicjuj zdalne wyszukiwania BLAST bezpośrednio z języka Python. Dowiedz się, jak używać qblast do wysyłania sekwencji na serwery NCBI i bezpiecznie zapisywać surowe wyniki w formacie XML.
4m 05s
9
Natywne parsowanie: Rozpakowywanie BLAST XML
Zrozum złożone wyniki BLAST. Ten odcinek krok po kroku pokazuje parsowanie plików BLAST XML do natywnych obiektów języka Python w celu wyodrębnienia przyrównań, par segmentów o wysokiej punktacji (HSPs) oraz wartości E-value.
3m 59s
10
Nawigacja po strukturach 3D z Bio.PDB
Wejdź w trzy wymiary. Odkrywamy moduł PDB, parsowanie struktur makromolekularnych i zrozumienie architektury Structure-Model-Chain-Residue-Atom (SMCRA).
4m 10s
11
Pomiary geometrii białek
Obliczaj relacje przestrzenne w białkach. Ten odcinek obejmuje obliczanie odległości międzyatomowych i używanie NeighborSearch do znajdowania atomów w określonym promieniu.
4m 31s
12
Drzewa filogenetyczne w języku Python
Parsuj, manipuluj i rysuj drzewa ewolucyjne za pomocą Bio.Phylo. Omawiamy odczytywanie plików Newick, przechodzenie przez drzewa i izolowanie określonych kladów.
4m 07s
13
Analiza motywów sekwencyjnych
Odkryj ukryte wzorce w DNA. Dowiedz się, jak tworzyć motywy sekwencyjne, budować macierze wagowe pozycji (PWMs) i skanować sekwencje docelowe pod kątem miejsc wiązania czynników transkrypcyjnych.
4m 07s
14
Integracja z Swiss-Prot i ExPASy
Uzyskaj dostęp do złotego standardu baz danych białek. Szczegółowo opisujemy, jak pobierać rekordy przez Bio.ExPASy i parsować gęste pliki płaskie Swiss-Prot, aby wyodrębnić wyselekcjonowane metadane białek.
3m 29s
15
Wizualizacja genomów za pomocą GenomeDiagram
Zamień surowe pliki GenBank w obrazy o jakości publikacyjnej. Dowiedz się, jak GenomeDiagram konstruuje koliste i liniowe mapy genomów poprzez nakładanie ścieżek i strzałek cech.
3m 46s
16
Genetyka populacyjna z Bio.PopGen
Analizuj zmienność genetyczną w populacjach. Ten odcinek wprowadza moduł Bio.PopGen do parsowania plików Genepop i łatwego wyodrębniania częstości alleli oraz wskaźników heterozygotyczności.
4m 18s
17
Szlaki biochemiczne z KEGG
Połącz kropki metaboliczne. Dowiedz się, jak parsować rekordy enzymów i szlaków KEGG, aby śledzić reakcje biochemiczne i struktury związków chemicznych.
4m 25s
18
Analiza skupień dla ekspresji genów
Grupuj geny na podstawie ich zachowania. W tym ostatnim odcinku omawiamy moduł Bio.Cluster, stosując algorytm K-means i klastrowanie hierarchiczne do danych z mikromacierzy ekspresyjnych.
3m 56s

Odcinki

1

Wprowadzenie do Biopython i obiekt Seq

3m 52s

Odkryj fundament biblioteki Biopython: obiekt Seq. Sprawdzamy, czym obiekty sekwencji różnią się od standardowych ciągów znaków w języku Python i uczymy się, jak wykonywać operacje biologiczne, takie jak odwrotna komplementarność i translacja.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 1 z 18. Traktowanie sekwencji DNA jako standardowego stringa działa dobrze, dopóki nie potrzebujesz przeciwnej nici. Proste manipulowanie stringami w Pythonie traci sens, gdy uświadomisz sobie, że transkrypcja biologiczna nie polega tylko na podmienianiu liter, ale na kierunkowości i odrębnych kodach genetycznych. Właśnie dlatego zajmiemy się Wprowadzeniem do Biopythona i obiektem Seq. W swojej istocie sekwencja biologiczna to string liter reprezentujący cząsteczki takie jak DNA, RNA lub białka. W Biopythonie centralną strukturą danych jest obiekt Seq. Wrapuje on standardowe zachowanie pythonowych stringów, ale bezpośrednio dodaje do danych biologiczną świadomość. Ponieważ zachowuje się jak normalny string, możesz robić wszystko, co normalnie robisz z tekstem. Możesz sprawdzić długość sekwencji. Możesz policzyć, ile razy pojawia się określony pattern. Możesz go slicować, aby wyciągnąć mniejszy fragment. Kiedy slicujesz obiekt Seq, wynik nie jest standardowym stringiem. To nowy obiekt Seq. Dzięki temu nigdy przypadkowo nie pozbędziesz się biologicznych metod podczas parsowania sekwencji na mniejsze fragmenty. I to jest kluczowe. Standardowe stringi nie rozumieją biologii. DNA jest dwuniciowe, a sekwencje są odczytywane w określonym kierunku. Jeśli masz sekwencję kodującą DNA i potrzebujesz przeciwnej nici, proste odwrócenie tekstu jest biologicznie niepoprawne. Musisz odwrócić kolejność liter i zamienić każdą zasadę na jej strukturalną parę. Obiekt Seq ogarnia to za pomocą jednej metody reverse complement, zwracając biologicznie poprawną przeciwną nić. Poza strukturą, obiekt Seq bezpośrednio obsługuje centralny dogmat biologii molekularnej. Weźmy pod uwagę krótką sekwencję kodującą DNA. Aby przekonwertować ją na messenger RNA, wywołujesz na swojej sekwencji metodę transcribe. Pod spodem ogarnia to konkretne podstawienia liter, zastępując tyminę uracylem, i zwraca ci sekwencję RNA. Jeśli zaczynasz od RNA i potrzebujesz odpowiednika DNA, metoda back transcribe odwraca ten proces. Kiedy masz już gotową sekwencję, zazwyczaj chcesz otrzymać wynikowe białko. Wywołujesz metodę translate. Automatycznie grupuje to litery sekwencji w triplety, ewaluuje je jako kodony i zwraca nowy obiekt Seq zawierający sekwencję aminokwasów. Biologia rzadko jest jednorodna, a standardowy kod genetyczny nie ma zastosowania wszędzie. Organizmy, takie jak niektóre bakterie, lub organelle, takie jak mitochondria kręgowców, odczytują kodony inaczej. Metoda translate uwzględnia to za pomocą tabel translacji. Zamiast pisać customową logikę dla sekwencji mitochondrialnej, po prostu przekazujesz do metody argument translation table. Możesz podać oficjalny numer tabeli NCBI, taki jak tabela numer dwa dla mitochondriów kręgowców, lub nazwę tabeli jako tekst. Obiekt Seq przelicza aminokwasy, wykorzystując te specyficzne reguły organizmu. Prawdziwą siłą obiektu Seq jest to, że chroni cię przed pisaniem niestabilnych, podatnych na błędy funkcji do parsowania tekstu dla ugruntowanych procesów biologicznych. Jeśli chcesz wesprzeć nasz podcast, możesz wyszukać DevStoriesEU na Patreonie. To wszystko w tym odcinku. Dzięki za słuchanie i twórz dalej!
2

Bogate dane sekwencyjne: Obiekt SeqRecord

4m 55s

Dowiedz się, jak opakować sekwencje w bogate metadane za pomocą obiektu SeqRecord. Omawiamy, w jaki sposób identyfikatory, nazwy, opisy i adnotacje słownikowe są przechowywane wraz z surową sekwencją.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 2 z 18. String dziesięciu tysięcy liter DNA to technicznie sekwencja, ale analitycznie jest bezużyteczny. Nie znając gatunku, z którego pochodzi, typu cząsteczki ani jakości odczytu, masz po prostu surowy tekst. Powiązanie tych kluczowych metadanych z surową sekwencją to zadanie dla Rich Sequence Data: obiektu SeqRecord. SeqRecord to kontener. Bierze podstawową sekwencję i opakowuje ją identyfikatorami oraz opisami potrzebnymi, żeby faktycznie użyć jej w bioinformatycznym pipeline'ie. Każdy SeqRecord opiera się na kilku podstawowych atrybutach. Pierwszy to kropka seq, który przechowuje same dane sekwencji. Obok niego mamy trzy standardowe atrybuty typu string. Kropka id zawiera główny identyfikator, zazwyczaj numer dostępu z publicznej bazy danych. Kropka name przechowuje krótszą nazwę zwyczajową lub identyfikator klonu. Kropka description zawiera czytelny dla człowieka tekst wyjaśniający, co ta sekwencja tak naprawdę reprezentuje. Czasami trzy atrybuty typu string to za mało. Kiedy musisz przechować złożone lub niestandardowe metadane, używasz atrybutu kropka annotations. To standardowy dictionary w Pythonie. Obsługuje on metadane na poziomie rekordu. Możesz tu przechować wszystko. Jeśli chcesz śledzić, jak sekwencja została zweryfikowana, po prostu dodajesz do dictionary nowy klucz o nazwie evidence i ustawiasz jego wartość na experimental. A oto kluczowa sprawa. Nie wszystkie metadane dotyczą całej sekwencji jako całości. Czasami potrzebujesz danych przypisanych do każdej pojedynczej litery. I właśnie to robi kropka letter annotations. To kolejny dictionary, ale z pewną ścisłą regułą. Każda lista, array czy string, które przypiszesz jako wartość w tym dictionary, musi mieć dokładnie taką samą długość jak sama sekwencja. Klasyczny use case to przechowywanie wyników jakości Phred z sekwenatora. Jeśli twoja testowa sekwencja DNA ma dokładnie dwadzieścia liter, możesz przypisać listę dwudziestu integerów do dictionary kropka letter annotations pod kluczem phred quality. Jeśli spróbujesz przypisać dziewiętnaście lub dwadzieścia jeden integerów, Biopython natychmiast rzuci błędem. Możesz łatwo zbudować SeqRecord od zera. Najpierw definiujesz obiekt sekwencji. Następnie przekazujesz tę sekwencję do konstruktora SeqRecord. Możesz przekazać identyfikator, nazwę i opis od razu jako argumenty. Kiedy obiekt już istnieje, możesz odwołać się do jego dictionary, żeby ręcznie wstrzyknąć swoje customowe stringi evidence albo listy wyników jakości dla poszczególnych liter. W praktyce rzadko budujesz je całkowicie ręcznie. Zazwyczaj dostajesz je poprzez parsowanie plików, a Biopython obsługuje różne formaty plików, mapując dane na atrybuty SeqRecord w określony sposób. Weźmy na przykład standardowy plik FASTA. FASTA to bardzo podstawowy format. Kiedy Biopython go czyta, łapie pierwsze słowo po znaku większości w linijce nagłówka i przypisuje je do atrybutu kropka id. Atrybut kropka name dostaje po prostu dokładnie taką samą wartość jak identyfikator. Reszta linijki nagłówka jest wrzucana bezpośrednio do atrybutu kropka description. Ponieważ FASTA nie ma ustrukturyzowanych metadanych, dictionary kropka annotations pozostaje całkowicie pusty. Pliki GenBank stanowią wyraźny kontrast. Zawierają bogate, ustrukturyzowane dane. Podczas parsowania GenBanku, Biopython przypisuje locus i numer wersji do kropka id. Nazwa locus trafia do atrybutu kropka name. Linijka definicji mapuje się na kropka description. Co kluczowe, Biopython aktywnie wypełnia dictionary kropka annotations. Wyciąga szczegóły taksonomii, typ cząsteczki, podział pliku danych i listę opublikowanych referencji, umieszczając je wszystkie ładnie w dictionary pod ustandaryzowanymi kluczami. Sekwencja mówi ci, jaki jest podstawowy kod biologiczny, ale to obiekt SeqRecord ostatecznie nadaje temu kodowi kontekst. Dzięki za spędzenie ze mną tych kilku minut. Do usłyszenia następnym razem, trzymaj się.
3

Odczyt i zapis plików za pomocą SeqIO

4m 06s

Opanuj konwersję plików sekwencyjnych i przetwarzanie wsadowe dzięki Bio.SeqIO. W tym odcinku wyjaśniamy różnicę między odczytywaniem plików z pojedynczym rekordem a parsowaniem zbiorów danych z wieloma rekordami.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 3 z 18. Twój bioinformatyczny pipeline wywala się w połowie działania. Sprawdzasz logi i orientujesz się, że downstreamowy skrypt oczekiwał pliku FASTA, ale upstreamowe narzędzie przekazało mu plik GenBank. Teraz musisz napisać parser od zera, tylko po to, żeby wyciągnąć dane sekwencji. Albo możesz użyć Bio dot SeqIO. SeqIO to standardowy moduł Biopythona do operacji input i output na sekwencjach. Obsługuje parsowanie różnych biologicznych formatów plików, więc nie musisz pisać własnych wyrażeń regularnych ani funkcji do manipulacji na stringach. Podajesz ścieżkę do pliku i format string, a SeqIO ogarnia całą strukturę pliku pod spodem. Przy czytaniu plików, SeqIO daje ci dwie różne funkcje, a wybranie tej złej to częste źródło bugów. Pierwsza to read. Funkcji read używasz, gdy masz absolutną pewność, że twój plik zawiera dokładnie jeden rekord sekwencji. Przekazujesz jej ścieżkę do pliku i format, na przykład fasta, a ona zwraca pojedynczy obiekt rekordu sekwencji. Jeśli plik jest pusty albo zawiera dwa lub więcej rekordów, funkcja read natychmiast rzuci exception i zatrzyma twój skrypt. Służy ona stricte do mapowania jeden do jednego. Częściej jednak masz do czynienia z plikami, które zawierają wiele sekwencji. Do tego używasz funkcji parse. W przeciwieństwie do read, parse nie ładuje wszystkiego do pamięci na raz. Zamiast tego zwraca iterator. I to jest kluczowa sprawa. Iterator zwraca jeden rekord sekwencji na raz, co utrzymuje twój memory footprint na niskim poziomie, nawet jeśli przetwarzasz ogromne, wielogigabajtowe genomiczne datasety. Weźmy konkretny scenariusz. Masz plik GenBank z danymi dla kilku gatunków storczyków. Chcesz wyciągnąć te rekordy, ale interesują cię tylko sekwencje dłuższe niż sto par zasad. Co więcej, kolejne narzędzie w twoim pipeline wymaga formatu FASTA, a nie GenBank. Możesz ogarnąć czytanie, filtrowanie i konwersję formatu sekwencyjnie. Najpierw tworzysz pustą listę, żeby przechować przefiltrowane sekwencje. Następnie robisz pętlę używając funkcji parse, wskazujesz w niej swój plik GenBank ze storczykami i podajesz genbank jako wejściowy format string. Wewnątrz pętli, funkcja parse przekazuje ci jeden obiekt rekordu sekwencji w każdej iteracji. Sprawdzasz długość sekwencji przypisanej do tego rekordu. Jeśli długość jest większa niż sto, dodajesz rekord do swojej listy. Jeśli jest krótsza, po prostu ją ignorujesz i przechodzisz do następnej iteracji. Teraz masz w pamięci listę poprawnych, przefiltrowanych rekordów. Żeby je zapisać, używasz funkcji write. Funkcja write wymaga trzech parametrów: sekwencji rekordów, które chcesz zapisać, ścieżki do pliku wyjściowego i wyjściowego format string. Przekazujesz swoją listę przefiltrowanych rekordów storczyków, podajesz nową nazwę pliku i przekazujesz fasta jako format string. To wszystko, czego potrzeba. SeqIO automatycznie wyciąga odpowiednie identyfikatory i sekwencje z twoich rekordów GenBank i poprawnie formatuje je jako tekst FASTA. Nie musisz ręcznie budować linii nagłówka ani formatować bloków sekwencji. Łącząc funkcję parse z write, bez problemu tłumaczysz między formatami plików. Najważniejszy wniosek z tego jest taki, że SeqIO działa jak ustandaryzowany most. Wymuszając na wszystkich formatach plików uniwersalną strukturę rekordu sekwencji podczas kroku parse, całkowicie oddziela format, który czytasz, od formatu, który ostatecznie zapisujesz. To wszystko w tym odcinku. Dzięki za wysłuchanie i koduj dalej!
4

Ekstrakcja genów za pomocą SeqFeature

3m 55s

Zanurz się w złożony świat cech sekwencji. Wyjaśniamy, jak Biopython reprezentuje współrzędne genów, nici i rozmyte lokalizacje za pomocą obiektu SeqFeature.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 4 z 18. Ręcznie robisz slice na stringu sekwencji, żeby wyciągnąć gen z nici odwrotnej. Obliczasz współrzędne, odwracasz string, komplementujesz zasady i odpalasz skrypt. W połowie przypadków kończysz z błędem off by one albo bezsensownymi danymi. Próba ręcznego liczenia tych sekwencji to klasyczna pułapka. Zamiast tego powinieneś pozwolić parserowi zrobić tę robotę, wyciągając geny za pomocą SeqFeature. Obiekt SeqFeature opisuje konkretny region lub punkt orientacyjny na sekwencji nadrzędnej. Kiedy parsujesz bogaty format pliku, Biopython wypełnia twój record sekwencji listą tych obiektów feature. Każdy feature ma trzy główne atrybuty, których będziesz używać non stop. Pierwszy to atrybut type. To po prostu string, który mówi ci, co reprezentuje dany feature, na przykład gen, CDS albo mRNA. Drugi to atrybut qualifiers. To dictionary zawierający wszystkie metadane przypięte do tego konkretnego feature'a. Jeśli potrzebujesz nazwy genu, tagu locus albo notatki o produkcie translacji, wyciągasz to z dictionary qualifiers. Trzeci, i najważniejszy, to atrybut location. Określa on dokładnie, gdzie ten feature żyje matematycznie na sekwencji nadrzędnej. Występuje w dwóch głównych formach. SimpleLocation ogarnia ciągłe, nieprzerwane odcinki sekwencji. Zawiera dokładną pozycję start, dokładną pozycję end oraz nić. Nić jest reprezentowana jako integer. To jedynka dla nici prostej i minus jeden dla nici odwrotnej. Biologia rzadko bywa prosta. Splicowane geny u eukariontów są rozbite na wiele eksonów w całym genomie. Żeby to obsłużyć, atrybut location będzie zamiast tego obiektem CompoundLocation. CompoundLocation to w zasadzie kolekcja połączonych ze sobą SimpleLocations. Grupuje te pofragmentowane współrzędne eksonów i traktuje je jako pojedynczą jednostkę logiczną. I tu jest kluczowa sprawa. Nie musisz patrzeć na te współrzędne location i pisać własnej notacji slice w Pythonie, żeby wyciągnąć dane sekwencji z nadrzędnego recordu. Używasz metody extract podpiętej do samego feature'a. Żeby jej użyć, bierzesz swój obiekt SeqFeature, wywołujesz metodę extract i przekazujesz pełną sekwencję nadrzędną jako argument. Feature patrzy na swoje własne dane location i odwala za ciebie całą czarną robotę. Jeśli feature to SimpleLocation na nici prostej, robi slice sekwencji dokładnie tak, jak byś się tego spodziewał. Jeśli feature jest na nici odwrotnej, extract automatycznie ogarnia slice, generuje reverse complement tej sekwencji i zwraca biologicznie poprawny wynik. Nie musisz odwracać stringów ani pamiętać o komplementarności zasad. Robi dla ciebie jeszcze więcej, kiedy masz do czynienia z CompoundLocation. Jeśli wywołasz extract na splicowanym genie, Biopython idzie do sekwencji nadrzędnej, wyciąga każdy pojedynczy ekson na podstawie ich SimpleLocations, automatycznie robi ich reverse complement, jeśli gen jest na nici minusowej, i zszywa je wszystkie razem w odpowiedniej kolejności. Zwraca ci jeden ciągły, czysty kawałek sekwencji, gotowy do dalszej translacji lub analizy. Poleganie na metodzie extract eliminuje ręczną matematykę na indeksach, która powoduje ciche błędy danych w pipeline'ach bioinformatycznych. Chciałbym poświęcić chwilę, żeby podziękować ci za słuchanie – to bardzo nam pomaga. Miłego!
5

Przyrównywanie par sekwencji

4m 32s

Dowiedz się, jak bezpośrednio porównać dwie sekwencje za pomocą modułu Bio.Align. Omawiamy PairwiseAligner, punktację podstawień i kary za przerwy dla przyrównań globalnych i lokalnych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 5 z 18. Klasyczne algorytmy alignmentu oparte na programowaniu dynamicznym są znane z tego, że działają bardzo wolno, gdy napiszesz je w czystym Pythonie. Jeśli spróbujesz przetworzyć tysiące par sekwencji, twój skrypt zawiesi się na wiele godzin. Biopython rozwiązuje ten problem, schodząc do poziomu języka C do najcięższych zadań, co daje ci wydajność rzędu milisekund. Ten odcinek jest o Pairwise Sequence Alignment przy użyciu obiektu PairwiseAligner. Aby porównać dokładnie dwie sekwencje, tworzysz instancję PairwiseAligner. Ten pojedynczy obiekt działa jako silnik konfiguracyjny dla całego procesu. Domyślnie wykonuje on global alignment, co oznacza, że wymusza dopasowanie end-to-end między dwiema sekwencjami. Jeśli chcesz znaleźć tylko najlepiej pasującą subsekwencję ukrytą gdzieś w większym stringu, zmieniasz atrybut mode alignera z global na local. Aligner potrzebuje reguł, aby zdecydować, co stanowi dobre dopasowanie. Ustawiasz te reguły bezpośrednio jako atrybuty na obiekcie alignera. Przypisujesz dodatnią liczbę do atrybutu match score, a ujemną do atrybutu mismatch score. Ale sekwencje biologiczne mutują również poprzez wstawianie lub usuwanie całych bloków liter, co tworzy gapy w alignmencie. I tu jest kluczowa sprawa. Biologia zdecydowanie faworyzuje jedną, długą delecję zamiast kilku małych, rozproszonych delecji. Aby zamodelować tę fizyczną rzeczywistość, konfigurujesz dwa osobne gap penalties. Przypisujesz dużą ujemną wartość do open gap score, aby ukarać utworzenie nowego gapa. Następnie przypisujesz znacznie mniejszą ujemną wartość do extend gap score. Ta matematyczna nierównowaga zmusza aligner do grupowania gapów razem, gdy tylko jest to możliwe. Kiedy twój aligner jest już skonfigurowany, wywołujesz jego metodę align i przekazujesz swoje dwie sekwencje. Metoda ta nie zwraca po prostu pojedynczego stringa czy końcowej liczby. Zwraca iterator obiektów alignment. Wiele ścieżek przez macierz programowania dynamicznego może dać dokładnie ten sam, najwyższy wynik. Aligner daje ci dostęp do wszystkich tych matematycznie optymalnych alignmentów. Ponieważ zwraca iterator, ewaluuje leniwie. Oblicza kolejną optymalną ścieżkę tylko wtedy, gdy o nią poprosisz, co chroni twój system przed przeciążeniem pamięci, jeśli wysoce powtarzalne sekwencje wygenerują tysiące równie poprawnych alignmentów. Rozważmy konkretny przykład z dwiema krótkimi sekwencjami DNA. Sekwencja pierwsza to A C C G T. Sekwencja druga to A C G, co oznacza, że brakuje w niej drugiego C i ostatniego T. Najpierw tworzysz obiekt alignera. Ustawiasz match score na dwa, a mismatch score na minus jeden. Ustawiasz open gap score na minus pięć, a extend gap score na minus jeden. Następnie przekazujesz obie sekwencje do metody align. Kiedy przejdziesz w pętli przez zwrócony iterator i wypiszesz wyniki, Biopython automatycznie sformatuje output. Wizualnie układa sekwencje jedna pod drugą, rysując pionowe linie między pasującymi zasadami i myślniki w miejscach, gdzie brakuje litery. Zobaczysz dokładnie, jak aligner umieścił znaki gapa w drugiej sekwencji, aby wyrównać pasujące litery, maksymalizując całkowity wynik w oparciu o zdefiniowane przez ciebie surowe open gap penalty. Pamiętaj, że konfiguracja alignera to w zasadzie dostrajanie modelu matematycznego; output ma znaczenie biologiczne tylko wtedy, gdy twoje match, mismatch i gap scores dokładnie odzwierciedlają specyficzną relację ewolucyjną między twoimi sekwencjami wejściowymi. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórzcie dalej!
6

Obsługa przyrównań wielu sekwencji

3m 58s

Przejdź od przyrównywania par do przyrównywania wielu sekwencji. Ten odcinek obejmuje parsowanie plików przyrównań za pomocą AlignIO i traktowanie ich jak tablic 2D w celu wycinania określonych kolumn.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 6 z 18. Otwierasz plik alignmentu w edytorze tekstu i wygląda on na idealnie ustrukturyzowany, jak prosta siatka. Ale spróbuj sparsować tylko trzecią pozycję dla pięćdziesięciu różnych gatunków, a nagle piszesz zagnieżdżone pętle i śledzisz indeksy stringów. Obsługa Multiple Sequence Alignments nie musi być tak frustrująca. Aby załadować alignment do kodu, używasz modułu Bio AlignIO. Zakładając, że twój plik alignmentu jest już wygenerowany, korzystasz z funkcji read. Przekazujesz tej funkcji ścieżkę do pliku i string z nazwą formatu, na przykład phylip lub stockholm. Funkcja read przetwarza plik tekstowy i zwraca obiekt MultipleSeqAlignment. Oto kluczowa sprawa. Obiekt MultipleSeqAlignment zachowuje się dokładnie tak samo jak dwuwymiarowy array. Jeśli kiedykolwiek pracowałeś z macierzą NumPy, logika jest identyczna. Wiersze w tej siatce to twoje pojedyncze sekwencje, zazwyczaj reprezentujące różne organizmy lub geny. Kolumny to konkretne pozycje nukleotydów lub aminokwasów zalignowane we wszystkich tych sekwencjach. Ponieważ działa to jak array 2D, używasz standardowej pythonowej składni slicingu, aby manipulować obydwoma wymiarami jednocześnie. Jeśli potrzebujesz wyciągnąć tylko konkretną sekwencję, slicujesz wiersze. Odwołanie się do indeksu zero twojego alignmentu zwraca pierwszą sekwencję w pliku. Ten wiersz jest zwracany jako standardowy obiekt SeqRecord, wraz z ID sekwencji, opisem i samymi danymi biologicznymi sekwencji. Możesz również iterować bezpośrednio po obiekcie alignmentu, a on zwróci ci każdy SeqRecord wiersz po wierszu. To załatwia sprawę sekwencji. Teraz czas na kolumny, gdzie logika 2D naprawdę oszczędza twój czas. Załóżmy, że załadowałeś alignment w formacie stockholm i chcesz wyizolować silnie konserwatywny region startowy. Interesuje cię tylko pierwsze dziesięć pozycji dla każdego pojedynczego gatunku. Zamiast iterować po pięćdziesięciu sekwencjach i slicować pięćdziesiąt pojedynczych stringów, aplikujesz slice 2D bezpośrednio na obiekcie alignmentu. Prosisz o wszystkie wiersze, używając pojedynczego dwukropka dla pierwszego wymiaru, po którym dajesz przecinek, a następnie slice od zera do dziesięciu dla drugiego wymiaru. Składnia to po prostu: otwierający nawias kwadratowy, dwukropek, przecinek, dwukropek dziesięć, zamykający nawias kwadratowy. Ta pojedyncza operacja zwraca zupełnie nowy obiekt MultipleSeqAlignment, zawierający tylko te pierwsze dziesięć kolumn dla każdej sekwencji. Wszystkie oryginalne ID sekwencji i metadane są automatycznie zachowywane w nowej, mniejszej siatce. Istnieje niewielka różnica w zachowaniu w zależności od tego, jak szeroki jest twój slice. Kiedy slicujesz zakres kolumn, Biopython zachowuje strukturę siatki i zwraca obiekt alignmentu. Ale jeśli wyciągniesz dokładnie jedną kolumnę — powiedzmy, wszystkie wiersze pod indeksem kolumny pięć — obiekt zwróci pojedynczy, zwykły string tekstowy zawierający tylko te znaki z góry na dół. Ten string wyjątkowo ułatwia obliczanie conservation scores lub identyfikację polimorfizmów pojedynczego nukleotydu w określonym miejscu bez rozpakowywania jakichkolwiek obiektów. Możesz łączyć te slice'y wierszy i kolumn, aby wyciągnąć dowolny potrzebny podblok. Możesz poprosić o wiersze od drugiego do piątego oraz kolumny od pięćdziesiątej do sześćdziesiątej, izolując konkretną domenę dla podzbioru gatunków. Potraktuj swoje alignmenty jak macierze, pozwól obiektowi MultipleSeqAlignment zająć się śledzeniem stringów, a twój kod do ekstrakcji danych skurczy się do zera. To wszystko na teraz. Do usłyszenia następnym razem!
7

Programistyczne odpytywanie baz danych NCBI

3m 59s

Zautomatyzuj wyszukiwanie literatury i sekwencji. Odkryj, jak odpytywać bazy danych NCBI za pomocą Entrez.esearch i pobierać dokładne identyfikatory bez użycia przeglądarki internetowej.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 7 z 18. Musisz pobrać dziesięć tysięcy rekordów sekwencji. Jeśli napiszesz standardowy web scraper, żeby odpytywać stronę NCBI, twój adres IP zostanie zablokowany, zanim pobierzesz pierwszą setkę. National Center for Biotechnology Information wyraźnie zabrania automatycznego scrapowania. Żeby pobierać dane legalnie i niezawodnie, musisz odpytywać bazy danych NCBI programowo, używając Bio dot Entrez. Przed wykonaniem jakichkolwiek network requests, musisz przestrzegać wytycznych API NCBI. Po pierwsze, musisz poinformować ich, kim jesteś. Robisz to, ustawiając zmienną Entrez dot email na swój prawdziwy adres e-mail. Jeśli twój skrypt wymknie się spod kontroli i przeciąży ich serwery, użyją tego maila, żeby się z tobą skontaktować, zanim na stałe odetną ci dostęp. Po drugie, musisz przestrzegać ich rate limits. NCBI ogranicza nieuwierzytelnionych użytkowników do trzech requestów na sekundę. Biopython obsługuje to automatycznie, wymuszając opóźnienie w tle. Jeśli jednak spróbujesz uruchomić wiele skryptów równolegle, żeby ominąć to opóźnienie, NCBI wykryje nadużycie i zbanuje twój adres IP. Graj według zasad. Workflow wyciągania danych z Entrez to zazwyczaj dwuetapowy proces: znalezienie unikalnych identyfikatorów, a następnie pobranie właściwych plików. Zaczynasz od wyszukiwania za pomocą funkcji Entrez dot esearch. Załóżmy, że chcesz znaleźć gen matK u storczyków. Wywołujesz esearch i przekazujesz nazwę bazy danych, czyli nucleotide, razem z twoim search term, na przykład orchid organism AND matK gene. Ta funkcja wyszukiwania nie zwraca biologicznych danych sekwencyjnych. Zwraca HTTP response, który działa jak otwarty plik tekstowy zawierający dokument XML. Oto kluczowa kwestia. Nie musisz pisać customowego parsera XML ani ręcznie wyciągać stringów. Bierzesz ten network file handle i przekazujesz go bezpośrednio do funkcji Entrez dot read. To parsuje XML i tłumaczy go na standardowy słownik w Pythonie. Wewnątrz tego słownika po prostu szukasz klucza o nazwie IdList. To daje ci listę w Pythonie zawierającą dokładne identyfikatory GenBank, które pasują do twojego zapytania o orchideę. Kiedy masz już tę listę identyfikatorów, przechodzisz do drugiego kroku: pobierania pełnych rekordów. Do tego używasz funkcji Entrez dot efetch. Przekazujesz jej tę samą nazwę bazy danych nucleotide, razem z identyfikatorem z twoich wyników wyszukiwania. Musisz też określić format danych, które chcesz otrzymać z powrotem. Żeby dostać standardowy plik tekstowy GenBank, ustawiasz argument retrieval type na gb, a argument retrieval mode na text. Tak jak funkcja wyszukiwania, efetch zwraca network stream, a nie raw string. Ponieważ ten stream imituje plik lokalny, nie musisz najpierw zapisywać pobranych danych na dysku. Możesz przekazać network handle bezpośrednio do SeqIO dot read, określić format jako genbank, a to natychmiast sparsuje stream do obiektu SeqRecord w Biopythonie. Masz teraz sekwencję i wszystkie jej biologiczne adnotacje załadowane do pamięci. Kiedy skończysz, zamknij handle, żeby zwolnić zasoby sieciowe. Najważniejszym nawykiem podczas odpytywania NCBI jest traktowanie twoich API responses jako file streams, a nie text strings. Przekazywanie tych streams bezpośrednio do Entrez dot read lub SeqIO dot read pozwala uniknąć niepotrzebnego memory overhead i utrzymuje twoje automation pipelines w idealnej czystości. Jeśli uważasz te odcinki za pomocne, możesz wesprzeć program, wyszukując DevStoriesEU na Patreonie. Dzięki za słuchanie, miłego kodowania wszystkim!
8

Uruchamianie BLAST przez Internet

4m 05s

Inicjuj zdalne wyszukiwania BLAST bezpośrednio z języka Python. Dowiedz się, jak używać qblast do wysyłania sekwencji na serwery NCBI i bezpiecznie zapisywać surowe wyniki w formacie XML.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 8 z 18. Wpatrywanie się w automatycznie odświeżającą się stronę internetową, podczas gdy sekwencja dopasowuje się do globalnej bazy danych, to okropna strata popołudnia. Zautomatyzowanie tego wyszukiwania w tle pozwala ci zająć się czymś pożytecznym, podczas gdy Python czeka. Dzisiaj omówimy uruchamianie BLAST-a przez internet za pomocą Biopythona. Potrzebna funkcja nazywa się qblast i znajduje się w module Bio dot Blast dot NCBIWWW. Działa ona jak wrapper na API NCBI BLAST, pozwalając ci wysyłać zapytania bezpośrednio ze skryptu, dokładnie tak samo, jak przez ich portal internetowy. Aby uruchomić wyszukiwanie, qblast wymaga trzech obowiązkowych argumentów. Pierwszym z nich jest program BLAST, który chcesz uruchomić. Na przykład, jeśli porównujesz sekwencję nukleotydów z bazą danych nukleotydów, przekazujesz string blastn. Jeśli pracujesz z białkami, przekazujesz blastp. Drugim argumentem jest konkretna baza danych, którą przeszukujesz. Najczęstszym wyborem dla nukleotydów jest string nt, co oznacza nieredundantną bazę nukleotydów. Jeśli przeszukiwałbyś białka, użyłbyś nr. Trzecim argumentem jest samo zapytanie z sekwencją. Biopython sprawia, że ten input jest bardzo elastyczny. Możesz podać zwykły string z surową sekwencją, wielolinijkowy string sformatowany jako rekord FASTA, obiekt SeqRecord z Biopythona, albo dokładny identyfikator sekwencji, taki jak numer akcesyjny NCBI. Jeśli chcesz uruchomić podstawowe wyszukiwanie, wywołujesz qblast, podajesz mu blastn jako program, nt jako bazę danych i twój string FASTA jako zapytanie. Python wstrzyma tutaj wykonywanie kodu, negocjując z serwerami NCBI i czekając tak długo, jak trzeba, na zakończenie zdalnego dopasowywania. Kiedy zdalny serwer skończy zadanie, qblast zwraca obiekt file-like zawierający twoje wyniki. Pod spodem, funkcja domyślnie żąda tych wyników w formacie XML. Powinieneś upewnić się, że tak zostanie, ponieważ XML to standardowy format, na którym Biopython polega przy przetwarzaniu downstream. Oto kluczowa wskazówka. Nie przekazuj od razu tego zwróconego web handle'a do funkcji parsującej. Uruchomienie zdalnego wyszukiwania BLAST jest kosztowne obliczeniowo dla serwerów NCBI i czasochłonne dla ciebie. Jeśli będziesz parsować strumień danych na żywo bezpośrednio z web handle'a, a twój skrypt napotka błąd kilka linijek dalej, te dane sekwencji zostaną utracone z pamięci. Aby naprawić swój kod i spróbować ponownie, musiałbyś wykonać dokładnie to samo zdalne wyszukiwanie od zera, marnując ich przepustowość i twój czas. Prawidłowy workflow polega na natychmiastowym, trwałym zapisaniu surowego outputu. W momencie, gdy qblast zwróci web handle, użyj standardowych operacji na plikach w Pythonie, aby otworzyć nowy plik lokalny w trybie zapisu. Odczytaj wszystko z web handle'a, zapisz to bezpośrednio do swojego nowego, lokalnego pliku XML, a następnie zamknij web handle. Masz teraz bezpieczną, statyczną kopię swojego wyszukiwania BLAST, która siedzi na twoim dysku twardym. Możesz otwierać ten lokalny plik XML jutro, w przyszłym tygodniu, albo pięćdziesiąt razy z rzędu podczas debugowania swojej aplikacji, bez ani jednego ponownego pingowania API NCBI. Zawsze oddzielaj pobieranie danych z sieci od przetwarzania danych, najpierw zapisując odpowiedzi z sieci na dysku. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
9

Natywne parsowanie: Rozpakowywanie BLAST XML

3m 59s

Zrozum złożone wyniki BLAST. Ten odcinek krok po kroku pokazuje parsowanie plików BLAST XML do natywnych obiektów języka Python w celu wyodrębnienia przyrównań, par segmentów o wysokiej punktacji (HSPs) oraz wartości E-value.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 9 z 18. Pisanie wyrażeń regularnych do scrapowania plików wyjściowych plain-text to bioinformatyczny rytuał przejścia. To także anti-pattern. W momencie, gdy narzędzie wyszukiwania zaktualizuje swoje formatowanie wizualne, twój skrypt przestaje działać. Aby mieć gwarancję struktury, musisz polegać na ustrukturyzowanych danych. W tym odcinku omówimy natywne parsowanie: rozpakowywanie BLAST XML. Biopython ogarnia to za pomocą modułu NCBIXML w pakiecie Bio dot Blast. Zamiast zapisywać wyniki wyszukiwania jako czytelny dla człowieka blok tekstu, zapisujesz je jako plik XML. Kiedy otwierasz ten plik i przekazujesz handle do funkcji parse w module NCBIXML, nie ładuje ona ogromnego bloba tekstowego do pamięci. Zamiast tego zwraca iterator. Ten iterator zwraca ustrukturyzowane obiekty jeden po drugim, utrzymując twój memory footprint na niskim poziomie, nawet jeśli wyszukiwanie zwróciło ogromne ilości danych. Aby efektywnie z tego korzystać, musisz zrozumieć trzypoziomową hierarchię, której Biopython używa do modelowania wyników. Najwyższym poziomem jest BLAST Record. Jeden rekord odpowiada dokładnie jednej sekwencji, którą przesłałeś jako query. Jeśli przesłałeś pojedynczą sekwencję, iterator zwraca jeden rekord. Jeśli przesłałeś pięćdziesiąt sekwencji, zwraca pięćdziesiąt rekordów. Wewnątrz każdego BLAST Record znajdziesz listę Alignments. Alignment reprezentuje pojedynczy hit w bazie danych. Mówi ci, że konkretna sekwencja w bazie danych dopasowała się do twojego query, wraz z metadanymi o tym wpisie w bazie. Wewnątrz każdego Alignment znajduje się trzeci poziom: High-scoring Segment Pairs, powszechnie znane jako HSP. To jest ta część, która ma znaczenie. Alignment po prostu wskazuje, że dwie sekwencje są powiązane. HSP zawiera matematyczny i strukturalny dowód tej relacji. Pojedynczy Alignment może zawierać wiele HSP, jeśli sekwencje współdzielą wiele odrębnych regionów podobieństwa oddzielonych niezalignowanymi gapami. Wyciągnięcie tych danych oznacza napisanie trzech zagnieżdżonych pętli. Najpierw iterujesz po rekordach w sparsowanym XML-u. Po drugie, iterujesz po alignments wewnątrz każdego rekordu. Po trzecie, iterujesz po HSP wewnątrz każdego alignmentu. Kiedy znajdziesz się w tej najbardziej wewnętrznej pętli, masz dostęp do właściwych danych o matchu. To tutaj stosujesz swoje filtry statystyczne. Najpopularniejszym filtrem jest e-value, które reprezentuje liczbę hitów o podobnej jakości, jakich spodziewałbyś się przez przypadek. Masz do tego dostęp przez atrybut expect w obiekcie HSP. Piszesz warunek: jeśli HSP dot expect jest mniejsze niż twój threshold, powiedzmy zero przecinek zero cztery, przetwarzasz match. Jeśli jest wyższe, match jest zbyt słaby i go ignorujesz. Dla hitów, które przejdą twój filtr, obiekt HSP przechowuje dokładne stringi alignmentu. Atrybut query zawiera twoją sekwencję wejściową z wszelkimi gapami wprowadzonymi przez algorytm. Atrybut sbjct zawiera zmatchowaną sekwencję z bazy danych. Atrybut match znajduje się koncepcyjnie pomiędzy nimi, zawierając reprezentację alignmentu, mapując dokładne matche, pozytywne substytucje lub gapy. Prawdziwą zaletą jest tutaj stabilność. Pozwalając modułowi NCBIXML na rozpakowanie pliku, przestajesz polegać na kruchym text scrapingu i zaczynasz interakcję ze zdefiniowanymi obiektami danych, które idealnie mapują się na biologiczną rzeczywistość rekordów, alignmentów i par segmentów. Dzięki za wysłuchanie, miłego kodowania wszystkim!
10

Nawigacja po strukturach 3D z Bio.PDB

4m 10s

Wejdź w trzy wymiary. Odkrywamy moduł PDB, parsowanie struktur makromolekularnych i zrozumienie architektury Structure-Model-Chain-Residue-Atom (SMCRA).

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 10 z 18. Białka są często przechowywane jako płaski, jednowymiarowy string liter, ale funkcjonują w złożonej, trójwymiarowej rzeczywistości. Mapowanie sekwencji 1D na trójwymiarową przestrzeń współrzędnych wymaga ścisłej, przewidywalnej hierarchii. Nawigowanie po strukturach 3D za pomocą Bio.PDB zapewnia dokładnie taką mapę. Kiedy pobierasz plik z Protein Data Bank, dostajesz go jako ogromny blok tekstu. Historycznie był to format kropka pdb. Dzisiaj standardem jest format kropka cif. Pisanie własnego kodu do czytania tych bloków tekstu linijka po linijce to niezła szkoła zarządzania edge cases. Bio.PDB rozwiązuje ten problem, konwertując tekst na obiektowe drzewo. Żeby to zrobić, używasz PDBParser albo MMCIFParser. Tworzysz instancję parsera, wywołujesz jego metodę get structure, podajesz dowolną nazwę dla swojej struktury i przekazujesz ścieżkę do pliku. W zamian dostajesz obiekt Structure. Ten obiekt Structure trzyma się ścisłej architektury danych znanej jako SMCRA. Ten skrót oznacza Structure, Model, Chain, Residue, Atom. Każdy plik 3D sparsowany przez Biopython jest zorganizowany w te pięć zagnieżdżonych poziomów. Główny poziom to Structure. Structure zawiera jeden lub więcej modeli. Jeśli struktura białka została rozwiązana za pomocą krystalografii rentgenowskiej, zazwyczaj jest tylko jeden model. Jeśli użyto NMR, mogą być dziesiątki modeli reprezentujących różne fluktuacje strukturalne. Zazwyczaj po prostu bierzesz pierwszy z nich, który znajduje się pod indeksem zero. Wewnątrz modelu masz obiekty Chain. Wiele białek to kompleksy zbudowane z wielu oddziałujących ze sobą łańcuchów polipeptydowych. Zazwyczaj są one oznaczane pojedynczymi wielkimi literami, jak chain A i chain B. Wewnątrz obiektu Chain znajdziesz obiekty Residue. Są to pojedyncze aminokwasy tworzące sekwencję. Ten poziom przechowuje również ligandy i cząsteczki wody przyłączone do tego konkretnego chaina. Na koniec, wewnątrz Residue, masz obiekty Atom. I tu jest kluczowa sprawa. Możesz nawigować po całym tym drzewie używając prostej iteracji albo dostępu w stylu dictionary. Jeśli napiszesz pętlę for po obiekcie chain, zwróci ona obiekty residue. Jeśli iterujesz po residue, zwróci atomy. Jeśli dokładnie wiesz, czego szukasz, możesz zejść w dół bez robienia pętli. Jeśli potrzebujesz współrzędnych przestrzennych węgla alfa w setnym residue w chain A, po prostu łączysz swoje lookupy. Bierzesz swój obiekt structure, pytasz o model zero, potem o chain A, potem o residue sto, a na końcu o atom o nazwie CA. Rozważmy praktyczny scenariusz: wyciąganie współrzędnych 3D wszystkich atomów w jednym, konkretnym residue. Najpierw inicjalizujesz swój parser i ładujesz plik do zmiennej. Następnie izolujesz docelowe residue. Tworzysz zmienną i przypisujesz do niej wynik wyszukania modelu zero, chain A i residue pięćdziesiąt z twojej struktury. Teraz piszesz standardową pętlę for. Dla każdego atomu w docelowym residue, żądasz jego współrzędnych. Biopython zwraca je jako array NumPy, reprezentujący dokładne pozycje X, Y i Z w przestrzeni. Printujesz nazwę atomu i jego array ze współrzędnymi. W zaledwie kilku linijkach kodu ominąłeś tysiące linijek surowego tekstu i wyciągnąłeś dokładnie te dane przestrzenne, których potrzebujesz. Hierarchia SMCRA gwarantuje, że każdy atom w każdym pliku struktury zostanie znaleziony przy użyciu dokładnie tej samej logiki. To wszystko na dzisiaj. Do usłyszenia następnym razem!
11

Pomiary geometrii białek

4m 31s

Obliczaj relacje przestrzenne w białkach. Ten odcinek obejmuje obliczanie odległości międzyatomowych i używanie NeighborSearch do znajdowania atomów w określonym promieniu.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 11 z 18. Jeśli napiszesz naiwną zagnieżdżoną pętlę, żeby obliczyć odległość między każdym atomem w białku a każdym atomem w ligandzie, twój skrypt się zawiesi. Indeksowanie przestrzenne rozwiązuje to błyskawicznie i właśnie tym zajmiemy się dzisiaj, omawiając mierzenie geometrii białek. Najbardziej podstawową operacją geometryczną w Bio dot PDB jest znalezienie odległości między dwoma punktami w trójwymiarowej przestrzeni. Biopython nadpisuje standardowy operator odejmowania dla obiektów Atom. Jeśli weźmiesz jeden obiekt Atom i odejmiesz od niego drugi obiekt Atom, wynikiem będzie float reprezentujący odległość euklidesową między nimi. Jednostką są zawsze angstremy. Nie musisz samemu wyciągać współrzędnych, podnosić ich do kwadratu ani wyciągać z nich pierwiastka. Po prostu odejmujesz jeden atom od drugiego i masz dokładną odległość. Ten trik z odejmowaniem jest idealny do sprawdzania konkretnej, znanej interakcji, takiej jak pojedyncze, podejrzewane wiązanie wodorowe. Ale przestaje się sprawdzać, kiedy musisz zbadać nieznane sąsiedztwo. Załóżmy, że masz małocząsteczkowy ligand związany z dużym receptorem i musisz zidentyfikować każdą resztę białkową w promieniu pięciu angstremów od tego ligandu. Typowe białko zawiera tysiące atomów. Sprawdzanie każdego pojedynczego atomu ligandu z każdym pojedynczym atomem białka jest zabójcze obliczeniowo. Złożoność czasowa rośnie geometrycznie, a twój skrypt po prostu staje. Żeby to rozwiązać, Bio dot PDB udostępnia moduł Neighbor Search. Zamiast porównywać pary jedna po drugiej, Neighbor Search buduje indeks przestrzenny. Pod spodem konstruuje drzewo KD, które mapuje, gdzie wszystko znajduje się w trójwymiarowej przestrzeni, pozwalając na ekstremalnie szybkie zapytania o sąsiedztwo. Konstruujesz obiekt Neighbor Search, przekazując mu płaską listę wszystkich atomów, które chcesz przeszukać. Zazwyczaj wyciągasz każdy atom ze swojej struktury docelowej, rzutujesz ten generator na standardową listę i przekazujesz do konstruktora Neighbor Search. Ten krok inicjalizacji zajmuje ułamek sekundy, ale odwala całą ciężką robotę obliczeniową, organizując dane przestrzenne na samym początku. Kiedy indeks jest już zbudowany, możesz go odpytywać. Główna metoda search wymaga dwóch argumentów: docelowej współrzędnej i promienia w angstremach. Kiedy odpalasz to wyszukiwanie, błyskawicznie przechodzi ono przez drzewo przestrzenne i zwraca tylko te encje, które znajdują się wewnątrz tej sferycznej granicy. I tu jest kluczowa sprawa. To wyszukiwanie nie zwraca tylko atomów. Ponieważ Bio dot PDB opiera się na architekturze SMCRA, Neighbor Search rozumie hierarchię strukturalną. Możesz przekazać opcjonalny parametr level do swojego query. Jeśli podasz literę R dla residue, indeks sprawdzi wszystkie atomy w promieniu pięciu angstremów, ustali, do jakich nadrzędnych residue te atomy należą, i zwróci czystą listę unikalnych obiektów Residue. W ten sposób całkowicie pomijasz poziom atomów w swoich wynikach. Żeby zmapować naszą kieszeń wiążącą ligand, przechodzisz przez prosty flow. Najpierw inicjalizujesz Neighbor Search wszystkimi atomami w łańcuchu białkowym. Po drugie, iterujesz tylko przez atomy w twoim ligandzie. Dla każdego atomu ligandu wywołujesz metodę search z promieniem pięciu angstremów i żądasz levelu residue. Na koniec zbierasz te zwrócone residues do pythonowego seta, żeby automatycznie usunąć wszelkie duplikaty. Właśnie zmapowałeś miejsce wiązania w kilka milisekund. Jeśli musisz znaleźć wewnętrzne kolizje w pojedynczym, zwiniętym łańcuchu, Neighbor Search zawiera również metodę search all. Po prostu podajesz promień, a ona zwraca każdą pojedynczą parę atomów w całej strukturze, które leżą bliżej siebie niż ta określona odległość, całkowicie unikając problemu zagnieżdżonych pętli. Traktowanie twoich danych molekularnych jako przeszukiwalnego indeksu geograficznego, a nie zagnieżdżonej listy, zmienia twój kod z powolnego i strukturalnego na szybki i przestrzenny. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
12

Drzewa filogenetyczne w języku Python

4m 07s

Parsuj, manipuluj i rysuj drzewa ewolucyjne za pomocą Bio.Phylo. Omawiamy odczytywanie plików Newick, przechodzenie przez drzewa i izolowanie określonych kladów.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 12 z 18. Jeśli kiedykolwiek widziałeś surowy plik Newick, wiesz, że to po prostu gęsty, zagnieżdżony koszmar nawiasów i przecinków. Napisanie własnego parsera stringów, żeby dowiedzieć się, który gatunek jest z którym spokrewniony, to prawdziwa męka. Potrzebujesz sposobu na załadowanie tego tekstu bezpośrednio do struktury danych, po której łatwo nawigować. Właśnie to oferuje Bio dot Phylo dla drzew filogenetycznych w Pythonie. Bio dot Phylo obsługuje parsowanie, manipulowanie i rysowanie drzew ewolucyjnych. Głównym punktem wejścia jest funkcja read. Przekazujesz jej ścieżkę do pliku i format string, taki jak newick lub phyloxml. Funkcja read konsumuje ten plik i zwraca pojedynczy obiekt Tree. Jeśli twój plik zawiera wiele drzew, używasz zamiast tego funkcji parse, aby uzyskać iterowalną sekwencję drzew. Po załadowaniu pliku pracujesz z dwoma odrębnymi komponentami: obiektem Tree i obiektem Clade. Obiekt Tree reprezentuje całą strukturę jako całość. Zawiera globalne metadane, takie jak nazwa drzewa i informacja o tym, czy jest ono ukorzenione, czy nie. Jednak faktyczne dane o rozgałęzieniach nie żyją bezpośrednio w obiekcie Tree. Znajdują się w obiektach Clade. Obiekt Clade reprezentuje konkretny węzeł i każdego potomka, który od niego odchodzi. Obiekt Tree ma atrybut root, który jest po prostu początkowym obiektem Clade dla całej hierarchii. Każda gałąź odchodząca od tego roota to kolejny Clade, który zawiera własne sub-clades, kaskadowo schodzące aż do samych wierzchołków. Nawigacja po tej hierarchii to moment, w którym ten moduł naprawdę błyszczy. Nie musisz ręcznie pisać rekurencyjnych pętli. Aby przeszukać strukturę, wywołujesz metodę find clades na swoim drzewie. Ta metoda przeszukuje wszystkie zagnieżdżone gałęzie i zwraca iterowalną kolekcję obiektów Clade pasujących do określonych przez ciebie właściwości. Możesz szukać po nazwie, po długości gałęzi, a nawet za pomocą własnej funkcji ewaluacyjnej. Jeśli interesują cię tylko same końce gałęzi, reprezentujące aktualnie żyjące gatunki, używasz metody get terminals. Zwraca to natychmiast płaską listę obiektów Clade będących liśćmi. Możesz również błyskawicznie obliczać metryki strukturalne. Wywołanie metody total branch length na drzewie sumuje długości każdej pojedynczej gałęzi w całej strukturze, dając ci całkowity dystans ewolucyjny. Wyobraź sobie scenariusz, w którym ładujesz ogromne drzewo ewolucyjne ssaków. Chcesz wyizolować tylko gałąź zawierającą naczelne, żeby przeprowadzić lokalną analizę. Wywołujesz find clades i szukasz docelowej nazwy Primates. Zwraca to konkretny obiekt Clade reprezentujący wspólnego przodka wszystkich naczelnych. Ponieważ Clade naturalnie zawiera wszystkich swoich potomków, masz teraz kompletne, wyizolowane poddrzewo. Możesz przekazać ten Clade naczelnych do innych funkcji analitycznych dokładnie tak samo, jak pełne drzewo. Czasami musisz po prostu spojrzeć na strukturę, żeby sprawdzić, czy twoja ekstrakcja zadziałała. Bio dot Phylo zawiera funkcję draw ascii. Przekazujesz swoje drzewo lub wyizolowany Clade do tej funkcji, a ona wypisuje reprezentację w postaci zwykłego tekstu bezpośrednio do twojego terminala. Nie jest to przeznaczone do publikacji, ale daje ci natychmiastowy wizualny feedback o topologii, bez konieczności konfigurowania zewnętrznych bibliotek do rysowania wykresów. Oto kluczowy wniosek. Przetłumaczenie zagnieżdżonych nawiasów na natywne obiekty sprawia, że topologia staje się API, pozwalając ci na wycinanie fragmentów historii ewolucyjnych za pomocą standardowych wywołań metod. Jeśli ten odcinek był dla ciebie pomocny i chcesz wesprzeć program, możesz wyszukać DevStoriesEU na Patreonie. To wszystko w tym odcinku. Dzięki za odsłuch i twórz dalej!
13

Analiza motywów sekwencyjnych

4m 07s

Odkryj ukryte wzorce w DNA. Dowiedz się, jak tworzyć motywy sekwencyjne, budować macierze wagowe pozycji (PWMs) i skanować sekwencje docelowe pod kątem miejsc wiązania czynników transkrypcyjnych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 13 z 18. Jeśli spróbujesz znaleźć miejsce wiązania czynnika transkrypcyjnego za pomocą ścisłego string match, przeoczysz zdecydowaną większość prawdziwych sygnałów biologicznych. Miejsca wiązania DNA bywają zmienne, a białka tolerują wariacje na konkretnych pozycjach sekwencji. Aby znaleźć je niezawodnie, musisz przestać szukać stałych stringów i zacząć szukać profili prawdopodobieństwa, na co dokładnie pozwala analiza motywów sekwencji. W Biopythonie obsłużysz to za pomocą modułu motifs. Zaczynasz od znanego zestawu wyrównanych sekwencji, które reprezentują twoje miejsce wiązania. Weźmy jako przykład klasyczny TATA box. Możesz mieć kilka znanych krótkich sekwencji, takich jak T A T A A A, T A T A A T i T A T A A C. Definiujesz je jako standardowe obiekty Seq i przekazujesz jako pojedynczą listę do funkcji create w module motifs. Biopython bierze tę listę instancji i pakuje je w pojedynczy obiekt motif. Bezpośrednim rezultatem utworzenia tego obiektu motif jest macierz zliczeń. Na każdej pozycji wzdłuż długości twojej sekwencji, Biopython zlicza całkowitą liczbę wystąpień A, C, G i T. Jeśli spojrzysz na pierwszą pozycję w naszych przykładach TATA box, liczba wystąpień dla T wynosi trzy, a dla pozostałych trzech liter zero. Ta macierz to dosłownie fundament wszystkich dalszych analiz, ale surowe zliczenia mają poważne ograniczenie matematyczne. Jeśli nukleotyd nigdy nie pojawi się na określonej pozycji w twojej małej próbce referencyjnej, jego prawdopodobieństwo staje się absolutnym zerem. Później, kiedy mnożysz prawdopodobieństwa, aby ocenić sekwencję, pojedyncze zero zeruje cały wynik. Aby naprawić tę słabość, konwertujesz macierz zliczeń na Position-Weight Matrix, czyli PWM. Oto kluczowa kwestia. Generujesz PWM, stosując pseudocounts. Pseudocount dodaje ułamek bazowy do każdego możliwego nukleotydu na każdej pozycji. Matematycznie uwzględnia to fakt, że to, iż nie widziałeś jeszcze cytozyny na drugiej pozycji, wcale nie oznacza, że substytucja w tym miejscu jest biologicznie niemożliwa. Wygładzając zera, Position-Weight Matrix zamienia twoje surowe zliczenia w solidne rozkłady prawdopodobieństwa. Same prawdopodobieństwa są nadal trudne do wykorzystania przy skanowaniu sekwencji. Musisz wiedzieć, czy dany fragment DNA pasuje do twojego motywu lepiej, niż do losowej sekwencji tła. Rozwiązujesz to, konwertując swoje PWM na Position-Specific Scoring Matrix, czyli PSSM. PSSM oblicza wyniki log-odds na podstawie rozkładu nukleotydów tła. Porównuje prawdopodobieństwo pojawienia się litery jako części twojego motywu z prawdopodobieństwem jej pojawienia się czysto przez przypadek. Dodatni wynik oznacza, że sekwencja aktywnie przypomina twój motyw. Ujemny wynik oznacza, że wygląda jak szum tła. Kiedy masz już swoje PSSM, możesz szukać niezaanotowanych miejsc wiązania w długiej sekwencji docelowej. Wywołujesz metodę calculate na PSSM i przekazujesz swoją docelową sekwencję DNA. Ta metoda w praktyce przesuwa twój motyw przez cały cel, oceniając każde możliwe okno o tej długości. Zwraca tablicę wyników liczbowych reprezentujących wartość log-odds na każdej pozycji sekwencji. Iterujesz po tych wynikach i szukasz wartości, które przekraczają zdefiniowany, ścisły próg. Jeśli wynik jest wystarczająco wysoki, prawdopodobnie znalazłeś funkcjonalny TATA box. Ścisły string match wymaga perfekcji, ale systemy biologiczne działają na prawdopodobieństwie, a przejście od surowych zliczeń do scoring matrices oddaje tę rzeczywistość. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
14

Integracja z Swiss-Prot i ExPASy

3m 29s

Uzyskaj dostęp do złotego standardu baz danych białek. Szczegółowo opisujemy, jak pobierać rekordy przez Bio.ExPASy i parsować gęste pliki płaskie Swiss-Prot, aby wyodrębnić wyselekcjonowane metadane białek.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 14 z 18. GenBank jest świetny, gdy pracujesz z kwasami nukleinowymi. Ale gdy potrzebujesz starannie wyselekcjonowanych, ręcznie sprawdzonych danych o białku — na przykład o jego dokładnych miejscach aktywnych lub o tym, gdzie przecina błonę komórkową — standardowe bazy sekwencji to za mało. Potrzebujesz specjalistycznej bazy białek, i to prowadzi nas do integracji Swiss-Prot i ExPASy. Swiss-Prot to wysokiej jakości, ręcznie adnotowana baza sekwencji białek. ExPASy to portal, który zapewnia do niej dostęp. Biopython łączy te dwa elementy. Wykorzystuje moduł ExPASy do pobierania danych przez internet, a moduł SwissProt do ich parsowania w ustrukturyzowany obiekt. Najpierw musisz pobrać surowy rekord z internetu. Robisz to za pomocą modułu ExPASy, a konkretnie funkcji o nazwie get_sprot_raw. Przekazujesz jej accession ID ze Swiss-Prot. Na przykład, jeśli chcesz uzyskać rekord dla podjednostki alfa ludzkiej hemoglobiny, przekazujesz jej accession ID, czyli P69905. Wywołanie get_sprot_raw z tym ID otwiera połączenie sieciowe z serwerem i zwraca handle do surowych danych tekstowych. Kiedy masz już ten handle do surowego tekstu, przekazujesz go do modułu SwissProt. Wywołujesz funkcję read i przekazujesz swój handle. To parsuje flat file i zwraca obiekt rekordu ze Swiss-Prot. I tu jest kluczowa sprawa. Ten obiekt rekordu to nie tylko string z sekwencją. To głęboko ustrukturyzowany kontener z eksperckimi metadanymi. Ponieważ Swiss-Prot jest ręcznie weryfikowany, pola w tym obiekcie są wyjątkowo bogate. Możesz odwołać się do atrybutu organism, aby dokładnie potwierdzić, do jakiego gatunku należy białko. Możesz sprawdzić atrybut sequence_length, aby natychmiast uzyskać liczbę aminokwasów, bez konieczności samodzielnego mierzenia stringa z sekwencją. Najbardziej wartościową częścią rekordu jest atrybut features. To zagnieżdżona lista zawierająca znane domeny strukturalne i funkcjonalne białka. Iterując przez te features, znajdziesz konkretne adnotacje. Zobaczysz features szczegółowo opisujące dokładne współrzędne aminokwasów dla miejsc aktywnych, regionów wiążących metale czy domen transbłonowych. Zamiast uruchamiać algorytm predykcyjny, odczytujesz pewne, potwierdzone laboratoryjnie współrzędne prosto z wyselekcjonowanej bazy. W praktyce twój code flow wygląda tak. Wywołujesz funkcję get_sprot_raw z ExPASy, podając swój accession ID. Bierzesz otrzymany handle i przekazujesz go do funkcji read ze SwissProt. To daje ci twój obiekt rekordu. Stamtąd możesz odczytać organism, sprawdzić sequence_length lub przeiterować przez listę features, aby wyciągnąć miejsca funkcjonalne. Zawsze pamiętaj o zamknięciu sieciowego handle'a po zakończeniu odczytu danych, aby zwolnić zasoby systemowe. Kiedy budujesz pipeline'y, które opierają się na funkcji biologicznej, a nie tylko na podobieństwie sekwencji, korzystanie ze Swiss-Prot gwarantuje, że opierasz swoją logikę na zweryfikowanych, ręcznie wyselekcjonowanych danych. To wszystko w tym odcinku. Dzięki za wysłuchanie i buduj dalej!
15

Wizualizacja genomów za pomocą GenomeDiagram

3m 46s

Zamień surowe pliki GenBank w obrazy o jakości publikacyjnej. Dowiedz się, jak GenomeDiagram konstruuje koliste i liniowe mapy genomów poprzez nakładanie ścieżek i strzałek cech.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 15 z 18. Kiedy przesyłasz artykuł opisujący nowo zsekwencjonowany plazmid bakteryjny, recenzenci rzadko chcą czytać tabelę współrzędnych genów w formacie plain text. Oczekują czytelnej, kolorowej mapy kołowej z adnotacjami, dzięki której struktura genomu jest jasna na pierwszy rzut oka. Wizualizacja genomów za pomocą GenomeDiagram to sposób, w jaki generujesz te mapy bezpośrednio ze swoich danych sekwencyjnych. Przed rozpoczęciem rysowania upewnij się, że zewnętrzna biblioteka ReportLab jest zainstalowana. GenomeDiagram pod spodem w pełni opiera się na bibliotece ReportLab, aby obliczyć geometrię i wyrenderować końcowe obrazy. Bez niej eksport graficzny zakończy się błędem. Architektura GenomeDiagram jest ściśle hierarchiczna. Budujesz swoją wizualizację, zagnieżdżając obiekty z góry na dół. Na samej górze znajduje się obiekt Diagram. To twoje puste płótno. Wewnątrz Diagramu dodajesz jeden lub więcej Tracków. Track reprezentuje określony obszar rysowania. Na mapie liniowej, Track to poziomy wiersz. Na kołowej mapie plazmidu, Track to pojedynczy, koncentryczny pierścień. Wewnątrz Tracka dodajesz obiekty FeatureSet. FeatureSet to logiczne grupowanie danych sekwencyjnych. Możesz użyć jednego FeatureSeta dla sekwencji kodujących i innego FeatureSeta dla regionów regulacyjnych na dokładnie tym samym pierścieniu. Na koniec, wewnątrz obiektów FeatureSet, umieszczasz poszczególne obiekty feature sekwencji. Oto kluczowa kwestia. Nie musisz ręcznie obliczać kątów ani współrzędnych pikseli, aby rozmieścić swoje geny. GenomeDiagram natywnie odczytuje pozycję start, pozycję stop i orientację nici ze standardowych obiektów feature w Biopythonie. Aby zastosować to w praktyce, załóżmy, że masz sparsowany rekord GenBank dla małego plazmidu. Najpierw inicjalizujesz pusty Diagram. Następnie tworzysz w nim nowy Track, a w tym Tracku nowy FeatureSet. Potem iterujesz po obiektach feature w twoim sparsowanym rekordzie GenBank. Sprawdzasz, czy typem obecnego feature'a jest CDS, czyli sekwencja kodująca. Kiedy znajdziesz CDS, przekazujesz go do swojego FeatureSeta, aby dodać go do wizualizacji. Na tym etapie przypisujesz też stylowanie wizualne. Możesz kazać feature'owi wyrenderować się jako strzałka, która automatycznie wskaże kierunek zgodny lub przeciwny do ruchu wskazówek zegara, w zależności od nici genu. Możesz tu również przypisać różne kolory. Popularnym trikiem jest użycie prostego licznika pętli do naprzemiennego zmieniania dwóch kolorów, tak aby sąsiadujące geny nie zlewały się wizualnie w jeden wielki blok. Gdy twoja hierarchia jest już w pełni zasilona danymi, instruujesz Diagram, aby się narysował. Wywołujesz metodę draw i ustawiasz format na circular. Możesz zdefiniować wymiary strony, kolor tła i skalowanie Tracków. Po skonstruowaniu rysunku w pamięci, po prostu wywołujesz metodę write, przekazując nazwę pliku kończącą się na PDF lub PNG. ReportLab błyskawicznie oblicza prawidłowe długości łuków, pozycjonuje kolorowe strzałki wzdłuż kołowego Tracka i eksportuje plik gotowy do publikacji. Główną zaletą tej wielopoziomowej struktury jest powtarzalność. Ponieważ reguły layoutu są ściśle oddzielone od parsowania surowych sekwencji, możesz napisać jeden skrypt, który jednolicie ostyluje całą bazę plazmidów, bez najmniejszej potrzeby dotykania narzędzi graficznych. Dzięki za wysłuchanie. Do usłyszenia następnym razem!
16

Genetyka populacyjna z Bio.PopGen

4m 18s

Analizuj zmienność genetyczną w populacjach. Ten odcinek wprowadza moduł Bio.PopGen do parsowania plików Genepop i łatwego wyodrębniania częstości alleli oraz wskaźników heterozygotyczności.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 16 z 18. Masz surowe dane genotypowe z terenu i potrzebujesz metryk statystycznych, ale wypełnienie tej luki oznacza pisanie kolejnego customowego skryptu do parsowania plików tekstowych. Konwersja tych danych z terenu do formatu gotowego do analizy jest żmudna, chyba że użyjesz parsera stworzonego specjalnie pod standardowy format Genepop. I tu do gry wchodzi Population Genetics z modułem Bio.PopGen. Genepop to standardowy pakiet oprogramowania i format pliku używany do obliczania metryk, takich jak równowaga Hardy'ego-Weinberga, statystyki F i nierównowaga sprzężeń. Jego tekstowy format wejściowy, zazwyczaj zapisywany jako plik .gen, jest bardzo sztywny. Opiera się na restrykcyjnych znakach nowej linii, konkretnych słowach kluczowych i sklejonych ze sobą kodach liczbowych dla alleli. Pisanie własnej logiki do wyciągania częstości alleli w wielu loci i populacjach jest bardzo podatne na błędy typu off-by-one. Moduł Bio.PopGen całkowicie tego unika, wczytując format Genepop bezpośrednio do ustrukturyzowanego obiektu w Pythonie. Weźmy konkretny scenariusz. Badasz dwie izolowane populacje ryb. Oznaczyłeś każdą rybę w trzech loci mikrosatelitarnych. Twoje surowe dane siedzą w standardowym pliku .gen. Na samej górze pliku jest tytuł, a pod nim nazwy twoich trzech markerów w osobnych liniach. Następnie pojawia się słowo kluczowe Pop, oznaczające początek pierwszej populacji ryb. Poniżej każda linia reprezentuje jedną rybę, pokazując jej identyfikator, a po nim allele we wszystkich trzech loci. Po ostatniej rybie w tej grupie pojawia się kolejne słowo kluczowe Pop, oznaczające początek drugiej populacji. Żeby to przetworzyć, importujesz moduł GenePop z Bio.PopGen. Otwierasz swój plik tekstowy i przekazujesz uchwyt otwartego pliku do funkcji GenePop.read. Ta funkcja przetwarza tekst i zwraca pojedynczy obiekt Record. I to jest najważniejsza część. Obiekt Record odzwierciedla biologiczną hierarchię twojego badania. Jeśli sprawdzisz atrybut loci na obiekcie Record, zwróci on prostą listę zawierającą nazwy twoich trzech markerów mikrosatelitarnych. To potwierdza, że parser poprawnie wczytał nagłówek. Następnie możesz spojrzeć na atrybut populations. Ten atrybut przechowuje listę, w której każdy element reprezentuje całą populację z twojego pliku. Ponieważ masz dwa słowa kluczowe Pop w pliku, ta lista zawiera dokładnie dwa elementy. Jeśli przyjrzysz się bliżej jednej z tych populacji, znajdziesz listę osobników, które się w niej znajdują. Każdy osobnik jest przechowywany jako para: jego identyfikator w postaci stringa oraz lista jego genotypów. Dla organizmu diploidalnego, genotyp w pojedynczym locus jest parsowany jako para alleli. Plik tekstowy Genepop często przechowuje te allele jako pojedynczy, połączony string cyfr, na przykład zero jeden zero dwa. Parser automatycznie dzieli to na osobne allele, reprezentując zero jeden i zero dwa jako oddzielne byty. Nie musisz pisać logiki do string slicing, żeby rozdzielić allele matczyne i ojcowskie. Po sparsowaniu pliku masz natychmiastowy dostęp do nazw markerów, liczebności populacji i danych o allelach poszczególnych osobników. Możesz iterować po populacjach, żeby policzyć konkretne częstości alleli, albo przekazać obiekt Record bezpośrednio do funkcji Biopythona, które współpracują z oprogramowaniem Genepop. Możesz odpalić obliczenia oczekiwanej heterozygotyczności albo zmierzyć zróżnicowanie genetyczne między twoimi dwiema izolowanymi grupami. Wartość parsera Bio.PopGen to nie tylko wczytanie pliku tekstowego, ale przekształcenie płaskiej listy stringów w ścisłą biologiczną hierarchię loci, populacji i osobników, której wymagają algorytmy statystyczne. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
17

Szlaki biochemiczne z KEGG

4m 25s

Połącz kropki metaboliczne. Dowiedz się, jak parsować rekordy enzymów i szlaków KEGG, aby śledzić reakcje biochemiczne i struktury związków chemicznych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 17 z 18. Sekwencjonowałeś gen i znalazłeś wariant. Znajomość sekwencji rzadko wystarcza. Aby zrozumieć rzeczywiste uszkodzenia biologiczne, musisz dokładnie wiedzieć, które sieci metaboliczne zaburza powstały enzym. Biochemical Pathways with KEGG zapewnia właśnie taką mapę. Kyoto Encyclopedia of Genes and Genomes utrzymuje rozległe bazy danych szczegółowo opisujące systemy biologiczne, związki chemiczne i reakcje. Dystrybuują te dane w postaci standardowych plików tekstowych typu flat file. Pliki te mają specyficzną strukturę, w której keyword znajduje się na lewym marginesie, a powiązane z nim dane na prawym. Problem polega na tym, że wartości, takie jak długa lista synonimów czy złożone nazwy ścieżek, często w nieprzewidywalny sposób zawijają się do kolejnych linii. Pisanie własnych operacji na stringach, żeby obsłużyć to zawijanie, jest bardzo podatne na błędy. Moduł Bio dot KEGG istnieje po to, aby obsłużyć te dziwactwa formatowania i przetłumaczyć te pliki tekstowe bezpośrednio na przewidywalne obiekty w Pythonie. Aby wyciągnąć podstawowe dane molekularne, używasz funkcji Compound dot parse z modułu KEGG. Przekazujesz do niej otwarty file handle wskazujący na plik tekstowy KEGG compound. Zamiast ładować ogromny dump bazy danych do pamięci naraz, parser zwraca iterator. Za każdym razem, gdy przesuwasz iterator, zwraca on pojedynczy obiekt Pythona reprezentujący jeden związek. Z tego obiektu możesz uzyskać dostęp do atrybutu entry, aby pobrać unikalny identyfikator, który zazwyczaj wygląda jak wielka litera C, po której następują cyfry. Ponieważ związki często mają wiele powszechnych nazw w literaturze, atrybut name zwraca listę stringów zawierającą wszystkie rozpoznane synonimy. Masz również bezpośredni dostęp do dokładnej struktury molekularnej poprzez atrybut formula. Związki to po prostu statyczne materiały w twoim systemie. Enzymy są tym, co faktycznie napędza reakcje. Aby je przeanalizować, przełączasz się na funkcję Enzyme dot parse, przekazując jej flat file z enzymem KEGG. Podobnie jak parser związków, zwraca ona pojedyncze obiekty jeden po drugim. Sprawdzasz atrybut entry, aby uzyskać standardowy numer EC, oraz atrybut name dla oznaczenia enzymu. To jest ta część, która ma znaczenie. Enzym nie działa w próżni, a obiekt enzymu odzwierciedla to poprzez swój atrybut pathway. Parser odczytuje wielolinijkowy blok tekstu szczegółowo opisujący interakcje enzymu i układa go w czystą listę. Każdy element tej listy to tuple zawierający dwie porcje danych. Pierwszy element w tuplu to identyfikator ścieżki KEGG, a drugi to czytelna dla człowieka nazwa tej ścieżki metabolicznej. Możesz napisać skrypt do kompletnego procesu mapowania w zaledwie kilku krokach. Najpierw otwierasz pobrany plik z danymi enzymu i przekazujesz go do funkcji Enzyme dot parse. Tworzysz pętlę, aby przejść przez zwrócone rekordy. Kiedy trafisz na rekord, w którym atrybut entry pasuje do numeru EC twojego zmutowanego enzymu, pobierasz jego atrybut pathway. Następnie możesz iterować po tej liście tupli, wyciągając nazwy ścieżek, aby natychmiast sprawdzić, czy mutacja wpływa na glikolizę, cykl kwasu cytrynowego, czy na coś zupełnie innego. Prawdziwa moc parserów KEGG to nie tylko czytanie tekstu, ale konwertowanie izolowanych komponentów biologicznych w połączone współrzędne sieci, co pozwala ci prześledzić zlokalizowany wariant genu aż do systemowej awarii metabolicznej. Jeśli uważasz te odcinki za pomocne i chcesz wesprzeć program, możesz wyszukać DevStoriesEU na Patreonie. To wszystko w tym odcinku. Dzięki za wysłuchanie i twórz dalej!
18

Analiza skupień dla ekspresji genów

3m 56s

Grupuj geny na podstawie ich zachowania. W tym ostatnim odcinku omawiamy moduł Bio.Cluster, stosując algorytm K-means i klastrowanie hierarchiczne do danych z mikromacierzy ekspresyjnych.

Pobierz
Cześć, tu Alex z DEV STORIES DOT EU. Podstawy Biopythona, odcinek 18 z 18. Właśnie przeprowadziłeś eksperyment RNA-seq i teraz wpatrujesz się w macierz ekspresji z dziesięcioma tysiącami wierszy. Znalezienie sensu w tych surowych danych jest niemożliwe, dopóki nie pogrupujesz tych genów w kilka odrębnych odpowiedzi biologicznych. Właśnie to robi analiza skupień dla ekspresji genów, wykorzystująca moduł Bio dot Cluster. Analizując dane z mikromacierzy lub RNA-seq, śledzisz aktywność genów w różnych warunkach. Weźmy konkretny scenariusz. Masz dane ekspresji tysiąca genów zmierzone w czterech punktach czasowych szoku cieplnego. Chcesz zidentyfikować, które geny zachowują się podobnie. Może pięćdziesiąt z nich zalicza skok w drugiej godzinie i spadek w czwartej. Geny o pasujących wzorcach up-regulation i down-regulation często dzielą te same szlaki biologiczne lub mechanizmy regulacyjne. Ręczne wyszukiwanie tych kohort w tysiącach wierszy jest po prostu niewykonalne. Moduł Bio dot Cluster zawiera rdzeń napisany w C, zaprojektowany specjalnie do wydajnego przetwarzania tego typu danych macierzowych. Twoim pierwszym krokiem jest załadowanie danych do Biopythona. Zamiast pisać własną logikę parsowania, przekazujesz swój plik tekstowy rozdzielony tabulatorami do funkcji read tego modułu. Zwraca to wyspecjalizowany obiekt Record. Obiekt ten przechowuje twoją numeryczną macierz ekspresji, ale śledzi również identyfikatory genów i nazwy warunków eksperymentalnych. Po załadowaniu danych stosujesz algorytm klastrowania. Najczęstszym podejściem jest K-means, uruchamiany za pomocą funkcji kcluster. K-means dzieli twoje elementy na z góry określoną liczbę grup, reprezentowaną przez zmienną k. Przekazujesz macierz danych i wybraną wartość k do funkcji kcluster. Funkcja zwraca następnie tablicę przypisującą każdy pojedynczy gen do konkretnego cluster ID, wraz z wartością błędu, która mierzy, jak ciasno te klastry są upakowane. Ponieważ algorytm zaczyna od losowych przypisań, zazwyczaj uruchamiasz go wielokrotnie i zatrzymujesz tę iterację, która daje najniższy błąd. Oto kluczowa kwestia. Algorytm grupuje geny na podstawie metryki odległości, którą musisz starannie wybrać. Jeśli użyjesz standardowej odległości euklidesowej, algorytm pogrupuje geny o podobnych bezwzględnych poziomach ekspresji. Ale jeśli chcesz grupować geny według kształtu ich krzywej ekspresji w czasie, niezależnie od ich początkowego baseline'u, musisz przekazać funkcji kcluster, aby zamiast tego użyła metryki odległości opartej na korelacji. K-means wymaga, żebyś z góry odgadł liczbę klastrów. Jeśli nie wiesz, ile różnych odpowiedzi występuje w twoich danych z szoku cieplnego, możesz zamiast tego użyć klastrowania hierarchicznego za pomocą funkcji treecluster. Zamiast wrzucać geny na siłę do płaskich bucketów, treecluster buduje hierarchię. Znajduje dwa geny o najbardziej identycznych wzorcach ekspresji i łączy je. Następnie znajduje kolejny najbliższy gen lub parę i łączy je, budując rozgałęzioną strukturę drzewa zwaną dendrogramem. Gdy drzewo połączy już cały tysiąc genów, możesz zaobserwować ogólną strukturę danych i odciąć gałęzie na takim poziomie, jaki ma biologiczny sens. Ponieważ to ostatni odcinek naszej serii Podstawy Biopythona, gorąco polecam otworzyć oficjalną dokumentację Biopythona i wypróbować te funkcje klastrowania na prawdziwym datasecie. Możesz również odwiedzić devstories dot eu, aby zasugerować tematy, które chciałbyś, żebyśmy poruszyli w przyszłych seriach. Ostatecznym celem uruchamiania tych algorytmów nie jest tylko sortowanie liczb do bucketów, ale odkrycie wspólnej biologicznej logiki, która zmusza te geny do wspólnej aktywacji. To wszystko w tym odcinku. Dzięki za słuchanie i buduj dalej!