我为什么要开发这款小程序?

2012年由于家庭的原因,我经常乘飞机往返于成都和广州。每次买机票前我都要观察一段机票的价格,然后再进行购买,但具体什么时候买很多时候都是靠拍脑袋。在买多几次机票后,我发现机票的价格变化还是有一定的规律可行。后来有一本叫做《大数据时代》的书提到了国外的一个Farecast产品,能够预测7天内的票价变化,给出买还是不买的建议。但很遗憾的是多年来国内一直没有相关的产品,这便触发了我做一款类似产品的想法。

这款产品叫做“爱飞狗旅行”(简称爱飞狗),这个名字来源于英文“aiflygo”。其中的AI也有人工智能的意思。产品的核心价值在于尽最大可能回答“什么时候买机票便宜”。买机票分为两个阶段,第一个阶段是选去哪里、什么时候去, 携程、去哪儿等旅游网站已经解决了这个问题。第二阶段是什么时候买票,各大网站也提供了低价提醒等功能,帮用户预定到更便宜的票。但这些产品的并没有告诉用户最低价位是什么,从而用户很难判断是否应该能够购买,除非多观察几天,但很有可能会错过最佳购票时间。

为了弥补最后的一环,这款产品首先要解决的问题的是当选定到达地点、出发日期和航班的前提下,什么时候买票最便宜。为免用户出现不会使用的情况,产品设计上我并没有标新立异,而是使用了传统的选择机票的流程。在用户选定了起降地点、时间,根据实时价格选定航班之后,传统的购票流程会显示订票的页面,而“爱飞狗”将会展示关于机票的一些购票提示。

首先展示的是运用人工智结合大数据预测出的购买建议。购票建议通过历史数据和近期价格波动综合考虑出一个结果,给予用户最快的提示。

然后是去年同期的最低价格。根据数据分析和航司的专业人士的告知,航空公司的价格定价会根据很大程度上根据去年价格,参考今年的运力波动进行定价。所以历史最低价位具有非常大的参考价值。同时,“爱飞狗”也给出最低票价出现的时间,方便用户决定今年什么时候买。在春节期间更是可以自动切换对齐到农历日期,这样更方便传统节日购票。

最后,“爱飞狗”会展示出该航班近期的购票价格的波动。注意这个价格并不是很多OTA上面展示的未来的价格,而是某一天起飞航班的历史购票价格。例如12月28日起飞的ZH9441航班,将会展示起飞前45天到今天的购票价格。

综合上述信息,用户可以根据波动情况决定是否购买。

在小程序还在开发的时候,我通过数据分析购买到了去广州的最便宜的票,一家人节约了400多元。小程序上线后不久,有朋友通过“爱飞狗”公众号告诉我他一家人出游选好了购票时间节约了600多元,也是对小程序的极大的肯定。

在未来,爱飞狗会继续优化用户体验和提高AI预测的准确性。由于产品目前还是个人开发,产品的更多的是靠口碑进行传播,由于个人力量所限,希望有志同道合的朋友能够一起将该产品做到更好,使得更多人受益。

2018春节机票怎么买?看这几张图就够了

2018年春节还有不到两个月了,各大航空公司已经准备春节的调价。根据《机票大数据分析,揭示购票的秘密》一文,一般来讲提前两个月预订机票价格相对较高,两个月之内航空公司会多次调价。在春节这个特殊的时期,定价很大程度上来自于供需关系。那么如果我确定好出发时间和地点,机票价格大约是怎样的一个趋势?我什么时候该买机票呢?能买到最低的价位是什么?

其实,每年的春节的价格都相差无几,参考2017年春节的机票价格,可以很大程度上预见2018年春节的机票价格及走势。我们选择了几个起飞日期来作为参考。

2018年2月10日,星期六,放假

对应于2017年1月21日,星期六,均是节前的最后一个假日,很多人会选择在这时拼假回家。请看下面这个图:图片展示了中国机场吞吐量前29的城市的机票折扣,横向选择出发城市,竖向选择到达城市,交叉的点就是能买到的最低折扣价格,颜色越深表明价格越高。

