You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/ru/2-Working-With-Data/07-python
localizeflow[bot] 4348014326
[de,ru,ar] chore(i18n): sync translations
4 weeks ago
..
R 🌐 Update translations via Co-op Translator 11 months ago
README.md [de,ru,ar] chore(i18n): sync translations 4 weeks ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 213 changes) 6 months ago
notebook-covidspread.ipynb chore(i18n): sync translations with latest source changes (chunk 1/1, 69 changes) 6 months ago
notebook-papers.ipynb 🌐 Update translations via Co-op Translator 11 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 11 months ago

README.md

Работа с данными: Python и библиотека Pandas

 Sketchnote от (@sketchthedocs)
Работа с Python - Sketchnote от @nitya

Вводное видео

Хотя базы данных предлагают очень эффективные способы хранения данных и их запросов с помощью языков запросов, самым гибким способом обработки данных является написание собственной программы для манипуляции данными. Во многих случаях выполнение запроса к базе данных было бы более эффективным способом. Однако в некоторых случаях, когда требуется более сложная обработка данных, это нельзя легко сделать с помощью SQL. Обработка данных может программироваться на любом языке программирования, но существуют определённые языки более высокого уровня для работы с данными. Учёные данных обычно предпочитают один из следующих языков:

  • Python, универсальный язык программирования, который часто считается одним из лучших вариантов для новичков из-за своей простоты. У Python есть множество дополнительных библиотек, которые помогут решить многие практические задачи, например извлечение данных из ZIP-архива или преобразование изображения в оттенки серого. Кроме науки о данных, Python часто используется и для веб-разработки.
  • R — это традиционный набор инструментов, разработанный с учётом статистической обработки данных. Он также содержит большой репозиторий библиотек (CRAN), что делает его хорошим выбором для обработки данных. Однако R не является универсальным языком программирования и редко используется за пределами области науки о данных.
  • Julia — ещё один язык, разработанный специально для науки о данных. Он предназначен для обеспечения лучшей производительности, чем Python, что делает его отличным инструментом для научных экспериментов.

В этом уроке мы сосредоточимся на использовании Python для простой обработки данных. Мы предположим базовое знакомство с языком. Если вы хотите более глубокое изучение Python, вы можете обратиться к одному из следующих ресурсов:

Данные могут принимать разные формы. В этом уроке мы рассмотрим три формы данных - табличные данные, текст и изображения.

Мы сосредоточимся на нескольких примерах обработки данных, вместо полного обзора всех связанных библиотек. Это позволит вам получить основное представление о возможностях и даст понимание, где искать решения ваших задач при необходимости.

Самый полезный совет. Когда вам нужно выполнить определённую операцию с данными, которую вы не знаете, как сделать, попробуйте поискать её в интернете. Stackoverflow обычно содержит много полезных примеров кода на Python для многих типичных задач.

Викторина перед лекцией

Табличные данные и DataFrame

Вы уже встречались с табличными данными, когда мы говорили о реляционных базах данных. Когда у вас много данных, содержащихся во многих различных связанных таблицах, определённо имеет смысл использовать SQL для работы с ними. Однако во многих случаях у нас есть таблица данных, и нам нужно получить некоторое понимание или инсайты о этих данных, такие как распределение, корреляция между значениями и др. В науке о данных часто требуется выполнить преобразования исходных данных с последующей визуализацией. Оба этих шага можно легко сделать с помощью Python.

В Python есть две наиболее полезные библиотеки, которые помогут вам работать с табличными данными:

  • Pandas позволяет манипулировать так называемыми DataFrame, которые аналогичны реляционным таблицам. Вы можете иметь именованные колонки и выполнять различные операции с рядами, колонками и DataFrame в целом.
  • Numpy — библиотека для работы с тензорами, то есть многомерными массивами. Массив содержит значения одного типа, и он проще, чем DataFrame, но предлагает больше математических операций и создаёт меньше накладных расходов.

Есть также несколько других библиотек, о которых стоит знать:

  • Matplotlib — библиотека для визуализации данных и построения графиков
  • SciPy — библиотека с дополнительными научными функциями. Мы уже встречались с этой библиотекой, обсуждая вероятность и статистику

