大資料案例之OD線分析
阿新 • • 發佈:2019-01-01
我們從網路上爬取了2013年到2017年芝加哥每一輛計程車的每一單行程資料,資料內容示例如圖一,包含了計程車ID,行程ID,上下車時間,上下車座標,行程耗時,費用以及支付方式等資訊。有了這些資料,我們就可以對其進行資料探勘分析,找到打車需求最旺的區域和時間段,以便得到更好的計程車資源排程策略等。本案例中我們明確分析目標,要找出2016年裡週末10點到18點這個時間段,從奧黑爾國際機場出發的旅客都去了哪兒。深入分析也能從這個分析目標中預測出芝加哥最熱門的旅遊景點等。
針對該分析目標,我們選擇supermap pyspark大資料元件產品,其OD線分析功能即可實現該分析目標,由於OD線分析需要行政區域面數據集,故我們又爬取了芝加哥主要的行政區域面數據。
資料
工具
supermap-bdtpy-9.1.0-beta
步驟
資料上傳到hdfs,便於分散式計算
./hadoop fs -put /opt/data/*.csv /opt/data/*.meta /taxi_data
讀取出租車資料,並按條件過濾,提取2016年週末10-18點期間在奧黑爾國際機場上車的行程單
def get_point(): fRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-Taxi_Trips.csv', SpecFieldNames('', 'TripStartTimestamp'
點資料集轉屬性表資料集,od線分析需要上車點與下車點的關係表資料集
# 構造屬性表結構 def make_new_meta(): struct_type = StructType() struct_type.add(StructField('TripID', StringType())) struct_type.add(StructField('TaxiID', StringType())) struct_type.add(StructField('TripSeconds', IntegerType())) struct_type.add(StructField('DropoffCentroidLat', DoubleType())) struct_type.add(StructField('DropoffCentroidLon', DoubleType())) struct_type.add(StructField('PickupCentroidLat', DoubleType())) struct_type.add(StructField('PickupCentroidLon', DoubleType())) return FeatureMetadata(struct_type, 'Empty', None, has_feature_id=True) # 構造新的要素 def make_new_feature(f): xy = str(f.get_value('PickupCentroidLocation')) import re # 提取起始點的xy座標 x, y = re.findall(r'[(](.*?)[)]', xy)[0].split(" ") field_value = [f.get_value('TripID'), f.get_value('TaxiID'), f.get_value('TripSeconds'), f.get_value('DropoffCentroidLatitude'), f.get_value('DropoffCentroidLongitude'), y, x] # none代表屬性表記錄,注意引數順序 return Feature(None, field_value, id_value=f.get_value('TripID'), field_infos=make_new_meta()._get_field_infos()) # 點轉屬性表 def get_table(): rdd = get_point().rdd.map(lambda f: make_new_feature(f)) tableRdd = FeatureRDD.make(rdd, make_new_meta()) return tableRdd
讀取用於OD線分析的行政區域面數據
# 用於od線製作的面數據 def get_region(): regionRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-region.csv',SpecFieldNames('OBJECTID', '', ''), 36, None, 'hdfs://localhost:9000/taxi_data/Chicago-region.meta', None) return regionRdd
構建OD線
def make_odline(): # 參與計算的featurerdd必須具備唯一id值 odRdd = make_od_line(get_region(), get_table(), 'NAME', 'PickupCentroidLon', 'PickupCentroidLat', 'DropoffCentroidLon', 'DropoffCentroidLat', 'TripSeconds,Sum,sumTripSeconds') # od線資料 odRdd[0].save_as_csv('hdfs://localhost:9000/taxi_data/output/workday16_line.csv', write_header=True) #od關聯區域面數據 odRdd[1].save_as_csv('hdfs://localhost:9000/taxi_data/output/workday16_region.csv', write_header=True) print('Done')
結果展示,通過idesktop對od分析結果資料集製作專題圖表達,可以看出去市區的人最多。
感興趣的夥伴可以進行更多的深度分析,比如不同時間段哪個區域的用車量最大?哪個區域更容易接到長途計程車單?