Data Engineering 102: Введение в Python для Data Engineering.

Приветствую моих дорогих читателей, сегодня мы расскажем о Python для инженерии данных. Если вы читали мою статью о Data Engineering 101, мы поняли, что одним из ключевых навыков, необходимых для инженера данных, является хорошее понимание языка Python. Прочитайте эту статью, чтобы получить базовое представление об инженерии данных.

Можно ли использовать другие языки для инженерии данных? Я бы ответил утвердительно, например, Scala, Java. Давайте разберемся, почему мы используем Python для инженерии данных:

  • Инженер данных работает с различными типами форматов данных. Для таких случаев лучше всего подходит Python. Его стандартная библиотека поддерживает простую работу с файлами .csv, одним из самых распространенных форматов файлов данных.
  • Инструменты для работы с данными используют направленные ациклические графы, такие как Apache Airflow, Apache NiFi. DAGs, коды Python, используемые для задания задач. Таким образом, изучение Python поможет инженерам данных эффективно использовать эти инструменты.
  • Инженер по данным не только получает данные из различных источников, но и обрабатывает их. Одним из самых популярных движков для обработки данных является Apache Spark, который работает с Python DataFrames и даже предлагает API, PySpark, для построения масштабируемых проектов больших данных.
  • Инженеру по данным часто приходится использовать API для получения данных из баз данных. Данные в таких случаях обычно хранятся в формате JSON (JavaScript Object Notation), и в Python есть библиотека JSON-JSON для работы с таким типом данных.
  • Luigi! Пакет модулей Python, который помогает нам строить сложные конвейеры данных.

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

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

Сбор и вставка данных: это включает в себя получение данных из баз данных, API и других источников. Для получения и ввода данных используется Python.

Манипулирование данными: это относится к тому, как инженер по данным обрабатывает структурированные, неструктурированные и полуструктурированные данные, превращая их в значимую информацию.

Параллельные вычисления: это необходимо для памяти и вычислительной мощности. Инженер по данным использует Python для разделения задач на подзадачи и распределения задач.

Конвейеры данных: Конвейер ETL, который включает в себя извлечение, преобразование и загрузку данных. У нас есть инструменты, которые легко использовать с Python, такие как Snowflake, Apache Airflow.

Отлично, теперь мы знаем, как Python используется в инженерии данных. Для начала нам нужно ознакомиться с основами Python и хорошо его понять, чтобы писать код. Я буду использовать jupyter lab, редактор кода, который находится в Anaconda. Я объясню основы Python на примерах, чтобы убедиться, что мы хорошо понимаем концепции.

В рамках базового Python мы рассмотрим следующие темы:

  1. Переменные
  2. Строки
  3. Математические выражения
  4. Циклы
  5. Кортежи, списки, словари и множества
  6. Функции

Переменная — это контейнер для хранения значения. Имя переменной относится к метке, которая присваивает ей значение.

variable_name = value
Вход в полноэкранный режим Выход из полноэкранного режима

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

officer_duty = False
Войти в полноэкранный режим Выход из полноэкранного режима

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

MAXIMUM_FILE_LIMIT = 1500
Ввести полноэкранный режим Выйти из полноэкранного режима

Строки

Это серия символов, представленная с помощью одинарных или двойных кавычек.

В python версии 3.6 есть f-strings (format string), f-strings помогает нам использовать значения переменных внутри строки.

Математические выражения

Операторы используются для выполнения различных операций над значениями и переменными. Операторы Python делятся на следующие группы:

  • Арифметические операторы
  • Операторы сравнения
  • Логические операторы
  • Побитовые операторы

Арифметические операторы
Эти операторы вычисляют математические операции над числовыми значениями. В программе также имеется математический модуль для выполнения сложных числовых вычислений.

Эти операции дают следующие результаты

Если мы комбинируем несколько арифметических операций, то сначала мы начнем с операций, заключенных в круглые скобки.

