R4marketing | канал Алексея Селезнёва | Язык R
4.46K subscribers
58 photos
11 files
1.19K links
Автор канала Алексей Селезнёв, украинский аналитик, автор ряда курсов по языку R и пакетов расширяющих его возможности.

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

Для связи: @AlexeySeleznev
Реклама: http://bit.ly/39MwJCY
Download Telegram
Друзья, каналу @R4marketing сегодня исполняется 5 лет, первый небольшой юбилей.

1 ноября 2018 года я сообщил о запуске канала у себя в facebook.

При желании можно поддержать канал по этой ссылке, либо переводом 5 USDT на TrustWallet по этой ссылке.

Спасибо вам!
Опубликован 14ый, и завершающий урок курса по разработке пакетов на языке R: Создание мета-пакета

В заключительном уроке курса мы с вами научимся создавать собственные мета пакеты. Мета пакет это не самостоятельный пакет, а просто коллекция объединённых пакетов, одним из наиболее известных мета-пакетов является tidyverse, в ядро которого входят такие пакеты как: dplyr, tidyr, ggplot2, stringr и т.д.

Это самый короткий урок данного курса.

Тайм коды:
00:00 Вступление
01:10 Пример создания мета-пакета с помощью пакета pkgverse
05:47 Аргументы функции pkgverse()
07:12 Заключение

————————————
Сегодня опубликован 14ый, и последний урок курса по разработке пакетов, работа над курсом продлилась ровно 3 месяца, 7 августа был опубликован 1ый урок, и сегодня - 7 ноября, последний.

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

В ближайшие дни опубликую курс на bookdown, о чём тут отдельно сообщу.
————————————

Ссылки:
1. Сайт курса
2. Видео на YouTube

#курсы_по_R
Уес МакКинни присоединился к Posit (ex. RStudio)

Несомненно это пожалуй самая громкая новость в мире R как минимум за этот год. Ниже приведу перевод сообщения из рассылки Posit. в котором они поделились этой новостью.

Мы рады сообщить, что Уэс МакКинни присоединился к Posit!

—————————————
Уэс МакКинни — предприниматель и разработчик ПО с открытым исходным кодом, который за последние 15 лет внес значительный вклад в развитие сообществ науки о данных и аналитики.

Его пакет pandas стал стандартом для анализа и обработки данных Python. Его книга
«Python для анализа данных» научила целое поколение ученых, занимающихся данными, как продуктивно работать с новой платформой pandas, NumPy, matplotlib и Jupyter.

С момента создания pandas Уэс неустанно работал над тем, чтобы сделать основные системы, которые мы используем для обработки и анализа данных, масштабируемыми, совместимыми и компонуемыми с помощью таких проектов, как
Ibis , Apache Arrow и Feather .

И теперь мы очень рады сотрудничать с Уэсом и внести свой вклад в экосистему PyData. Когда мы сменили название на
Posit, нашей целью было объединить усилия для создания отличных инструментов для анализа данных, независимо от языка, и сотрудничество с Уэсом — огромный шаг вперед в реализации этой мечты.

Прочтите
сообщение в блоге Уэса, чтобы узнать больше о том, над чем он планирует работать в Posit. Нам не терпится увидеть, что он создаст в ближайшие годы!
—————————————

Пожелаем Уэсу успехов!

#новости_и_релизы_по_R
rlinkedinads - Пакет для работы с Linkedin Advertising API

Ранее никогда не приходилось работать с Linkedin API, но в этом месяце была задача написать скрипт, который бы запрашивал статистику их рекламного кабинета Linkedin, соответственно в ходе её решения появился пакет для работы с Linkedin Advertising API.

На данный момент в пакете реализован следующий функционал:

● Интерфейс авторизации
● Запрос всех объектов рекламного кабинета
● Запрос статистики из рекламного кабинета

Установить пакет можно из CRAN или Github:

install.packages('rlinkedinads')
pak::pak('selesnow/rlinkedinads')


Пример кода:
library(rlinkedinads)

