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

@haarrp - админ

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

@ai_machinelearning_big_data - ML

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

РКН: clck.ru/3FmyAp
Download Telegram
📌esProc SPL - это скриптовый язык для обработки данных, с хорошо продуманными богатыми функциями и мощным синтаксисом, который может исполняться в Java-программе через интерфейс JDBC и вычисляться независимо.

Github
Документация

@data_analysis_ml
👍124🥰2
Media is too big
VIEW IN TELEGRAM
🖥 Python анализ данных с Pandas. Join, merge, concat в Pandas

Видео
Код из видео
Часть 1
Часть 2

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍222🔥2
🌝 Крутые data science проекты с исходным кодом

1. Создание чат-ботов:
https://dzone.com/articles/python-chatbot-project-build-your-first-python-pro

2. Обнаружение мошенничества с кредитными картами:
https://kaggle.com/renjithmadhavan/credit-card-fraud-detection-using-python

3. Обнаружение фальшивых новостей
https://data-flair.training/blogs/advanced-python-project-detecting-fake-news/

4. Определение сонливости водителя
https://data-flair.training/blogs/python-project-driver-drowsiness-detection-system/

5. Рекомендательные системы (рекомендация фильмов)
https://data-flair.training/blogs/data-science-r-movie-recommendation/

6. Анализ настроений
https://data-flair.training/blogs/data-science-r-sentiment-analysis-project/

7. Определение пола и прогнозирование возраста
https://pyimagesearch.com/2020/04/13/opencv-age-detection-with-deep-learning/

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
26👍14🔥4
Yachay AI — открытое сообщество по машинному обучению

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

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


Из интересного: сообщество также разработало инструмент для определения геолокации

Github
Проект
Датасеты

@data_analysis_ml
👍135🔥4
🤖 Как использовать агенты Hugging Face для решения задач NLP

Hugging Face  — ИИ-сообщество с открытым исходным кодом для практиков машинного обучения — недавно интегрировало концепцию инструментов и агентов в свою популярную библиотеку Transformers.

Если вы уже использовали Hugging Face для решения задач обработки естественного языка (NLP), компьютерного зрения и работой над аудио/речью, вам будет интересно узнать о дополнительных возможностях Transformers.

Агент Transformers: реализация
В этом разделе я использовал документацию Hugging Face об агентах и реализовал их на собственных примерах.

Шаг 1. Требования
Начнем с импорта нескольких библиотек, которые будем использовать. Обратите внимание: я включил версии этих библиотек в результаты, чтобы вы могли создать идентичную среду.

import transformers, huggingface_hub, diffusers, torch
from platform import python_version
print(f'python: {python_version()}')
print(f'transformers: {transformers.__version__}')
print(f'huggingface_hub: {huggingface_hub.__version__}')
print(f'diffusers: {diffusers.__version__}')
print(f'torch: {torch.__version__}')


Результаты:

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

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🔥2
💻 Принципы SOLID в инженерии данных.

Как принципы SOLID трансформируются в функциональном программировании?

▪️Принцип единственной ответственности: у каждой функции должно быть одно назначение, то есть возможно несколько задач, но одна достигаемая цель.
▪️Принцип открытости/закрытости: исходный код каждой функции открыт для расширения, но закрыт для модификации.
▪️Принцип подстановки Лисков: каждая функция заменяется на другую с той же сигнатурой без изменения поведения программы.
▪️Принцип разделения интерфейса: каждая функция не зависит от ненужных ей функций.
▪️Принцип инверсии зависимостей: все функции зависят от входных аргументов, а не жестко заданного в функции поведения.

Интерпретация принципов SOLID: ООП против функционального программирования (в изображении)

Нарушение и соблюдение принципов SOLID на примерах

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

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


🔘 Примеры
🔘 Часть 1.
🔘 Часть 2.

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3🎉2
🔥 Дайджест полезных материалов из мира : Data Science за неделю

Почитать:
Как мы решили вопрос нехватки кадров, обучив соискателей работе с Apache Spark
Создание приложения для потоковой передачи видео с физическими элементами управления
Пять подходов к созданию ad-hoc-датафреймов в PySpark
Искусство ETL. Пишем собственный движок SQL на Spark [часть 1 из 5]
7 аргументов почему UUID лучше, чем автоинкрементные идентификаторы
Тестирование производительности на Python: Пошаговое руководство с Flask
Boosting Resiliency with ML-Based Telemetry Analytics Architecture
Dominando a função WITH: Criando Consultas Temporárias no SQL
The Secret Sauce of Success: Soft Skills Every data Scientist needs
What AI-driven analytics tools aid in data-driven decision-making for businesses?
Unlocking Computational Efficiency in Event Analysis Through Centroids and Blocks: A Conceptual Exploration
How can AI-driven cybersecurity tools protect businesses from daily threats and breaches?
SQL Roadmap for Data Analysts[Step-by-Step]
Dataviz accessibility review: what we can learn from the Norwegian 2023 election graphs
Data Science Mentorship in Ahmedabad Learning from the Best
7-Stage Roadmap for Data Science