Операторы сравнения
Эти операторы помогают сравнивать два значения.

  • Меньше чем ( < )
  • Меньше или равно (<=)
  • Больше чем (>)
  • Больше или равно (>=)
  • Равно ( == )
  • Не равно ( != )

Он сравнивает числа, строки и возвращает булево значение (либо True, либо False).

Логические операторы
Они помогают проверять несколько условий одновременно.
У нас есть операторы and, or, not.

Побитовые операторы
Используются для сравнения двоичных чисел.

Циклы

В Python есть два цикла: цикл while и цикл for.

цикл while
Вы будете выполнять блок кода до тех пор, пока заданное условие будет истинным.

while condition:
   body
Вход в полноэкранный режим Выйти из полноэкранного режима

Условие — это выражение, которое будет иметь значение true или False (булево значение).
while проверяет условие в начале каждой итерации и выполняет тело цикла до тех пор, пока условие равно True.
В теле, чтобы избежать бесконечного цикла, необходимо остановить условие после нескольких повторений.

day_of_week = 0
while True:
   print(day_of_week)
   day_of_week += 1

   if day_of_week == 5:
      break
Вход в полноэкранный режим Выход из полноэкранного режима

В приведенном выше блоке кода day_of_week будет многократно увеличиваться на единицу. Затем у нас есть оператор if, который проверяет, если day_of_week == 5, то блок выполняется до тех пор, пока не будет достигнуто значение пять, и блок if выполняется, разрывая цикл. Оператор break выходит из цикла, как только условие if становится истинным.

цикл for
В основном мы используем цикл for для выполнения блока кода несколько раз.

for index in range(n):
   statement
Вход в полноэкранный режим Выйти из полноэкранного режима

Мы видим синтаксис цикла for. index называется счетчиком цикла, n — количество раз, которое цикл выполнит оператор. range() — встроенная функция, range(n) генерирует последовательность чисел от 0 до n, однако n последнее значение не выводится.

sum = 0
for number in range(101):
   sum += number

print(sum)

Вход в полноэкранный режим Выход из полноэкранного режима

Как вы видите в range(0, 10, 2), это указывает на range(start, stop, step). Вы можете изменить значения и посмотреть, как работает код.

Функции

Функция — это блок кода, который выполняет определенную задачу или возвращает значение. Функции помогают разделить программу на управляемые части, чтобы облегчить чтение, тестирование и сопровождение программы.
Вот как мы пишем функцию:

def greet(name):
   return f'{name} how are you doing?'
greetings = greet('Richard')
print(greetings)
Войти в полноэкранный режим Выйти из полноэкранного режима

Параметр — это информация, которая нужна функции и указывается в определении функции. В нашем примере name является параметром.
Аргумент — это часть данных, которые вы передаете функции и которые она должна вернуть Richard — это аргумент.

У нас есть рекурсивные функции, это функции, которые могут обращаться к самим себе.

Лямбда-функция
Если у вас есть простая функция с одним выражением, то нет необходимости определять ключевое слово def. Лямбда-выражения позволяют определять анонимные функции, которые используются один раз.

функция map()
Эта функция принимает два аргумента — функцию, которую нужно применить, и объект, к которому нужно применить функцию.
Она обеспечивает быстрый и чистый способ итеративного применения функции без применения цикла for.

Список
Это упорядоченная коллекция элементов, заключенная в квадратные скобки [] .
Вы можете добавлять, удалять, изменять, сортировать элементы в списке, так как он является изменяемым.

empty_list = []
Вход в полноэкранный режим Выход из полноэкранного режима

Кортежи
Это упорядоченная коллекция элементов, заключенная в круглые скобки () и она неизменяема, вы не можете изменять элементы, назначенные переменной.

selected_colors = ('cyan', 'gray', 'white')
Вход в полноэкранный режим Выход из полноэкранного режима

Понимание списка
Преобразует элементы списка и возвращает новый список.
Синтаксис для понимания списка выглядит следующим образом:

