Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fb2df83786 | |||
| 71b3042b43 | |||
| 54bd4595ea | |||
| ca8905a19c | |||
| 71b54cb383 | |||
| 4354371ac0 | |||
| f7f6de1eca | |||
| c2b07981bc |
@@ -0,0 +1,311 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "ad33a980",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 1. Две переменные — один список\n",
|
||||||
|
"Есть список колонок:\n",
|
||||||
|
"columns= [\"id\",\"event_time\",\"amount\"]\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" создать переменную columns_for_export и присвоить ей columns;\n",
|
||||||
|
" добавить в columns_for_export колонку \"load_dt\";\n",
|
||||||
|
" вывести:\n",
|
||||||
|
" columns\n",
|
||||||
|
" columns_for_export"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 1,
|
||||||
|
"id": "f5d2c49a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"['id', 'event_time', 'amount', 'load_dt']\n",
|
||||||
|
"['id', 'event_time', 'amount', 'load_dt']\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"columns = [\"id\",\"event_time\",\"amount\"]\n",
|
||||||
|
"columns_for_expert = columns\n",
|
||||||
|
"columns_for_expert.append(\"load_dt\")\n",
|
||||||
|
"print(columns)\n",
|
||||||
|
"print(columns_for_expert)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "e3cc1bdb",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"почему изменились обе переменные: обе переменные изменились потому что мы используем изменяемую переменную списка - list, данная переменная изменяемая и columns_for_expert ссылается на columns, сами переменные это не переменные, а указатели на них в памяти, поэтому если изменить одну, то и вторая поменяется\n",
|
||||||
|
"\n",
|
||||||
|
"какой тип здесь используется: используется список list\n",
|
||||||
|
"\n",
|
||||||
|
"он изменяемый или неизменяемый: изменяемый"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "1422c7e6",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 2. Строка и список — разное поведение\n",
|
||||||
|
"Есть переменные:\n",
|
||||||
|
" table_name=\"orders\"\n",
|
||||||
|
" metrics= [\"rows\",\"errors\",\"duration\"]\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" создать table_name_copy = table_name;\n",
|
||||||
|
" создать metrics_copy = metrics;\n",
|
||||||
|
" к table_name добавить строку \"_raw\";\n",
|
||||||
|
" в metrics_copy добавить элемент \"latency\";\n",
|
||||||
|
"вывести все 4 переменные:\n",
|
||||||
|
" table_name\n",
|
||||||
|
" table_name_copy\n",
|
||||||
|
" metrics\n",
|
||||||
|
" metrics_copy"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 2,
|
||||||
|
"id": "7acdbe0d",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"orders_raws\n",
|
||||||
|
"orders\n",
|
||||||
|
"['rows', 'errors', 'duration', 'latency']\n",
|
||||||
|
"['rows', 'errors', 'duration', 'latency']\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"table_name = \"orders\"\n",
|
||||||
|
"metrics = [\"rows\",\"errors\",\"duration\"]\n",
|
||||||
|
"table_name_copy = table_name\n",
|
||||||
|
"metrics_copy = metrics\n",
|
||||||
|
"table_name = (\"orders\" + \"_raws\")\n",
|
||||||
|
"metrics_copy.append(\"latency\")\n",
|
||||||
|
"print(table_name)\n",
|
||||||
|
"print(table_name_copy)\n",
|
||||||
|
"print(metrics)\n",
|
||||||
|
"print(metrics_copy)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "ade754e4",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"почему строка изменилась не так, как список: потому что строка в данном случае это переменная и это неизменяемый тип данных, каждая переменная хранится в одной ячейке памяти и получается, что у нас две переменные и каждая хранится по отдельности, в отличие от списка, который в данном случае хранится как указатель на ячейку в памяти и изменение одного списка порождает изменение и в другом, так как это одна и та же ячейка в памяти\n",
|
||||||
|
"\n",
|
||||||
|
"какой объект оказался неизменяемым: строка\n",
|
||||||
|
"\n",
|
||||||
|
"какой объект оказался изменяемым: список"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "07e7c0e3",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 3. Словарь конфигурации пайплайна\n",
|
||||||
|
"Есть конфиг:\n",
|
||||||
|
"pipeline_config= {\n",
|
||||||
|
"\"source\":\"postgres\",\n",
|
||||||
|
"\"target\":\"s3\",\n",
|
||||||
|
"\"batch_size\":1000\n",
|
||||||
|
"}\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" создать current_config = pipeline_config;\n",
|
||||||
|
" изменить в current_config значение batch_size на 5000;\n",
|
||||||
|
" добавить ключ \"mode\" со значением \"append\";\n",
|
||||||
|
" вывести:\n",
|
||||||
|
" pipeline_config\n",
|
||||||
|
" current_config"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"id": "9b4fb54b",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"{'source': 'postgres', 'target': 's3', 'batch_size': '5000', 'mode': 'append'}\n",
|
||||||
|
"{'source': 'postgres', 'target': 's3', 'batch_size': '5000', 'mode': 'append'}\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"pipeline_config = {\n",
|
||||||
|
" \"source\":\"postgres\",\n",
|
||||||
|
" \"target\":\"s3\",\n",
|
||||||
|
" \"batch_size\":1000\n",
|
||||||
|
"}\n",
|
||||||
|
"current_config = pipeline_config\n",
|
||||||
|
"current_config[\"batch_size\"] = \"5000\"\n",
|
||||||
|
"current_config[\"mode\"] = \"append\"\n",
|
||||||
|
"print(pipeline_config)\n",
|
||||||
|
"print(current_config)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "d41c940e",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"почему исходный словарь тоже изменился: потому что словарь это изменяемый тип данных и когда мы его записываем в переменную, то он лишь хранится в виде указателя на ячейку памяти, соответственно, когда мы присваиваем другой переменной этот же словарь, то он ссылкается на ту же ячейку в памяти и любое изменение того или иного словаря влечет изменение и другого словаря\n",
|
||||||
|
"\n",
|
||||||
|
"является ли словарь изменяемым типом: да, является\n",
|
||||||
|
"\n",
|
||||||
|
"чем это может быть опасно в ETL-задачах: тем что если мы например захотим как-то проанализировать данные и например добавим какую-то колонку, то соответственно эта колонка появится в обоих словарях, что может привести к ошибкам или искажениям данных, поэтому необходимо при такой работе создавать копию словаря, чтобы оставить исходный словарь без изменений"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "7af4f14d",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 4. Функция меняет исходные данные\n",
|
||||||
|
"Есть список статусов:\n",
|
||||||
|
"statuses= [\"new\",\"validated\",\"loaded\"]\n",
|
||||||
|
"\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" вывести список до изменений;\n",
|
||||||
|
" заменить первый элемент на \"processed\";\n",
|
||||||
|
" добавить в конец \"archived\";\n",
|
||||||
|
" вывести список после изменений.\n",
|
||||||
|
"Требования:\n",
|
||||||
|
" использовать обращение по индексу;\n",
|
||||||
|
" использовать append();\n",
|
||||||
|
" вывести список до и после изменений."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 4,
|
||||||
|
"id": "5344d3d5",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"['new', 'validated', 'loaded']\n",
|
||||||
|
"['processed', 'validated', 'loaded', 'archived']\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"statuses = [\"new\",\"validated\",\"loaded\"]\n",
|
||||||
|
"print(statuses)\n",
|
||||||
|
"statuses[0] = \"processed\"\n",
|
||||||
|
"statuses.append(\"archived\")\n",
|
||||||
|
"print(statuses)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "a276419e",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"почему список изменился: список это изменяемый тип данных и его можно менять. когда мы изменили значение и добавили новое , то список изменяется внутри ячейки памяти\n",
|
||||||
|
"\n",
|
||||||
|
"какой элемент был заменён: самый первый\n",
|
||||||
|
"\n",
|
||||||
|
"какой элемент был добавлен: самый последний - \"archived\""
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "5ea9f452",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 5. Подготовка списка колонок без порчи исходника\n",
|
||||||
|
"Есть список:\n",
|
||||||
|
" raw_columns= [\"id\",\"user_id\",\"price\"]\n",
|
||||||
|
"Нужно подготовить список для витрины:\n",
|
||||||
|
" в новый список добавить \"load_dt\";\n",
|
||||||
|
" в новый список добавить \"source_name\".\n",
|
||||||
|
"Но при этом исходный raw_columns менять нельзя.\n",
|
||||||
|
"Что нужно сделать:\n",
|
||||||
|
" создать новый список mart_columns;\n",
|
||||||
|
" добавить в него новые поля;\n",
|
||||||
|
" вывести:\n",
|
||||||
|
" raw_columns\n",
|
||||||
|
" mart_columns"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"id": "3e4dbd80",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"['id', 'user_id', 'price']\n",
|
||||||
|
"['id', 'user_id', 'price', 'load_dt', 'source_name']\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"raw_columns = [\"id\",\"user_id\",\"price\"]\n",
|
||||||
|
"mart_columns = raw_columns.copy()\n",
|
||||||
|
"mart_columns.append(\"load_dt\")\n",
|
||||||
|
"mart_columns.append(\"source_name\")\n",
|
||||||
|
"print(raw_columns)\n",
|
||||||
|
"print(mart_columns)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "bd0f9b9c",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"почему нельзя просто написать mart_columns = raw_columns: потому что в таком случае оба списка будут ссылаться на одну ячейку памяти и изменение одно из списков в таком случае влечет изменение второго\n",
|
||||||
|
"\n",
|
||||||
|
"что произойдёт, если потом изменить mart_columns: если мы напишем mart_columns = raw_columns, то оба списка изменятся, это нам не нужно\n",
|
||||||
|
"\n",
|
||||||
|
"почему в DE важно не портить исходные структуры: потому что это может вызвать ошибку или исказить анализ данных"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "9b88d6f7",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 1. Безопасное преобразование числа\n",
|
||||||
|
"Пользователь вводит число с клавиатуры.\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" попытаться преобразовать ввод в int;\n",
|
||||||
|
" если получилось — вывести:\n",
|
||||||
|
" само число;\n",
|
||||||
|
" его квадрат;\n",
|
||||||
|
" его удвоенное значение;\n",
|
||||||
|
" если не получилось — вывести сообщение об ошибке."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "66c30856",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"44\n",
|
||||||
|
"1936\n",
|
||||||
|
"88\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"a = input(\"vvedite 4islo s klaviaturi\")\n",
|
||||||
|
"try:\n",
|
||||||
|
" a = int(a)\n",
|
||||||
|
" print(a)\n",
|
||||||
|
" print(a ** 2)\n",
|
||||||
|
" print(a * 2)\n",
|
||||||
|
"except:\n",
|
||||||
|
" print(\"error\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "7be390bd",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 2. Деление чисел с разными ошибками\n",
|
||||||
|
"Напиши программу, которая:\n",
|
||||||
|
" просит пользователя ввести два числа;\n",
|
||||||
|
" первое число — делимое;\n",
|
||||||
|
" второе число — делитель;\n",
|
||||||
|
"пытается:\n",
|
||||||
|
" преобразовать оба значения в float;\n",
|
||||||
|
" выполнить деление;\n",
|
||||||
|
"обрабатывает ошибки:\n",
|
||||||
|
" если введено не число;\n",
|
||||||
|
" если попытались делить на ноль.\n",
|
||||||
|
"Если всё прошло успешно, вывести результат деления."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 18,
|
||||||
|
"id": "259db03e",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"2.0\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"a = input(\"vvedite pervoe 4islo - delimoe\")\n",
|
||||||
|
"b = input(\"vvedite vtoroe 4islo - delitel\")\n",
|
||||||
|
"try:\n",
|
||||||
|
" a = float(a)\n",
|
||||||
|
" b = float(b)\n",
|
||||||
|
" print(a / b)\n",
|
||||||
|
"except ValueError:\n",
|
||||||
|
" print(\"nevernii type of data\")\n",
|
||||||
|
"except ZeroDivisionError:\n",
|
||||||
|
" print(\"delenie na 0\")\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "654327c9",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 3. Обработка списка строк с числами\n",
|
||||||
|
"Дан список строк:\n",
|
||||||
|
"values= [\"10\",\"20\",\"abc\",\"40\",\"\",\"15\"]\n",
|
||||||
|
"\n",
|
||||||
|
"Нужно пройти по списку и для каждого элемента:\n",
|
||||||
|
" попытаться преобразовать его в число;\n",
|
||||||
|
" если получилось — вывести:\n",
|
||||||
|
" исходное значение;\n",
|
||||||
|
" число;\n",
|
||||||
|
" квадрат числа;\n",
|
||||||
|
" если не получилось — вывести сообщение, что элемент не удалось преобразовать.\n",
|
||||||
|
"В конце дополнительно вывести:\n",
|
||||||
|
" сколько элементов успешно обработано;\n",
|
||||||
|
" сколько элементов вызвали ошибку."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 63,
|
||||||
|
"id": "15ba90bc",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"common text - 10\n",
|
||||||
|
"number - 10\n",
|
||||||
|
"sqr number - 100\n",
|
||||||
|
"common text - 20\n",
|
||||||
|
"number - 20\n",
|
||||||
|
"sqr number - 400\n",
|
||||||
|
"ne ydalos preobrazovat abc\n",
|
||||||
|
"common text - 40\n",
|
||||||
|
"number - 40\n",
|
||||||
|
"sqr number - 1600\n",
|
||||||
|
"ne ydalos preobrazovat \n",
|
||||||
|
"common text - 15\n",
|
||||||
|
"number - 15\n",
|
||||||
|
"sqr number - 225\n",
|
||||||
|
"uspeshno obrabotano 4\n",
|
||||||
|
"oshibok sdelano 2\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"values = [\"10\",\"20\",\"abc\",\"40\",\"\",\"15\"]\n",
|
||||||
|
"success = 0\n",
|
||||||
|
"errors = 0\n",
|
||||||
|
"for i in values:\n",
|
||||||
|
" try:\n",
|
||||||
|
" a = int(i)\n",
|
||||||
|
" print(f\"common text - {i}\")\n",
|
||||||
|
" print(f\"number - {a}\")\n",
|
||||||
|
" print(f\"sqr number - {a**2}\")\n",
|
||||||
|
" success += 1\n",
|
||||||
|
" except ValueError:\n",
|
||||||
|
" print(f\"ne ydalos preobrazovat {i}\")\n",
|
||||||
|
" errors += 1\n",
|
||||||
|
"print(f\"uspeshno obrabotano {success}\")\n",
|
||||||
|
"print(f\"oshibok sdelano {errors}\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "51101218",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 4. Использование else и finally\n",
|
||||||
|
"Попроси пользователя ввести целое число.\n",
|
||||||
|
"Программа должна:\n",
|
||||||
|
" в блоке try попытаться преобразовать ввод в int;\n",
|
||||||
|
" в except обработать ошибку ввода;\n",
|
||||||
|
" в else вывести:\n",
|
||||||
|
" число;\n",
|
||||||
|
" его куб;\n",
|
||||||
|
" сообщение, что операция выполнена успешно;\n",
|
||||||
|
"в finally вывести:\n",
|
||||||
|
" \"Программа завершила попытку обработки\"."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 64,
|
||||||
|
"id": "f2a891bd",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"3\n",
|
||||||
|
"27\n",
|
||||||
|
"операция выполнена успешно\n",
|
||||||
|
"программа завершила попытку обработки\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"a = input(\"введите целое число\")\n",
|
||||||
|
"try:\n",
|
||||||
|
" a = int(a)\n",
|
||||||
|
"except ValueError:\n",
|
||||||
|
" print(\"ошибка ввода\")\n",
|
||||||
|
"else:\n",
|
||||||
|
" print(a)\n",
|
||||||
|
" print(a**3)\n",
|
||||||
|
" print(\"операция выполнена успешно\")\n",
|
||||||
|
"finally:\n",
|
||||||
|
" print(\"программа завершила попытку обработки\")"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,263 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "901c685d",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 1. Текущая дата и время + разбор на части\n",
|
||||||
|
"Напиши программу, которая:\n",
|
||||||
|
" получает текущую дату и время;\n",
|
||||||
|
" выводит:\n",
|
||||||
|
" полную дату и время;\n",
|
||||||
|
" отдельно год;\n",
|
||||||
|
" отдельно месяц;\n",
|
||||||
|
" отдельно день;\n",
|
||||||
|
" отдельно часы;\n",
|
||||||
|
" отдельно минуты;\n",
|
||||||
|
" дополнительно выводит дату в формате:\n",
|
||||||
|
" YYYY-MM-DD\n",
|
||||||
|
" DD.MM.YYYY"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 17,
|
||||||
|
"id": "a9776c66",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Полная текущая дата и время - 2026-10-09 11:53:36.376962\n",
|
||||||
|
"Год - 2026\n",
|
||||||
|
"Месяц - 10\n",
|
||||||
|
"День - 9\n",
|
||||||
|
"Часы - 11\n",
|
||||||
|
"Минуты - 53\n",
|
||||||
|
"Формат вывода YYYY-MM-DD - 2026-10-09\n",
|
||||||
|
"Формат вывода DD.MM.YYYY - 09.10.2026\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"from datetime import datetime\n",
|
||||||
|
"now = datetime.now()\n",
|
||||||
|
"print(f\"Полная текущая дата и время - {now}\")\n",
|
||||||
|
"print(f\"Год - {now.year}\")\n",
|
||||||
|
"print(f\"Месяц - {now.month}\")\n",
|
||||||
|
"print(f\"День - {now.day}\")\n",
|
||||||
|
"print(f\"Часы - {now.hour}\")\n",
|
||||||
|
"print(f\"Минуты - {now.minute}\")\n",
|
||||||
|
"print(f\"Формат вывода YYYY-MM-DD - {now.strftime(\"%Y-%m-%d\")}\")\n",
|
||||||
|
"print(f\"Формат вывода DD.MM.YYYY - {now.strftime(\"%d.%m.%Y\")}\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "69b619b5",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 2. Работа с конкретной датой\n",
|
||||||
|
"Создай вручную дату события:\n",
|
||||||
|
"2025-12-31 18:45:00\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" вывести эту дату;\n",
|
||||||
|
" вывести отдельно:\n",
|
||||||
|
" год;\n",
|
||||||
|
" месяц;\n",
|
||||||
|
" день;\n",
|
||||||
|
" часы;\n",
|
||||||
|
" минуты;\n",
|
||||||
|
" создать ещё одну дату:\n",
|
||||||
|
" 2026-01-05 09:00:00\n",
|
||||||
|
" посчитать разницу между этими двумя датами;\n",
|
||||||
|
" вывести:\n",
|
||||||
|
" полную разницу;\n",
|
||||||
|
" количество дней."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 45,
|
||||||
|
"id": "af9e0816",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Дата - 2025-12-31\n",
|
||||||
|
"Год - 2025\n",
|
||||||
|
"Месяц - 12\n",
|
||||||
|
"День - 31\n",
|
||||||
|
"Часы - 18\n",
|
||||||
|
"Минуты - 45\n",
|
||||||
|
"Полная разница между датами '-5 days, 9:45:00'\n",
|
||||||
|
"Разница в количестве дней -5\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"from datetime import datetime, timedelta\n",
|
||||||
|
"\n",
|
||||||
|
"date_event_str = \"2025-12-31 18:45:00\"\n",
|
||||||
|
"date_event = datetime.strptime(date_event_str, \"%Y-%m-%d %H:%M:%S\")\n",
|
||||||
|
"print(f\"Дата - {date_event.strftime(\"%Y-%m-%d\")}\") \n",
|
||||||
|
"print(f\"Год - {date_event.year}\")\n",
|
||||||
|
"print(f\"Месяц - {date_event.month}\")\n",
|
||||||
|
"print(f\"День - {date_event.day}\")\n",
|
||||||
|
"print(f\"Часы - {date_event.hour}\")\n",
|
||||||
|
"print(f\"Минуты - {date_event.minute}\")\n",
|
||||||
|
"\n",
|
||||||
|
"another_date_event_str = \"2026-01-05 09:00:00\"\n",
|
||||||
|
"another_date_event = datetime.strptime(another_date_event_str, \"%Y-%m-%d %H:%M:%S\")\n",
|
||||||
|
"differences = date_event - another_date_event\n",
|
||||||
|
"print(f\"Полная разница между датами '{differences}'\")\n",
|
||||||
|
"print(f\"Разница в количестве дней {differences.days}\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "470d379a",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 3. Прибавление и вычитание времени\n",
|
||||||
|
"Напиши программу, которая:\n",
|
||||||
|
" получает текущую дату;\n",
|
||||||
|
" считает:\n",
|
||||||
|
" дату через 7 дней;\n",
|
||||||
|
" дату через 30 дней;\n",
|
||||||
|
" дату 14 дней назад;\n",
|
||||||
|
" выводит все результаты;"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 48,
|
||||||
|
"id": "060745f2",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"2026-10-09 14:11:42.487216\n",
|
||||||
|
"2026-10-16 14:11:42.487216\n",
|
||||||
|
"2026-11-08 14:11:42.487216\n",
|
||||||
|
"2026-09-25 14:11:42.487216\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"from datetime import datetime, timedelta\n",
|
||||||
|
"now = datetime.now()\n",
|
||||||
|
"in_7_days = now + timedelta(days=7)\n",
|
||||||
|
"in_30_days = now + timedelta(days=30)\n",
|
||||||
|
"before_14_days = now - timedelta(days=14)\n",
|
||||||
|
"print(now)\n",
|
||||||
|
"print(in_7_days)\n",
|
||||||
|
"print(in_30_days)\n",
|
||||||
|
"print(before_14_days)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "9c82c9de",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 4. Преобразование строк в даты\n",
|
||||||
|
"Дан список строк с датами:\n",
|
||||||
|
"dates = [\"2026-03-30\",\"2026-03-25\",\"2026-02-15\",\"2026-01-01\"]\n",
|
||||||
|
"Нужно:\n",
|
||||||
|
" пройти по списку;\n",
|
||||||
|
" каждую строку превратить в дату;\n",
|
||||||
|
" для каждой даты вывести:\n",
|
||||||
|
" исходную строку;\n",
|
||||||
|
" полученную дату;\n",
|
||||||
|
" день;\n",
|
||||||
|
" месяц;\n",
|
||||||
|
" год;\n",
|
||||||
|
" посчитать, сколько дней прошло от этой даты до текущей даты."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 57,
|
||||||
|
"id": "25874736",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Исходная строка - 2026-03-30\n",
|
||||||
|
"Преобразовання строка в дату - 2026-03-30 00:00:00\n",
|
||||||
|
"День - 30\n",
|
||||||
|
"Месяц - 3\n",
|
||||||
|
"Год - 2026\n",
|
||||||
|
"На сегодняшний день прошло - 193 дня\n",
|
||||||
|
"\n",
|
||||||
|
"Исходная строка - 2026-03-25\n",
|
||||||
|
"Преобразовання строка в дату - 2026-03-25 00:00:00\n",
|
||||||
|
"День - 25\n",
|
||||||
|
"Месяц - 3\n",
|
||||||
|
"Год - 2026\n",
|
||||||
|
"На сегодняшний день прошло - 198 дня\n",
|
||||||
|
"\n",
|
||||||
|
"Исходная строка - 2026-02-15\n",
|
||||||
|
"Преобразовання строка в дату - 2026-02-15 00:00:00\n",
|
||||||
|
"День - 15\n",
|
||||||
|
"Месяц - 2\n",
|
||||||
|
"Год - 2026\n",
|
||||||
|
"На сегодняшний день прошло - 236 дня\n",
|
||||||
|
"\n",
|
||||||
|
"Исходная строка - 2026-01-01\n",
|
||||||
|
"Преобразовання строка в дату - 2026-01-01 00:00:00\n",
|
||||||
|
"День - 1\n",
|
||||||
|
"Месяц - 1\n",
|
||||||
|
"Год - 2026\n",
|
||||||
|
"На сегодняшний день прошло - 281 дня\n",
|
||||||
|
"\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"from datetime import datetime, timedelta\n",
|
||||||
|
"dates_str = [\"2026-03-30\",\"2026-03-25\",\"2026-02-15\",\"2026-01-01\"]\n",
|
||||||
|
"now = datetime.now()\n",
|
||||||
|
"for date in dates_str:\n",
|
||||||
|
" dates = datetime.strptime(date, \"%Y-%m-%d\")\n",
|
||||||
|
" print(f\"Исходная строка - {date}\")\n",
|
||||||
|
" print(f\"Преобразовання строка в дату - {dates}\")\n",
|
||||||
|
" print(f\"День - {dates.day}\")\n",
|
||||||
|
" print(f\"Месяц - {dates.month}\")\n",
|
||||||
|
" print(f\"Год - {dates.year}\")\n",
|
||||||
|
" differences = now - dates\n",
|
||||||
|
" print(f\"На сегодняшний день прошло - {differences.days} дня\\n\")"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "3759f336",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 1. Сообщение о запуске ETL\n",
|
||||||
|
"Нужно написать функцию show_etl_start, которая принимает имя джобы и выводит сообщение о ее запуске.\n",
|
||||||
|
"Что нужно сделать:\n",
|
||||||
|
" создать функцию show_etl_start(job_name);\n",
|
||||||
|
" внутри вывести строку:Запуск ETL: <имя ETL>;\n",
|
||||||
|
" вызвать функцию для:\n",
|
||||||
|
" \"orders_load\"\n",
|
||||||
|
" \"users_load\"\n",
|
||||||
|
"\n",
|
||||||
|
"Ожидаемый вывод:\n",
|
||||||
|
" Запуск ETL: orders_load\n",
|
||||||
|
" Запуск ETL: users_load"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 32,
|
||||||
|
"id": "ad2441e7",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Запуск ETL: orders_load\n",
|
||||||
|
"Запуск ETL: users_load\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def show_etl_start(job_name):\n",
|
||||||
|
" print(f\"Запуск ETL: {job_name}\")\n",
|
||||||
|
"\n",
|
||||||
|
"show_etl_start(\"orders_load\")\n",
|
||||||
|
"show_etl_start(\"users_load\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "7f37ba98",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 2. Нормализация имени таблицы\n",
|
||||||
|
"Нужно написать функцию normalize_table_name, которая принимает имя таблицы и возвращает его:\n",
|
||||||
|
" без пробелов по краям;\n",
|
||||||
|
" в нижнем регистре.\n",
|
||||||
|
"Что нужно сделать:\n",
|
||||||
|
" создать функцию normalize_table_name(table_name);\n",
|
||||||
|
" использовать strip() и lower();\n",
|
||||||
|
" сохранить результат в переменную;\n",
|
||||||
|
" вывести результат для значений:\n",
|
||||||
|
" \" Orders \"\n",
|
||||||
|
" \" USERS \"\n",
|
||||||
|
" \"Payments\"\n",
|
||||||
|
"Пример вызова функции:\n",
|
||||||
|
" result = normalize_table_name(\" Orders \")\n",
|
||||||
|
" print(result)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 40,
|
||||||
|
"id": "e5777c5a",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"orders\n",
|
||||||
|
"users\n",
|
||||||
|
"payments\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def normalize_table_name(table_name):\n",
|
||||||
|
" return table_name.strip().lower()\n",
|
||||||
|
"\n",
|
||||||
|
"result_orders = normalize_table_name(\" Orders \")\n",
|
||||||
|
"result_users = normalize_table_name(\" USERS \")\n",
|
||||||
|
"result_payments = normalize_table_name(\"Payments\")\n",
|
||||||
|
"\n",
|
||||||
|
"print(result_orders)\n",
|
||||||
|
"print(result_users)\n",
|
||||||
|
"print(result_payments)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "efa9fae5",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 3. Проверка корректной суммы\n",
|
||||||
|
"Нужно написать функцию is_valid_amount, которая принимает сумму и возвращает:\n",
|
||||||
|
" True, если сумма больше 0;\n",
|
||||||
|
" False, если сумма меньше или равна 0.\n",
|
||||||
|
"Что нужно сделать:\n",
|
||||||
|
" создать функцию is_valid_amount(amount);\n",
|
||||||
|
" проверить значения:\n",
|
||||||
|
" 100\n",
|
||||||
|
" 0\n",
|
||||||
|
" -25"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 43,
|
||||||
|
"id": "09665391",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"True\n",
|
||||||
|
"False\n",
|
||||||
|
"False\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def is_valid_amount(amount):\n",
|
||||||
|
" return amount > 0\n",
|
||||||
|
"\n",
|
||||||
|
"print(is_valid_amount(100))\n",
|
||||||
|
"print(is_valid_amount(0))\n",
|
||||||
|
"print(is_valid_amount(-25))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "d99423c2",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 4. Построение имени витрины\n",
|
||||||
|
"Нужно написать функцию build_mart_name, которая принимает:\n",
|
||||||
|
" название сущности;\n",
|
||||||
|
" слой.\n",
|
||||||
|
"И возвращает строку в формате:\n",
|
||||||
|
" <layer>_<entity>\n",
|
||||||
|
"Что нужно сделать:\n",
|
||||||
|
" создать функцию build_mart_name(entity_name, layer);\n",
|
||||||
|
" проверить на примерах:\n",
|
||||||
|
" (\"orders\", \"dm\")\n",
|
||||||
|
" (\"users\", \"core\")\n",
|
||||||
|
" (\"payments\", \"stg\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 55,
|
||||||
|
"id": "d3c6683e",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"dm_orders\n",
|
||||||
|
"core_users\n",
|
||||||
|
"stg_payments\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def build_mart_name(entity_name, layer):\n",
|
||||||
|
" return f\"{layer}_{entity_name}\"\n",
|
||||||
|
"\n",
|
||||||
|
"print(build_mart_name(\"orders\", \"dm\"))\n",
|
||||||
|
"print(build_mart_name(\"users\", \"core\"))\n",
|
||||||
|
"print(build_mart_name(\"payments\", \"stg\"))"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "669999d9",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 1. Лог запуска процесса\n",
|
||||||
|
"Напиши функцию log_job_start, которая принимает:\n",
|
||||||
|
" job_name\n",
|
||||||
|
" level=\"INFO\"\n",
|
||||||
|
" env=\"dev\"\n",
|
||||||
|
"Функция должна выводить строку:\n",
|
||||||
|
" [INFO] Job load_users started in dev"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 59,
|
||||||
|
"id": "2af8c0ea",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"[INFO] Job load_users started in dev\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def log_job_start(job_name, level = \"INFO\", env = \"dev\"):\n",
|
||||||
|
" print(f\"[{level}] Job {job_name} started in {env}\")\n",
|
||||||
|
"\n",
|
||||||
|
"log_job_start(\"load_users\")"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "60ce459d",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 2. Подключение к источнику\n",
|
||||||
|
"Напиши функцию connect_source, которая принимает:\n",
|
||||||
|
" source_name\n",
|
||||||
|
" host=\"localhost\"\n",
|
||||||
|
" port=5432\n",
|
||||||
|
" user=\"etl_user\"\n",
|
||||||
|
"Функция должна возвращать словарь с настройками подключения."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"id": "d73d7ab5",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"{'source_name': 'dwh', 'host': 'localhost', 'port': 5432, 'user': 'etl_user'} <class 'dict'>\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def connect_source(source_name, host = \"localhost\", port = 5432, user = \"etl_user\"):\n",
|
||||||
|
" connecting_configuration = {\n",
|
||||||
|
" \"source_name\" : source_name,\n",
|
||||||
|
" \"host\" : host,\n",
|
||||||
|
" \"port\" : port,\n",
|
||||||
|
" \"user\" : user\n",
|
||||||
|
" }\n",
|
||||||
|
" return connecting_configuration"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "e667db79",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 3. Построение SELECT-запроса\n",
|
||||||
|
"Напиши функцию build_select_query, которая принимает:\n",
|
||||||
|
" table_name\n",
|
||||||
|
" columns=None\n",
|
||||||
|
"Логика:\n",
|
||||||
|
" если columns=None, функция должна вернуть:\n",
|
||||||
|
" SELECT * FROM table_name\n",
|
||||||
|
" если список колонок передан, собрать их через запятую."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 51,
|
||||||
|
"id": "4b710ebe",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"'SELECT id, user_id, email FROM orders'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 51,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def build_select_query(table_name, columns = None):\n",
|
||||||
|
" if columns is None:\n",
|
||||||
|
" return f\"SELECT * FROM {table_name}\"\n",
|
||||||
|
" else:\n",
|
||||||
|
" columns_str = \", \".join(columns)\n",
|
||||||
|
" return f\"SELECT {columns_str} FROM {table_name}\"\n",
|
||||||
|
"\n",
|
||||||
|
"build_select_query(\"orders\")\n",
|
||||||
|
"build_select_query(\"orders\", [\"id\", \"user_id\", \"email\"])\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "ba059bd5",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"Задача 4. Проверка обязательных полей\n",
|
||||||
|
"Напиши функцию validate_row, которая принимает:\n",
|
||||||
|
" row — словарь;\n",
|
||||||
|
" required_fields=None\n",
|
||||||
|
"Логика:\n",
|
||||||
|
" если required_fields=None, использовать [\"id\"];\n",
|
||||||
|
" проверить, есть ли все нужные поля;\n",
|
||||||
|
" если какого-то поля нет, вернуть строку:\n",
|
||||||
|
" Missing field: email\n",
|
||||||
|
" если всё хорошо, вернуть:\n",
|
||||||
|
" Row is valid"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 94,
|
||||||
|
"id": "ceb7c30b",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"'Row is valid'"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 94,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def validate_row(row, required_fields = None):\n",
|
||||||
|
" if required_fields is None:\n",
|
||||||
|
" required_fields = [\"id\"]\n",
|
||||||
|
" for field in required_fields:\n",
|
||||||
|
" if field not in row:\n",
|
||||||
|
" return f\"Missing field: {field}\"\n",
|
||||||
|
" return \"Row is valid\"\n",
|
||||||
|
"\n",
|
||||||
|
"validate_row({\"id\": 1, \"email\":2}, [\"id\", \"email\"])"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.13.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 12,
|
"execution_count": 6,
|
||||||
"id": "7dc68e3b",
|
"id": "7dc68e3b",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -83,18 +83,18 @@
|
|||||||
"Dima\n",
|
"Dima\n",
|
||||||
"Medvedev\n",
|
"Medvedev\n",
|
||||||
"Dima Medvedev\n",
|
"Dima Medvedev\n",
|
||||||
"12\n"
|
"13\n"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"source": [
|
"source": [
|
||||||
"name = 'Dima'\n",
|
"name = 'Dima'\n",
|
||||||
"surname = 'Medvedev'\n",
|
"surname = 'Medvedev'\n",
|
||||||
"\n",
|
"full_name = f'{name} {surname}'\n",
|
||||||
"print(name)\n",
|
"print(name)\n",
|
||||||
"print(surname)\n",
|
"print(surname)\n",
|
||||||
"print(f'{name} {surname}')\n",
|
"print(f'{name} {surname}')\n",
|
||||||
"print(len(name)+len(surname))"
|
"print(len(f'{name} {surname}'))"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 14,
|
"execution_count": 7,
|
||||||
"id": "fe383ba3",
|
"id": "fe383ba3",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
@@ -177,8 +177,10 @@
|
|||||||
"source": [
|
"source": [
|
||||||
"a = 3\n",
|
"a = 3\n",
|
||||||
"b = 5\n",
|
"b = 5\n",
|
||||||
"print(a * (b + a))\n",
|
"vir_1 = a * (b + a)\n",
|
||||||
"print(a * b + a)"
|
"vir_2 = a * b + a\n",
|
||||||
|
"print(vir_1)\n",
|
||||||
|
"print(vir_2)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user