Анализ данных (Data analysis)
46.3K subscribers
2.33K photos
272 videos
1 file
2.06K links
Data science, наука о данных.

@haarrp - админ

@itchannels_telegram - 🔥 главное в ит

@ai_machinelearning_big_data - ML

@machinelearning_interview - вопросы с собесдований по Ml

РКН: clck.ru/3FmyAp
Download Telegram
👀 12 лучших репозиториев GitHub по компьютерному зрению

Список из наиболее важных Awesome репозиториев GitHub, посвященных компьютерному зрению, которые охватывают широкий спектр исследовательских и образовательных тем. Огромный кладезь знаний из области CV.


1. Awesome Computer Vision
2. Computer Vision Tutorials by Roboflow
3. Transformer in Vision
4. Awesome Referring Image Segmentation
5. Awesome Vision Language Pretraining Papers
6. Awesome Vision and Language
7. Awesome Temporal Action Detection
8. Awesome Masked Autoencoders
9. Awesome Visual Transformer
10. Transformer-Based Visual Segmentation
11. CVPR 2023 Paper with Code
12. Awesome Deepfakes Detection

👍Лайк , если полезно

@data_analysis_ml
👍351🔥1
⚡️Маст-хэв список для программистов, каналы с последними книжными новинками, библиотеками, разбором кода и актуальной информацией, связанной с вашим языком программирования.
Лучший способ получать свежие обновлении и следить за трендами в разработке.

Машинное обучение: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
C#: t.iss.one/csharp_ci
C/C++/ t.iss.one/cpluspluc
Data Science: t.iss.one/datascienceiot
Devops: t.iss.one/devOPSitsec
Go: t.iss.one/Golang_google
Базы данных: t.iss.one/sqlhub
Rust: t.iss.one/rust_code
Javascript: t.iss.one/javascriptv
React: t.iss.one/react_tg
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Мобильная разработка: t.iss.one/mobdevelop
Linux: t.iss.one/+A8jY79rcyKJlYWY6
Big Data: t.iss.one/bigdatai
Хакинг: t.iss.one/linuxkalii
Тестирование: https://t.iss.one/+F9jPLmMFqq1kNTMy
Java: t.iss.one/javatg

💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy

Папка машинное обучение: https://t.iss.one/addlist/_FjtIq8qMhU0NTYy

📕 Бесплатные Книги для программистов: https://t.iss.one/addlist/YZ0EI8Ya4OJjYzEy

🎞 YouTube канал: https://www.youtube.com/@uproger

😆ИТ-Мемы: t.iss.one/memes_prog

🇬🇧Английский: t.iss.one/english_forprogrammers
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4🥰1
📎 Практическое применение Scrapy в Data Science

Установка и настройка
pip install scrapy

Основы веб-скрепинга
Чтобы проиллюстрировать фундаментальную концепцию Scrapy, давайте создадим простой веб-скрепер, извлекающий данные с сайта. В этом примере мы будем извлекать цитаты с сайта “https://quotes.toscrape.com”. Изображение 1.
✔️ Мы определяем класс с именем “QuotesSpider”, который наследуется от класса Scrapy Spider. Мы указываем URL-адреса, с которых парсер начинает собирать данные. Метод “parse” является точкой входа парсера, в нем мы извлекаем нужные данные (цитаты и авторов) с помощью CSS-селекторов. Для возврата извлеченных данных мы используем оператор “yield”.

• Продвинутые техники скрапирования
Рассмотрим две важные техники парсинга: работу с пагинацией на страницах и извлечение данных из страниц всех собранных страниц. Изображение 2.
✔️ Мы создаем класс под названием “ProductSpider” для сбора информации о товарах с сайта электронной коммерции. В методе “parse” мы извлекаем название продукта и его цену со страниц. Кроме того, мы переходим по ссылкам на страницы с подробной информацией с помощью метода “response.follow” и определяем отдельный метод “parse product” для разбора страниц с подробной информацией об отдельных товарах. В методе “parse_product” мы извлекаем дополнительные сведения, например, описание товара.