lkd_set_login('ВАШ ЛОГИН')
lkd_set_account_id(ID ВАШЕГО РЕКЛАМНОГО АККАУНТА)

# Иерархия рекламного аккаунта
accounts <- lkd_get_accounts()
user_accounts <- lkd_get_accounts_by_authenticated_user()
account_users <- lkd_get_ad_account_users_by_accounts(account_urn_id = 'urn:li:sponsoredAccount:511009658')
campaign_groups <- lkd_get_campaign_groups()
campaigns <- lkd_get_campaigns()
creatives <- lkd_get_creatives()

# Запрос аналитики
report <- lkd_get_ads_analytics(
pivot = 'CAMPAIGN',
date_from = '2023-01-01,
date_to = '2023-06-30,
time_granularity = 'DAILY',
fields = c(
'pivotValues',
'dateRange',
'clicks',
'impressions',
'dateRange',
'costInUsd',
'oneClickLeads',
'externalWebsiteConversions'
),
facets = list(
accounts = 'urn:li:sponsoredAccount:511009658',
campaigns = "urn:li:sponsoredCampaign:253102116",
campaigns = "urn:li:sponsoredCampaign:229686963"
)
)


В ближайшее время запишу видео урок по работе с пакетом.

#новости_и_релизы_по_R
Вышел httr2 1.0.0

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

httr2 является преемником httr.Основное его отличие состоит в том, что у него есть явный объект запроса, который можно создать с помощью нескольких вызовов функций. Это делает интерфейс более естественным для работы в пайпах и в целом упрощает жизнь, поскольку вы можете итеративно создавать сложный запрос. httr2 также основан на 10-летнем опыте разработки пакетов, который мы накопили с момента создания httr, поэтому его использование должно быть более удобным. Если вы в настоящее время являетесь пользователем httr, вам не нужно переходить на него, поскольку мы продолжим поддерживать пакет в течение многих лет, но если вы начинаете новый проект, я бы рекомендовал вам попробовать httr2.

От себя добавлю, что с момента выхода httr2 все свои новые пакеты я уже писал на его основе.

————————————————
Что нового в httr2 1.0.0

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

Для управления политикой отправки набора запросов в данном релизе добавлены следующие 3 функции:

req_perform_sequential() - берет список запросов и выполняет их по одному.
req_perform_parallel() - берет список запросов и выполняет их параллельно (до 6 одновременно по умолчанию). По смыслу похоже на req_perform_sequential(), но, очевидно, быстрее за счет потенциальной нагрузки на сервер. У него также есть некоторые ограничения: самое главное, он не может обновить токен OAuth с истекшим сроком действия и игнорирует политику обработки ошибок настроенную через`req_retry()` и ограничение скорости отправки запросов через req_throttle().
req_perform_iterative() - принимает один запрос и функцию обратного вызова для генерации следующего запроса из предыдущего ответа. Это будет продолжаться до тех пор, пока функция обратного вызова не вернется NULL или max_reqs не будут выполнены запросы. Это очень полезно для API с поддержкой пагинации, которые сообщают только URL-адрес следующей страницы.

Небольшой пример кода для работы с набором запросов:

# формируем URL для запроса
urls <- paste0("https://swapi.dev/api/people/", 1:10)
# генерируем список объектов запроса
reqs <- lapply(urls, request)
# последовательно отправляем каждый запрос из списка
resps <- req_perform_sequential(reqs)

# функция для парсинга результатов
sw_data <- function(resp) {
tibble::as_tibble(resp_body_json(resp)[1:9])
}
# парсинг результата
resps |> resps_data(sw_data)


● В функцию req_url_query() добавлен аргумент .multi, который позволяет управлять поведением параметра, если вы передаёте в него набор значений в виде вектора:
- .multi = "comma" - разделение значений через запятую
- .multi = "pipe" - разделение значений через |
- .multi = "explode" - создание одного параметра для каждого значения (например a = c(1, 2) конвертируется в ?a=1&a=2)

● Так же у пакета теперь появился официальный логотип, который вы видите на изображении к посту.

Ссылки:
- Прочитать о выпуске httr2 1.0.0 можно по ссылке

