我正在學習 Google 技能提升計劃中的一門 BQ 課程。他們使用帶有足球(足球)統計資料的資料集,計算射門距離對進球可能性的影響。
我不太明白這部分的射擊距離是如何計算的:
SQRT(
POW(
(100 - positions[ORDINAL(1)].x) * 105/100,
2)
POW(
(50 - positions[ORDINAL(1)].y) * 68/100,
2)
) AS shotDistance
我知道使用了距離公式 (d=√((x_2-x_1)2 (y_2-y_1)2)) 但是:
- 為什么使用 ORDINAL(1)?在這個例子中它是如何作業的?
- 為什么先減100,然后減50?
作為記錄,positions是一個重復的欄位,下面嵌套了 x,y int64。x 和 y 的值介于 1 和 100 之間,表示事件(例如傳球)開始或終止的音高百分比。
整個代碼如下:
WITH
Shots AS
(
SELECT
*,
/* 101 is known Tag for 'goals' from goals table */
(101 IN UNNEST(tags.id)) AS isGoal,
/* Translate 0-100 (x,y) coordinate-based distances to absolute positions
using "average" field dimensions of 105x68 before combining in 2D dist calc */
SQRT(
POW(
(100 - positions[ORDINAL(1)].x) * 105/100,
2)
POW(
(50 - positions[ORDINAL(1)].y) * 68/100,
2)
) AS shotDistance
FROM
`soccer.events`
WHERE
/* Includes both "open play" & free kick shots (including penalties) */
eventName = 'Shot' OR
(eventName = 'Free Kick' AND subEventName IN ('Free kick shot', 'Penalty'))
)
SELECT
ROUND(shotDistance, 0) AS ShotDistRound0,
COUNT(*) AS numShots,
SUM(IF(isGoal, 1, 0)) AS numGoals,
AVG(IF(isGoal, 1, 0)) AS goalPct
FROM
Shots
WHERE
shotDistance <= 50
GROUP BY
ShotDistRound0
ORDER BY
ShotDistRound0
謝謝
uj5u.com熱心網友回復:
為什么使用 ORDINAL(1)?在這個例子中它是如何作業的?
根據 BigQuery 陣列檔案
要訪問此列中陣列的元素,您必須指定要使用的索引型別:OFFSET(用于從零開始的索引)或 ORDINAL(用于從 1 開始的索引)。
因此,獲取一個示例陣列來訪問第一個元素,您將執行以下操作:
array = [7, 5, 8]
array[OFFSET(0)] = 7
array[ORDINAL(1)] = 7
所以在本例中,它用于獲取拍攝地點的坐標(在此資料中是第一組 x,y 坐標)。
為什么先減100,然后減50?
100 和 50 之間的差異代表了目標在場上的位置。
因此,假設射門的終點在球門的中間,沿著 x 軸從 0 到 100,100 是球場的終點線,而在 y 軸上,球門在球場的中間相等與每條邊線的距離,因此 50 是目標的中點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512734.html
標籤:Google Cloud Collective 数学谷歌大查询距离
上一篇:只有一半的陣列被提升到權力
