Получение количества и просмотров страниц для домашней страницы на других страницах сайта за каждую страницу за час в BigQuery - PullRequest
0 голосов
/ 29 января 2020

Я чрезвычайно новичок в BigQuery и работаю над проектом по определению тенденций по часам для пользователей, переходящих с домашней страницы на каждую страницу нашего сайта на основе данных GA, я начал собирать воедино код для получения от домашней страницы до страницы под названием «/ wait-times», как я могу сделать это для домашней страницы с любой другой комбинацией страниц на нашем сайте?

hourly_wait_times = pd.io.gbq.read_gbq('''

select 

visitStartTime_HOUR,    
visitStartTime_DAY,     
sum(waitTimes) waitTimes,   #
sum(allPageViews) allPageViews   #
from (
  SELECT
  date,
  EXTRACT(HOUR FROM 
    DATETIME(TIMESTAMP_SECONDS(
        visitStartTime),'America/New_York')) visitStartTime_HOUR,
  EXTRACT(DATE FROM 
    DATETIME(TIMESTAMP_SECONDS(
        visitStartTime),'America/New_York')) visitStartTime_DAY,
  case when h.page.pagePath = "/wait-times" then 1 else 0 end waitTimes,
  1 allPageViews,
  h.page.hostname,
  h.page.pagePath,

  LAG(h.page.pagePath, 1) 
    OVER (PARTITION BY fullVisitorId, visitId, DATE ORDER BY h.hitNumber ASC) AS PreviousPage,
  LAG(h.page.pagePath, 1) 
    OVER (PARTITION BY fullVisitorId, visitId, DATE ORDER BY h.hitNumber DESC) AS NextPage
  FROM `MY-GA-SESSION`.`ga_sessions_*`, unnest(hits) h 
  WHERE

  _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 3 MONTH)) 
  AND FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
  and h.type = 'PAGE'
  and h.page.hostname = 'www.myhostname'

  ) A

where PreviousPage = '/'
group by visitStartTime_DAY, visitStartTime_HOUR
order by visitStartTime_DAY, visitStartTime_HOUR
 ''',
project_id=project_id)

Я бы хотел, чтобы таблица выглядела так, как это можно сделать?

+-------+------------+----------+------+-------+-----------+--+
| PageA |   PageB    |   date   | hour | count | pageviews |  |
+-------+------------+----------+------+-------+-----------+--+
| /     | /donations | 12/1/19  |    0 |     0 |       100 |  |
| /     |            |          |    1 |     4 |       254 |  |
| /     |            |          |  ... |       |           |  |
|       |            |          |   23 |     5 |       500 |  |
|       |            | ...      |      |       |           |  |
| /     |            | 3/1/19   |    0 |     1 |       183 |  |
|       |            |          |  ... |       |           |  |
| /     |            |          |      |       |           |  |
| /     |            |          |   23 |     6 |       600 |  |
| /     | /store     | 12/1/19  |    0 |     2 |       100 |  |
|       |            |          |  ... |       |           |  |
+-------+------------+----------+------+-------+-----------+--+

1 Ответ

1 голос
/ 29 января 2020

Я бы, вероятно, структурировал это примерно так.

with pages as (
  select date, visitID, visitStartTime, h.page.pagePath, h.hitNumber
  from `MY-GA-SESSION`.`ga_sessions_*`, unnest(hits) h 
  where h.type = 'PAGE'
    and _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 3 MONTH)) 
    and FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
),
temp as (
  select *,
    lead(pagePath,1) over (partition by visitID order by hitNumber asc) as nextPagePath, -- Get the next page path
    row_number() over (partition by visitID order by hitNumber asc) as pagenum -- will need later on in we want to filter to landing page only
  from pages
),
temp2 as (
  select
    pagePath as pageA,
    nextPagePath as pageB,
    EXTRACT(DATE FROM DATETIME(TIMESTAMP_SECONDS(visitStartTime),'America/New_York')) as date,
    EXTRACT(HOUR FROM DATETIME(TIMESTAMP_SECONDS(visitStartTime),'America/New_York')) as hour,
    count(*) as a_to_b_count
  from temp
  where pagePath = '/' --whatever your homepage (or pageA is)
    and pagenum = 1 -- if you want pageA as a landing page only, delete if you want all pageA->pageB visits
)
select pageA, pageB, array_agg(struct(date,hour,a_to_b_count) order by 1 asc, 2 asc) as visit_info
from temp2
group by 1,2

Примечание: я не совсем уверен, что вы подразумеваете под просмотрами страниц в этом контексте, мой запрос фокусируется на переходе pageA-> pageB. Если вы ищете общее количество просмотров страниц, связанных после каждого перехода A-> B, я бы обернул это в CTE, а затем соединил его обратно на visitID перед агрегацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...