Полезные материалы по httr2:
- Начало работы с httr2
- Оборачиваем API с помощью httr2
- Видео урок по созданию пакета обёртки над API с помощью httr2

#новости_и_релизы_по_R
Опубликовал видео воркшопа по анализу показателя качества ключевых слов в Google Ads с помощью пакета rgoogleads

Воркшоп прошел ещё 14 сентября, но у меня только недавно добрались руки до его записи.

Описание:
Воркшоп по работе с Google Ads API с помощью языка R и пакета rgoogleads. В ходе которого мы с нуля разберёмся как пройти авторизацию, запрашивать отчёты из Google Ads, и проанализируем показатель качества ключевых слов рекламного аккаунта.

Тайм коды:
00:00:00 Приветствие
00:01:12 О спикере
00:03:43 Программа воркшопа
00:04:14 Что такое контекстная реклама и сервис Google Ads
00:06:34 Варианты авторизации в пакете rgoogleads
00:07:24 Авторизация в Google Ads с помощью дефолтных параметров пакета rgoogleads
00:10:00 Создание собственных учётных данных для авторизации
00:21:12 Авторизация в Google Ads с помощью собственных учётных данных
00:23:00 Иерархия аккаунтов в Google Ads API
00:24:53 Ограничения при использовании собственных учётных данных
00:25:54 Автоматизация процесса авторизации с помощью переменных среды
00:26:43 Опции пакета rgoogleads
00:27:34 Запрос отчётов из Google Ads API
00:30:49 GAQL QueryBuilder
00:34:52 Пример запроса отчётов из Google Ads API
00:39:54 Аргументы функции gads_get_report()
00:41:13 Загрузка отчётов из Google Ads API в многопоточном режиме
00:44:34 Запрос объектов рекламного кабинета Google Ads
00:45:49 Что такое показатель качества ключевых слов и как проходит аукцион среди рекламодателей в Google Ads
00:47:47 Что влияет на показатель качества ключевых слов Google Ads
00:48:29 На что влияет показатель качества Google Ads
00:49:16 Пример анализа качества ключевых слов
01:03:36 Ответы на вопросы

Организаторы:
- Дмитрий Серебренников
- Kazakhstan Sociology Lab (сайт, инстаграм, LinkedIn, группа в тг)

Ссылки:
- Видео на YouTube
- Страница с материалами воркшопа

#видео_уроки_по_R
Курс "Разработка пакетов на языке R" опубликован на bookdown.org

В начале месяца я упоминал о завершении разработки последнего, 14-го урока курса и о планах опубликовать его на bookdown. Итак, рад сообщить, что курс теперь доступен на указанной платформе.

О курсе:
Что касается содержания курса, он был создан под впечатлением от книги Хедли Викхема и Дженни Брайан "R Packages (2e)". Мой опыт в разработке R-пакетов начался в 2016 году, и, как выяснилось, мои первые шаги были далеко не самыми эффективными. Книга Хедли предоставила современный и эффективный подход к разработке пакетов, что я внедрил в этот курс.

Курс объединяет мой семилетний опыт в создании пакетов с тем, что было представлено Викхемом и Брайан в их книге. У этих авторов есть чему поучиться.

Этот курс будет полезен как тем, кто только начинает свой путь в создании пакетов, так и тем, кто уже обладает опытом, поскольку в нем рассматриваются передовые практики в разработке пакетов. Так, что если вы не пробовали ещё себя в разработке пакета, то самое время попробовать.

Хотя некоторые теоретические главы книги были опущены, вместо них были добавлены уроки по созданию пакетов-обёрток над API с использованием httr2 и gargle.

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

Программа курса:
1. Обзор рабочего процесса разработки пакета
2. Настройка системы и интеграция с GitHub
3. Рекомендации по организации R кода
4. Добавление данных в пакет
5. DESCRIPTION - Метаданные пакета
6. NAMESPACE - Зависимости пакета
7. Разработка юнит-тестов к функциям пакета (пакет testthat)
8. Написание документации к функциям пакета
9. Виньетки и прочая опциональная документация пакета
10. Разработка сайта пакета (пакет pkgdown)
11. Публикация в CRAN
12. Разработка пакета обёртки над API (пакет httr2)
13. Разработка пакета обёртки для Google API (пакет gargle)
14. Как создать коллекцию пакетов