Обработка входа в систему и аутентификации
Scrapy предлагает функции для обработки сценариев входа в систему и аутентификации, что позволяет собирать данные из закрытых областей сайта. Пример обработки входа в систему с помощью FormRequest: Изображение 3.
✔️ Мы создаем класс с именем “LoginSpider” для обработки процесса входа в систему. В методе “parse” мы извлекаем данные формы входа в систему, включая CSRF-токен. Затем мы отправляем форму входа в систему с помощью FormRequest, передавая данные формы и функцию обратного вызова “after_login” для обработки ответа. В методе “after_login” можно выполнять дальнейшие операции Парсинга на аутентифицированных страницах.

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🔥3
🔥 Awesome Data Science: List of Resources for Data Scientists

Продолжаем публиковать крутые Awesome репозитории. Тщательно подобранный список Awesome ресурсов по науке о данных.

Статьи
Книги
Шпаргалки
Датасеты
Инструменты
Игры
Курсы

и многое другое

🖥 Github

👍Лайк , если полезно

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥2🥰1
🦙 MM-Vet: Evaluating Large Multimodal Models for Integrated Capabilities

MM-Vet - новый оценочный бенчмарк, который проверяет большие мультимодальные модели (БММ) на сложных мультимодальных задачах.


Github
Модель
Статья
Датасет

@data_analysis_ml
👍6🔥21
Руководство по созданию бота YouTube с помощью LangChain и Pinecone Vectorstore 🤖📹

Просмотр часового видеоролика на YouTube по любой научной теме, безусловно, непростая задача. ИИ может помочь с этим.

К концу этого поста вы сможете создать свой собственный чат-бот для YouTube с искусственным интеллектом.

Я проведу вас через весь процесс шаг за шагом. Вы сможете:

•Создать модели OpenAI
•Загрузить исходные документы
•Разделить текст на фрагменты
• Создать и обработать векторные эмбеддинги
•Задать любой вопрос боту и получить ответ


Инициирование модели OpenAI
Запустим модель LLM и добавим в код ключ API. Мы будем использовать модель gpt-3.5-turbo , но вы можете выбрать любую другую.

from langchain.llms import OpenAI
llm = OpenAI(model_name = 'gpt-3.5-turbo',
openai_api_key = 'ваш ключ',
temperature = 0.7)

Загрузка исходго видео.

Скопируйте и вставьте ссылку на видео с YouTube. Загрузите текст видео с помощью функции loader.load() и сохраните его в переменной, как показано ниже.

from langchain.document_loaders import YoutubeLoader
loader = YoutubeLoader.from_youtube_url('<https://www.youtube.com/watch?v=ogEalPMUCSY&pp=ygUJTGFuZ2NoaWFu>')
doc = loader.load()

Разделение текста на фрагменты
Размделим весь PDF-файл с текстом из видео на фрагменты с помощью функциии
RecursiveCharacterTextSplitter. Установим размер фрагмента 1000 и значение перекрытия фрагментов 10. Это позволит разбить документ на фрагменты по 1000 слов.

from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=10)
text_chunks = text_splitter.split_documents(doc)

Создание и хранение векторных эмбеддингов
Настроим функцию эмбедингов OpenAIEmbeddings и хранилище векторов Pinecone. Подключим pinecone. Загрузите все текстовые фрагменты в векторное хранилище с помощью функции Pinecone.from_texts.

from langchain.vectorstores import Pinecone
from langchain.embeddings import OpenAIEmbeddings
import pinecone
import tqdm
import os
embeddings = OpenAIEmbeddings(openai_api_key= 'ваш апи ключ')
pinecone.init(
api_key= 'PINECONE_API_KEY'
environment = 'PINECONE_API_ENVIRON'
)
index_name = 'chatchain'
docsearch = Pinecone.from_texts(texts = [t.page_content for t in text_chunks],embedding=embeddings, index_name=index_name)

Настроим запросы
similarity_searh и k=4 выдаст 4 наиболее релевантных фрагмента, относящихся к нашему запросу. Передайте эти документы в load_qa_chain. Он просуммирует фрагменты в соответствии с нашим запросом и выдаст наилучший возможный ответ.

from langchain.chains.question_answering import load_qa_chain

query = 'what is vector embeddings'
docs = docsearch.similarity_search(query, k=4)
chain = load_qa_chain(llm, chain_type = 'stuff')
chain.run(input_documents=docs, question=query)


С помощью этого чат-бота вы можете загрузить любое видео,, задать любые вопросы по нему и получить искомое за считанные секунды с помощью ии-бота.