list_comprehension = [expression for item in iterable if condition == True]
Войти в полноэкранный режим Выйти из полноэкранного режима

Давайте реализуем это понимание списка и поймем, как оно работает:

распаковка и упаковка
Это можно сделать как для кортежей, так и для списков.
Когда вы создаете кортеж, вы присваиваете ему значения, это называется упаковкой кортежа.

rainbow_colors = ('Red', 'Orange', 'Yellow', 'Green', 'Blue', 
   'Indigo', 'Violet')
Вход в полноэкранный режим Выход из полноэкранного режима

Извлечение значений из кортежа обратно в переменные называется распаковкой, поэтому мы будем распаковывать наш кортеж.
Количество используемых переменных должно быть больше количества значений внутри кортежа. Например, наш кортеж имеет семь значений, поэтому его можно распаковать в семь переменных.

(first, second, third, forth, fifth, sixth, seventh) = 
   rainbow_colors
Вход в полноэкранный режим Выйти из полноэкранного режима

Однако это можно упростить, используя звездочку *, которая добавляется к имени переменной, и она берет все оставшиеся элементы и распаковывает их в список.

(first, second, *other_colors) = rainbow_colors
Вход в полноэкранный режим Выход из полноэкранного режима

Имя переменной other_colors будет содержать все оставшиеся цвета из исходного имени переменной rainbow_colors.

распаковка списков
Распаковка, которая была выполнена для кортежей, может быть выполнена и для списков.

rainbow_colors = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 
   'Indigo', 'Violet']

first, second, *other_colors = rainbow_colors
Вход в полноэкранный режим Выход из полноэкранного режима

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

Глядя на изображения выше, мы видим, что использование * на имени переменной возвращает список.
Это здорово, теперь вы понимаете, что такое распаковка в кортежах и списках.

Словарь
Это коллекция пар ключ-значение, в которой хранятся данные. Python использует фигурные скобки {} для определения словаря.

empty_dictionary = {}
Вход в полноэкранный режим Выход из полноэкранного режима
customer = {
   'first_name' : 'Fred',
   'last_name' : 'Kagia',
   'age' : 39,
   'location' : 'Nairobi',
   'active' : True
}
Войти в полноэкранный режим Выход из полноэкранного режима

Для перебора всех пар ключ-значение в словаре используется цикл for с двумя переменными key и value. Однако в цикле for могут быть и другие переменные, кроме key и value, которые мы решили использовать.

for key, value in customer.items():
   print (f"{key} : {value}")
Вход в полноэкранный режим Выйти из полноэкранного режима

Устанавливает
Это неупорядоченный список элементов, элементы уникальны. Мы используем фигурные скобки {}, чтобы заключить множество.
Для определения пустого множества мы используем следующий синтаксис:

empty_set = set()
Войти в полноэкранный режим Выйти из полноэкранного режима
capital_cities = {'Nairobi', 'Lusaka', 'Cairo', 'Lagos'}
Войти в полноэкранный режим Выйти из полноэкранного режима

замороженные наборы
Чтобы сделать набор неизменяемым, используйте frozenset(), это гарантирует, что элементы набора не могут быть изменены.

capital_cities = {'Nairobi', 'Lusaka', 'Cairo', 'Lagos'}
capital_cities_frozen = frozenset(capital_cities)
Вход в полноэкранный режим Выход из полноэкранного режима

Чтобы получить доступ к индексам элементов множества по мере их перебора, можно использовать встроенную функцию enumerate() :

capital_cities = {'Nairobi', 'Lusaka', 'Cairo', 'Lagos'}

for index, city in enumerate(capital_cities, 1):
   print(f"{index}. Capital city is {capital_city}")
Вход в полноэкранный режим Выход из полноэкранного режима

Теория множеств
Это относится к методам типа данных set, которые применяются к коллекции объектов.

  • set.intersection() — проверяет все элементы в обоих наборах
  • set.difference() — проверяет элементы в одном множестве, но не в другом.
  • set.symmetric_difference() — проверяет все элементы точно в одном множестве.
  • set.union() — проверяет все элементы в любом из множеств.