Посмотреть:
🌐 Leveraging Generative AI in Education - A M Aditya ( 31:24)
🌐 Невероятная нейросеть переводит любое видео на другие языки с сохранением оригинального голоса. ( 00:55)
🌐 Python анализ данных с Pandas. PandaSQL ( 12:13)
🌐 Python анализ данных с Pandas. Join, merge, concat в Pandas ( 19:25)
🌐 Python+SQL часть2 создание таблиц. ( 05:15)
🌐 Управление жестами всегда было в ваших часах, просто его нужно было активировать. ( 00:11)
🌐 Уроки Golang с нуля /#28 - Встраивание типов ( 06:16)
🌐 Уроки Golang с нуля /#27 - Bufio. Чтение и запись ( 10:35)
🌐 Python анализ данных с Pandas. ( 17:04)
🌐 ODSC Webinar | A Path to Insights Starts with Trusted Data ( 23:23)
🌐 Not Just Deep Fakes: Apps of Visual Generative Models in Pharma Manufacturing - Guglielmo Iozzia ( 01:18:40)
🌐 Lightning Interview “Beyond the Code: How AI Is Disrupting the Programmer's Role” ( 58:40)
🌐 AI Reads Minds of 29 Patients! ( 06:01)
🌐 OpenAI’s ChatGPT Nails 150+ Difficult Tasks! ( 05:54)

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

@data_analysis_ml
👍15🔥31
🚀 Гарвардский университет предлагает БЕСПЛАТНОЕ образование мирового класса в области Data Science!

Курсы охватывают:
- Python
- Визуализация данных
- Вероятность
- Статистика
- Машинное обучение
- Наука о данных: Capstone


Курс

@data_analysis_ml
👍31🔥93
🎞 Полезные плейлисты YouTube по науке о данных:

Основы машинного обучения 2023, майнор ИАД
https://www.youtube.com/playlist?list=PLEwK9wdS5g0oCRxBzxsq9lkJkzMgzWiyg

Tableau
https://www.youtube.com/playlist?list=PLgG9iJlSBmTe4n8doaYFkzLU-dEbb2XGn

Парсинг на Python
https://www.youtube.com/playlist?list=PLysMDSbb9HcwWWhs1Cm9EF1sv0fo8kII5

SQL
https://www.youtube.com/playlist?list=PLBheEHDcG7-k1Y_Uy04Dj2ylWhcfSfqoF

Наука о данных
https://www.youtube.com/playlist?list=PLysMDSbb9HcwIpPPBR72Qe7CMCgx-D9Ob

Python и базы данных
https://www.youtube.com/playlist?list=PLysMDSbb9HcxdvtQSkYoO7xaF3SvGUD8n

Numpy полный курс
https://www.youtube.com/playlist?list=PLysMDSbb9Hcz3Gdi9oV-btohZ9zhths-r

R
https://youtube.com/playlist?list=PL6gx4Cwl9DGCzVMGCPi1kwvABu7eWv08P

PowerBI
https://youtube.com/playlist?list=PLv2BtOtLblH13vCbf99BptWWk-EWx7QQG

Линейная алгебра и аналитическая геометрия
https://www.youtube.com/playlist?list=PLaX3n04-uUZoTu4DcD2Eqgq-h5wimh_uT

Python
https://www.youtube.com/playlist?list=PLV0FNhq3XMOKljD7POtuWVAZn8wXcn4-L


Excel
https://www.youtube.com/playlist?list=PLzilK6a-UuVl5FP-QY1ks_c--3CrYU3MX

Data Analysis
https://youtube.com/playlist?list=PLrRPvpgDmw0ks5W7U5NmDCU2ydSnNZA_1

Data Analyst
https://youtube.com/playlist?list=PLUaB-1hjhk8FE_XZ87vPPSfHqb6OcM0cF

Linear Algebra
https://youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

Calculus
https://youtube.com/playlist?list=PLZHQObOWTQDMsr9K-rj53DwVRMYO3t5Yr

