做網(wǎng)站避免上當(dāng)簡(jiǎn)單網(wǎng)頁(yè)設(shè)計(jì)模板html
根據(jù)車輛的運(yùn)行軌跡,計(jì)算先經(jīng)過(guò)某些路段,再經(jīng)過(guò)某些路段的車輛數(shù)。
歡迎關(guān)注本人公眾號(hào)--交通數(shù)據(jù)探索師
如下表,
其中:vehicle: 車輛編號(hào);route: 車輛軌跡。
以第一行為例,車輛car1按順序經(jīng)過(guò)了路段123、路段456、路段789。
現(xiàn)統(tǒng)計(jì)先通過(guò)路段123再通過(guò)路段789的車輛數(shù)。
大家可以可以先思考一下怎么使用Python和SQL進(jìn)行實(shí)現(xiàn)。
?
Python
實(shí)現(xiàn)思路:以car1的軌跡為例,現(xiàn)將route拆分成列表['123', '456', '789'],判斷該列表中是否包含路段123和路段789,如果包含則再進(jìn)一步判斷路段123在列表中的位置是不是在路段789的前面,如果也是,則該車輛滿足要求。?
import pandas as pd
import numpy as np data = pd.DataFrame({'vehicle': ['car1', 'car2', 'car3', 'car4', 'car5'],'route': ['123+456+789', '1123+789+357', '123+456+7899', '123+456+789+548', '789+123']}
)# 統(tǒng)計(jì)途徑路段:123和789的車輛數(shù)
data = (data.eval("route=route.str.split('+')"). # 將route拆分成列表# 如果車輛的route包含123和789則flag列賦值為1 否則為0assign(flag=lambda df: df['route'].apply(lambda x: 1 if set(['123', '789']).issubset(set(x)) else 0)).query("flag==1"). # 將flag列為1的數(shù)據(jù)篩選出來(lái)# 比較123和456在列表中的位置assign(order_check=lambda df: df['route'].apply(lambda x: x.index('123') < x.index('789'))).query("order_check==True")
)
data
至此篩選出來(lái)了滿足條件的車輛,可進(jìn)一步處理出車輛數(shù)。?
clickhouse
select vehicle, splitByChar('+', route) as route_list, # 將route拆分成數(shù)組hasAll(route_list, ['123', '789']) as flag # 判斷['123', '789']是否都包含在route_list中indexOf(route_list, '123') as one, # 計(jì)算123在route_list中的位置indexOf(route_list, '789') as two # 計(jì)算789在route_list中的位置
from table_name
where flag = 1
and one < two