美文网首页R语言与统计分析数据科学与R语言数据-R语言-图表-决策-Linux-Python
R-接上篇日数据处理增发,如何将日数据处理批量应用到多站点气象要

R-接上篇日数据处理增发,如何将日数据处理批量应用到多站点气象要

作者: TroyShen | 来源:发表于2019-12-10 12:47 被阅读0次

    目录

    • 0.问题导入
    • 1.示例数据
    • 2.导入数据
    • 3.将多个站点气温日数据及多个公司股价数据及批量转为月均数据
    • 4.从多个站点气温日数据及多个公司股价数据中批量提取趋势项
    • 5.本篇总结
    • 6.肉眼可预计运行出现的BUGs及处理方案
    • 7.daily2monthly 函数源码
    • 8.daily_trend函数源码
    • 9.致谢

    0. 问题导入

    昨日篇R-日数据(比如股价,气温等)好,但是信息量太密集,怎么办?介绍了如何将单点/公司日数据转化为月数据及如何从单点/公司的日数据中提取序列的趋势项。

    但新问题又来了,我们生活在一个复杂又多样的世界里。进而,我们要分析的对象往往是多样的,比如上市公司有无数家,气象站有2000+个等,所以如何可以同时批量在多个对象上实现相同的操作是今日篇所要解决的问题,即如何实现以上操作在多点及多公司日股价之间的批量处理?

    1. 示例数据

    1.1 气温数据
    说明:其中tas为实际过程,tas1-2采用下式随机生成

    tas1 = runif(len,-10,30)
    tas2 = runif(len,-2,40)
    

    点我下载气温数据

    1.2 股价数据
    点我下载新浪/京东/途牛美股股价数据

    2. 导入数据

    2.1 导入多站气温数据

    input_tas = 'data/station.csv'
    tas_df = read.csv(input_tas,header= T)
    len = nrow(tas_df)
    tas1 = runif(len,-10,30)
    tas2 = runif(len,-2,40)
    
    tas_df$tas1 = tas1
    tas_df$tas2 = tas2
    
    date_tas = seq(as.Date('1960-08-01'),as.Date('2012-07-31'),'day')
    tas_df = data.frame(date = date_tas, tas = tas_df$tas/10, 
                        tas1 = tas_df$tas1,tas2 = tas_df$tas2)
    

    2.2 多站气温数据数据结构
    注意:对比多站气温数据结构与上篇('R-日数据(比如股价,气温等)好,但是信息量太密集,怎么办?')中单站数据的不同。

    head(tas_df)
            date  tas       tas1      tas2
    1: 1960-08-01 15.7  9.6851787 19.335569
    2: 1960-08-02 17.7 -9.2805201 32.017779
    3: 1960-08-03 16.2 -0.8946223 25.229585
    4: 1960-08-04 16.1 -9.9157054  8.573615
    5: 1960-08-05 15.6 -5.2617051 15.779735
    6: 1960-08-06 17.0 26.6645286 18.581560
    

    2.3 导入多公司股价数据

    input_jd = 'data/JD.csv'
    input_sina = 'data/SINA.csv'
    input_tour = 'data/TOUR.csv'
    
    jd_price = read.csv(input_jd,header = T)
    sina_price = read.csv(input_sina,header =T )
    tour_price = read.csv(input_tour,header = T)
    
    price_df = data.frame(date = as.Date(jd_price$Date),
                          JD = jd_price$Close,
                          SINA = sina_price$Close,
                          TOUR = tour_price$Close)
    

    2.4 多公司股价数据数据结构

    head(price_df)
            date    JD  SINA  TOUR
    1: 2014-12-09 25.42 36.77 10.77
    2: 2014-12-10 24.75 36.70 11.30
    3: 2014-12-11 24.79 36.90 11.27
    4: 2014-12-12 23.97 37.32 11.80
    5: 2014-12-15 23.26 37.22 13.30
    6: 2014-12-16 23.13 37.23 13.58
    

    3. 将多个站点气温日数据及多个公司股价数据及批量转为月均数据

    注:函数daily2monthly.R 附于文末,需在R中保存且source后才能正常使用,如下

    source('~/Documents/JianShu_Project/20191209/daily2monthly.R')
    

    3.1 多个站点气温日数据批量转为月均数据:

    tas_m = daily2monthly(tas_df)
    price_m = daily2monthly(price_df)
    

    3.2 月均数据可视化数据处理

    date_tas_mon = seq(as.Date('1960-08-01'),as.Date('2012-07-31'),'month')
    date_price_mon = seq(as.Date('2014-12-09'),as.Date('2019-12-09'),'month')
    
    pl_tas_m = data.frame(date = date_tas_mon, tas_m[,3:5])
    pl_price_m = data.frame(date = date_price_mon,price_m[,3:5])
    
    pl_tas_melt = melt(pl_tas_m, 'date')
    pl_price_melt = melt(pl_price_m,'date')
    
    pl_tas_melt$type = "Monthly Tas (\u00B0C)"
    pl_price_melt$type = "Monthly Stock Price ($)"
    
    pl_df_melt = rbind(pl_tas_melt,pl_price_melt)
    

    3.3 月均数据可视化(图1)

    fontsize = 12
    plot1 = ggplot()+
      geom_line(data = pl_df_melt,aes(x = date, y = value,
                                      color = variable,
                                      linetype = variable),size = 1)+
      theme(panel.background = element_rect(fill = 'transparent',color = 'black'),
            axis.text = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
            axis.title = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
            legend.position=c('bottom'),
            legend.direction = c('horizontal'),
            strip.background = element_rect(fill = 'transparent'),
            strip.text = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
            )+
      scale_color_npg()+
      facet_wrap(~type, nrow = 2,scales = 'free')+
      xlab('Time (month)')+
      ylab('Index')
    
    dir.create('plot')
    png('plot/p1.png',
        height = 25,
        width = 25,
        units = 'cm',
        res = 800)
    print(plot1)
    dev.off()
    
    图1 月均数据可视化结果

    4. 从多个站点气温日数据及多个公司股价数据中批量提取趋势项

    用于批量提取趋势项的函数附于文末(daily_trend.R),与上篇不同,需复制粘贴到Rstudio中保存且source后才能使用,如下

    source('~/Documents/JianShu_Project/20191209/daily_trend.R')
    

    4.1 批量提取多个站点气温日数据及多个公司股价数据中的趋势项

    tas_trend = daily_trend(tas_df)
    price_trend = daily_trend(price_df)
    

    4.2 趋势项可视化前预处理

    pl_tas_trend = melt(tas_trend,'date')
    pl_price_trend = melt(price_trend,'date')
    
    pl_tas_trend$type = "Monthly Tas (\u00B0C)"
    pl_price_trend$type = 'Monthly Stock Price ($)'
    
    pl_df_trend = rbind(pl_tas_trend,pl_price_trend)
    

    4.3 趋势项可视化(图2)

    fontsize = 12
    plot2 = ggplot()+
      geom_line(data = pl_df_trend,aes(x = date, y = value,
                                      color = variable,
                                      linetype = variable),size = 1)+
      theme(panel.background = element_rect(fill = 'transparent',color = 'black'),
            axis.text = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
            axis.title = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
            legend.position=c('bottom'),
            legend.direction = c('horizontal'),
            strip.background = element_rect(fill = 'transparent'),
            strip.text = element_text(face='bold',colour='black',size=fontsize,hjust=.5),
      )+
      scale_color_npg()+
      facet_wrap(~type, nrow = 2,scales = 'free')+
      xlab('Time (month)')+
      ylab('Index')
    
    dir.create('plot')
    png('plot/p2.png',
        height = 25,
        width = 25,
        units = 'cm',
        res = 800)
    print(plot2)
    dev.off()
    
    图2 多站点气温及多公司股价趋势项结果可视化

    5. 总结

    本篇较上篇('R-日数据(比如股价,气温等)好,但是信息量太密集,怎么办?')解决了如下问题:


    1. 如何批量化将多站点/多公司日数据转化为月均数据?
    2. 如何批量化从多站点/多公司日数据中提取趋势项?

    6. 肉眼可预计运行出现的BUGs及处理方案

    程序运行过程中偶尔会出BUG,这是RStudio就会以红字给出Error 报错,但是问题就在于他从来只是单纯报错,不给解决方案。。。这里呢,我们就事先给出大家预警一些肯能会出现的BUGs及对应的解决方案。

    BUG 1

    当我们在处理多站点(多公司)日数据时,肯定会面临的一个问题就是:多站点间设站记录的时间不一样(多公司上市时间不一致)导致各站点(各公司)所记录的日数据起始及终止时间不一样,这时我们需要做的 就是将其进行统一。

    BUG2

    多站点/多公司日数据中存在缺省值(NA)引发报错,简单粗暴的方式就是直接插值填补缺省值。但当我们遇到要分析1960 年以后站点日数据,但是有些站偏偏不争气是2000年后新设立的时候就需要将其Delete掉,不进行分析(这个是不是更直接,哈哈哈哈)。

    7. daily2monthly 函数源码

    daily2monthly <-function(
      daily_data
    ){
      
      library(data.table)
      df = daily_data
    
      df_mon_mean = setDT(df)[,lapply(.SD, mean), by = .(year(date),month(date))]
    
      return(df_mon_mean)
      
      
    }
    

    8. daily_trend函数源码

    daily_trend<-function(
      df
    ){
      date = df$date
      start_year = as.numeric(substr(date[1],1,4))
      
      df = df[,-1]
      df= as.matrix(df)
      
      trend_extract <- function(x){
        ts_x = ts(x,start = c(start_year,as.numeric(format(date[1],'%j'))),frequency = 365)
        ts_x_t = decompose(ts_x)$trend
        return(ts_x_t)
      }
      
      ts_trend = apply(df,2,trend_extract)
      
      ts_trend_df = data.frame(date = date,trend = ts_trend)
      
      return(ts_trend_df)
        
    }
    

    9. 致谢

    大家如果觉得有用,还麻烦大家关注点赞,也可以扩散到朋友圈,多谢大家啦~

    大家如果在使用本文代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~


    小编联系方式

    相关文章

      网友评论

        本文标题:R-接上篇日数据处理增发,如何将日数据处理批量应用到多站点气象要

        本文链接:https://www.haomeiwen.com/subject/nzmwgctx.html