Работа с данными

1). JSON
2). время даты
3). Pandas
4). Numpy

JSON

Это синтаксис для хранения и обмена данными. В Python есть модуль json, который используется для работы с данными JSON.

Чтобы преобразовать JSON в Python, вы передадите строку JSON с помощью json.loads().

Чтобы преобразовать Python в JSON, вы будете конвертировать в JSON строку с помощью метода json.dumps().

Для анализа и отладки данных JSON нам может понадобиться вывести их в более читабельном формате. Это можно сделать, передав дополнительные параметры indent и sort_keys методу json.dumps() и json.dump().

datetime

Мы используем модуль datetime для работы с датами как с объектом dates.

import datetime

current_time = datetime.datetime.now()
print(current_datetime)
Вход в полноэкранный режим Выход из полноэкранного режима

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

Создание объекта даты
Вы можете использовать класс datetime() модуля datetime. Этот класс требует три параметра для создания года, месяца, дня.

import datetime

planned_date = datetime.datetime(22, 9, 3)
print(planned_date)
Вход в полноэкранный режим Выход из полноэкранного режима

NumPy

Это библиотека Python, которая работает с массивами, числовым python. Массивы numpy содержат элементы одного типа. Однородность позволяет массивам numpy быть быстрее и эффективнее списков Python.

создать объект NumPy

import numpy as np

natural_numbers = np.array([1, 2, 3, 4, 5])
print(natural_numbers)
print(type(natural_numbers))
Войти в полноэкранный режим Выйти из полноэкранного режима

NumPy обладает мощной техникой, называемой NumPy broadcasting, способностью векторизировать операции, так что они выполняются над всеми элементами сразу.

natural_numbers = np.array([1, 2, 3, 4, 5])
natural_numbers_squared = natural_numbers ** 2
print(natural_numbers_squared)
Вход в полноэкранный режим Выход из полноэкранного режима

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

Pandas

Это библиотека, используемая для работы с наборами данных. В ней есть функции для анализа, изучения, очистки и манипулирования данными. Основная структура данных — DataFrame. Табличные данные с маркированными строками и столбцами.

В pandas есть метод .apply() , этот метод берет функцию и применяет ее к DataFrame. Для этого необходимо указать ось, 0 для столбцов и 1 для строк. Этот метод можно использовать с анонимными функциями (вспомните лямбда-функции).

Мы рассмотрели основы языка Python, которые помогут нам понять и реализовать инженерию данных. Мы сможем работать с такими инструментами, как Pyspark, Airflow.

Для примера рассмотрим пример кода Directed Acyclic Graph (DAG).

# this is DAG definition file

from airflow.models import DAG
from airflow.operators.python_operator
import python_operator

dag = DAG(dag_id = "etl_pipeline"
   schedule_interval = "0 0 * * *")

etl_task = Python_Operator(task_id = "etl_task"
   python_callable = etl, dag = dag)

etc_task.set_upstream(wait_for_this_task)
Вход в полноэкранный режим Выход из полноэкранного режима
#defines an ETL function

def etl():
   film_dataframe = extract_film_to_pandas()
   film_dataframe = transform_rental_rate(film_dataframe)
   load_loadframe_to_film(film_dataframe)

#define ETL task using PythonOperator


etl_task = PythonOperator(task_id = 'etl_film',
   python_callable = etl, dag =dag)


#set the upstreamto wait_for_table and sample run etl()


etl_task.set_upstream(wait_for_table)
etl()
Войти в полноэкранный режим Выход из полноэкранного режима

В приведенном выше коде показан файл определения DAG (Directed Acyclic Graph) и ETL-задача, которая будет добавлена в DAG. DAG для расширения и задача для ожидания определены в dag, wait_for_able. Это просто пример кода, скоро мы напишем наши DAG и ETL и реализуем их.

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

Оцените статью
devanswers.ru
Добавить комментарий