接上一篇。 数据样式如下,总量共计1500万+条:

CARD_NO  RIDING_DATE  RIDING_TIME  TRAFFIC_TYPE  LINE_NO  BUS_NO  TRADE_TYPE  PAID  PREAMT_FLAG
4000000007936933  20170525  81758  1  911  10017  1  1  0
4000000210311917  20170525  140645  1  982  983007  0  1.8  0
4000000005882185  20170525  154507  1  910  91207  0  2.7  0
4000000810038209  20170525  191745  2  103  1034102  0  3.6  0
4000001510052051  20170525  191730  2  113  1134104  0  4.5  0

第一问:包含哪些天的记录?每天分别有多少数据量?

思路:按日期分组,计算记录数,考虑到交通情况与工作日、周末强相关,顺便将日期转为星期格式。 SQL语句:

select RIDING_DATE, 
    datename(weekday,RIDING_DATE) as riding_week, 
    count(*) as records_num
from dbo.traffic_card
group by RIDING_DATE

运行的部分结果:

RIDING_DATE  riding_week  records_num
20160801  星期一  1913208
20160824  星期三  218179
20160825  星期四  257466
……  ……  ……
20170109  星期一  2644115
20170525  星期四  4729824
20170526  星期五  2515023

结论:共计50多天,记录数最少的日期仅有2条,最多的达到470万+条,达到100万条以上的仅有5天,90%的日期数据不完整(包含周末)。

第二问:数据是否完整覆盖了24小时?

思路:筛选记录数最多的三天,按小时分组,统计记录数。 SQL语句:

select RIDING_DATE, 
  datename(weekday,RIDING_DATE) as riding_week, 
  RIDING_TIME / 10000 as riding_hour,
  count(*) as records_num
from dbo.traffic_card
where RIDING_DATE = '20170109' or
  RIDING_DATE = '20170525' or
  RIDING_DATE = '20170526'
group by RIDING_DATE,RIDING_TIME / 10000
order by RIDING_DATE,riding_hour
    运行的部分结果:
RIDING_DATE  riding_week  riding_hour  records_num
20170109  星期一  0  164
……  ……  ……
20170109  星期一  12  119697
……  ……  ……
20170109  星期一  23  2420
20170525  星期四  4  413
……  ……  ……
20170525  星期四  12  187627
……  ……  ……
20170525  星期四  23  8801
20170526  星期五  0  1331
……  ……  ……
20170526  星期五  12  97041
……  ……  ……
20170526  星期五  23  7587

遇到的问题:数据中时间格式为“hhmmss”,通过datename函数转换无法识别,因此直接通过除法转换为小时(SQL Sever默认向下取整)。 结论:0~24时完整覆盖的为5月26日的数据,考虑到夜间出行人数较少的话,另外两天的数据也非常完整。

第三问:交通类型字段中的1/2/3哪个是地铁?

思路:对覆盖时段最完整的那天进行分析,按交通类型进行分组统计。 SQL语句:

# 按小时、不同交通类型 group by分组统计记录数
select 
  RIDING_DATE, 
  datename(weekday,RIDING_DATE) as riding_week,
  TRAFFIC_TYPE, 
  RIDING_TIME / 10000 as riding_hour,
  count(*) as records_num
from 
  dbo.traffic_card
where 
  RIDING_DATE = '20170526'
group by 
  RIDING_DATE, TRAFFIC_TYPE, RIDING_TIME / 10000
order by 
  RIDING_DATE, TRAFFIC_TYPE, riding_hour

运行的部分结果:

RIDING_DATE  riding_week  TRAFFIC_TYPE  riding_hour  records_num
20170526  星期五  1  0  1273
……  ……  ……
20170526  星期五  1  23  1803
20170526  星期五  2  0  58
……  ……  ……
20170526  星期五  2  23  5783
20170526  星期五  3  3  1
……  ……  ……
20170526  星期五  3  23  1

遇到的问题:以上这种形式不方便各交通类型之间的对比,因此,需要使用 pivot 聚合函数,将交通类型字段中的1/2/3转为列来展示。 SQL语句:

# 按小时、不同交通类型 pivot聚合 (行转列)
select 
  riding_hour, [1] as type1, [2] as type2, [3] as type2
from(
  select C.TRAFFIC_TYPE, C.RIDING_TIME / 10000 as riding_hour, count(C.CARD_NO) as records_num
  from dbo.traffic_card as C
  where RIDING_DATE = '20170526'
  group by C.TRAFFIC_TYPE, C.RIDING_TIME / 10000
  ) as ST
pivot(
  sum(ST.records_num) for ST.TRAFFIC_TYPE in([1],[2],[3])
  ) as PT
order by riding_hour
    运行的部分结果:
riding_hour  type1  type2  type3
0  1273  58  NULL
1  381  NULL  NULL
2  91  NULL  NULL
3  NULL  NULL  1
4  324  NULL  NULL
5  8267  NULL  NULL
6  101860  10076  NULL
……  ……  ……
12  63781  33260  NULL
……  ……  ……
18  120599  142152  NULL
……  ……  ……
23  1803  5783  1

结论:考虑到公交和地铁的运营时间,可以判断类型1为公交,类型2为地铁,而通过刷卡乘坐出租车的人数较少,也可以确定类型3为出租。

第…问:还可以进行哪些分析?

  • 根据乘车时间——可以进行早中晚分时段的流量分析、早晚高峰流量分析(需自定义时间段)
  • 根据交通线路编号——可以假设当类型为地铁时,线路编号实为地铁站编号,例如211代表2号线第11站,则可以进行地铁站流量分析(当然也可以进行公交线路流量分析)
  • 若上一条假设成立,那么可以结合乘车时间,分析各个地铁站哪个时间段人流量最大、早晚高峰人流量大的地铁站有哪些
  • 进一步深入分析,可以根据地铁站人流量特征,确定地铁站周边区域属于商务区还是居住区,又或者购物商圈等等
  • 根据交易金额和交易类型——可以分析当地人民出行消费的分布情况,结合公交和地铁定价规则,可以分析出行里程和消费金额的相关关系
  • ……

-------- END --------

相关阅读 数据探索 | Python处理TXT数据避坑指南 数据探索 | SQL Sever大容量数据导入指南

https://mp.weixin.qq.com/s/cpRlFCvT0PN5A1ppPt7OxQ