📌Бесплатный курс от Activeloop на LangChain & Vector Databases in Production.
📌pinecone
📌Статья

@data_analysis_ml
👍13🔥63🤔1
🖥 Продвинутые темы SQL для дата-инженеров

Дата-инженер контролирует и анализирует большие наборы данных. SQL — мощный инструмент выполнения запросов и манипулирования данными, и для создания эффективных решений здесь имеется немало продвинутых функциональных средств. Рассмотрим ряд важных для дата-инженеров тем SQL, иллюстрируя их примерами применения набора данных.

Пример набора данных
Имеется три таблицы:

product_table с данными различных продуктов — название, цена, категория;
category_table с данными о категориях продуктов;
order_table с данными о заказах: заказанный продукт, его количество, дата заказа.

Вот схема каждой таблицы:
product_table
+----+----------------------+-------+-------------+
| id | Название | Цена | category_id |
+----+----------------------+-------+-------------+
| 1 | iPhone 13 | 1000 | 2 |
| 2 | Galaxy S21 | 800 | 2 |
| 3 | Pixel 6 | 700 | 2 |
| 4 | MacBook Air | 1000 | 4 |
| 5 | Surface Pro 8 | 1200 | 4 |
| 6 | iPad Pro | 800 | 3 |
| 7 | iPad Mini | 400 | 9 |
| 8 | Smart TV | 800 | 1 |
| 9 | Home Theater System | 600 | 1 |
| 10 | Galaxy S21 Ultra | 1400 | 2 |
| 11 | iPhone 13 Pro Max | 1300 | 2 |
| 12 | Pixel 6 Pro | 1000 | 2 |
+----+----------------------+-------+-------------+

category_table
+----+-------------+
| id | Название |
+----+-------------+
| 1 | Электроника |
| 2 | Телефоны |
| 3 | Планшеты |
| 4 | Ноутбуки |
| 5 | Бытовая техника |
| 6 | Одежда |
| 7 | Спорттовары |
| 8 | Игрушки |
| 9 | Аксессуары |
+----+-------------+


order_table
+----+------------+-------------+------------+
| id | product_id | Количество | Дата |
+----+------------+-------------+------------+
| 1 | 1 | 2 | 2022-03-28 |
| 2 | 2 | 1 | 2022-03-28 |
| 3 | 3 | 3 | 2022-03-29 |
| 4 | 4 | 1 | 2022-03-30 |
| 5 | 5 | 2 | 2022-03-31 |
| 6 | 6 | 3 | 2022-03-31 |
| 7 | 7 | 2 | 2022-03-31 |
| 8 | 8 | 1 | 2022-03-31 |
| 9 | 9 | 1 | 2022-03-31 |
+--------------------------------------------+

Фильтрация данных
Предложение WHERE — это важный SQL-функционал для фильтрования данных по конкретным условиям. WHERE, которым определяется условие включения данных в результаты, добавляется в конце оператора SELECT.

Пример. Чтобы получить все продукты дороже 1000 $, применяем WHERE для их фильтрации по цене, в результаты включаются только продукты дороже 1000 $:
SELECT *
FROM product_table
WHERE price > 1000;


Возвращаемый результат:
+----+---------------------+-------+-------------+
| id | Название | Цена | category_id |
+----+---------------------+-------+-------------+
| 5 | Surface Pro 8 | 1200 | 4 |
| 10 | Galaxy S21 Ultra | 1400 | 2 |
| 11 | iPhone 13 Pro Max | 1300 | 2 |
+----+---------------------+-------+-------------+


Объединения
Чтобы иметь полную картину о данных нескольких таблиц, эти таблицы объединяют. Для этого в SQL имеются внутренние, левые, правые и полные внешние объединения.

Пример. Чтобы получить список всех заказов и название заказанного продукта, с помощью объединения в SQL объединяем таблицы: в одной данные о заказе, в другой — о продукте:
SELECT order_table.*, product_table.name
FROM order_table
INNER JOIN product_table ON order_table.product_id = product_table.id;


📌 Читать дальше

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🥱112🔥2
🗺 Визуализируем графы взаимосвязей на картах

GraphMining (далее –GM) – одно из направлений анализа данных, которое позволяет представить комплексные данные в виде графов.

В Python наиболее популярными библиотеками для GM являются NetworkX, pyviz и graph-tool. С их помощью можно формировать и кастомизировать различные виды графов, а, так же, вычислять множество метрик для анализа.

