Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Строка итоговых значений #7

Open
danzerzine opened this issue Dec 20, 2021 · 10 comments
Open

Строка итоговых значений #7

danzerzine opened this issue Dec 20, 2021 · 10 comments

Comments

@danzerzine
Copy link

danzerzine commented Dec 20, 2021

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

Код:

library(dplyr)
library(rym)
library(lubridate)

today <- Sys.Date()
start_date <- seq(as.Date("2021-09-01"), today, by = "months")
end_date <- seq(as.Date("2021-10-01"),  today, by = "months")
end_date <- c(end_date, today)
start_date
end_date

metrika_all_visits <- list()
for (i in seq_along(start_date)) {
  rym_basic <-
    rym_get_data(
      counters = "*",
      date.from = start_date[i],
      date.to = end_date[i],
      dimensions = "ym:pv:date, ym:pv:URLPath",
      metrics = "ym:pv:pageviews",
      sort = "-ym:pv:date",
      login = "*",
      token.path = "~/metrica_token",
      accuracy = "full",
      include.undefined = TRUE,
      lang = "ru"
    )
  # добавляем результат итерации в общий список
  metrika_all_visits <-
    dplyr::bind_rows(metrika_all_visits, rym_basic)
  Sys.sleep(0.5)
  gc()
}
metrika_all_visits %>% 
  readr::type_convert() %>%
  arrange(desc(Просмотры)) %>%
  glimpse()

Результат:

# A tibble: 1,227,134 × 3
   `Дата просмотра` `Путь страницы` Просмотры
   <chr>            <chr>               <dbl>
 1 Итого и средние  NA                4889328
 2 Итого и средние  NA                4889328
 3 Итого и средние  NA                4889328
 4 Итого и средние  NA                4806073
 5 Итого и средние  NA                4806073
 6 Итого и средние  NA                4806073
 7 Итого и средние  NA                4220184
 8 Итого и средние  NA                4220184
 9 Итого и средние  NA                4220184
10 Итого и средние  NA                3960399
# … with 1,227,124 more rows
> 
@selesnow
Copy link
Owner

Спасибо за информацию, в ближайшее время возьму в работу.

@selesnow
Copy link
Owner

Подскажите, а зачем вам цикл?

Дело в том, что мне кажется что на каждой итерации цикла у вас получается (при каждом запросе) в ответе всего 1 строка, с этим и связано, что у вас просто кроме итоговой строки ничего не прилетает.

@danzerzine
Copy link
Author

danzerzine commented Dec 21, 2021

Привет!

Спасибо за информацию, в ближайшее время возьму в работу.

И вам спасибо, без ваших библиотек как без рук!

Подскажите, а зачем вам цикл?

В счетчике очень много данных, из-за чего все запросы с интервалом больше месяца чаще всего отдают ошибку 400. Поскольку приходится делать периодические backfill выгрузки и материализовывать разные срезы из Метрики, то пришлось прибегнуть к циклу который итерировал бы запросы с самой ранней даты и до вчерашнего дня, разбивая его автоматически по месяцам и подставляя нужные даты в date.from и date.to (как пример)

Про 1 строку в ответе не до конца понял -- у меня сохранился результат последней итерации за декабрь, в ней 234 375 строк

CleanShot 2021-12-21 at 20 47 53

@selesnow
Copy link
Owner

А какая у вас версия пакета?

Посмотрите в NEWS изменения, которые были внесены в версии 1.0.4

Ранее пакет всегда убирал последнюю строку считая её строкой итогов, даже если в отчёте прилетала всего 1 строка.

Начиная с версии 1.0.4 пакет не удаляет строку, если в ответе прилетел отчёт состоящий всего из одной строки, грубо говоря если вы никакие dimension не задали, или комбинация dimension вернула всего одну строку отчёта.

@danzerzine
Copy link
Author

Да, я обратил внимание на changelog, но насколько понимаю строка появилась наоборот, как раз после последнего обновления.

r$> library(rym)                                                                                                                                                                                          
---------------------
Welcome to rym version 1.0.5 - R Interface to Yandex.Metrica API.

@selesnow
Copy link
Owner

Сама по себе идея добавлять в ответ API строку итогов мне не понятна, но её мы решить не сможем.

Смотрите как работает пакет:

  1. Если в ответе прилетела всего одна строка он её не удаляет, т.к. считает что это не итоги.
  2. Если в ответе прилетело более одной строки, то он удаляет нижнюю т.к. это итоговая строка.

Вот у вас такое впечатление, что апи метрики отдаёт всего одну строку, и это получается строка итогов, на некоторых итерациях цикла, можете это проверить?

@danzerzine
Copy link
Author

danzerzine commented Dec 31, 2021

Про добавление строки итогов в API согласен абсолютно, равно как странно и то что нельзя смешивать сессионные и хитовые метрики в одном запросе, имея при этом эндпоинт который отдает древовидную структуру. Энивей -- я пока заделал эту дыру добавлением внутри цикла filter(across(everything(), ~ !grepl("Итого и средние", .))) однако смущает что возможно в моем кейсе может не работать что-то еще на уровне дробления подзапросов т.к. total_rows ответа вероятнее всего всегда превышает 100 000

