Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.
library(bigrquery) library(magrittr) bq_auth(email = '[email protected]') ds <- bq_dataset(project = "my_proj", dataset = 'my_ds') # тестовые данные df <- data.frame( gr = c('a', 'a', 'a', 'b', 'b'), val = c(3, 5, 1, 3,4) ) # создаём кластеризированную таблицу bq_mtcars <- bq_table_create( bq_table(ds, 'cluster_tbl'), clustering = list(fields = "gr"), fields = as_bq_fields(df) ) # записываем данные bq_table(project = "my_proj", dataset = "my_ds", table = "cluster_tbl") %>% bq_table_upload( values = df, write_disposition = "WRITE_APPEND" ) # запрашиваем данные sql <- "SELECT * FROM my_ds.cluster_tbl WHERE gr = 'b'" bq_df <- bq_project_query('choice31', sql) %>% bq_table_download()Т.е. для создания кластеризированной таблицы необходимо: 1. Использовать аргумент
clustering передав в него список столбцов для кластеризации.
2. Передать в аргумент fields структуру будущей таблицы с помощью as_bq_fields(df).
Как правильно запрашивать данные из кластеризированной таблицы
Вы можете запрашивать данные из кластеризированной таблицы также, как и из обычной. Но для того, что бы получить эффект от кластеризации соблюдайте следующие правила:
● Кластеризация работает при фильтрации данных в блоке WHERE, и агрегации данных используя блок GROUP BY.
● Соблюдайте порядок обращения к столбцам, такой же как указывали при кластеризации.
● Нельзя использовать в выражении фильтрации кластеризированное поле, с каким либо другим полем.
● Используйте только простейшие выражения, например нельзя использовать при фильтрации по кластерному полю функции его преобразования.
Ссылки:
- Introduction to clustered tables
- Creating and using clustered tables
- Querying clustered tables
#заметки_по_Rpatchwork. patchwork по сути решает туже проблему, что и gridExtra::grid.arrange() и cowplot::plot_grid(), но имеет более простой синтаксис.
Рассмотрим несколько примеров:
library(ggplot2) library(patchwork) # создаём 2 графика p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) # располагаем их на одном изображении p1 + p2Пример более сложного макета, в котором 3 графика будут располагаться в верхней части изображения, и один в нижней.
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))
(p1 | p2 | p3) /
p4
Так же управлять макетом изображения вам позволяет функция plot_layout():
p1 + p2 + p3 + p4 + plot_layout(ncol = 3)Аргументы функции
plot_layout():
● ncol, nrow - Размеры создаваемой сетки, если оба равны NULL, для установки размеров будет использоваться та же логика, что и при использовании facet_wrap().
● byrow - Аналогично byrow в matrix(). При значении FALSE, графики будут заполнены по столбцам.
● widths, heights - Относительная ширина и высота каждого столбца и строки в сетке. Будет повторяться, чтобы соответствовать размерам сетки.
● guides - Позволяет расположение общей легенды объединяемых графиов, принимает одно из следующих значений: 'collect', 'keep', 'auto'
● tag_level - Автопометка графиков, принимает одно из следующих значений: 'keep', 'new'
● design - Спецификация расположения областей графиков на макете.
Пример работы с аргументом design
p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) p3 <- ggplot(mtcars) + geom_bar(aes(gear)) + facet_wrap(~cyl) p4 <- ggplot(mtcars) + geom_bar(aes(carb)) p5 <- ggplot(mtcars) + geom_violin(aes(cyl, mpg, group = cyl)) # пример 1 design <- c( area(1, 1, 2), area(1, 2, 1, 3), area(2, 3, 3), area(3, 1, 3, 2), area(2, 2) ) p1 + p2 + p3 + p4 + p5 + plot_layout(design = design) # пример 2 design <- " 122 153 443 " p1 + p2 + p3 + p4 + p5 + plot_layout(design = design)Результат работы этого примера вы видите на изображении к посту. Ссылки: - сайт пакета patchwork #заметки_по_R
RAdwords. В связи с чем, я начал работу над серией видео уроков по работе с более новым пакетом rgoogleads, который работает с Google Ads API.
В первом видео я рассказал как пройти авторизацию, создать собственные учётные данные, необходимые для работы с Google Ads API, и запросить структуру ваших аккаунтов.
Тайм коды:
00:00 Вступление
00:57 Варианты авторизации в пакете rgoogleads
02:33 Пример авторизации в Google Ads API с использованием параметров по умолчанию
03:57 Какие учётные данные необходимо создать, для авторизации в Google Ads API
04:43 Как создать управляющий аккаунт Google Ads и запросить токен разработчика
08:55 Как создать и настроить проект в Google Cloud для работы с Google Ads API
13:00 Настройка конфигурации авторизации в пакете rgoogleads
18:56 Переменные среды в пакете rgoogleads
20:33 Опции пакета rgoogleads
21:49 Работа с иерархией аккаунтов в Google Ads API
26:19 Заключение
Смотрите также:
- Опубликовано видео моего доклада "Зачем интернет маркетологу понимать что такое API. Разбираем устройство API Google Ads", с которым я выступал летом на 8P.
- Миграция с Google AdWords API на Google Ads API: подробный мануал
#видео_уроки_по_RGreenplumR - R пакет для работы с Greenplum.
#статьи_по_Rbulletchartr.
Установить bulletchartr в данный момент можно только с GitHub командой devtools::install_github("ACDIVOCATech/bulletchartr").
Пример построения простой пулевой диаграммы
library(bulletchartr)
# загрузка тестовых данных
data('bc_ex')
# обычная пулевая диаграмма
bullet_chart(dataframe = bc_ex)
Функция bullet_chart() имеет следующие аргументы:
● file_name - путь к Excel файлу с данными
● sheet_name - название листа в файле
● dataframe - data.frame с данными
● indicator_name - имя столбца, в котором есть имена вашего индикатора / KPI
● info - дополнительная информация для индикаторов (валюта, процент, символ и т. д.)
● current - текущее значение индикатора
● low - имя столбца с пессимистическим планом
● medium - имя столбца с реалистическим планом
● high - имя столбца с оптимистическим планом
● target - имя столбца с целью
● remove_no_targets - удалить индикаторы без указанного "целевого" значения
● legend - показать легенду
Пулевые диаграммы с учётом времени
Функции bullet_chart_symbols(), bullet_chart_wide(), and bullet_chart_vline() имеют другой масштаб оси x, по сравнению с диаграммами построенными функцией bullet_chart.
bullet_chart_wide(
file_name = read_example("Indicators_Targets_ext.xlsx"),
cal_type = "cal"
)
В данном случае ось X представляется как процент от годовой цели, так и процент прошедшего года. Есть вертикальная линия, показывающая TODAY, которая показывает, в каком процентном соотношении в году и в каком процентном отношении к цели мы находимся прямо сейчас. Если мы приближаемся к линии TODAY или за ней, то цвет внутри полосы зеленый, когда мы близки к достижению цели - цвет оранжевый, , и если мы сильно отстаем от графика / цели, цвет красный.
Описанные в этом разделе функцию имеют несколько другой набор аргументов:
● actual - имя столбца с актуальным значением достижения KPI
● actual_lastweek - имя столбца, в котором хранится фактические значение достижения KPI за прошлую неделю
● actual_lastyear - имя столбца, в котором хранится фактические значение достижения KPI за прошлый год
● target - имя столбца с плановым показателем KPI
● for_year - отчётный год
● cal_type - какой календарь вы используете. Возможные варианты: «fis» для финансового года, начинающегося 1 октября, «cal» для календарного года, начинающегося 1 января, или введите собственную дату в формате «ГГГГ / ММ / ДД»
И несколько других, менее важных аргументов.
Ссылки:
- Проект пакета на GitHub
#заметки_по_R*leaflet*, который позволяет строить интерактивные карты в R.
Ссылки:
- видео урок
- практика
Смотрите также:
- запись воскресного скRинкаста по работе leaflet
- 2 видео урока о построении карт на языке R
#видео_уроки_по_RBinSeqBstrap, который посвящен решению задачи определения неустранимых разрывов первого рода в задачах регрессии.
#статьи_по_R|>, теперь с помощью нижнего подчёркивания вы можете прокидывать результат предыдущей операции, не только в первый аргумент следующей функции, но и в любой другой именованный аргумент.
# This works in R 4.2 mtcars |> lm(mpg ~ disp, data = _)● Была улучшена страница справки, например примеры в блоке Examples теперь можно запустить кликом по ссылке "Run examples" ● Операторы
while() и if() теперь возвращают ошибку, если заданное условие имеет длинну более 1:
if (1:2 == 1) do_something() # Error in if (1:2 == 1) do_something() : the condition has length > 1● В Windows прекращена поддержка 32 битной версии R ● На Windows пользовательская библиотека пакетов перемещена с R\win-library\x.y (где x.y номер версии R) в скрытую директорию данных приложений C:\Users\username\AppData\Local. Ссылки: - Информация данного поста заимствована из статьи "New features in R 4.2.0" - Скачать R 4.2.0 alpha для Windows можно по ссылке #новости_и_релизы_R
for, while и repeat
● Обработка ошибок: конструкции try() и tryCatch()
● Функции семейства apply
● Итерирование с помощью функций пакета purrr
● Обработка ошибок: функции safely(), possibly(), quietly()
● Введение в многопоточность, пакеты: foreach, doFuture, pbapply, furrr
● Реализация многопоточности с помощью пакета future
—————————
В военное, и любое другое кризисное время наиболее правильной инвестицией времени является обучение. Поэтому надеюсь, что этот курс многим в текущей ситуации будет полезен.
Планирую в апреле постепенно возвращаться к регулярным публикациям в канале, не смотря на то, что война продолжается, необходимо работать, обучаться и продолжать жить.
—————————
#курсы_по_Rfuture является ядром библиотеки futureverse, и пожалуй самым мощным интерфейсом параллельного программирования на языке R.
В ходе урока мы разберём его интерфейс и функционал на нескольких практических примерах.
Тайм коды:
00:00 Вступление
01:15 Явное и неявное объявление фьючерсов
04:33 Аргументы функции future
05:40 Локальное окружение фьючерса
06:42 Стратегии выполнения вычислений в пакете future
08:20 Как менять стратегию выполнения кода с помощью future
10:42 Настройка плана cluster
12:09 Вложенные друг в друга фьючерсы
18:00 Отладка ошибок в фьючерсах
19:03 Многопоточное итерирование с помощью future
21:58 Пример использования future в многопоточном режиме
26:07 Опции и переменные среды пакета future
28:00 Другие пакеты входящие в библиотеку futureverse
29:10 Заключение
—————————
Этот видео урок должен был быть опубликован ещё 1 марта. С момента запуска канала, я старался держать темп на уровне хотя бы одной публикации в будний день, но в условиях войны это невозможно. Тем не менее, цель данного канала - образование, и в текущей ситуации для многих вопрос образования очень актуален, к тому же у меня были записаны и смонтированы несколько уроков ещё в декабре - январе, и уже готов курс "Циклы и функционалы в языке R". Курс постараюсь опубликовать в свободный доступ уже на следующей неделе.
—————————
#видео_уроки_по_Rplot.new() polygon(x = c(0, 1, 1, 0), y = c(0, 0, 0.5, 0.5), col = "#FFDD00") polygon(x = c(0, 1, 1, 0), y = c(0.5, 0.5, 1, 1), col = "#0057B7")
tidyr::unnest_longer() и unnest_wider().
Все пакеты входящие в tidyverse имеют шикарную, наверное лучшую, документацию. Все функции имеют детальное описание, и огромное количество примеров кода их использования. Но в функциях разворачивания списков, таких как hoist(), unnest_longer() и unnest_wider(), есть несколько аргументов, которые имеют лишь краткое описание, но примеров их использования нет. Да и мои попытки нагуглить варианты их использования не увенчались успехом.
Ниже мы разберём аргументы ptype и transform доступные в unnest_*() функциях.
Описание аргументов:
● transform, .transform - Необязательный аргумент, принимает именованный список функций преобразования, применяемых к каждому компоненту. Используйте эту функцию, если вы хотите преобразовать или проанализировать отдельные элементы по мере их разворачивания.
● ptype, .ptype - Необязательный аргумент, принимает именованный список прототипов, объявляющий желаемый тип вывода каждого компонента. Используйте этот аргумент, если вы хотите проверить, что каждый элемент имеет типы, которые вы ожидаете при разворачивании списка.
Примеры использования:
Для начала сгенерируем тестовый набор данных:
# тестовый список
test_list <- list(
list(name = 'John',
age = '37',
children = list('Paul', 'Ron')),
list(name = 'Tim',
age = '25',
children = list('Liza'))
)
Пробуем развернуть этот список, не используя дополнительные аргументы:
# первая попытка развёртывания tibble(uncol = test_list) %>% unnest_wider(uncol) # A tibble: 2 x 3 name age children <chr> <chr> <list> 1 John 37 <list [2]> 2 Tim 25 <list [1]>Какие проблемы мы можем решить с помощью аргументов ptype и transform Итак, вроде мы развернули наш список, но появилось две проблемы, которые далее мы исправим. 1. Возраст в поле
age является текстом, требуется привести его к целочисленному типу.
2. Поле children по прежнему является списком, а нам необходимо сделать так, что бы имена детей, были перечислены в одной ячейке через запятую.
Аргумент ptype
ptype позволяет вам добавить проверку типов данных, выходящего тиббла, например в следующем примере мы добавим проверку поля age.
# добавляем проверку типа данных в поле age
tibble(uncol = test_list) %>%
unnest_wider(
uncol,
ptype = list(age = 2)
)
Error: Can't convert <character> to <double>.
Сообщение об ошибке малоинформативное, но суть не меняется, мы проверяем тип данных в указанных полях , и если какое то из полей не соответствует указанному прототипу - мы получим ошибку.
Прототип - это просто образец данных нужного типа, если мы хотим убедиться, что какое то поле является целым числом, то необходимо в качестве прототипа передать любое целое число, я использовал 2, но вместо него можно передать любое другое целое число.
Аргумент transform
Аргумент transform позволит нам решить описанные ранее проблемы, а именно:
1. Преобразовать поле age в целочисленный тип.
2. Объединить элементы вложенного поля children через запятую, избавившись от вложенности.
# используем ptype и transform
tibble(uncol = test_list) %>%
unnest_wider(
uncol,
transform = list(
children = function(x) paste(x, collapse = ', '),
age = as.integer),
ptype = list(age = 2),
)
# A tibble: 2 x 3
name age children
<chr> <dbl> <chr>
1 John 37 Paul, Ron
2 Tim 25 Liza
Ссылки:
- видео урок по работе с функциями разворачивания списков
- перевод виньетки "Rectangling"
#заметки_по_R