Для того, чтобы автоматизировать проверку заданий, задания должны быть оформлены стандартным способом.
На примере первой недели:
- Путь к файлу должен быть вида edusummer2021/students/<your gtihub name>/codewars/week2_solutions.md
- Файлы должны быть у правильное ветке week1 или week2 и тд.
Markdown файл должен быть следующего вида
# 1. Opposite Number. https://www.codewars.com/kata/56dec885c54a926dcd001095
```python
def opposite(number):
return -1 * number
```
# 2. Even or Odd. https://www.codewars.com/kata/53da3dbb4a5168369a0000fe/train/python
```python
def even_or_odd(number):
return "Odd" if number % 2 else "Even"
```
Хедер начинается с решетки. Потом номер задания, потом точка, потом имя задания, потом точка, внутри имени задания других точек не должно быть. Потом ссылка на ваше решение, если такая ссылка еть.
После этого пустая строка.
Потом три лапки слово python. Внутри код. Обратите внимание на отступы, один отступ - это четыре пробела, никаких табов. Потом три лапки.
После этого пустая строка.
После этого следущее решение.
Без такого форматирование задание автоматически не примется.
Ccылка тут: https://github.com/aglabx/edusummer2021/blob/main/biological_formats.md
Сделайте папочку playground, мы в ней начнем писать вашу лучную библиотеку для биоинформатики.
Задача реализовать следующее решение, файл playground/fasta_reader.py (20 points):
def stupid_fasta_reader(fasta_file_name):
""" Write here the correct doc string.
"""
sequences = []
...
return sequences
def iter_fasta_file(fasta_file_name):
""" Write here the correct doc string.
"""
...
yield header, sequence
class FastaData:
...
def _parse_header(self):
""" Write here the correct doc string.
"""
...
...
def iter_fasta_objects(fasta_file_name):
""" Write here the correct doc string.
"""
...
seq_obj = FastaData...
...
yield seq_obj
Написать абстрактный ридер блочных файлов на основе кода фаста ридера с классами и без, файл playground/block_reader.py (10 points).
class BlockData:
...
def iter_block_objects(blocks_file_name, new_block_symbol):
""" Write here the correct doc string.
"""
...
block_obj = BlockData...
...
yield block_obj
def iter_block_file(blocks_file_name, new_block_symbol):
""" Write here the correct doc string.
"""
...
yield header, data
Перепишите FastaData класс наследовав его от BlockData, тоже в файле playground/fasta_reader.py:
class FastaData(BlockData):
...
Теперь у нас есть всё, чтобы легко написать парсер для FastQ файла, сначала напишите решение в лоб, а потом напишите красивый класс.
Это будет основой следующего спринта, когда будем FastQC свой писать, чтобы разобраться в его самых страшных секретах, файл playground/fastq_reader.py (20 points)
def iter_fastq_file(fastq_file_name):
""" Write here the correct doc string.
"""
...
yield header, sequence, strand, quality_string
class FastqData(BlockData):
...
def _parse_header(self):
# воспользуйтесь документацией иллюмины
...
def _convert_phred_to_probability(self):
...
def iter_fastq_blocks(fastq_file_name):
""" Write here the correct doc string.
"""
...
yield fastq_obj
Документация по классам: https://docs.python.org/3/tutorial/classes.html
Задача уметь читать и писать:
- csv files
- tsv files
- bed files
- gff3 files
- sam files
- vcf files
Для первых двух есть отличная библиотека https://docs.python.org/3/library/csv.html
Для остальных в лоб ее использовать не получится. Так как в них часто запихнуты не табличные данные.
Сейчас ваша задача разобраться какие в этих файлах есть поля. А это проще всего сделать имплементиров ридеры для этих файлов.
Начнем опять с абстрактного контейнера, чтобы не повторять себя в коде много раз, , файл playground/tsv_readers.py (10 points)
На этом этапе вам нужно составить только поля из соответствующих форматов, к усоврешенствованию этих классов мы еще много раз вернемся. Так что минимум придется доки по форматам найти и прочитать.
class TabDelimitedData:
def __init__(self):
...
class BEDData(TabDelimitedData):
def __init__(self):
...
class GFF3Data(TabDelimitedData):
def __init__(self):
...
class SAMData(TabDelimitedData):
def __init__(self):
...
class VCFData(TabDelimitedData):
def __init__(self):
...
Попробуйте найти в этих данных общее и вынести это в родительский класс.
При имплементации нужно решить следующие задачи будет, сейчас это задачка со зведочкой (*):
- Есть 0- и 1-based файлы, нужно научиться конвертировать туда обратно, как это лучше сделать?
- Если значение число, то оно и должно возвращаться, как это лучше сделать.
- Часть значение это словари как из развернуть? Для части полей значения могут быть списками, а как это сделать?
- Возможно ли придумать как описывать поля, чтобы можно было легко менять базовые классы под новые форматы?
Файл playground/gbff_readers.py.
Умея читать блочные файлы, чтения злобных форматов по типа генбанка уже не что-то сложное:
class GBFFData(BlockData):
...
def __init__(self):
...
self.sequence = ...
self.header = ...
self.length = ...
self.taxon = ...
...
def iter_gbff_blocks(gbff_file_name):
""" Write here the correct doc string.
"""
...
yield gbff_obj
Во-первых, нужно пройти тест по первой главе Кунина. И конспект второй главы в виде терминов разбитых на группы.
Группы:
- Ясно и могу объяснить.
- Вроде ясно, но не уверен, что смогу объяснить своими словами.
- Не ясно, нужна помощь с пониманием.
Кроме терминов, еще нужно придумать три вопроса, которых еще нет в списке вопросов придуманных.
Не откладывайте Кунина, он сложней, чем может показываться.
Ожидается файл: "koonin/chapter2.md"
Задачки на эту неделю:
- Let's Be Practical http://rosalind.info/problems/ini/
- Four Commonly Used Protein Databases http://rosalind.info/problems/dbpr/
- New Motif Discovery http://rosalind.info/problems/meme/
- GenBank Introduction http://rosalind.info/problems/gbk/
- Data Formats http://rosalind.info/problems/frmt/
- FASTQ format introduction http://rosalind.info/problems/tfsq/
- Read Quality Distribution http://rosalind.info/problems/phre/
- Read Filtration by Quality http://rosalind.info/problems/filt/
- Base Quality Distribution http://rosalind.info/problems/bphr/
- Base Filtration by Quality http://rosalind.info/problems/bfil/
Часть решений смело добавляйте в классы, что мы пишем для чтения фасты и фастку.
Задачки из слака яндекс практики по алгоритмам. Расчитаны на неделю.
Для каждой задачки нужно попробовать оценить сложность время/память.
Статья вам в помощь https://habr.com/ru/post/444594/ и тут https://www.programiz.com/dsa/asymptotic-notations, кроме этого первая лекция яндекса. Вы же я надеюсь их смотрите?
Еще две ссылки https://medium.com/dataseries/a-quick-primer-on-big-o-notation-c99ccc7ddbae и https://medium.com/dataseries/how-to-calculate-time-complexity-with-big-o-notation-9afe33aa4c46
https://www.codewars.com/kata/52685f7382004e774f0001f7/train/python
https://www.codewars.com/kata/54ba84be607a92aa900000f1/train/python
https://www.codewars.com/kata/5502c9e7b3216ec63c0001aa/train/python
https://www.codewars.com/kata/555615a77ebc7c2c8a0000b8/train/python
https://www.codewars.com/kata/57b06f90e298a7b53d000a86
https://www.codewars.com/kata/586f6741c66d18c22800010a
https://www.codewars.com/kata/5b37a50642b27ebf2e000010
https://www.codewars.com/kata/59377c53e66267c8f6000027
https://www.codewars.com/kata/525f50e3b73515a6db000b83
https://www.codewars.com/kata/530e15517bc88ac656000716
https://www.codewars.com/kata/51c8e37cee245da6b40000bd
Попробуйте решить их. Они значительно проще чем первая неделя.