Вот у вас такое впечатление, что апи метрики отдаёт всего одну строку, и это получается строка итогов, на некоторых итерациях цикла, можете это проверить?

Я с радостью, только подскажите как, во что нужно обернуть код выше чтобы можно было дебагнуть результаты всех запросов включая те что в пакете?

@selesnow
Copy link
Owner

Прогнал ваш код по своему счётчику, и у меня нет итоговой строки:

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

  if ( 'Итого и средние' %in% unique(rym_basic$`Дата просмотра`)) {
    message("Catch total rows, date ", start_date[i])
    total_rows_data <- rym_basic
    break
  }

Весь код выглядит так:

library(dplyr)
library(rym)
library(lubridate)

today <- Sys.Date()
start_date <- seq(as.Date("2021-09-01"), today, by = "months")
end_date <- seq(as.Date("2021-10-01"),  today, by = "months")
end_date <- c(end_date, today)
start_date
end_date

rym_auth(login = 'selesnow')
rym_get_counters()
metrika_all_visits <- list()
for (i in seq_along(start_date)) {
  rym_basic <-
    rym_get_data(
      counters = "22584910",
      date.from = start_date[i],
      date.to = end_date[i],
      dimensions = "ym:pv:date, ym:pv:URLPath",
      metrics = "ym:pv:pageviews",
      sort = "-ym:pv:date",
      login = 'selesnow',
      token.path = "~/metrica_token",
      accuracy = "full",
      include.undefined = TRUE,
      lang = "ru"
    )
  
  if ( 'Итого и средние' %in% unique(rym_basic$`Дата просмотра`)) {
    message("Catch total rows, date ", start_date[i])
    total_rows_data <- rym_basic
    break
  }
  
  # добавляем результат итерации в общий список
  metrika_all_visits <-
    dplyr::bind_rows(metrika_all_visits, rym_basic)
  Sys.sleep(0.5)
  gc()
}
metrika_all_visits %>% 
  readr::type_convert() %>%
  arrange(desc(Просмотры)) %>%
  glimpse()

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

Жду результата проверки от вас, самому интересно)

@danzerzine
Copy link
Author

danzerzine commented Jan 1, 2022

Так, я прогнал следующий код

library(dplyr)
library(rym)
library(lubridate)
library(Hmisc)
library(anonymizer)
library(vroom)

start_date <- seq(as.Date("2021-09-01"), as.Date("2021-12-31"), by = "months")
end_date <- seq(as.Date("2021-10-01"), as.Date("2021-12-31"), by = "months")
end_date <- c(end_date, as.Date("2021-12-31"))
start_date
end_date

metrika_all_visits <- list()
for (i in seq_along(start_date)) {
  rym_basic <-
    rym_get_data(
      counters = counter,
      date.from = start_date[i],
      date.to = end_date[i],
      dimensions = "ym:pv:date, ym:pv:URLPath",
      metrics = "ym:pv:pageviews",
      sort = "-ym:pv:date",
      login = login,
      token.path = "~/metrica_token",
      accuracy = "full",
      include.undefined = TRUE,
      lang = "ru"
    )
  
  if ('Итого и средние' %in% unique(rym_basic$'Дата просмотра')) {
    message("Catch total rows, date ", start_date[i])
    total_rows_data <- rym_basic
    break
  }
  
  # добавляем результат итерации в общий список
  metrika_all_visits <-
    dplyr::bind_rows(metrika_all_visits, rym_basic)
  Sys.sleep(0.5)
  gc()
}


total_rows_data$`Путь страницы` <- anonymize(total_rows_data$`Путь страницы`)

В итоге получилось:

Load token from ~/metrica_token/*RData
Token expire in 290 days
Catch total rows, date 2021-09-01         

> total_rows_data %>% arrange(desc(Просмотры))

# A tibble: 332,062 × 3
   `Дата просмотра` `Путь страницы`                                                  Просмотры
   <chr>            <chr>                                                                <dbl>
 1 Итого и средние  5bc0a094eec224eef9194735021cb1eb1d7fd1eb577392b6bad624703de06c56   4220184
 2 Итого и средние  5bc0a094eec224eef9194735021cb1eb1d7fd1eb577392b6bad624703de06c56   4220184
 3 Итого и средние  5bc0a094eec224eef9194735021cb1eb1d7fd1eb577392b6bad624703de06c56   4220184
 4 2021-09-20       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     22090
 5 2021-09-27       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     20474
 6 2021-09-21       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     19989
 7 2021-09-16       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     19440
 8 2021-09-23       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     19388
 9 2021-09-13       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     19348
10 2021-09-08       a9c352c4c774c28a7e7d70ee040c9bdbb34ed0e261886b78d3e3637f1525e786     19167
# … with 332,052 more rows

@selesnow
Copy link
Owner

Очень странное поведение, почему один запрос возвращает сразу 3 строки итого, у меня не получается такое поведение на своей стороне воспроизвести.

Может у вас будет возможность временно расшарить на меня доступ к этому счётучику метрики?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants