1. 程式人生 > >大資料案例之OD線分析

大資料案例之OD線分析

​ 我們從網路上爬取了2013年到2017年芝加哥每一輛計程車的每一單行程資料,資料內容示例如圖一,包含了計程車ID,行程ID,上下車時間,上下車座標,行程耗時,費用以及支付方式等資訊。有了這些資料,我們就可以對其進行資料探勘分析,找到打車需求最旺的區域和時間段,以便得到更好的計程車資源排程策略等。本案例中我們明確分析目標,要找出2016年裡週末10點到18點這個時間段,從奧黑爾國際機場出發的旅客都去了哪兒。深入分析也能從這個分析目標中預測出芝加哥最熱門的旅遊景點等。

這裡寫圖片描述

​ 針對該分析目標,我們選擇supermap pyspark大資料元件產品,其OD線分析功能即可實現該分析目標,由於OD線分析需要行政區域面數據集,故我們又爬取了芝加哥主要的行政區域面數據。

  • 資料

    這裡寫圖片描述

  • 工具

    supermap-bdtpy-9.1.0-beta

  • 步驟

    1. 資料上傳到hdfs,便於分散式計算

      ./hadoop fs -put /opt/data/*.csv /opt/data/*.meta /taxi_data
    2. 讀取出租車資料,並按條件過濾,提取2016年週末10-18點期間在奧黑爾國際機場上車的行程單

      def get_point():
       fRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-Taxi_Trips.csv', SpecFieldNames('', 'TripStartTimestamp'
      , ''), 36, None,'hdfs://localhost:9000/taxi_data/Chicago-Taxi_Trips.meta', None) regionRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-region.csv', SpecFieldNames('SmID', '', ''), 36, None,'hdfs://localhost:9000/taxi_data/Chicago-region.meta', None) # 奧黑爾國際機場所在的行政區ID為165381 airportRdd = regionRdd.filter(lambda
      f: int(f.get_value('OBJECTID')) == 165381) # 構造時間週期,2016年裡所有的週末,2016-01-02為第一個週六 cycleW = TimeCycle(Duration(1, DurationUnit.Weeks), '2016-01-02 00:00:00', Duration(2, DurationUnit.Days),'2016-01-01 00:00:00', '2017-01-01 00:00:00') tfW = TimeCycleFilter(cycleW) # 構造時間週期,每天的10-18點 cycleH = TimeCycle(Duration(1, DurationUnit.Days), '2016-01-02 10:00:00', Duration(8, DurationUnit.Hours),'2016-01-01 00:00:00', '2017-01-01 00:00:00') tfH = TimeCycleFilter(cycleH) # 上車點資料按時間過濾,過濾行程終點為空的,過濾行程時間異常的,按區域裁剪 fr = fRdd.filter(tfW).filter(tfH).filter(lambda f: f.get_value('TripSeconds') != None).filter(lambda f: f.get_value('DropoffCentroidLatitude') != None).filter(lambda f: f.get_value('DropoffCentroidLongitude') != None).filter(lambda f:int(f.get_value('TripSeconds')) > 120).filter(lambda f:int(f.get_value('TripSeconds')) < 12000).clip(airportRdd.first()) return fr
    3. 點資料集轉屬性表資料集,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
    4. 讀取用於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
    5. 構建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分析結果資料集製作專題圖表達,可以看出去市區的人最多。

    這裡寫圖片描述

  • 感興趣的夥伴可以進行更多的深度分析,比如不同時間段哪個區域的用車量最大?哪個區域更容易接到長途計程車單?