Буду признателен за репосты!

Ссылки:
- Курс на bookdown
- Сайт курса
- Плейлист на YouTube
- Благодарности автору

#курсы_по_R
Время обновить пакеты rfacebookstat и rlinkedinads

1. rfacebookstat - пакет для запроса статистики из рекламных кабинетов Facebook и Instagram

Пакет был переведён на работу с Facebook Marketing API v18.

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

2. rlinkedinads - пакет для запроса статистики из рекламных кабинетов Linkedon

В rlinkedinads была исправлена ошибка обновления токена. Кроме обновления никаких дополнительных действий не требуется.

#новости_и_релизы_по_R
Релиз bigrquery 1.5.0

Я довольно плотно работаю с BigQuery, соответственно не редко использую для этого пакет bigrquery. Пару дней назад был достаточно важный релиз bigrquery 1.5.0,

Что нового:

Основные изменения:

* Из пакета были исключены все устаревшие функции, т.е. те, названия которых начинаются НЕ с префикса bq_.
* bq_table_download() теперь возвращает в текстовом формате поля, которые в BigQuery хранятся в неизвестном для R типе. Ранее вы получали ошибку при попытке загрузить таблицы с полями которые имели тип BIGNUMERIC или JSON.
* Теперь bigrquery анализирует даты с помощью пакета clock. Это приводит к значительному повышению производительности и гарантирует корректный анализ дат до 1970-01-01.

Изменение в DBI интерфейсе:

* Наборы данных и таблицы bigquery теперь будут отображаться на панели подключений при использовании dbConnect().
* Добавлена поддержка функций dbAppendTable(), dbCreateTable() и dbExecute()
* В dbGetQuery() и dbSendQuery() поддерживают передачу параметров запросов с помощью аргумента params.

Так же ряд менее значительных изменений получил и dbplyr интерфейс, например tbl() теперь работает не только с физическими таблицами, но и с представлениями (View).

Более подробно обо всех изменениях можно почитать на GitHub.

#новости_и_релизы_по_R
Добавляем полезные аннотации к части вызова пакетв в своих скриптах

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

library(rjira)
library(dplyr)
library(tidyr)
library(snakecase)
library(purrr)
library(stringr)
library(bigrquery)
library(googlesheets4)
library(glue)


Это реальный пример загрузки пакетов в одном из моих скриптов. Пакет annotater добавляет в RStudio Addon, который позволяет добавить описание вызовам пакетов, на данный момент доступно 5 типов аннотаций:

1. Annotate package calls in active file

Добавляет тайтлы пакетов к команде их вызовов. т.е. превратит пример выше в следующий:


library(rjira) # Work with Jira API
library(dplyr) # A Grammar of Data Manipulation
library(tidyr) # Tidy Messy Data
library(snakecase) # Convert Strings into any Case
library(purrr) # Functional Programming Tools
library(stringr) # Simple, Consistent Wrappers for Common String Operations
library(bigrquery) # An Interface to Google's 'BigQuery' 'API'
library(googlesheets4) # Access Google Sheets using the Sheets API V4
library(glue) # Interpreted String Literals


2. Annotate package repository source in active file

Добавляет информацию о репозитории и версии пакета:

library(rjira)         # [github::selesnow/rjira] v0.0.0.9000
library(dplyr) # CRAN v1.1.2
library(tidyr) # CRAN v1.2.1
library(snakecase) # CRAN v0.11.0
library(purrr) # CRAN v0.3.4
library(stringr) # CRAN v1.4.1
library(bigrquery) # CRAN v1.5.0
library(googlesheets4) # CRAN v1.0.1
library(glue) # CRAN v1.6.2


3. Annotate tittles and repository sources in active file