Statistics
https://youtube.com/playlist?list=PLblh5JKOoLUK0FLuzwntyYI10UQFUhsY9

Machine Learning
https://youtube.com/playlist?list=PLQVvvaa0QuDfKTOs3Keq_kaG2P55YRn5v

Deep Learning
https://youtube.com/playlist?list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI

Deep Learning
https://youtube.com/playlist?list=PLblh5JKOoLUIxGDQs4LFFD--41Vzf-ME1

Excel Power Query
https://youtube.com/playlist?list=PLmHVyfmcRKyyKV86N7i0q9TfYNN8bBjX-

Microsoft Excel
https://youtube.com/playlist?list=PLmHVyfmcRKyx1KSoobwukzf1Nf-Y97Rw0

👇Делитесь полезными DS плейлистами в комментариях

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41👍194🥰4
🟥 Как автоматизировать создание контента для YouTube и блога с помощью LangChain и OpenAI

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

🔴LangChain: фреймворк, упрощающий использование больших языковых моделей.
🔴OpenAI: большая языковая модель, которую мы будем использовать.
🔴Streamlit: фреймворк для создания веб-приложений на Python.
🔴Python-dotenv: пакет для управления переменными окружения.
Чтобы установить эти пакеты, откройте терминал и запустите:
pip install langchain openai streamlit python-dotenv

Шаг 2. Получение API-ключа OpenAI
Далее вам необходимо получить API-ключ OpenAI. Это уникальный ключ, открывающий доступ к модели GPT-3 (GPT-3.5/ChatGPT, GPT-4). После регистрации учетной записи в OpenAI вы найдете API-ключ на дашборде.

Полученный ключ нужно надежно сохранить в файле .env. В каталоге проекта создайте файл .env и добавьте в него следующую строку:
OPENAI_API_KEY=ваш_ключ_openai

Замените ваш_ключ_openai на свой действительный ключ OpenAI. Этот файл будет использоваться для безопасного хранения API-ключа.

Шаг 3. Настройка файла app.py и импорт библиотек
Создадим главный файл Python, app.py. В нем и будем разрабатывать маркетингового ИИ-помощника.

Начнем с импорта необходимых библиотек и загрузки переменных среды:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain, SimpleSequentialChain, SequentialChain
import os
from dotenv import load_dotenv
load_dotenv()


В этих строках кода импортируется класс OpenAI из модуля langchain.llms, который позволяет взаимодействовать с моделью GPT. Кроме того, импортируются классы PromptTemplate и LLMChain, которые будут использоваться для создания промптов и цепочек.

Функция load_dotenv() загружает переменные среды OPENAI_API_KEY из файла .env.

Часть 2. Компоновочные блоки LangChain
Шаг 4. Обзор основных компонентов
Прежде чем приступить к написанию кода, сделаем краткий обзор компонентов, которые будем использовать.

🔵Большая языковая модель (LLM): экземпляр модели GPT-3.
🔵Шаблон промптов (Prompt Template): простая инструкция для LLM. Она принимает входные переменные и использует их в шаблоне.
🔵Цепочка (Chain): комбинация LLM и шаблона промптов. Она является самой малой рабочей единицей в LangChain.

Эти три компонента будут использованы для разработки генератора публикаций в блоге.

Шаг 5. Создание первой LLMChain
Чтобы создать первую цепочку, нужно инициализировать LLM, разработать шаблон промптов, а затем объединить их в цепочку.

Настройте LLM и первый шаблон промптов:

# Пример LLMChain

# Модель
llm = OpenAI(temperature=0.9)

# Промпт
blog_prompt_template = PromptTemplate(
input_variables = ['product_description'],
template = 'Write a blog post on {product_description}'
)

# Цепочка
blog_chain = LLMChain(llm=llm, prompt=blog_prompt_template, verbose=True)

# Запуск
product_description = 'best eco-friendly coffee'
blog_chain.run(product_description)


СОВЕТ: ПАРАМЕТР TEMPERATURE УПРАВЛЯЕТ РАНДОМНОСТЬЮ ВЫХОДНЫХ ДАННЫХ МОДЕЛИ. ОН ПРИНИМАЕТ ЗНАЧЕНИЯ ОТ 0 ДО 1, ГДЕ МЫ УСТАНОВИЛИ ЗНАЧЕНИЕ 0,9, ПОСКОЛЬКУ ХОТИМ ПОЛУЧИТЬ МНОГО НОВЫХ ИДЕЙ, В ТО ВРЕМЯ КАК МЕНЬШЕЕ ЗНАЧЕНИЕ, НАПРИМЕР 0, ДЕЛАЕТ МОДЕЛЬ БОЛЕЕ ДЕТЕРМИНИРОВАННОЙ.