2017-01-21起飞的机票最低价格

从图上可以看出从北上广深到内地城市的机票普遍价格较高,这是由于北上广深打工的人很多,所以返乡价格会更贵。如果你恰好在这些区域,那么就几乎只能买到全价票或者很少的折扣,早点购买是明智的选择,因为怕机票售罄。

但从内地(例如成都)出发飞往北上广深的机票反而很便宜,所以可以等待机票价格下降到一定程度再购买,具体可以查询微信小程序“爱飞狗旅行”的历史价格,根据提示,可以知道大约起飞前4周能够买到最便宜的机票。

爱飞狗旅行查询成都至广州

最后,目的地为三亚、海口的机票价格也保持在一个较高的价位,某些城市(例如北京、兰州)等还可以有机会买到7折左右的票,但根据价格历史查询,发现最低价可能很难购买,所以请提前关注价格波动购买。

2018年2月14日,除夕前一天

对应2017年1月26日。大多数人也会选择除夕前请一个假回家。

这天起飞的航班的价格与1月25日起飞的航班的价格对比,可以发现票价有所上调,飞往三亚、海口的机票已经几乎都是全价。然后北上广深飞往内地的机票价格也几乎是全价票了。

2017-01-26

2018年2月15日,除夕当天

对应于2017年1月27日。由于工作的关系,很多人只能在除夕当天回家。

虽然这一天回家有一些不尽人意,但这一天的机票对比除夕前一天价格有大幅度的回落,即便是之前很火的北上广深往内地的机票价格也回落到5折左右。但旅游城市三亚、海口的价格依然坚挺。

2017-01-27

  • 2018年2月21日,春节假期最后一天
    对应于2017年2月2日。返回家乡,准备第二天工作了。
    这张图片和除夕前的图片看起来很类似,只是出发城市和到达城市相反而已。这个时间由于是返程,所以航空公司也肯定会狠赚一把。
    2017-02-02

总结

通过这几幅图可以清楚地看出春节机票的购票规律,如果你需要查询其他几天出行的票价图,请关注微信公众号“爱飞狗”回复“春节”即可。通过这些图确定是否还有更低的价格,对于无折扣的热门航班,较早购买不会亏,而且可以避免机票售罄。对于机票价格较为便宜的航班,提前太长时间购买可能并不划算,可以参考“爱飞狗旅行”的机票价格历史,选择一个合适的购票时间窗口,买到最便宜的机票。

小程序传送门:
gh_d92817984f7d_1280.jpg

机票大数据分析,揭示购票的秘密

对于旅游或者探亲来说,买机票的一个最基本的问题是什么时候买能买到最便宜的机票?提前一个月还是一周?知乎上各种旅游攻略上各种“业内人士”也说提前一个月买可能买到最便宜的机票,有些又说提前2个星期买能买到最便宜的机票,事实真的如此么?为了解密机票的定价策略,本文作者做了一个长达一年多的数据收集,通过分析350亿机票价格数据,告诉你机票的各种秘密。

到底要提前多久能买到最便宜的机票?

要回答这个问题非常困难 ,因为机票的定价是一个非常复杂的动态的博弈的过程,而且定价由各种因素组合而成。我们买机票也不是一个高频的事件,所以当你需要买机票的时候,很可能观察一两天然后就购买。由于信息不对称,我们根本不知道当前是否最佳购买购票时机,买了以后说不定就惋惜又降价两三百。对于家庭出游来讲,赤裸裸的就少了好几百块钱。但在大数据面前,一切的秘密也不是秘密,将机票价格可视化出来你就会发现一些购票的秘密。

研究的数据

北京到广州的航班:

  • 国航:最早起飞的CA1321,中午起飞的CA1315,晚上最后一班的CA1319
  • 南航:最早起飞的CZ3166,中午起飞的CZ3112,晚上最后起飞的CZ3000

价格:观察起飞前45天的价格,并且每天都记录一次
时间区间:2016年8月15日 - 2017年11月1日

