Python Bigquery根据时间/位置数据(当前行上方/下方的行)获取速度
我在Bigquery中有一个表,其中包含Nascar驱动程序的跟踪数据以及我正在进行的项目的虚拟数据。x和y坐标每秒取10次。capture_帧表示当前帧,每个连续的capture_帧应该相隔100毫秒,因为数据每100毫秒采集一次 我想计算每个车手每圈的速度。我知道如何在熊猫身上做到这一点,但我认为这在bigquery中是可能的。为了计算速度,我查看了捕获帧之前的两行和捕获帧之后的两行,然后除以历元时间差,应该是400毫秒 下面是一个示例,其中一名车手在第一圈的1场比赛中使用了几个捕捉帧。每圈有几百个捕捉帧,然后还有20个车手混合在一起,但如果我们只看一个车手/比赛/圈,就更容易理解了Python Bigquery根据时间/位置数据(当前行上方/下方的行)获取速度,python,sql,pandas,google-bigquery,geospatial,Python,Sql,Pandas,Google Bigquery,Geospatial,我在Bigquery中有一个表,其中包含Nascar驱动程序的跟踪数据以及我正在进行的项目的虚拟数据。x和y坐标每秒取10次。capture_帧表示当前帧,每个连续的capture_帧应该相隔100毫秒,因为数据每100毫秒采集一次 我想计算每个车手每圈的速度。我知道如何在熊猫身上做到这一点,但我认为这在bigquery中是可能的。为了计算速度,我查看了捕获帧之前的两行和捕获帧之后的两行,然后除以历元时间差,应该是400毫秒 下面是一个示例,其中一名车手在第一圈的1场比赛中使用了几个捕捉帧。每圈
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| Race | Capture | Lap | Driver | … | X | Y | Epoch_time | Delta_dist | Curr_speed |
| | _frame | | | | | | | | |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 1 | 1 | Logano | …. | 2.1 | 1 | 1552089720 | NULL | Null |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 2 | 1 | Logano | … | 2.2 | 1.1 | 1552089820 | NULL | Null |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 3 | 1 | Logano | … | 2.22 | 1.2 | 1552089920 | 2.265921446 | 0.005664804 |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 4 | 1 | Logano | .. | 3.22 | 1.5 | 1552090020 | 3.124163888 | 0.00781041 |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 5 | 1 | Logano | .. | 4.22 | 1.8 | 1552090120 | NULL | null |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
| I500 | 6 | 1 | Logano | .. | 5.22 | 1.9 | 1552090220 | NULL | null |
+------+---------+-----+--------+----+------+-----+------------+-------------+-------------+
第3帧的增量距离由sqrt4.22-2.1^2+1.8-1^2/1计算,当前速度是该数字除以400。比赛的第一个/最后两个距离和速度将为零,因为没有先前的x或y坐标,这是可以的,因为在距离出发或停止0.1秒的时候,实际上没有任何速度
在《熊猫》中,我会这样做,但这并不是一个很好的代码,因为我只是让每个车手和比赛都独立进行:
#laps_per_race dictionary with num laps per race
for driver in driver_list:
for race in race_list:
driver_race_query = “SELECT * from nascar_xyz where driver={driver} and Race={race}”.format(driver=driver, race=race)
df_entire_race = client.query(driver_race_query).to_dataframe()
num_laps = laps_per_race[race]
for lap in num_laps:
#get subset of dataframe just for this lap
df = df_entire_race.loc[df_entire_race['Lap'] == lap]
df.sort_values(‘Epoch_time’, inplace=True)
df[‘prev_x’] = df[‘X’].shift(2)
df[‘next_x’] = df[‘X’].shift(-2)
df[‘prev_y’] = df[‘Y’].shift(2)
df[‘next_y’] = df[‘Y’].shift(-2)
#this is just distance function sqrt((x2-x1)^2 + (y2-y1)^2)
df['delta_dist'] = np.sqrt((df[‘X’].shift(-2) - df[‘X’].shift(2))**2 + (df[‘Y’].shift(-2) - df[‘Y’].shift(2))**2))
#400.0 is the time actual difference
df['Curr_speed'] = df['delta_dist']/400.0
我认为,在我的sql查询中,我要么必须执行group by,要么必须执行partition by to,因为我希望按驱动程序id查看每个比赛,然后如果该抽象级别有意义,则执行lap。也许对于速度和前瞻性,我可以用窗口或者类似于大熊猫移动的滞后来做一些事情 你走的是正确的道路。我将获取一个围绕史坦顿岛行驶的公交车的公共数据集——我将通过查看它们的lat、lon来使用地理距离:
WITH data AS (
SELECT bus, ST_GeogPoint(longitude, latitude) point
, PARSE_TIMESTAMP('%Y%m%d %H%M%S',FORMAT('%i %06d', day, time)) ts
FROM `fh-bigquery.mta_nyc_si.201410_bustime`
WHERE day=20141014
AND bus IN (7043, 7086, 7076, 2421, 7052, 7071)
)
SELECT *
FROM (
SELECT bus, ts, distance/time speed
FROM (
SELECT bus, ts
, ST_DISTANCE(point, LAG(point, 3) OVER(PARTITION BY bus ORDER BY ts)) distance
, TIMESTAMP_DIFF(ts, LAG(ts, 3) OVER(PARTITION BY bus ORDER BY ts), SECOND) time
FROM data
)
WHERE time IS NOT null
)
WHERE speed < 500
切中要害的评论:我很惊讶这个问题在不到5分钟的时间里得到了3票的支持。现在还不清楚——你希望得到什么样的结果。你能举个例子吗,这样我们就可以不做太多的推测而提供帮助