В приведенном выше коде настраивается LLM и создается шаблон промптов, который принимает описание продукта и генерирует в блоге публикацию о нем. Затем эти два шаблона объединяются, чтобы сформировать цепочку. Потом запускается LLMChain с product_description.

Часть 3. Освоение основ цепочек в LangChain
Шаг 6. Создание SimpleSequentialChain

📌Читать

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍7🔥4
Media is too big
VIEW IN TELEGRAM
📊Python Matplotlib. Визуализация данных на PRO уровне.

📌 Видео
📌 Код и полезные ресурсы

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍28🔥43
🚀 𝐄𝐱𝐜𝐢𝐭𝐢𝐧𝐠 𝐀𝐧𝐧𝐨𝐮𝐧𝐜𝐞𝐦𝐞𝐧𝐭: 𝐈𝐧𝐭𝐫𝐨𝐝𝐮𝐜𝐢𝐧𝐠 𝐃𝐞𝐜𝐢𝐃𝐢𝐟𝐟𝐮𝐬𝐢𝐨𝐧 𝟏.𝟎 - 𝐑𝐞𝐯𝐨𝐥𝐮𝐭𝐢𝐨𝐧𝐢𝐳𝐢𝐧𝐠 𝐓𝐞𝐱𝐭-𝐭𝐨-𝐈𝐦𝐚𝐠𝐞 𝐆𝐞𝐧𝐞𝐫𝐚𝐭𝐢𝐨𝐧!

DeciDiffusion 1.0, новая модель диффузии текста в изображение.

Имея впечатляющие 820 млн. параметров, она достигает такого же исключительного качества, как и модель Stable Diffusion v1.5 с 860 млн. параметров, но за 40% меньшее количество итераций.

🔹 Высочайшая эффективность вычислений: на 40% меньше итераций и в 3 раза быстрее, чем в Stable Diffusion v1.5, что привело к снижению затрат почти на 66%.

pip install diffusers --upgrade
pip install invisible_watermark transformers accelerate safetensors


Colab
Model
Demo

@data_analysis_ml
👍101🔥1🥰1
🐼Как устроен Pandas: взгляд изнутри

Структура данных Pandas
Как правило, датафрейм поддерживается каким-нибудь массивом, например NumPy или Pandas ExtensionArray. Эти массивы хранят данные датафрейма. pandas добавляет промежуточный слой Block и BlockManager. Он управляет этими массивами, обеспечивая максимальную эффективность операций. Это одна из причин, почему в Pandas методы, работающие с несколькими столбцами, могут быть очень быстрыми. Далее более подробно рассмотрим упомянутые слои.

Массивы
Фактические данные датафрейма могут храниться в наборе массивов NumPy или Pandas ExtensionArray. Этот слой обычно направляет к базовой реализации, например использует NumPy API при условии хранения данных в массивах NumPy. Pandas хранит в них данные и вызывает свои методы без расширения интерфейса.

Массивы NumPy обычно являются двумерными и дают ряд преимуществ в производительности, о которых речь пойдет далее. На данный момент Pandas ExtensionArray в основном представляют собой одномерные структуры данных, благодаря чему операции становятся предсказуемыми.
Однако не обошлось и без недостатков: в ряде случаев страдает производительность.

ExtensionArray допускает применение датафреймов, которые поддерживаются массивами PyArrow и другими типами данных Pandas.

Block

Датафрейм обычно состоит из столбцов, представленных по крайней мере одним массивом. Как правило, имеется коллекция массивов, так как один массив может хранить только один определенный тип данных. Эти массивы хранят данные, но не владеют информацией о том, какие столбцы они представляют. Каждый массив из датафрейма обернут соответствующим блоком Block.
Block добавляет дополнительную информацию в массивы, например расположение представленных им столбцов.
Block служит слоем вокруг фактических массивов с возможностью расширения вспомогательными методами, необходимыми для операций Pandas.
При выполнении фактической операции с датафреймом Block гарантирует, что метод направляется в базовый массив. Например, при вызове astype он убедится, что эта операция вызывается в массиве.

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

BlockManager
Как следует из названия, BlockManager управляет всеми Block, связанными с одним датафреймом. Он содержит сами Block и информацию об осях датафрейма, например имена столбцов и метки Index.
И самое главное в том, что он направляет большинство операций к фактическим Block:

df.replace(...)