Эта опция добавит одновременно и описание пакета и описание репозитория и его версии

4. Annotate each package's function calls

Пропишет возле вызова пакета список функций. который в текущем скрипте из этого пакета используется.

library(rjira) # jr_get_fields jr_issue_search
library(dplyr) # %>% filter mutate left_join group_by row_number ungroup pull select all_of coalesce any_of where rename_with matches across
library(tidyr) # %>% all_of any_of unnest_wider matches hoist
library(snakecase) # to_snake_case
library(purrr) # %>% map_dfc map
library(stringr) # %>% str_remove
library(bigrquery) # bq_auth bq_dataset bq_dataset_query bq_table bq_table_upload
library(googlesheets4) # gs4_auth range_read %>%
library(glue) # glue_sql


5. Expand metapackages

Разворачивает вызов метапакета, в отдельные вызовы для каждого пакета, который в него входит.

Например вызов library(tidyverse) будет преобразован в:

####
library(ggplot2)
library(tibble)
library(tidyr)
library(readr)
library(purrr)
library(dplyr)
library(stringr)
library(forcats)
library(lubridate)
####


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

Пример работы на изображении к посту.

Ссылка на GitHub пакета annotater.

#заметки_по_R
Как разбить таблицу на части по заданному количеству строк

Иногда вам может потребоваться разбить таблицу на части, либо по количеству строк, либо по значениям какого то поля, в этом вам поможет функция split() из базового R.

Для начала построим тестовую таблицу:

# к-во строк в тестовой таблице
rows_in_table <- 570

# тестовая таблица
df <- data.frame(
row_num = 1:rows_in_table,
numbers = sample(1:9000, size = rows_in_table, replace = T),
letters = sample(letters, size = rows_in_table, replace = T)
)


Теперь разобьём таблицу на части по значению поля letters:

# Разбивка по значению какого либо поля
df_split_by_column <- split(df, df$letters)


$a
# A tibble: 28 x 3
row_num numbers letters
<int> <int> <chr>
1 3 8 a
2 11 2217 a
3 19 1948 a
4 34 338 a
5 54 604 a
6 64 754 a
7 68 3479 a
8 92 3942 a
9 160 7475 a
10 169 2507 a
# i 18 more rows
# i Use `print(n = ...)` to see more rows

$b
# A tibble: 20 x 3
row_num numbers letters
<int> <int> <chr>
1 9 4438 b
2 14 56 b
3 109 6039 b
4 159 1749 b
5 175 8068 b
6 200 7444 b
7 220 1101 b
8 234 2396 b
9 260 3112 b
10 296 7411 b
11 302 4639 b
12 354 7716 b
13 396 4090 b
14 398 1540 b
15 424 6738 b
16 426 728 b
17 441 333 b
18 503 3346 b
19 548 3347 b
20 564 651 b

$c
# A tibble: 17 x 3
row_num numbers letters
<int> <int> <chr>
1 47 1900 c
2 89 8522 c
3 130 6156 c
4 131 246 c
5 148 8591 c
6 151 640 c
7 154 8428 c
8 209 4218 c
9 216 7774 c
10 298 753 c
11 307 8839 c
12 355 5903 c
13 421 5147 c
14 433 2422 c
15 442 3224 c
16 557 4346 c
17 562 8635 c

...


Так же мы можем разбить таблицу на части по заданному количеству строк:

# Разбивка по заданному количеству строк
chunk <- 100 # размер одной части в к-ве строк
n <- nrow(df) # вычисляем к-во строк исходной таблицы
r <- rep(1:ceiling(n/chunk),each=chunk)[1:n] # определяем каждую строку в определённую часть таблицы
df_split_by_100_rows <- split(df,r) # Разбиваем таблицу


$`1`
row_num numbers letters
1 1 1210 h
2 2 5087 y
3 3 81 y
4 4 5459 a
5 5 5665 j
6 6 3735 v
7 7 4309 p
8 8 3858 i
9 9 847 x
10 10 91 e
11 11 3859 k

...


#заметки_по_R
ggplot 3.5.0.