Вот кусочек кода, который обычно используется для импорта этих библиотек в начале Python-программы:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import ... # вам нужно указать конкретные подпакеты, которые вам нужны

Pandas основан на нескольких базовых понятиях.

Series

Series — это последовательность значений, похожая на список или numpy-массив. Главное отличие в том, что у series есть индекс, и при операциях над series (например, сложении) индекс учитывается. Индекс может быть простым — целочисленным номером строки (используется по умолчанию при создании series из списка или массива) или иметь сложную структуру, например, интервал дат.

Примечание: В сопроводительном блокноте notebook.ipynb есть вводный код для Pandas. Здесь мы лишь кратко представляем некоторые примеры, и вы, безусловно, можете ознакомиться с полным блокнотом.

Рассмотрим пример: мы хотим проанализировать продажи нашего киоска с мороженым. Сгенерируем ряд из чисел продаж (количество проданных единиц в каждый день) за некоторый период:

start_date = "Jan 1, 2020"
end_date = "Mar 31, 2020"
idx = pd.date_range(start_date,end_date)
print(f"Length of index is {len(idx)}")
items_sold = pd.Series(np.random.randint(25,50,size=len(idx)),index=idx)
items_sold.plot()

График временного ряда

Теперь предположим, что каждую неделю мы устраиваем вечеринку для друзей и берём дополнительно 10 упаковок мороженого на вечеринку. Мы можем создать другой series с индексом по неделям, чтобы это показать:

additional_items = pd.Series(10,index=pd.date_range(start_date,end_date,freq="W"))

Когда мы складываем два series, получаем итоговое количество:

total_items = items_sold.add(additional_items,fill_value=0)
total_items.plot()

График временного ряда

Обратите внимание, что мы не используем простой синтаксис total_items+additional_items. Были бы они использованы, мы получили бы множество значений NaN (Not a Number) в результирующем series. Это происходит потому, что в некоторых индексных точках серии additional_items отсутствуют значения, и сложение с NaN даёт NaN. Поэтому при сложении необходимо указать параметр fill_value.

С временными рядами мы также можем пересамплировать series с другими временными интервалами. Например, предположим, что мы хотим вычислить средний объём продаж помесячно. Для этого используем следующий код:

monthly = total_items.resample("1M").mean()
ax = monthly.plot(kind='bar')

Средние значения по месяцам

DataFrame

DataFrame — по сути коллекция series с одинаковым индексом. Мы можем объединить несколько series в один DataFrame:

a = pd.Series(range(1,10))
b = pd.Series(["I","like","to","play","games","and","will","not","change"],index=range(0,9))
df = pd.DataFrame([a,b])

Это создаст горизонтальную таблицу следующего вида:

0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9
1 I like to use Python and Pandas very much

Мы также можем использовать Series в качестве колонок и задать имена колонок через словарь:

df = pd.DataFrame({ 'A' : a, 'B' : b })

Это даст нам таблицу такого вида:

A B
0 1 I
1 2 like
2 3 to
3 4 use
4 5 Python
5 6 and
6 7 Pandas
7 8 very
8 9 much

Обратите внимание, что такую таблицу можно получить, транспонировав предыдущую, например, написав

df = pd.DataFrame([a,b]).T.rename(columns={ 0 : 'A', 1 : 'B' })

Здесь .T означает операцию транспонирования DataFrame, то есть замену строк на столбцы и наоборот, а операция rename позволяет переименовать колонки, чтобы привести их в соответствие с предыдущим примером.

Вот несколько самых важных операций, которые можно выполнять с DataFrame:

Выбор колонок. Мы можем выбрать отдельные колонки, написав df['A'] — эта операция возвращает Series. Также можно выбрать подмножество колонок в другой DataFrame написав df[['B','A']] — это возвращает другой DataFrame.

Фильтрация только определённых строк по критериям. Например, чтобы оставить только строки, у которых значение в колонке A больше 5, можно написать df[df['A']>5].