Однако, есть проблема: стандартные библиотеки GM не работают с картами, а библиотеки для работы с картами не формируют графы. На самом деле существует очевидное и простое решение, которое я опишу далее.

В начале – импортируем необходимые библиотеки:

import folium
import pandas as pd
import numpy as np
Допустим, что у меня имеется датасет с аггрегированной информацией о переводах от одного клиента другому:

data = pd.read_csv('data.csv', sep = ';')

В 75% строках датасета количество операций от отправителя к получателю 5 или меньше. Отфильтруем данные, оставив наиболее сильные связи:

data_clean = data[data['opers_cnt']>5]
Далее, необходимо получить набор точек (nodes) с идентификаторами клиентов и их координатами и посчитать общую сумму операций у клиента – отправлений и поступлений:

data_senders = data_clean.rename(
columns = {'id_send':'id','lat_send':'lat','lon_send':'lon'})[['id','lat','lon','opers_sum']]
data_receivers = data_clean.rename(
columns = {'id_recei':'id','lat_rec':'lat','lon_rec':'lon'})[['id','lat','lon','opers_sum']]

nodes = (pd.concat([data_senders, data_receivers])
.groupby(['id','lat','lon'])['opers_sum']
.sum()
.reset_index())

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

nodes['opers_sum_scaled'] = (nodes['opers_sum']-nodes['opers_sum'].min()) / (nodes['opers_sum'].max()-nodes['opers_sum'].min())*20

Обогащаем информацией о суммах отправлений и поступлений каждого идентификатора:

id_send_opers = (data_clean.groupby(['id_send'])['opers_sum'].sum()
.reset_index()
.rename(columns = {'id_send':'id','opers_sum':'send_sum'}))

id_rec_opers = (data_clean.groupby(['id_recei'])['opers_sum'].sum()
.reset_index()
.rename(columns = {'id_recei':'id','opers_sum':'rec_sum'}))
nodes = nodes.merge(id_send_opers, on ='id', how = 'left')
nodes = nodes.merge(id_rec_opers, on ='id', how = 'left')
nodes = nodes.fillna(0)

Получил всю необходимую информацию для нанесения точек на карту:

Далее эти точки необходимо соединить – формирую список ребер:

edges = (pd.DataFrame(np.unique(np.array(['-'.join(sorted(edge)) for edge in zip(for_edges['id_send'],for_edges['id_recei'])])))[0]
.str.split('-', expand = True).rename(columns=({0:'id_x', 1:'id_y'})))
coords_list = nodes[['id','lat','lon']]
edges = edges.merge(coords_list.rename(columns={'id':'id_x'}), on ='id_x', how = 'left')
edges = edges.merge(coords_list.rename(columns={'id':'id_y'}), on ='id_y', how = 'left')


📌 Читать дальше

@data_analysis_ml
👍105🔥5
🟡 Дайджест полезных материалов из мира Data science за неделю

Почитать:
ML-искусство переживать проблемы: как избегать разочарований и находить аналоги товаров в периоды out-of-stock
Генеративный ИИ с базой данных SQL: Персональный чатбот разработчика SQL
Как мы научили ML-модель выбирать товары для акций в СберМаркете и увеличили ROI скидок в 8 раз
Руководство по созданию бота YouTube с помощью LangChain и Pinecone
Распределённое обучение с PyTorch на кластере для тех, кто спешит
У вас неправильные перцептроны
Как аугментация помогает нейронным сетям решать уравнения в частных производных
Дропаем ранжирующие метрики в рекомендательной системе, часть 1: визуальный анализ и popularity bias
«Диалектик», независимое социалистическое медиа, рассказывает о своих NLP проектах, публикует датасеты и делится кодом
Скрытая угроза: критерии классификации атак на нейронные сети
Список популярных утечек с GitHub: Анализ репозиториев компаний
ИИ самоучка: модель реконструкции голограмм с самоконтролируемым обучением
Основные ресурсы нейронных сетей для начинающих и энтузиастов
Анализ настроений в отзывах Trip Advisor с помощью модели трансформеров Hugging Face
SaaS platform with integrated 3D body measurement technology
Visualizing shapefiles in R with sf and ggplot2!
Reading data from csv file
Roadmap to Become a Database Engineer
Integration of Machine Learning through AWS Batch
ScoreCast: A Tool for Predicting Football Game Outcomes in Minor Leagues
Global Generalization Injection: Using Generated Sentences in Pre-Training Transformers
Grammar of Graphics: how it helps us to create clear visualizations and tell stories with data
Data Science Zero to Hero - 2.1: The Machine Learning Cycle
How Fast Does Your Website Need to Be?

