查看原文
其他

干货分享 | 日数据处理增发,如何将日数据处理批量应用到多站点气象要素分析及多公司股价分析

申泽西 全国地研联 2021-09-20



目录


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)


下载气温数据链接https://pan.baidu.com/s/1IrMyMOZ4jPk_BEs35j9Rxg


1.2 股价数据

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

https://pan.baidu.com/s/1uojmpbOxVvB7YiMpp1xsnQ


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. 致谢

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

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

作者:TroyShen

链接:https://www.jianshu.com/p/51104a50c7ad

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

图文编辑:王佳雯

责任编辑:石笑阳

审核:王冠 王波涛 


猜你喜欢

干货分享 | R-日数据(比如股价,气温等)好,但是信息量太密集,怎么办?

干货分享 | 李濛:新一代三维GIS技术进展全解析

会议通知 | 中国教育学会地理教学专业委员会关于举办2019年综合学术年会的通知


 扫描二维码,关注我们


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存