搜狐首页 科技 宫主大人

手机搜狐

SOHU.COM

解析滴滴算法大赛---数据分析过程

数据挖掘入门与实战公众号:datadw

目的和意义

很难有机会接触这么多的实际真实数据。

通过对于这些数据的分析,初步了解大数据的处理方式。

进一步掌握MongoDB的特性,熟练Excel的高级用法。

这里只是做分析,不提供源代码,毕竟是一个比赛。

这里只是做分析,不提供源代码,我也无意开发一个完整的程序。

题目分析

http://research.xiaojukeji.com/competition/detail.action?competitionId=DiTech2016

构建一个模型,根据天气,交通,区域里面的各种设施,以往历史数据,预测未来的某个时间点,某个区域里,打车需求的缺口。整个算法其实就是一个有监督的机器学习的过程。

数据整理

(5月20日版本)下载后的整个压缩数据包575M,其中包括的订单数据大约900万条。(其他Master表数据量很小,这里忽略不计)

使用MongoDB存储的话,大概使用2GB的空间,全部导入之后,工作用计算机十分卡顿。MongoCola管理软件失去响应。所以,这里的订单按照日期导入。(训练的时候,按照天来训练)

注意:官方的订单数据的 订单号 OrderID是主键重复的。这里以第一次出现的订单号的数据为准。

官方对于重复订单的解释:

  1. Q: 在order info 中重复出现的数据应如何处理?

    A: 数据重复是因为同一个用户可能在一个10分钟片同一个地区发单被多次应答,但是这样的情况并不多,影响并不大。为了简化问题,重复的订单不需要去重,直接计入到缺口的计算中。

关于订单的目标区域HashCode,这里发现一部分数据是无法找到的,可能是跨区域的。

(全部订单:498789 ,目的地可以找到:406138,跨区域:92651)

由于数据量非常庞大,所以这里建议将中间的计算结果也放入数据库中备用。

订单数据整理

订单数据整理,主要是整理出各个时段,各个地域的订单数据。

数据整理尽量使用LINQ进行处理,MONGODB查询是消耗时间的!!!,这里数据库只是用作数据的存储不做计算

  1. privatevoidbtnImportDB_Click(objectsender,EventArgse)

  2. {

  3. stringrootFolder =txtRootDir.Text;

  4. //Order: Root + "order_data"

  5. foreach(varfilename inDirectory.GetFiles(rootFolder +"order_data"))

  6. {

  7. if(!filename.Contains("._"))

  8. {

  9. stringstrDate =filename.Substring(filename.LastIndexOf("_")+1);

  10. varcolname ="Order_"+strDate;

  11. Database.Clear(colname);

  12. varorderlist =newListOrder();

  13. varread =newStreamReader(filename);

  14. while(!read.EndOfStream)

  15. {

  16. varo =Order.Gernerate(read.ReadLine());

  17. orderlist.Add(o);

  18. }

  19. orderlist =orderlist.Distinct(x =x.order_id).ToList();

  20. Database.InsertRecBatch(orderlist,colname);

  21. varorderGaplist =newListOrderGap();

  22. Database.Clear("OrderGap_"+strDate);

  23. for(inttime =1;time 144+1;time++)

  24. {

  25. for(intarea =1;area 66+1;area++)

  26. {

  27. varm =newOrderGap(){DistrictId=area,TimeSlient=time};

  28. m.Total=orderlist.Count((x)={returnx.DistrictID==area x.TimeSlient==time;});

  29. m.Gap=orderlist.Count((x)={returnx.DistrictID==area x.TimeSlient==time x.driver_id =="NULL";});

  30. m.GapPercent=m.Total==0?0:Math.Round(((double)m.Gap/m.Total)*100,2);

  31. orderGaplist.Add(m);

  32. }

  33. }

  34. Database.InsertRecBatch(orderGaplist,"OrderGap_"+strDate);

  35. //暂时只分析一天数据

  36. break;

  37. }

  38. }

  39. }

精选