Примечание: Фильтрация работает следующим образом. Выражение df['A']<5 возвращает булевский series, указывающий, для каждого элемента исходного series df['A'], истинно ли условие (True) или ложно (False). Когда булевский series используется в качестве индекса, он возвращает подмножество строк DataFrame. Поэтому нельзя использовать произвольное булевское выражение Python, например, написание df[df['A']>5 and df['A']<7] будет ошибкой. Вместо этого следует использовать специальную операцию & для булевских series, написав df[(df['A']>5) & (df['A']<7)] (скобки здесь важны).

Создание новых вычисляемых колонок. Мы можем легко создать новые вычисляемые колонки в нашем DataFrame, используя интуитивное выражение, например:

df['DivA'] = df['A']-df['A'].mean() 

Этот пример вычисляет отклонение A от её среднего значения. Фактически здесь мы вычисляем series, а затем присваиваем этот series в левую часть, создавая новую колонку. Поэтому мы не можем использовать операции, несовместимые с series, например, следующий код неправильный:

# Неправильный код -> df['ADescr'] = "Low" если df['A'] < 5 иначе "Hi"
df['LenB'] = len(df['B']) # <- Неправильный результат

Последний пример, хотя синтаксически корректен, даёт неправильный результат, так как присваивает длину series B всем значениям колонки, а не длину отдельных элементов, как предполагалось.

Если нам нужно вычислить сложные выражения, можно использовать функцию apply. Последний пример можно записать так:

df['LenB'] = df['B'].apply(lambda x : len(x))
# или
df['LenB'] = df['B'].apply(len)

После вышеописанных операций мы получим следующий DataFrame:

A B DivA LenB
0 1 I -4.0 1
1 2 like -3.0 4
2 3 to -2.0 2
3 4 use -1.0 3
4 5 Python 0.0 6
5 6 and 1.0 3
6 7 Pandas 2.0 6
7 8 very 3.0 4
8 9 much 4.0 4

Выбор строк по номеру можно сделать с помощью конструкции iloc. Например, чтобы выбрать первые 5 строк из DataFrame:

df.iloc[:5]

Группировка часто используется для получения результата, похожего на сводные таблицы в Excel. Допустим, мы хотим вычислить среднее значение колонки A для каждого значения LenB. Для этого можно сгруппировать DataFrame по LenB и вызвать mean:

df.groupby(by='LenB')[['A','DivA']].mean()

Если нужно вычислить среднее и количество элементов в группе, можно использовать более сложную функцию aggregate:

df.groupby(by='LenB') \
 .aggregate({ 'DivA' : len, 'A' : lambda x: x.mean() }) \
 .rename(columns={ 'DivA' : 'Count', 'A' : 'Mean'})

Это даст нам следующую таблицу:

LenB Count Mean
1 1 1.000000
2 1 3.000000
3 2 5.000000
4 3 6.333333
6 2 6.000000

Получение данных

Мы уже видели, как просто создавать Series и DataFrames из объектов Python. Однако данные обычно поступают в виде текстового файла или таблицы Excel. К счастью, Pandas предлагает нам простой способ загрузки данных с диска. Например, считывание CSV-файла так же просто:

df = pd.read_csv('file.csv')

Мы увидим больше примеров загрузки данных, включая получение их с внешних веб-сайтов, в разделе "Задание"

Печать и построение графиков

Специалист по данным часто должен исследовать данные, поэтому важно уметь их визуализировать. Когда DataFrame большой, часто хочется просто убедиться, что все сделано правильно, распечатав первые несколько строк. Это можно сделать, вызвав df.head(). Если вы используете Jupyter Notebook, он выведет DataFrame в красивом табличном виде.

Мы также видели использование функции plot для визуализации некоторых столбцов. Хотя plot очень полезен для многих задач и поддерживает множество типов графиков через параметр kind=, вы всегда можете использовать библиотеку matplotlib для построения чего-то более сложного. Подробно мы рассмотрим визуализацию данных в отдельных уроках курса.

Этот обзор охватывает наиболее важные концепции Pandas, однако библиотека очень богата, и нет предела тому, что вы можете с ней делать! Теперь давайте применим эти знания для решения конкретной задачи.

🚀 Задание 1: Анализ распространения COVID

Первая задача, на которой мы сосредоточимся, — моделирование эпидемического распространения COVID-19. Для этого мы воспользуемся данными о количестве инфицированных в разных странах, предоставленными Центром системной науки и инженерии (CSSE) в Университете Джонса Хопкинса. Набор данных доступен в этом репозитории на GitHub.