下图是CA1321一年的机票价格变化。每一行代表特定出发日期的价格变化,例如第一行代表2016年8月15日起飞的航班的机票价格的变化。一行里,左边离出发日期越近,右边离出发日期越远。第一个方块代表距离出发日期0天(当天)的机票价格,第二格代表距离出发日期1天的机票价格,以此类推,最后一个表示44天前的价格。颜色越深代表价格越高,颜色越浅价格。

此图很长……请耐心,看不清请看原图……
CA1321.png

再来看第二张图,这张图是从上一张图做差分得到,目的是显示出涨价、降价的区块。红色的代表涨价,颜色越深涨价越多;灰色表示无价格变动;蓝色代表降价,颜色越深降价越多。

CA1321.png

好了,从这两张图能看出点什么呢?请注意,以下分析仅仅针对该航班。

距离起飞前第9天开始,几乎所有的日期都开始涨价

最明显的是,距离起飞前第9天开始,几乎所有的日期都开始涨价。请注意图二的坐标为8的那一列。然后到距离起飞前第3天才是,又要涨价一次。所以,如果距离起飞已经只有10多天了,请赶紧购买,涨价是大概率的事情。

同一个月内的价格调整在同一天完成

让我们把图缩小一点看看。在图上,我手工画了一些斜线,你可以看到价格再那里发生了变化。但每个斜线都是45度,意味着这是在同一天发生的价格调整。举个例子,4月份的价格调整,可以通过斜线看出。所以4月2号的机票,提前25天到10天左右买是可以买到较为便宜的,而4月3号的提前26天到10天左右,以此类推,4月16号的以前差不多一个月到10天都可以。

CA1321.jpg

CA1321_4月

而六月份的就不太一样,需要叠加节假日的因素,6月5、6、7日为周日、周一、周二,价格相对较高,所以调价的是涨价。购买这几天的机票就要提前更早买比较合适。而随后的8,9,10为周三、周四、周五,价格相对较低,所以是降价。航空公司估计是这样来平衡收益。
CA1321_6月

起飞时间是周几对价格影响

在上一节已经涉及到了周几起飞的价格影响。我再来画几条线,一看你就明白。价格的涨跌一目了然。对这个航班而言,周日到周二是票价相对较高的区间,周三到周六是较低的区间。

CA1321

早班中班晚班的对比

对早中晚几个航班,可以明显的看出:

  • 在价格方面:早班的航班价格较贵(整体颜色深),中班适当,晚班的较便宜(整体颜色浅)。
  • 调价:参考之前的斜线,不同时段航班的调价也几乎都是同一时间发生。

国航.jpg

发现淡季和旺季

根据颜色的深浅及颜色的变化即可判断出淡季旺季,基本规律大致相同,大假附近几乎会上涨,寒假、暑假、过年期间价格也较高。

CA1321_季节.jpg

南航航班和国航对比

不同航空公司的定价不相同,但类似的调价措施似乎有一定的参考。南航的缩小图见下,可以看出一些斜线的区域,显然是遵循了一样的调价规律。

南航.jpg

工具

决定什么时候出发,相关的工具必不可少。各大OTA网站:携程、去哪儿、飞猪、同程,各大官网,这些就不用多说吧。

决定什么时候买,通常我们会查看票价历史来做决定。目前还没有工具能够查询到历史的票价。针对这个问题我们开发了一个小程序帮忙查询到历史票价,微信小程序搜索“爱飞狗旅行”即可使用。

查看价格波动情况和购票建议。近期的价格波动情况可以很清楚的看到,当票价已经上涨了并且临近起飞日期了,请赶紧购票。
爱飞狗旅行

价格预测及最低价格,此航班提示明年春节购票最好提前7到9周。公历和农历对齐可以很方便的对齐去年的节假日。
爱飞狗旅行

最后可以在上述OTA网站订阅一个低价预约,出现预约后就可以购票了。

总结