BlockManager гарантирует, что replace выполняется для каждого Block.

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

При создании датафрейма Pandas гарантирует, что на каждый тип данных приходится только один Block:

df = pd.DataFrame(
{
"a": [1, 2, 3],
"b": [1.5, 2.5, 3.5],
"c": [10, 11, 12],
"d": [10.5, 11.5, 12.5],
}
)

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

Добавим новый столбец к этому датафрейму:
df["new"] = 100

У него такой же тип данных, как и у существующих столбцов "a" и "c". Рассмотрим 2 возможных варианта дальнейших действий:

1. Добавление нового столбца в существующий массив, содержащий целочисленные столбцы.
2. Создание нового массива только для хранения нового столбца.

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

◾️ Второй вариант

📌 Читать

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥52
💻 Как создать простой агент с Guidance и локальной моделью LLM

Guidance  — это инструмент от Microsoft, представляющий собой “язык, организующий управление LLM”. Он позволяет управлять выводом LLM, что облегчает выполнение инструкций.

Что касается GPT 3.5–4, то он успешно работает с большинством инструкций.
Но небольшие локальные модели, такие как LLaMa и ее разновидности (Alpca, WizardML), не всегда выдают правильный ответ. А это большая проблема. Некоторые фреймворки, такие как ReAct, требуют определенного формата инструкций для ответа. Кроме того, работу усложняет тот факт, что LLM иногда предоставляет данные в формате JSON с синтаксической ошибкой.

Пример:
valid_dish = ["Pizza", "Noodles", "Pho"]

# определение текстовой подсказки
order_maker = guidance("""The following is a order in JSON format.
```json
{
"name": "{{name}}",
"age": {{gen 'age' pattern='[0-9]+' stop=','}},
"delivery": "{{#select 'delivery'}}Yes{{or}}No{{/select}}",
"order": "{{select 'order' options=valid_dish}}",
"amount": {{gen 'amount' pattern='[0-9]+' stop=','}}
}```""")

# генерация имени заказчика доставки
order_maker(
name="Alex",
valid_dish=valid_dish
)
**Вывод**
The following is a order in JSON format.
```json
{
"name": "Alex",
"age": 25,
"delivery": "Yes",
"order": "Noodles",
"amount": 10
}```

Как видно, мы легко составили текстовую подсказку, предварительно определили несколько пунктов и добились от LLM точного их выполнения. Скорректировали регулярное выражение для поля age с помощью {{gen ‘age’ pattern=’[0–9]+’ stop=’,’}}.
Это значит, что оно принимает только цифры и заканчивается на ,. Кроме того, используя valid_dish, ограничили тип заказанной еды с помощью “{{select ‘order’ options=valid_dish}}”. Более подробная информация предоставлена по официальной ссылке на GitHub.

Агент ReAct с Guidance и Wizard-Mega-13B-GPTQ
Примечание. С кодом данного раздела можно ознакомиться по ссылке.

Перед запуском необходимо разместить LLM на локальном ПК. В данном случае для этой цели применяется wizard-mega-13B-GPTQ. Вы можете выбрать и другие модели. Сначала загружаем модель и позволяем Guidance ее использовать:

model_para = 'YOUR_MODEL_DIR'
checkpoint_para = 'YOUR_MODEL_FILE'
model = load_quant(model_para, checkpoint_para, 4, 128)
model.to(DEV)
tokenizer = AutoTokenizer.from_pretrained(model_para)

llama = guidance.llms.Transformers(model=model, tokenizer=tokenizer, device=0)
guidance.llm = llama

Испытаем на простой текстовой подсказке. С помощью формата ReAct проверяем, насколько корректно работает модель.

📌 Читать

@data_analysis_ml
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🔥1
Задача из Собеседования в Яндекс с зарплатой 85000 рублей #python #собеседование #задача #yandex

На вход функции поступает 2 строки s и s2. Функция возвращает True, если s1 может быть получена из символов строки s2. Каждый символ s2 используется только 1 раз.

📌Код
👍72👎1
Что лучше — нанять тимлида из сторонней компании или вырастить самостоятельно? Как правильно выбрать подходящего на эту роль сотрудника?

На эти и другие важные вопросы отвечает руководитель аналитики в Авито Глеб Белогорцев. В своем гайде он подробно рассказывает, как понять, какой именно тимлид нужен компании, как распознать потенциального руководителя в числе сотрудников и кого точно не нужно брать на роль тимлида.

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

Реклама.ООО "КЕХ ЕКОММЕРЦ" ИНН 7710668349 erid: Kra23e76V
👍62