Поскольку мы хотим показать, как работать с данными, предлагаем открыть notebook-covidspread.ipynb и прочитать его от начала до конца. Вы также можете выполнить ячейки и выполнить некоторые испытания, которые мы оставили для вас в конце.

COVID Spread

Если вы не знаете, как запускать код в Jupyter Notebook, взгляните на эту статью.

Работа с неструктурированными данными

Хотя данные очень часто бывают в табличной форме, в некоторых случаях нам нужно работать с менее структурированными данными, например, текстом или изображениями. В таких случаях, чтобы применить рассмотренные выше методы обработки данных, нам нужно как-то извлечь структурированные данные. Вот несколько примеров:

  • Извлечение ключевых слов из текста и анализ частоты их появления
  • Использование нейронных сетей для получения информации об объектах на изображении
  • Получение информации об эмоциях людей с видеопотока

🚀 Задание 2: Анализ COVID-статей

В этом задании мы продолжим тему пандемии COVID и сосредоточимся на обработке научных статей по теме. Существует набор данных CORD-19 Dataset с более чем 7000 (на момент написания) статей о COVID, доступных с метаданными и аннотациями (а примерно для половины из них также предоставлены полные тексты).

Полный пример анализа этого набора данных с использованием когнитивной службы Text Analytics for Health описан в этом блоге. Мы обсудим упрощённую версию этого анализа.

ПРИМЕЧАНИЕ: Мы не предоставляем копию набора данных в составе этого репозитория. Сначала вам может понадобиться скачать файл metadata.csv из этого набора на Kaggle. Может потребоваться регистрация на Kaggle. Набор данных можно скачать и без регистрации здесь, но он будет включать все полные тексты в дополнение к файлу метаданных.

Откройте notebook-papers.ipynb и прочитайте его от начала до конца. Вы также можете выполнить ячейки и выполнить некоторые испытания, которые мы оставили для вас в конце.

Covid Medical Treatment

Обработка изображений

В последнее время были разработаны очень мощные модели ИИ, которые позволяют нам понимать изображения. Существует множество задач, которые можно решать с помощью предварительно обученных нейронных сетей или облачных сервисов. Вот несколько примеров:

  • Классификация изображений, которая помогает отнести изображение к одному из заранее определённых классов. Вы можете легко обучить свои собственные классификаторы изображений с помощью таких сервисов, как Custom Vision
  • Обнаружение объектов для выявления разных объектов на изображении. Сервисы, такие как computer vision, могут распознавать множество распространённых объектов, а вы можете обучить модель Custom Vision для обнаружения специфических интересующих вас объектов.
  • Обнаружение лиц, включая определение возраста, пола и эмоций. Это можно сделать через Face API.

Все эти облачные сервисы можно вызывать с помощью Python SDK, что позволяет легко интегрировать их в ваш рабочий процесс исследования данных.

Вот несколько примеров исследования данных из источников изображений:

  • В блоге Как учиться Data Science без программирования мы исследуем фотографии из Instagram, пытаясь понять, что заставляет людей ставить больше лайков. Сначала мы извлекаем как можно больше информации из изображений с помощью computer vision, а затем используем Azure Machine Learning AutoML для построения интерпретируемой модели.
  • В Facial Studies Workshop мы используем Face API для выявления эмоций у людей на фотографиях с мероприятий, чтобы попытаться понять, что делает людей счастливыми.

Заключение

Независимо от того, есть ли у вас уже структурированные или неструктурированные данные, используя Python, вы можете выполнить все этапы обработки и анализа данных. Это, пожалуй, самый гибкий способ обработки данных, и именно поэтому большинство специалистов по данным используют Python в качестве основного инструмента. Изучение Python в глубину — отличная идея, если вы серьезно настроены на развитие в области Data Science!

Викторина после лекции

Обзор и самостоятельное изучение

Книги

Онлайн-ресурсы

Изучение Python

Задание

Выполните более детальное исследование данных для указанных выше заданий

Благодарности

Этот урок был подготовлен с ♥️ Дмитрием Сошниковым (http://soshnikov.com)


Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.