flight航班延误时间和距离的关系

2017-08-17  本文已影响92人  张伟松

这篇实践是跟着猴子的教程走了一遍,为的是是熟悉项目目录和dplyr包的使用。
代码在我的git上:项目地址

项目的目录结构:

.Rproj.user
output
data
db
service
util
view
.Rhistory
da.Rproj

在git上传项目时发现一个问题,git跟踪的是文件,所以不会对空文件夹进行同步本地的项目中data,db等空文件夹没有传至服务器

项目结构:

db是数据层,用来获取/操作数据,service是业务逻辑层,view是视图层。项目建好之后只需要source()运行视图层中的R脚本,即可运行整个项目,因为在view中同样使用source()调用了service中的业务逻辑模块,而在service中调用数据操作模块(如果有的话)。

获取数据

nycflights13包中的flights,是纽约2013年航班数据信息(On-time data for all flights that departed NYC (i.e. JFK, LGA or EWR) in 2013),共包含30多万条记录,19个变量涵盖了航班号,飞行时长,目的地,起飞时间,落地时间,延误时间。

str(flights)#On-time data for all flights that departed NYC (i.e. JFK, LGA or EWR) in 2013.
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   336776 obs. of  19 variables:
 $ year          : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ month         : int  1 1 1 1 1 1 1 1 1 1 ...
 $ day           : int  1 1 1 1 1 1 1 1 1 1 ...
 $ dep_time      : int  517 533 542 544 554 554 555 557 557 558 ...
 $ sched_dep_time: int  515 529 540 545 600 558 600 600 600 600 ...
 $ dep_delay     : num  2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
 $ arr_time      : int  830 850 923 1004 812 740 913 709 838 753 ...
 $ sched_arr_time: int  819 830 850 1022 837 728 854 723 846 745 ...
 $ arr_delay     : num  11 20 33 -18 -25 12 19 -14 -8 8 ...
 $ carrier       : chr  "UA" "UA" "AA" "B6" ...
 $ flight        : int  1545 1714 1141 725 461 1696 507 5708 79 301 ...
 $ tailnum       : chr  "N14228" "N24211" "N619AA" "N804JB" ...
 $ origin        : chr  "EWR" "LGA" "JFK" "JFK" ...
 $ dest          : chr  "IAH" "IAH" "MIA" "BQN" ...
 $ air_time      : num  227 227 160 183 116 150 158 53 140 138 ...
 $ distance      : num  1400 1416 1089 1576 762 ...
 $ hour          : num  5 5 5 5 6 5 6 6 6 6 ...
 $ minute        : num  15 29 40 45 0 58 0 0 0 0 ...
 $ time_hour     : POSIXct, format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...

service/flight.r中定义一个函数disDelay()该函数的目的是

  1. 获取数据
  2. 对数据进行操作,返回的数据框中应包含主要信息:延误时间和距离。
#引入包
library(dplyr)#数据操作
library(nycflights13)#包含数据
#定义函数
disDelay <- function(){
  myFlights <- select(flights,year,month,day,dep_delay,arr_delay,distance,dest) 
#由于本人对Mysql操作比较熟悉,将上面的命令改写为mysql的语言,便于自己理解
#SELECT year, month, day, dep_delay, arr_delay, distance, dest FROM flights
  #重命名列remane函数
  myFlights <- rename(myFlights, destination = dest)
#删除缺失值, 这里的空值代表航班取消。
myFlights <- filter(myFlights, !is.na(dep_delay), !is,na(arr_delay))
#表示留下的数据只包含没有缺失数据的记录
#对数据进行排序 
  myFlights <- arrange(myflithgs,desc(dep_delay))
#数据计算,起飞地都是纽约,所以如果目的地不同,表明距离不同, 根据目的地进行分组计算,距离和延误时间求均值
delay <- myFlights %>%
  group_by(destination) %>%
  summarise(
    count = n(),
    dist = mean(distance, na.rm=T),
    delay = mean(arr_delay, na.rm=R)
  ) %>%
  filter(count >20)
#SELECT destination, count(1) AS count,AVG(distance) AS dist,AVG(arr_delay) AS delay FROM myFlights GROUP BY destination WHERE count>20.
return(delay)
}

结果可视化

编写好service层之后,在view层中只需要source("service/flights.r")引入,进行结果展示。这里使用ggplot2包进行可视化。

library(ggplot2)
library(stringr)
source("service/flight.r")#相当于引入disDelay函数
delay <- disDelay()

view <- ggplot(data=delay) + #ggplot图层叠加
  geom_point(mapping = aes(x=dist, y=delay)) +
  geom_smooth(mapping = aes(x=dist, y=delay))

#保存为图片
filename <- str_r("output","delayFlight.jpg",sep="/")
ggsave(filename=filename,plot=view)

生成的结果:

delayFlight.jpg

用Mysql获取数据

刚才我们使用的是包自带的数据进行操作,大多数时候数据是存在于数据库中的,这就需要我们建立数据库链接,获取数据。git上的代码在这里

#查询航班数据
findFlights <- function(){
  #连接数据库
  #user:数据库用户名,password:数据库密码,
  #host数据库服务器地址(127.0.0.1是指本地数据库)
  #dbname数据库名
  con <- dbConnect(MySQL(), 
                   user='root',
                   password='root',
                   port=3307,
                   host='127.0.0.1',
                   dbname='flightinfo')
  #dbGetQuert执行一个sql语句
  flightsdata <- dbGetQuery(con, "select year,month,day,
                      dep_delay,arr_delay,
                            distance,dest
                            from flights")
  
  #关闭数据库连接
  dbDisconnect(con)
  
  return (flightsdata)
}

这时在service的文件中执行findFlights()就可以获得航班数据了。
其他的代码不变,因为数据从30w条减少到1000条,生成的图像有些不同。

上一篇 下一篇

猜你喜欢

热点阅读