Посмотреть:
🌐Как работать с декораторами в Python. Часть 1
🌐 Методы сокращения и улучшения кода на Python
🌐 Продвинутые методы улучшения кода на Python
🌐 Создаем продвинутый интерфейс на Python
🌐 Harvard CS50’s Artificial Intelligence with Python – Full University Course
🌐Реальное Собеседование Data Science | ВСЯ ТЕОРИЯ В ОДНОМ ВИДЕО

Хорошего дня!

❤️ Лайк, если полезно

@data_analysis_ml
30👍6🔥6
🤗Гайд по развертыванию моделей Hugging Faceс помощью BentoML: DeepFloyd IF.

В этой статье показано, как интегрировать DeepFloyd IF с BentoML.

DeepFloyd IF - это современная модель преобразования текста в изображение с открытым исходным кодом.

BentoML - это платформа с открытым исходным кодом для настройки и развертывания моделей машинного обучения.

📌 Читать

@data_analysis_ml
👍63🔥3
🔍 Анализ данных для задач НЛП

Для успешного NLP-проекта одним из важнейших этапов является предварительная обработка данных. В этой статье мы рассмотрим все шаги, связанные с анализом данных для любой задачи НЛП.

Для анализа данных мы можем использовать статистические методы, вычислительные алгоритмы, чтобы обработать данные и повысить производительность модели. Шаги, описанные в этом посте, могут быть использованы для анализа данных для любой задачи НЛП.

Настройка среды
Первым шагом любого проекта является настройка среды, т.е. установка важных пакетов и импорт важных библиотек.
!pip install nltk
!pip install pandas


import pandas as pd
import nltk
from nltk.tokenize import sent_tokenize,word_tokenize
from nltk.stem import PorterStemmer
from nltk.corpus import stopwords
import re

Обзор данных
Следующим этапом проекта будет загрузка датасета. В данном случае мы будем использовать набор данных твитов о катастрофах из Kaggle.
Мы можем загрузить наш датасет с помощью библиотеки pandas.

df = pd.read_csv("/train.csv")

Для того чтобы получить общее представление о данных, мы можем просмотреть верхние строки набора данных с помощью функции head в pandas:

df.head(10)

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

plt.figure(figsize=(10,70))
sns.countplot(data=df,y="keyword",hue="target",saturation=0.50)
plt.legend(bbox_to_anchor=(1.02, 1), loc='upper left', borderaxespad=0)
plt.show()


📌 Продолжение

@data_analysis_ml
12👍3🔥1
🖥 5 факторов, которые влияют на выбор базы данных

При выборе баз данных для текущего проекта (или при замене тех, которые не отвечают вашим текущим потребностям) количество возможных вариантов очень велико. Это и хорошо, и плохо, ведь нужны какие-то критерии фильтрации.

Сегодня есть гораздо больше баз данных, чем когда-либо. В декабре 2012 года, когда DB-Engines.com впервые начал ранжировать базы данных, у него получился список из 73 систем (существенный рост по сравнению с самым первым списком из 18 систем). Спустя десять лет, на декабрь 2022 года в списке было уже почти четыреста систем. За последнее десятилетие произошёл настоящий кембрийский взрыв технологий баз данных.

Нужно ориентироваться в обширном пространстве вариантов: SQL, NoSQL, множество «многомодельных» баз данных, которые могут быть сочетанием SQL и NoSQL, или множественные модели данных NoSQL (сочетающие две или более опций: документы, ключи-значения, широкие столбцы, графы и так далее).

Кроме того, пользователи не должны путать популярность с применимостью для них. Хотя сетевой эффект имеет свои преимущества («Все пользуются X, поэтому не ошибусь, если выберу её»), он также может привести к групповому мышлению, торможению инноваций и конкуренции.

Читать статью

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101🔥1😱1
erid: LjN8KUZML
50 000 ₽ за хорошего аналитика