其实航空公司的票价策略还是有规律可寻,当有一定数据量并且可视化出来以后就更容易发现规律。利用适当的工具能够帮我们选择。春节即将到来,请尽早决定并持续关注价格历史,祝您买到一张便宜的回家的机票。

请停止结对编程!

(根据真实事件改编,情节有所夸张,请勿对号入座。)

这是一个风和日丽的星期五下午,Ben和Martin本应该在Costa咖啡馆喝一杯下午茶,一起聊聊周末的计划,然而PM的一个微信通知打乱了这一切。原来产品出现了一个bug需要紧急修复,下班之前必须要搞定。两人收到消息疾步走回到岗位,也没了心情去喝刚泡好的咖啡,连忙打开邮箱查看问题报告。

开始

Ben:看来这不是一个很大的问题,就是处理一个来自于远端服务的异常。现在的情况是BFF(backend for frontends)在内部的远端服务有异常,会将异常直接返回到客户端,这样只要一个保单出了问题,前端所有的保单也都没法用了。

Martin:那怎么解决?

Ben:感觉可以在异常的地方加一个异常处理。这个涉及到RxJava和Java8的stream特性,我不是太熟悉,要不我们一起Pair吧

Martin:好。

两人喝了一口炙热的咖啡,摆好键盘鼠标,打开了IntelliJ工程。几分钟后,这个故障重现了。

Martin:可以重现的故障通常比较好解决。我们在这里先弄个try…catch试试。 两人似乎很有信心,然而重启项目后,故障并没有按照预期停下来。

Ben:hmm,这里为什么停不下来呢?

Martin:可能是RxJava的延迟处理,没有正确的捕捉到。这样,你在这里再写一个逻辑,然后在这里设个断点……

焦急

在这个过程中,Martin只是对着屏幕指指点点,时不时看看手机、在微信上聊聊天。Ben对RxJava并不是很熟悉,他想紧紧跟随Martin的思路,然而增加多个逻辑以后,依然都不能解决问题。15分钟已经过去,Ben这时候心生怀疑,是不是哪些地方没弄对?

Ben:我们理一下思路看看?

Martin:恩,来吧,一起看一下代码。

Martin领着Ben一起看了一下代码,并且一直在旁边指点Ben进行单步调试。由于RxJava的延迟特性,使得断点很难设置。而抛出异常的调用栈会出现在某些莫名其妙的地方,这让他们根本不知道把try…catch放在哪里才能奏效。

Ben:可能是要这样,在这里加一个OnError看能不能解决。

看似问题能够解决,其实是又一次的失败。在两人的激烈讨论中,时间过得很快,一晃眼已经是1个小时以后,咖啡早已经凉了,然而两个人完全没有心情,甚至都忘了咖啡的存在。

Ben对Martin的解决方案越来越没有信心,两人开始重新讨论起解决方案。然而方案是越讨论越复杂,看起来想在下班前解决这个问题是不可能了,通宵是必然了。

简化

Zen是组里的Tech Lead,今天在忙另外一个事情。这个周五真是不得安宁,恨不得想到美国去过过昨天。

Zen听到两个人的讨论,虽然并不了解这个问题的细节,但直觉上认为是跑偏了。马上提醒Ben和Martin:

这不是一个很难的问题,我感觉你们想复杂了?是不是走偏了?能给我说一下你们怎么想的么?

被Zen打断的Martin说了一下之前的解决方案,也说试过了其他的方案了,都不行。由于Zen对这个事情也不是很了解,所以只是提了一个醒:

“Keep it simple,别把事情整复杂了。”

两个人的讨论依然在继续,Ben有点无法跟上Martin的思路,艰难地写着代码,但每次都不对。Pair的气氛犹如冬日里冰冷的咖啡一样凝结,不知道孰是孰非。Ben已经有些不高兴,Martin则依然在一旁指指点点但并不动手。

Zen一看表已经3点钟了,又插了一句嘴:

Martin,既然你对这个更熟悉,你来操刀吧。你来写代码吧。

可能由于之前的讨论过于激烈,Martin反驳Zen:

我们在Pair啊,他对RxJava不熟悉,我应该指导他。我看着他写就可以了。

Zen说,

你们的解决方案是什么,给我看看。

解释了一通以后,Zen也没有更多的想法,就让他们继续吧。但Zen建议道:

在这个紧要的关头,我们应该改变一下Pair的方式。现在不是教授知识,而是要高效的解决问题。在这种压力的情境下,你可以直接实现自己的思路,带着别人飞就好了。

分歧

Martin稍微冷静了下,拿过键盘,继续开始修复问题。Ben这时候在一旁观察,也适当的休息一下,之前手忙脚乱的按F8、F9的神经也得以缓和。

Ben:看来还是不行。我们再理一下代码吧。

Martin:你说的这些我之前都试过,都不行,要这样才行。

Ben:我说的是这样做的,既然我们还没讨论清楚,我们再来看一下代码吧。

两人拿出了纸和笔,对着屏幕一边画一边讨论,然而Ben并不认可Martin的方案,说要采用另外个方案。Martin则坚持认为这是一个可行的方案,得试试。Ben拿过键盘,准备按照Martin的方案写代码,但心里面颇为不爽,一直在想说服Martin采用他的方案试试。

怒气

到此时,时间都已经不知不觉过去两个小时了,然而问题似乎离真相总是忽远忽近。两个人已经疲劳不堪,再加上解决方案的不一致,两人的言语中开始显露出一些怒气。

Zen在运行测试的空档,打断了两人的对话,建议道:

既然大家已经产生了分歧,要不然两个人分开,各自实现一个,看谁能够先实现,然后再来讨论。

Martin对于Zen并不认同,认为Zen指责他和Ben没有Pair好。

Zen解释道:

其实我听出了两人意见的不统一,言语中已经有一些怒火,这样下去Pair的效率很低。首先,大家带着不爽来干活,互相质疑。更关键的是,解决问题已经用去了两个多小时,大家都比较疲惫,可以适当休息。我让你们分开的目的是让大家冷静一下,在不受打扰的情况下工作一段时间,可能会不一样。

冷静

Martin回到了电脑面前,按照他的思路一步一步做下去。Ben去上了个厕所,倒掉了那杯冷冰冰的咖啡,泡了杯热茶。回到电脑前专注的重新按照他的思路一步一步走下去。

其实两个人已经接近了真相,只是这之间不停的对话把注意力消耗殆尽。两人企图达到一个统一,然而口头的对话并不能解决问题,反而暂缓了这个过程。

10分钟后,Ben兴高采烈的说已经搞出来了一套可以运行的方案,叫Martin一同过来看看。Ben的临时解决方案比较简单好理解,但并不完美。熟悉RxJava的Martin指出了一些可以改进的地方。

然后两人又开始了新一轮的Pair,重新将这个方案完善。有了这个基础的解决方案,两人都很高兴,是朝着一个正确的方向大步向前。

尾声

下午6点半,虽然比正常下班晚了半个多小时,但还好整个解决方案都正常了,交付的任务也顺利完成。

Ben和Martin都总结道,我们应该停止结对,当:

  • 两人的思路不统一但无法说服对方时:我们可以考虑分开一阵,安静一下,各自用可运行的代码来证明思路的可行。这里只需要相对粗糙的代码即可。
  • 时间已经超过番茄时间而感到疲惫时:人的专注力是有限的,在Pair时非常累,特别是在能力方面存在较大差距的时候。在这时候我们可以试试番茄工作法,让大脑得到休息。
  • 注意力不集中或者有其他事务要处理时:在Pair的时候,彼此要尊重对方,不要玩手机、看其他无关的网页,除非事先取得别人的同意,否则就要等到停止结对、处理完事务后再继续。

共享单车数据爬虫

在线实时查看共享单车的位置,并提供了API供调用,方便进行研究,请查看体验

完整体验请在电脑上打开,手机可能显示不完整。由于时间所限,IE浏览器不兼容,请用chrome类似的浏览器。

服务器在海外,加载速度可能不理想,请耐心等待。

单车地图