Привет, друзья! Давно я тут ничего не публиковал, но думаю пора возвращаться из творческого отпуска.

Хедли со своей командой в феврале этого года анонсировали выход новой версии ggplot2 3.5.0. А в конце апреля вышел к ней патч 3.5.1. Этот релиз включает множество улучшений и новых возможностей, которые делают работу с графиками еще более удобной и мощной. Давайте разберемся, что нового появилось в этой версии.

1. Обновления в темах графиков:

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

2. Усовершенствованные функции для координатных систем:

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

3. Новые геометрические объекты:

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

4. Оптимизация производительности:

Разработчики внесли изменения, которые улучшают производительность пакета. Графики теперь строятся быстрее, что особенно заметно при работе с большими наборами данных.


Примеры использования

Вот пример использования новой функции geom_density2d_filled для создания двухмерного плотностного графика:

library(ggplot2)

# Создаем примерный набор данных
data <- data.frame(x = rnorm(1000), y = rnorm(1000))

# Строим график с использованием новой функции
ggplot(data, aes(x = x, y = y)) +
geom_density2d_filled() +
theme_minimal() +
labs(title = "2D Density Plot with geom_density2d_filled",
x = "X Axis",
y = "Y Axis")


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

Ссылки:
Статья "ggplot2 3.5.0" в блоге Tidyverse

#новости_и_релизы_по_R
Видео: Личные кейсы использования ChatGPT в рутинных рабочих задачах

Друзья, я выпустил новый видеоурок, где делюсь своим опытом использования ChatGPT 4 в работе аналитика данных. В этом видео вы узнаете о моих успешных и не очень успешных кейсах применения ChatGPT для генерации кода на R и M, а также какие сложности возникли при переводе Python кода в R.

Что вас ждет в видео:
● Обзор пользовательских GPT для аналитиков данных
● Успешные примеры генерации R и M кода для различных задач
● Опыт автоматизации задач с помощью ChatGPT
● Пример неудачной попытки перевода кода с Python на R

Тайм-коды:
00:00 Вступление
01:08 Пользовательские GTP для аналитика данных
07:31 Успешный кейс №1: Генерация R кода для запроса курсов валют
13:33 Успешный кейс №2: Генерация кода на языке M для генерации справочников в Power Query
20:05 Успешный кейс №3: Генерация R кода для отправки HTTP запроса по скриншоту из Postman
24:56 Неуспешный кейс: Перевод Python кода в R
28:33 Заключение

В комментариях делитесь своими кейсами использования в работе ChatGPT.

Ссылки:
Статья с конспектом к видео уроку
Видео на YouTube

#видео_уроки_по_R
Новое видео на YouTube: Как настроить запуск R скриптов по расписанию с помощью GitHub Action

В новом видеоуроке я погружаюсь в мир непрерывной интеграции и развёртывания (CI/CD), а также расскажу, как автоматизировать запуск скриптов с помощью GitHub Actions. Я покажу способ, который позволяет настроить расписание запуска ваших скриптов без необходимости аренды серверов.

Что вы узнаете из видео:

● Основы CI/CD и их роль в автоматизации.
● Настройка рабочего процесса с GitHub Actions.
● Конфигурация YAML файлов для управления рабочими процессами.
● Настройка автоматического запуска скриптов по расписанию.

Тайм-коды:
00:00 Вступление
00:49 CI/CD: Непрерывная интеграция и непрерывное развёртывание
01:45 Что такое GitHub Actions
02:30 Обзор рабочего процесса
03:05 Создание репозитория на GitHub
05:11 Добавляем в репозиторий R-скрипт
08:03 Настройка GitHub Actions
09:47 Конфигурация YAML файла, описывающего рабочий процесс
10:10 Настройка расписания запуска в YAML файле
12:17 Разбираем все команды в YAML файле рабочего процесса
19:01 Создание переменных среды в GitHub репозитории
20:26 Отправляем проект на GitHub
20:52 Запускаем GitHub Action
22:46 Заключение

Если видео окажется полезным и наберёт много откликов то в будущем запишу такое же видео про GitLab.