Присмотритесь к своим друзьями и знакомым — вдруг среди них есть Android-аналитик который ищет работу мечты. А тут Финтех Яндекса как раз нанимает, обещает ценить и хорошо платить, да ещё и даёт 50 000 ₽ за рекомендацию.

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

Реклама, ООО «Яндекс»
👍8🤩31🤨1
🔢 Как аугментация помогает нейронным сетям решать уравнения в частных производных

Обширные явления реального мира, такие как турбулентность, атмосферная циркуляция и напряжение деформируемых материалов и т.д., описываются лежащими в их основе дифференциальными уравнениями в частных производных (PDEs).

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

Традиционный подход к численному решению PDEs основан на использовании различных солверов, которые используют те или иные классические методы. Например, метод конечных элементов (FEM) или метод конечных разностей (FDM), которые решают PDEs путем дискретизации расчетной области. Однако, в этом случае точность численного решения сильно зависит от дискретизации расчетной сетки: грубые сетки работают быстро, но менее точно; мелкие — точны, но медленны. В реальных приложениях решение PDEs обычно требует очень хорошей дискретизации и, следовательно, очень сложны, времязатратны и трудоемки для традиционных солверов.

В последние несколько лет на решение этой проблемы направлены усилия ученых, занимающихся нейронными сетями (NNs). Широко известно, что NNs являются универсальными аппроксиматорами непрерывных функций. Более важным фактом является то, что NN с одним скрытым слоем может точно аппроксимировать любой нелинейный непрерывный оператор. Недавно в рамках нового направления было предложено изучение бесконечномерных операторов с помощью NNs. Нейронный оператор устраняет зависящую от сетки дискретизацию, создавая единый набор параметров NN, которые можно использовать с различными дискретизациями расчетной сетки.

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

📌 Читать дальше

@data_analysis_ml
👍133🔥1
🖥 Тайны виртуальных конвертов: чтение и парсинг .pst файлов

Сегодня я рассмотрю алгоритм чтения и парсинга .pst файлов, написанный на python. Для работы с одним файлом и оставлю в стороне параллельную обработку, которую стоит использовать при работе с большим числом архивов.

Для открытия и чтения .pst файлов воспользуюсь pypff – python оберткой для библиотеки libpff, написанной на C. Эта библиотека позволяет работать с форматами PFF (Personal Folder File) и OFF (Offline Folder File), в которые как раз и входит формат .pst, наряду с форматами .pab (Personal Address Book) и .ost (Offline Storage Table).

# Установка библиотеки
pip install libpff-python
# Импортирование библиотеки
import pypff
Работа с файлом будет подобна работе с древовидным архивом. Поэтому в первую очередь после чтения файла необходимо получить корневую папку:

pst = pypff.file()
pst.open(“example.pst”)
root = pst.get_root_folder()

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

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

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

def parse_folder(base):
messages = []
for folder in base.sub_folders:
if folder.number_of_sub_folders:
# Извлечение писем из дочерней папки
messages += parse_folder(folder)
# Обработка писем в текущей папке
for message in folder.sub_messages:
messages.append({
"folder": folder.name,
"subject": message.subject,
"sender_name": message.sender_name,
"sender_email": get_sender_email(message),
"datetime": message.client_submit_time,
"body_plain": get_body(message)
})
return messages

# Извлечение всех писем из файла
messages = parse_folder(root)

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

Как можно видеть из списка атрибутов pff.message, письмо может иметь тело в трех форматах (plain_text, html, rtf), а точнее в одном из этих трех.

Для задачи меня будет интересовать получение тела письма в формате текста, поэтому необходимо конвертировать html строки (которых оказалось больше всего). Для этого воспользуемся библиотекой BeautilfulSoup: создадим объект bs на основе нашего html_body и воспользуемся методом get_text(), чтобы получить очищенный от html тегов текст письма. На этом можно было бы остановится, но в результирующих строках оставались комментарии с описанием стилей и шрифтов, поэтому дополнительно производится их удаление с помощью регулярных выражений, а также замена двойных символов перевода строки на одинарные.

📌Читать дальше

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132🔥2
Data Cleaning and Preprocessing for data science beginners

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

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

📚Скачать книгу

@data_analysis_ml
👍10🔥41
Эмбеддинг - это как переводчик, преобразующий слова в числа, чтобы алгоритмы могли их понять.

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

Github
Colab

@data_analysis_ml
👍191🔥1🤔1