This media is not supported in your browser
VIEW IN TELEGRAM
#ml Краткая история нейросетей. Part III.
В "нулевых" появились мощные графические процессоры и стали доступны большие объёмы данных, что привело к разработке алгоритмов Deep Learning. Результаты исследований начали демонстрировать высокие результаты в обучении и составлении прогнозов на основе больших объёмов данных.
Одной из самых прорывных историй является создание модели GPT-3 (Generative Pretrained Transformer 3) — языковой модели, разработанной OpenAI (они и создали ChatGPT). Модель была представлена в 2020 году и хорошо нашумела. Её натренировали на огромном количестве текстовых данных и научили выполнять разные языковые задачи.
В конце ноября 2022-го года в свет выходит ChatGPT и спустя 2 месяца пробивает отметку в 100 миллионов пользователей, получив статус самого быстрорастущего онлайн-сервиса за всю историю.
В "нулевых" появились мощные графические процессоры и стали доступны большие объёмы данных, что привело к разработке алгоритмов Deep Learning. Результаты исследований начали демонстрировать высокие результаты в обучении и составлении прогнозов на основе больших объёмов данных.
Одной из самых прорывных историй является создание модели GPT-3 (Generative Pretrained Transformer 3) — языковой модели, разработанной OpenAI (они и создали ChatGPT). Модель была представлена в 2020 году и хорошо нашумела. Её натренировали на огромном количестве текстовых данных и научили выполнять разные языковые задачи.
В конце ноября 2022-го года в свет выходит ChatGPT и спустя 2 месяца пробивает отметку в 100 миллионов пользователей, получив статус самого быстрорастущего онлайн-сервиса за всю историю.
#ml Активационные функции
Сверточные нейронные сети СНС имеют архитектуру слоев, каждый слой с помощью суммы весов проецируемых фильтром сворачивает картинку.
То есть, вся нейросеть может быть представлена
линейной функцией
y = w * x
активационные функции это прослойки между линейными слоями, помогающие выстроить более сложное поведение для для обучения нейросети
1. Relu - срезает все отрицательные значения в ноль. Этот свойство позволяет нейронной сети отсеивать слои, которые дают отрицательные значения и не имеют смысла в контексте нашей модели.
2. Сигмоида
Хороша для бинарной (да/нет) классификации, потому что она принимает любое действительное число в качестве входного и преобразует его в число между 0 и 1. По этой причине она часто используется в выходных слоях (подробнее об этом смотрите в конце).
3. Softmax
принимает список произвольных чисел и преобразует их в список вероятностей пропорциональных этим числам. То есть:
Функция принимает вектор (список) входных данных — а не одно число. Это отличается от всех предыдущих, она работает сразу с несколькими нейронами (обычно со всем слоем).
4. Tanh
Выходные значения tanh находятся в диапазоне от -1 до 1, что делает её центрированной относительно нуля. Это выгодно, поскольку это может помочь процессу обучения, так как данные, проходящие через сеть, в среднем будут поддерживать среднее значение близкое к 0, что в свою очередь помогает оптимизации методом градиентного спуска.
5. Binary Step Function (ступенчатая)
Бинарная ступенчатая функция — один из самых простых типов функций активации, используемых в нейронных сетях. Это пороговая функция активации, которая активируется или нет в зависимости от того, находится ли входное значение x выше или ниже определенного порога, что аналогично переключателю вкл/выкл. Обычно она используется в перцептронах и задачах бинарной классификации, где ожидается, что выход будет либо 0, либо 1, например, при решении, является ли электронное письмо спамом или не спамом.
Сверточные нейронные сети СНС имеют архитектуру слоев, каждый слой с помощью суммы весов проецируемых фильтром сворачивает картинку.
То есть, вся нейросеть может быть представлена
линейной функцией
y = w * x
активационные функции это прослойки между линейными слоями, помогающие выстроить более сложное поведение для для обучения нейросети
1. Relu - срезает все отрицательные значения в ноль. Этот свойство позволяет нейронной сети отсеивать слои, которые дают отрицательные значения и не имеют смысла в контексте нашей модели.
if input > 0:
return input
else:
return 0
2. Сигмоида
f(x) = 1/(1+e^-x)
Хороша для бинарной (да/нет) классификации, потому что она принимает любое действительное число в качестве входного и преобразует его в число между 0 и 1. По этой причине она часто используется в выходных слоях (подробнее об этом смотрите в конце).
3. Softmax
softmax([1, 2, 3]) = [0.09003, 0.24473, 0.66524]
принимает список произвольных чисел и преобразует их в список вероятностей пропорциональных этим числам. То есть:
Функция принимает вектор (список) входных данных — а не одно число. Это отличается от всех предыдущих, она работает сразу с несколькими нейронами (обычно со всем слоем).
4. Tanh
tanh(x) = 2 * sigmoid(2x)-1
Выходные значения tanh находятся в диапазоне от -1 до 1, что делает её центрированной относительно нуля. Это выгодно, поскольку это может помочь процессу обучения, так как данные, проходящие через сеть, в среднем будут поддерживать среднее значение близкое к 0, что в свою очередь помогает оптимизации методом градиентного спуска.
5. Binary Step Function (ступенчатая)
Бинарная ступенчатая функция — один из самых простых типов функций активации, используемых в нейронных сетях. Это пороговая функция активации, которая активируется или нет в зависимости от того, находится ли входное значение x выше или ниже определенного порога, что аналогично переключателю вкл/выкл. Обычно она используется в перцептронах и задачах бинарной классификации, где ожидается, что выход будет либо 0, либо 1, например, при решении, является ли электронное письмо спамом или не спамом.
#ml Переобучение и недообучение (дисперсия и смещение)
Дисперсия(переобучение) – это способность модели реагировать на незначительные колебания в тренировочных данных. Если модель слишком чувствительна и пытается подстроиться под каждый шум или аномалию в данных, это приводит к высокой дисперсии. Такие модели хорошо работают на тренировочных данных, но плохо – на новых, неизвестных данных.
Смещение(недообучение) – это своего рода предубеждение модели, когда она не учитывает все особенности данных.
"С такой проблемой смещения сталкиваются достаточно часто. Один из проектов, над которым мы работали, касался анализа пользовательского поведения на сайте. Мы использовали данные, собранные в определенном регионе, но когда компания масштабировалась на всю страну, модель была неэффективна. Причина? Смещение – модель была обучена на слишком узком наборе данных."
Методы уменьшения смещения и дисперсии
Регуляризация - это техника, используемая для предотвращения переобучения модели на обучающих данных, которое обычно происходит за счет увеличения дисперсии. Смысл регуляризации заключается в введении дополнительных ограничений или штрафов на величину и/или сложность модели.
Основная цель регуляризации - обеспечить более гладкую и устойчивую модель, которая лучше обобщает закономерности и уменьшает риск переобучения, сохраняя при этом адекватный уровень смещения. Существует два типа регуляризации:
- L1 (Lasso) регуляризация
L1 регуляризация добавляет к функции потерь модели штраф, равный сумме абсолютных значений коэффициентов (весов) модели. Этот подход направлен на минимизацию не только ошибки прогнозирования, но и сложности самой модели.
- L2 (Ridge) регуляризация
В L2 регуляризации к функции потерь добавляется штраф, пропорциональный квадрату величины весов модели. Это заставляет модель не только минимизировать ошибку на обучающих данных, но и сохранять веса как можно меньшими.
В отличие от L1 регуляризации, L2 не склонна обнулять веса. Вместо этого она уменьшает веса постепенно, делая модель более "гладкой" и менее подверженной влиянию шума в данных.
L2 регуляризация полезна в ситуациях, когда количество признаков в данных велико или когда они сильно коррелированы. Она помогает справляться с мультиколлинеарностью, сохраняя все признаки, но уменьшая их влияние.
- Бэггинг
Бэггинг, или Bootstrap Aggregating, является ансамблевым методом, предназначенным для улучшения стабильности и точности моделей, снижения вариативности и избежания переобучения. Он основан на принципе объединения нескольких простых моделей для создания одной устойчивой и надежной модели.
- Бустинг
это ансамблевая стратегия, предназначенная для создания сильного классификатора из последовательности слабых классификаторов.Метод фокусируется на постепенном улучшении прогнозов путем исправления ошибок предыдущих моделей в ансамбле.
Существует несколько реализаций бустинга, в ихчисле: XGBoost, LightGBM, CatBoost.
В отличие от бэггинга, где модели обучаются независимо, бустинг обучает каждую новую модель, чтобы исправить ошибки, сделанные предыдущими. Это достигается путем увеличения весов для неправильно классифицированных примеров.
- Кросс-валидация
Кросс-валидация включает в себя разделение датасета на несколько подмножеств и последовательное обучение модели на этих подмножествах, что позволяет более точно оценить её способность к обобщению на новых данных.
Дисперсия(переобучение) – это способность модели реагировать на незначительные колебания в тренировочных данных. Если модель слишком чувствительна и пытается подстроиться под каждый шум или аномалию в данных, это приводит к высокой дисперсии. Такие модели хорошо работают на тренировочных данных, но плохо – на новых, неизвестных данных.
Смещение(недообучение) – это своего рода предубеждение модели, когда она не учитывает все особенности данных.
"С такой проблемой смещения сталкиваются достаточно часто. Один из проектов, над которым мы работали, касался анализа пользовательского поведения на сайте. Мы использовали данные, собранные в определенном регионе, но когда компания масштабировалась на всю страну, модель была неэффективна. Причина? Смещение – модель была обучена на слишком узком наборе данных."
Методы уменьшения смещения и дисперсии
Регуляризация - это техника, используемая для предотвращения переобучения модели на обучающих данных, которое обычно происходит за счет увеличения дисперсии. Смысл регуляризации заключается в введении дополнительных ограничений или штрафов на величину и/или сложность модели.
Основная цель регуляризации - обеспечить более гладкую и устойчивую модель, которая лучше обобщает закономерности и уменьшает риск переобучения, сохраняя при этом адекватный уровень смещения. Существует два типа регуляризации:
- L1 (Lasso) регуляризация
L1 регуляризация добавляет к функции потерь модели штраф, равный сумме абсолютных значений коэффициентов (весов) модели. Этот подход направлен на минимизацию не только ошибки прогнозирования, но и сложности самой модели.
- L2 (Ridge) регуляризация
В L2 регуляризации к функции потерь добавляется штраф, пропорциональный квадрату величины весов модели. Это заставляет модель не только минимизировать ошибку на обучающих данных, но и сохранять веса как можно меньшими.
В отличие от L1 регуляризации, L2 не склонна обнулять веса. Вместо этого она уменьшает веса постепенно, делая модель более "гладкой" и менее подверженной влиянию шума в данных.
L2 регуляризация полезна в ситуациях, когда количество признаков в данных велико или когда они сильно коррелированы. Она помогает справляться с мультиколлинеарностью, сохраняя все признаки, но уменьшая их влияние.
- Бэггинг
Бэггинг, или Bootstrap Aggregating, является ансамблевым методом, предназначенным для улучшения стабильности и точности моделей, снижения вариативности и избежания переобучения. Он основан на принципе объединения нескольких простых моделей для создания одной устойчивой и надежной модели.
- Бустинг
это ансамблевая стратегия, предназначенная для создания сильного классификатора из последовательности слабых классификаторов.Метод фокусируется на постепенном улучшении прогнозов путем исправления ошибок предыдущих моделей в ансамбле.
Существует несколько реализаций бустинга, в ихчисле: XGBoost, LightGBM, CatBoost.
В отличие от бэггинга, где модели обучаются независимо, бустинг обучает каждую новую модель, чтобы исправить ошибки, сделанные предыдущими. Это достигается путем увеличения весов для неправильно классифицированных примеров.
- Кросс-валидация
Кросс-валидация включает в себя разделение датасета на несколько подмножеств и последовательное обучение модели на этих подмножествах, что позволяет более точно оценить её способность к обобщению на новых данных.
#ml #cv Hello paddleOCR
[[[91.0, 104.0], [163.0, 106.0], [162.0, 125.0], [90.0, 123.0]], ('отец', 0.9746374487876892)],
[[[391.0, 238.0], [502.0, 238.0], [502.0, 255.0], [391.0, 255.0]], ('король', 0.9802486300468445)],
[[[732.0, 373.0], [792.0, 375.0], [791.0, 398.0], [731.0, 396.0]], ('шут', 0.965769350528717)]]]#cv #ml
Как извлечь информацию на основе данных изображения
Эта задача обширно востребована. Распознавание форм, извлечение информации о билетах, извлечение информации об удостоверениях личности и т. д.
На ранних этапах было много методов основанных на сопоставлении шаблонов, однако чтобы менять шаблон нужно много усилий.
Извлечение ключевой информации (KIE) содержит 2 подзадачи:
- SER: распознавание семантического объекта, которое классифицирует каждый обнаруженный текст, например имя и удостоверение личности.
- RE: Извлечение отношений, классифицируйте каждый обнаруженный текст, например разделяя его на вопросы (ключ) и ответы (значение).
Как извлечь информацию на основе данных изображения
Эта задача обширно востребована. Распознавание форм, извлечение информации о билетах, извлечение информации об удостоверениях личности и т. д.
На ранних этапах было много методов основанных на сопоставлении шаблонов, однако чтобы менять шаблон нужно много усилий.
Извлечение ключевой информации (KIE) содержит 2 подзадачи:
- SER: распознавание семантического объекта, которое классифицирует каждый обнаруженный текст, например имя и удостоверение личности.
- RE: Извлечение отношений, классифицируйте каждый обнаруженный текст, например разделяя его на вопросы (ключ) и ответы (значение).
#cv #ml
Основные методы, основанные на глубоком обучении:
- Методы на основе сетки. Chargrid.
- Методы на основе токенов. BERT в нлп. LayoutLM, LayoutLMv2, LayoutXLM, StrucText. Сначала тренируется на больших наборах данных, чтобы дальше для улучшения требовался небольшой объем аннотированных данных.
- Методы на основе GCN: этот тип метода пытается изучить структурную информацию между изображениями и текстом, чтобы решить проблему извлечения информации из открытого набора (шаблоны, которые не были замечены в обучающем наборе), например GCN, SDMGR и другие алгоритмы.
- Сквозной метод: этот тип метода объединяет две существующие задачи: распознавание текста OCR и извлечение информации KIE в единую сеть для совместного обучения и усиливает друг друга в процессе обучения. Такие как Trie и другие алгоритмы.
Основные методы, основанные на глубоком обучении:
- Методы на основе сетки. Chargrid.
- Методы на основе токенов. BERT в нлп. LayoutLM, LayoutLMv2, LayoutXLM, StrucText. Сначала тренируется на больших наборах данных, чтобы дальше для улучшения требовался небольшой объем аннотированных данных.
- Методы на основе GCN: этот тип метода пытается изучить структурную информацию между изображениями и текстом, чтобы решить проблему извлечения информации из открытого набора (шаблоны, которые не были замечены в обучающем наборе), например GCN, SDMGR и другие алгоритмы.
- Сквозной метод: этот тип метода объединяет две существующие задачи: распознавание текста OCR и извлечение информации KIE в единую сеть для совместного обучения и усиливает друг друга в процессе обучения. Такие как Trie и другие алгоритмы.
#django быстрый старт проекта
директория проекта
виртуальное окружение
Создаем приложение
директория проекта
виртуальное окружение
создаем новый репозиторий
Создаем приложение
Далее можно запустить проверить
В консоли будет адрес на локалхост если все сделано правильно увидим стартовую страницу
директория проекта
виртуальное окружение
pip install django
Создаем приложение
django-admin startproject mysite - создаем новое приложение директория проекта
виртуальное окружение
pip install django
создаем новый репозиторий
git init
Создаем приложение
django-admin startproject mysite - создаем новое приложениеДалее можно запустить проверить
python manage.py runserver
В консоли будет адрес на локалхост если все сделано правильно увидим стартовую страницу
cv_konovalov_en.pdf
163.7 KB
#resume Обновил резюме на hh ru и составил новое по образцу старшего специалиста
#教え
Видео 9/22
Существует 4 вида функций
Статическая функция
Статический метод - @staticmethod, обращаемся без
Метод класса (cls) - @classmethod, через cls позволяет обратиться к классу
Метод экземпляра (self)
Множественное наследование
посмотреть линеаризацию объекта можно через Object.mro
поиск атрибута в предках происходит по MRO(method resolution order) алгоритму C3
- линеаризацией класса называется список из самого класса и всех его предков (родителей и прородителей) в котором по порядку слева направо будет производиться поиск метода.
- порядок разрешения методов (MRO) — это способ, с помощью которого составляется линеаризация класса.
- монотонность — это свойство, которое требует соблюдения в линеаризации класса-потомка того же порядка следования классов-прородителей, что и в линеаризации класса-родителя.
- порядок локального старшинства (local precedence ordering)— это свойство, которое требует соблюдения в линеаризации класса-потомка того же порядка следования классов-родителей, что и в его объявлении.
L[C] = [C] + merge(L[C1], L[C2], …, L[CN], [C1, C2, …, CN])
https://habr.com/ru/articles/62203/
Unifying types and classes in Python 2.2 — о разделении объектной модели и модели мета-данных. Здесь же обсуждаются MRO, проблемы множественного наследования и super().
The Python 2.3 Method Resolution Order — алгоритм C3 с примерами. В конце есть реализация функций mro и merge на чистом Питоне для тех, кто лучше воспринимает код чем текст.
A Monotonic Superclass Linearization for Dylan — сравнение некоторых видов линеаризации.
Exceptions
нужны для того чтобы программа не падала
Абстрактный класс - класс шаблон, его экземпляр создать нельзя. Элемент архитектуры, а не физичского приложения. Имеет смысл "это должно быть в потомке и характеристики могут использоваться в разных объектах", но существовать самостоятельно не может
Миксины - классы с доп функционалом, который можно быстно накинуть в создаваемый класс.
Они подобны аддонам в играх или плагинам расширяющим повторяющийся функционал.
Модули
В python все что имеет расширение .py является модулем, видимо этот канал тоже модуль
Существует 2 вида импортов
imort ___
from ___ import ___ as _ (в разы меньше нагружает интерп)
Работа с файлами
JSON
json.dumps - в json
json.loads - из json
load и dump - без сериализации
Видео 9/22
Существует 4 вида функций
Статическая функция
Статический метод - @staticmethod, обращаемся без
Метод класса (cls) - @classmethod, через cls позволяет обратиться к классу
Метод экземпляра (self)
Множественное наследование
посмотреть линеаризацию объекта можно через Object.mro
поиск атрибута в предках происходит по MRO(method resolution order) алгоритму C3
- линеаризацией класса называется список из самого класса и всех его предков (родителей и прородителей) в котором по порядку слева направо будет производиться поиск метода.
- порядок разрешения методов (MRO) — это способ, с помощью которого составляется линеаризация класса.
- монотонность — это свойство, которое требует соблюдения в линеаризации класса-потомка того же порядка следования классов-прородителей, что и в линеаризации класса-родителя.
- порядок локального старшинства (local precedence ordering)— это свойство, которое требует соблюдения в линеаризации класса-потомка того же порядка следования классов-родителей, что и в его объявлении.
L[C] = [C] + merge(L[C1], L[C2], …, L[CN], [C1, C2, …, CN])
https://habr.com/ru/articles/62203/
Unifying types and classes in Python 2.2 — о разделении объектной модели и модели мета-данных. Здесь же обсуждаются MRO, проблемы множественного наследования и super().
The Python 2.3 Method Resolution Order — алгоритм C3 с примерами. В конце есть реализация функций mro и merge на чистом Питоне для тех, кто лучше воспринимает код чем текст.
A Monotonic Superclass Linearization for Dylan — сравнение некоторых видов линеаризации.
Exceptions
нужны для того чтобы программа не падала
Абстрактный класс - класс шаблон, его экземпляр создать нельзя. Элемент архитектуры, а не физичского приложения. Имеет смысл "это должно быть в потомке и характеристики могут использоваться в разных объектах", но существовать самостоятельно не может
Миксины - классы с доп функционалом, который можно быстно накинуть в создаваемый класс.
Они подобны аддонам в играх или плагинам расширяющим повторяющийся функционал.
Модули
В python все что имеет расширение .py является модулем, видимо этот канал тоже модуль
Существует 2 вида импортов
imort ___
from ___ import ___ as _ (в разы меньше нагружает интерп)
Работа с файлами
file = open('text.txt')
file.readline() # читает строку
file.readlines() # создает список из всех строк что есть в файле
file.close() # при работе с open, close обязателен!
# with работает с объектами которые нужно закрыть после работы, удобен с базами данных
with open('text.txt', 'w') as file: # мы можем создавать свои контекстные менеджеры
# "r(чтение),w(запись), x(создать на запись иначе исключение), a(запись в конец), b(двоичный),
# t(текстовый режим + по умолчанию),+(чтение и запись)" - режимы работы
for line in my_file.readlines()
# после with close не нужен JSON
json.dumps - в json
json.loads - из json
load и dump - без сериализации
#hw lesson 9
from functools import reduce
# 1. Дан список строк. Отформатировать все строки в формате ‘{i} - {string}’,
# где i это порядковый номер строки в списке. Использовать генератор списков.
str_list = ['asfgasdags', 'bbbbbbb', 'cccccc', 'ddddddd']
mod_str_list = [f'{i} - {string}' for i, string in enumerate(str_list)]
# 2. Создать lambda функцию, которая принимает на вход неопределенное количество именных аргументов
# и выводит словарь с ключами удвоенной длины. {‘abc’: 5} -> {‘abcabc’: 5}
double_key = lambda *args, **kwargs: {key * 2: value for key, value in kwargs.items()}
# 3. Создать декоратор для функции, которая принимает список чисел.
# Декоратор должен производить предварительную проверку данных - удалять все четные элементы из списка.
def even_face_control(func):
def wrapper(*args, **kwargs):
numbers = args[0]
faced_numbers = [num for num in numbers if not num & 1 == 0] # (҂◡̀_◡́)ᕤ
new_args = [faced_numbers, *args[1::]]
return func(*new_args, **kwargs)
return wrapper
@even_face_control
def num_multiplier(numbers: list[int]) -> int:
result = reduce(lambda acc, el: acc * el, numbers, 1)
return result
# 4. Создать универсальный декоратор,
# который меняет порядок аргументов в функции на противоположный.
def arg_reverse(func):
def wrapper(*args, **kwargs):
if args:
args = args[::-1]
if kwargs:
kwargs = kwargs[::-1]
return func(*args, **kwargs)
return wrapper
@arg_reverse
def foo(numbers: list[int], string: str) -> bool:
print(numbers, string)
return True
#教え
Видео 10/22 Базы данных
- популярные субд
SQLite - мощная встаиваемая рсубд
MySQL - самая популярная и часто используемая рсубд
PostgreSQL - самая провинутая и гибкая рсубд
- у баз данных есть свои типы данных
char(при задавании количества символов, если передано больше остальное добивается пробелами), varchar(недостающие символы не добиваются), int. decimal, datetime etc...
- первичные ключи (primary key или pkey) - когда мы называем столбец первичным ключом это говорит о том что сущности стоящие за ним повторяться не будут
- виды sql команд
1) определение данных DDL Data definition language (создать CREATE. изменить ALTER. удалить DROP)
2) управление данных ВСД Data Control language (GRANT - предоставить доступ, REVOKE - отозвать доступ, SET ROLE - разрешает или запрещает роли для текущего сеанса)
3) управление транзакциями TCL Transaction Control language (BEGIN/COMMIT и ROLLBACK - откат ) Транзация неделимая сущность(с точки зрения изменения на базу данных) состоящая из нескольких минитранзакций, в банке перевод лаве с одного счета на другой это не перекладывание золота с одного места на другое, по сути сначала берется ваш счет и вычитается определенная сумма, и далее прибавляется к счету другого человека. Транзакция засчитывается только если все минитранзакции прошли успешно.
4) Манипулирование данными DML Data manipulation language ( INSERT, DELETE, UPDATE, SELECT)
типы связей в бд
- один ко многим
- один к одному
- многие ко многим
JOIN
left/right inner join - совпадение левой таблицы с правой
left/right outer join - все из левой и совпадения из правой, где не нашел null
full outer join - все из первой,все из второй, где не нашел стыка данных null
cross join - создает все возможные соединения 2х таблиц, декартово произведение, напимер берем сочетание 2х таблиц размеров футболок и цветов и получаем возможный набор ассортимента
Видео 10/22 Базы данных
- популярные субд
SQLite - мощная встаиваемая рсубд
MySQL - самая популярная и часто используемая рсубд
PostgreSQL - самая провинутая и гибкая рсубд
- у баз данных есть свои типы данных
char(при задавании количества символов, если передано больше остальное добивается пробелами), varchar(недостающие символы не добиваются), int. decimal, datetime etc...
- первичные ключи (primary key или pkey) - когда мы называем столбец первичным ключом это говорит о том что сущности стоящие за ним повторяться не будут
- виды sql команд
1) определение данных DDL Data definition language (создать CREATE. изменить ALTER. удалить DROP)
2) управление данных ВСД Data Control language (GRANT - предоставить доступ, REVOKE - отозвать доступ, SET ROLE - разрешает или запрещает роли для текущего сеанса)
3) управление транзакциями TCL Transaction Control language (BEGIN/COMMIT и ROLLBACK - откат ) Транзация неделимая сущность(с точки зрения изменения на базу данных) состоящая из нескольких минитранзакций, в банке перевод лаве с одного счета на другой это не перекладывание золота с одного места на другое, по сути сначала берется ваш счет и вычитается определенная сумма, и далее прибавляется к счету другого человека. Транзакция засчитывается только если все минитранзакции прошли успешно.
4) Манипулирование данными DML Data manipulation language ( INSERT, DELETE, UPDATE, SELECT)
-- CREATE TABLE person (
-- id SERIAL primary key ,
-- firstname varchar,
-- lastname varchar
-- );
-- DROP TABLE person;
-- ALTER TABLE person
-- ADD COLUMN email varchar(255)
-- INSERT INTO person (id,firstname, lastname)
-- VALUES (1, 'Alex', 'Varkalov');
SELECT firstname FROM person WHERE lastname like '%ov';
типы связей в бд
- один ко многим
- один к одному
- многие ко многим
JOIN
left/right inner join - совпадение левой таблицы с правой
left/right outer join - все из левой и совпадения из правой, где не нашел null
full outer join - все из первой,все из второй, где не нашел стыка данных null
cross join - создает все возможные соединения 2х таблиц, декартово произведение, напимер берем сочетание 2х таблиц размеров футболок и цветов и получаем возможный набор ассортимента
#hw lesson 10
from random import randint
import csv
from pprint import pprint
from datetime import date, timedelta
today = date.today()
# 1. Создать csv файл с данными следующей структуры: Имя, Фамилия, Возраст.
# Создать отчетный файл с информацией по количеству людей входящих в ту или иную
# возрастную группу. Возрастные группы: 1-12, 13-18, 19-25, 26-40, 40+.
firstnames = ['ivan', 'slava', 'ulia', 'jenya', 'denis', 'igor',
'muslim', 'radik', 'natasha', 'vlad', 'jacks', 'ulia', 'petya', 'andrew', 'alice']
secondnames = ['petrov', 'usatov', 'polisatov', 'hvastunov', 'nosatov', 'dzevadze', 'shushkupa', 'ugvey']
people = [[firstnames[randint(0, len(firstnames) - 1)],
secondnames[randint(0, len(secondnames) - 1)],
str(randint(0, 50))] for _ in range(30)]
# без либы
# with open('people.csv','a') as f:
# for p in people:
# f.writelines(','.join(p) + '\n')
# c либой
# with open('people.csv', 'a', newline='') as csvfile:
# humanwriter = csv.writer(csvfile)
# for p in people:
# humanwriter.writerow(p)
#
# with open('people.csv', 'r', newline='') as csvfile:
# people_ages_groups = {
# (1, 12): 0,
# (13, 18): 0,
# (19, 25): 0,
# (26, 40): 0,
# (40, 100): 0
# }
# humanreader = csv.reader(csvfile)
# # люди с 15 годами возраста находятся на индексе 14 .example
# people_ages_list = [0 for age in range(1, 51)]
#
# for row in humanreader:
# people_age = int(row[2])
# people_ages_list[people_age - 1] += 1
#
# # people.append(row)
#
# for age_group_interval, count in people_ages_groups.items():
# for age in range(age_group_interval[0], age_group_interval[1] + 1):
# age_index = age - 1
# if age_index > len(people_ages_list) - 1:
# break
# people_ages_groups[age_group_interval] += people_ages_list[age_index]
#
# 2. Создать csv файл с данными о ежедневной погоде.
# Структура: Дата, Место, Градусы, Скорость ветра.
# Найти среднюю погоду(скорость ветра и градусы) для Минска за последние 7 дней.
people = [[firstnames[randint(0, len(firstnames) - 1)],
secondnames[randint(0, len(secondnames) - 1)],
str(randint(0, 50))] for _ in range(30)]
cities = 'Moscow', 'London', 'Washington', 'Minsk'
degrees_interval = (15, 26)
wind_speed_interval = (1, 10)
dates = ('20.05.2025', '03.06.2025')
weather_value = []
for day_num in range(10):
day_date = date.today() - timedelta(days=day_num)
weather_value.append([
[
day_date.isoformat(),
city_name,
randint(degrees_interval[0], degrees_interval[1]),
randint(wind_speed_interval[0], wind_speed_interval[1])
]
for city_name in cities
])
# создание файла погоды
# with open('weather.csv', 'a', newline='') as csvfile:
# weather_observer = csv.writer(csvfile)
# for day_info in weather_value:
# weather_observer.writerow(day_info)
with open('weather.csv', 'r', newline='') as csvfile:
weather_reader = csv.reader(csvfile)
minsk_wind = []
minks_degrees = []
day_counter = 7
while day_counter > 1:
day_weather_info = next(weather_reader)
minks_degrees.append(int(day_weather_info[3][2]))
minsk_wind.append(int(day_weather_info[3][3]))
day_counter -= 1
middle_degrees = sum(minks_degrees) // len(minks_degrees)
middle_wind = sum(minsk_wind) // len(minsk_wind)
print(f'Minsk last 7 days middle weather is {middle_degrees} as degrees and {middle_wind} as wind')
# 3. Дан файл, содержащий различные даты. Каждая дата - это число, месяц и год.
# Найти самую раннюю дату.
with open('dates.csv','r',newline='') as csvfile:
dates_reader = csv.reader(csvfile)
earliest_date = False
for row_date in dates_reader:
if earliest_date is False:
earliest_date = row_date
continue
if row_date < earliest_date:
earliest_date = row_date
print(earliest_date)
#教え
Видео 11/22 WEB
Клиент серверная архитектура
клиент - узел запрашивающий данные
сервер - узел хранящий данные
компьютеры общаются в сети с помощью протоколов http\ip
http запросы
get - получить инфу (можно отправить данные, но это небезопасно)
сочный value, в теории можно создать honey pot с открытой сетью вай фая и смотреть какой трафик через него гонят
post - запрос на отправку данных (регистрация - отправляем логин пароль)
put, patch - запрос на изменение(put - отправляем целый объект, path не требует отправки целого объекта)
delete - запрос на удаление
OSI - модель работы интернета. Сейчас интрнет работает на модели TCP\IP
1) Верхний уровень прикладной http(мы доставим определенному пользователю)
2) далее TCP определяет маршрут до адресата, разбивает по пакетам данные. Валидирует целостность данных. (мы доставим это в нужное приложение
UDP отправляет пакеты без подтверждения, работает быстрее, но данные могут прийти не все
далее
3) IP - internet protokol (мы доставим в нужный компьютер)
на этом уровне распределяются адреса для отправителей и получателей
4) Ethernet и тд Сетевой протокол (мы доставим это кабелем или вайфаем)
Интернет держат IEEE (некоммерческие)
они дают адреса местным региональным ребятам,
а они дают местным компаниям поменьше
Видео 11/22 WEB
Клиент серверная архитектура
клиент - узел запрашивающий данные
сервер - узел хранящий данные
компьютеры общаются в сети с помощью протоколов http\ip
http запросы
get - получить инфу (можно отправить данные, но это небезопасно)
сочный value, в теории можно создать honey pot с открытой сетью вай фая и смотреть какой трафик через него гонят
post - запрос на отправку данных (регистрация - отправляем логин пароль)
put, patch - запрос на изменение(put - отправляем целый объект, path не требует отправки целого объекта)
delete - запрос на удаление
OSI - модель работы интернета. Сейчас интрнет работает на модели TCP\IP
1) Верхний уровень прикладной http(мы доставим определенному пользователю)
2) далее TCP определяет маршрут до адресата, разбивает по пакетам данные. Валидирует целостность данных. (мы доставим это в нужное приложение
UDP отправляет пакеты без подтверждения, работает быстрее, но данные могут прийти не все
далее
3) IP - internet protokol (мы доставим в нужный компьютер)
на этом уровне распределяются адреса для отправителей и получателей
4) Ethernet и тд Сетевой протокол (мы доставим это кабелем или вайфаем)
Интернет держат IEEE (некоммерческие)
они дают адреса местным региональным ребятам,
а они дают местным компаниям поменьше
#教え #django
Видео 11/22 Django blog
settings.py
allowed hosts откуда можем принимать запросы ['*'] можно поставить для начала
installed apps - регистрация написанного приложения в движке джанго
middleware - запросы приходящие в приложение проходят через эти прослойки
database - как будто понятно зачем
auth passwords - валидаторы пароля
далее внизу там переменные окружения для проекта
- urls.py - роутинг по сути
ссылки доступные на вашем сайте
- manage.py - файл который запускает весь проект
он кладет переменные окружение из settings.py в окружение и начинает с ними работать
запускает проект, запускает веб сервер
создать базу данных в django можно одной командой
создаем админа
можем запустить
создаем приложение
появляется папка приложения, в нем
папка migrations будет описывать классы работающие с бд
admin.py - настройки админки
models - модели, таблицы баз данных
tests.py - тесты
views.py - вьюшки
Django основывается на MVT model-view-template
хранение, представление, отображение
Видео 11/22 Django blog
django-admin startproject core .settings.py
allowed hosts откуда можем принимать запросы ['*'] можно поставить для начала
installed apps - регистрация написанного приложения в движке джанго
middleware - запросы приходящие в приложение проходят через эти прослойки
database - как будто понятно зачем
auth passwords - валидаторы пароля
далее внизу там переменные окружения для проекта
- urls.py - роутинг по сути
ссылки доступные на вашем сайте
- manage.py - файл который запускает весь проект
он кладет переменные окружение из settings.py в окружение и начинает с ними работать
запускает проект, запускает веб сервер
создать базу данных в django можно одной командой
python manage.py migrate
создаем админа
python manage.py createsuperuser
можем запустить
python manage.py runserver
создаем приложение
python manage.py startapp blog
появляется папка приложения, в нем
папка migrations будет описывать классы работающие с бд
admin.py - настройки админки
models - модели, таблицы баз данных
tests.py - тесты
views.py - вьюшки
Django основывается на MVT model-view-template
хранение, представление, отображение
#hw 11
from decimal import Decimal
from random import randint
from datetime import date
# 1
# Создать пять классов описывающие реальные объекты.
# Каждый класс должен содержать минимум три приватных атрибута,
# конструктор, геттеры и сеттеры для каждого атрибута, два метода.
class Robot:
last_model = 0
class Computer:
__cpu = False
__login: str
__password: str
def __init__(self, login, password):
self.__login = login
self.__password = password
@property
def cpu(self):
return self.cpu
@property.setter
def cpu(self, cpu):
self.__cpu = cpu
@property
def login(self):
return self.login
@property.setter
def login(self, login):
self.__login = login
@property
def password(self):
return self.__password
@property.setter
def password(self, password):
self.__password = password
def turn_on(self):
self.__cpu = True
def sing_in(self, login, password):
if login == self.__login and password == self.__password:
return True
return False
class Catgirl(Robot):
__uid: int
__race: str
__character: str
name: str
def __init__(self, race, character):
self.__uid = super().last_model + 1
super().last_model += 1
self.__race = race
self.__character = character
@property
def uid(self):
return self.uid
@uid.setter
def uid(self, uid):
self.__uid = uid
@property
def race(self):
return self.__race
@race.setter
def race(self, race):
self.__race = race
@property
def character(self):
return self.character
@character.setter
def character(self, character):
self.__character = character
def love(self, target):
while target.life > 0:
self.love(target)
@staticmethod
def kill(target):
del target
class Grave:
__material: str
__inside: str
__secret: str
def __init__(self, material, inside, secret):
self.__material = material
self.__inside = inside
self.__secret = secret
@property
def material(self):
return self.__material
@material.setter
def material(self, material):
self.__material = material
@property
def inside(self):
return self.__inside
@inside.setter
def inside(self, inside):
self.__inside = inside
@property
def secret(self):
return self.__secret
@secret.setter
def secret(self, secret):
self.__secret = secret
def fill_in(self, dead_human):
self.__inside = dead_human
def get_secret_from_inside(self):
return self.secret + self.inside
class Casino:
__bank: int
__jackpot: int
__owner: str
def __init__(self, owner_name):
self.__owner = owner_name
self.__bank = 0
self.__jackpot = 0
@property
def bank(self):
return self.__bank
@bank.setter
def bank(self, value):
self.__bank = value
@property
def jackpot(self):
return self.__jackpot
@jackpot.setter
def jackpot(self, value):
self.__jackpot = value
@property
def owner(self):
return self.__owner
@owner.setter
def owner(self, owner_name):
self.__owner = owner_name
def feed_owner(self):
self.__bank = 0
def enter_trouble(self):
self.__owner = None
class Success:
__luck: decimal
__try_count: int
__owner: str
def __init__(self):
self.__luck = Decimal(1, 100)
self.__try = 0
self.__owner = None
@property
def luck(self):
return self.__luck
@luck.setter
def luck(self, luck):
self.__luck = luck
@property
def try_count(self):
return self.__try
@try_count.setter
def try_count(self, try_count):
self.__try_count = try_count
@property
def owner(self):
return self.__owner