Ссылки:
Видео урок
Статья с конспектом к уроку

#видео_уроки_по_R
Please open Telegram to view this post
VIEW IN TELEGRAM
Преобразовываем речь в текст с помощью R и Google Speech-to-Text API

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

Google Speech-to-Text API является условно бесплатным, т.е. бесплатно вы можете в месяц с помощью этого сервиса преобразовать час аудио в текст.

Давайте пройдемся по всему процессу шаг за шагом.

1️⃣ Настройка проекта Google Cloud
Прежде чем начать кодить, нам нужно настроить проект в Google Cloud:

1. Зайдите на console.cloud.google.com и создайте новый проект.
2. Включите API Speech-to-Text в разделе "APIs & Services".
3. Создайте учетные данные (Service Account Key) для доступа к API:
3.1. Перейдите в "APIs & Services" > "Credentials"
3.2. Нажмите "Create Credentials" > "Service Account Key"
3.3. Выберите роль "Project" > "Owner"
3.4. Скачайте JSON файл с ключом

2️⃣ Установка необходимых пакетов R

install.packages(c("tuneR", "seewave", "googledrive", "googleAuthR", "googleLanguageR", "av"))


3️⃣ Код функции
Вот функция, которая делает всю магию:

library(tuneR)
library(seewave)
library(googledrive)
library(googleAuthR)
library(googleLanguageR)
library(av)

speech_to_text_from_audio <- function(audio_file_path) {
# Определяем расширение файла
file_ext <- tolower(tools::file_ext(audio_file_path))

# Создаем временный WAV файл
temp_wav_file <- tempfile(fileext = ".wav")

# Обработка в зависимости от типа файла
if (file_ext == "mp3") {
audio <- readMP3(audio_file_path)
} else if (file_ext == "wav") {
audio <- readWave(audio_file_path)
} else if (file_ext == "ogg") {
# Конвертируем OGG в WAV
av_audio_convert(audio_file_path, temp_wav_file)
audio <- readWave(temp_wav_file)
} else {
stop("Неподдерживаемый формат файла. Поддерживаются только MP3, WAV и OGG.")
}

# Если аудио стерео, конвертируем в моно
if (audio@stereo) {
audio <- mono(audio, "both")
}

# Изменяем частоту дискретизации на 16000 Гц, только если текущая частота отличается
if (audio@samp.rate != 16000) {
audio_resampled <- resamp(audio, g = 16000, output = "Wave")
} else {
audio_resampled <- audio
}

# Записываем обработанное аудио во временный WAV файл
writeWave(audio_resampled, temp_wav_file)

# Выполняем распознавание речи
result <- tryCatch({
gl_speech(temp_wav_file,
languageCode = "ru-RU",
sampleRateHertz = 16000)$transcript
}, error = function(e) {
return(paste("Ошибка при распознавании речи:", e$message))
})

# Удаляем временный WAV файл
file.remove(temp_wav_file)

# Возвращаем результат
return(result$transcript)
}


4️⃣ Использование функции

# Пример использования:
# Не забудьте аутентифицироваться перед использованием функции
gl_auth("path/to/your/google_cloud_credentials.json")

# Теперь вы можете использовать функцию так:
mp3_file <- "path/to/your/voice.mp3"
ogg_file <- "path/to/your/voice.ogg"

transcript_mp3 <- speech_to_text_from_audio(mp3_file)
transcript_ogg <- speech_to_text_from_audio(ogg_file)


В результате получим следующее:

> transcript_mp3
[1] "небольшая текстовая начитка для преобразования речи в текст с помощью языка R"


Ниже два небольших файла, один в mp3, второй в ogg формате, для тестов.

#заметки_по_R
Обновления в книге по созданию Telegram-ботов!

Привет, друзья! Рад сообщить вам о свежих обновлениях в моей книге. Вот что нового:

Новая обложка: Книга обзавелась новым дизайном.

Глава 1: В раздел [Создаём бота, и отправляем с его помощью сообщения в Telegram] добавлен новый раздел [Настраиваем запуск расписания отправки сообщения с помощью GitHub Actions]. Теперь вы узнаете, как автоматизировать отправку сообщений с помощью мощных инструментов CI/CD.

Глава 2: В раздел [Добавляем боту поддержку команд и фильтры сообщений, класс Updater] добавлен новый раздел [Обработка голосовых сообщений. Переводим голосовое сообщение в текст]. Мы рассмотрим, как преобразовать голосовые сообщения в текст и приведём пример бота, выполняющего эту задачу.

Глава 2: Также добавлен новый раздел [Бот для сбора статистики из Telegram чатов]. Вы научитесь создавать бота, который собирает и анализирует статистику из чатов, что может быть полезно для анализа активности и взаимодействия.

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

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

В данный момент я работаю над новой главой книги, и буду рад поделиться с вами новыми подробностями, как только они будут готовы.

#онлайн_книги_по_R
Как настроить запуск R скриптов по расписанию в Google Cloud Run

Продолжаем изучать тему удалённой автоматизации запуска ваших скриптов. В этом видео мы погружаемся в мир Google Cloud Run и разбираемся с тем, как автоматизировать запуск R скриптов по расписанию. Мы подробно разберём каждый шаг — от настройки облачной платформы до создания Docker образа и его публикации. Итог — условно бесплатная автоматизированная система для выполнения скриптов без постоянного вмешательства.

Что вы узнаете из видео:
● Какой софт понадобится для настройки и запуска скриптов.
● Что такое Google Cloud Run и как он поможет автоматизировать задачи.
● Как настроить проект в Google Cloud для работы с R скриптами.
● Как создать Docker образ и развернуть его в облаке.
● Как настроить регулярный запуск скрипта с помощью триггеров.

Тайм-коды:
00:00 Введение
00:32 Какой софт нам понадобится
01:01 Что такое Google Cloud Run
02:25 Обзор рабочего процесса
03:26 Создание и настройка проекта в Google Cloud
05:36 Обзор R скрипта, который мы будет запускать по расписанию
07:07 Создание Dockerfile
09:54 Локальная сборка Docker образа и запуск контейнера
11:51 Инициализация проекта Google Cloud с Google Cloud SDK Shell
13:43 Отправка Docker образа в Google Container Registry
14:33 Создание Job в Google Cloud Run
16:07 Создание триггера для запуска скрипта по расписанию
18:31 Заключение

Полезные ссылки, которые я упоминаю в видео:
Как создать Telegram бота и получить токен
Как упаковать Telegram бота в Docker
Курс по разработке Telegram ботов на R

Не забывайте подписываться на YouTube канал!

#видео_уроки_по_R
Новый урок на YouTube: Развёртывание Telegram-бота в Google Cloud Run!

Привет, друзья!

Не так давно я рассказывал о том, что работаю над новой главой книги по разработке telegram ботов на R. Так вот, мы на финишной прямой нашего пути по созданию Telegram-ботов, и я рад представить вам новый видеоурок, в котором мы освоим важный шаг — развертывание бота в облаке с помощью Google Cloud Run!

В этом видео вы узнаете:

● Что такое Google Cloud Run и как он поможет вашему боту
● Как настроить и развернуть бота в облаке
● Основы технологии Webhook и Docker
● Пошаговое руководство по созданию, сборке и запуску Docker образа

Тайм-коды:
00:00 Вступление
00:37 Какой софт нам потребуется
01:25 Что такое Google Cloud Run
02:45 Обзор рабочего процесса
04:30 Код бота
05:20 Технология Webhook
10:44 Обзор Dockerfile
14:33 Локальная сборка Docker образа
17:35 Настройка проекта в Google Cloud
19:45 Инициализация Google Cloud SDK
22:10 Тегирование и пушинг Docker образа
23:04 Первый запуск бота
24:14 Корректировка WEBHOOK_URL
25:33 Пересборка и пушинг Docker образа
27:03 Развёртывание в Google Cloud Run
27:14 Проверка бота
28:10 Заключение

Ссылки:
Видео урок

#видео_уроки_по_R