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

目录

  • 0.问题导入
  • 1.示例数据
  • 2.数据导入
  • 3.日数据转月均数据(文末附转换函数daily2monthly)
  • 4.日序列趋势提取(函数附于文末 daily_trend)
  • 5.本文小结
  • 6.本文所使用的软件包,没有需要安装
  • 7.daily2monthly函数
  • 8.daily_trend函数

0. 问题导入

我们有时候会拿到一些日数据,比如日气温数据(中国气象信息网),股票价格数据等,但是日间变化太小,数据点离得太近,数据序列长度短还好说,但是当它变长了的时候,往往是这个鬼样子的(图1)。


图1 日气温数据的鬼样子

就好像一团乱麻,完全无从下手,有没有!

那今天本篇就跟大家说说如何从日数据中挖出点东西~

1. 示例数据

今天我们用1960~2012年单点日气温数据与京东的近五年的日股价数据来进行示例说明。
点我下载:日气温数据
点我下载:京东近5年股价数据

2. 数据导入

导入气温数据

input_tas = 'station.csv'
tas_daily = read.csv(input_tas,header = T)

date_tas = seq(as.Date('1960-08-01'),
           as.Date('2012-07-31'),'day')

tas_df = data.frame(
  date= date_tas, 
  tas = tas_daily[,4]/10
)

导入京东闭市股价数据

input_jd = 'JD.csv'
jd_daily = read.csv(input_jd, header =T)

jd_daily$Date = as.Date(jd_daily$Date)

jd_df = data.frame(
  date = jd_daily$Date, 
  close_price = jd_daily$Close
)

日数据可视化(图2)

pl_df_daily_m1 = melt(tas_df,'date')
pl_df_daily_m2 = melt(jd_df,'date')

pl_df_daily_m1$type = "(a) TAS_MON (\u00B0C)"
pl_df_daily_m2$type = "(b) JD Close Price (yuan)"
pl_df_daily_m = rbind(pl_df_daily_m1,pl_df_daily_m2)

p1 = ggplot()+
  geom_line(data = pl_df_daily_m,aes(x= date,y = value,color = variable),
            linetype = 1,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))+
  facet_wrap(~ type, nrow = 2,scales = 'free')+
  xlab('Time (month)')+
  ylab('Index')

png('p1.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p1)
dev.off()
图2 气温及JD股价日数据序列

如果说长序列日数据信息量过于密集,那么将其转化为月均序列便是一种减少信息量的方法之一。但是如何做呢?请看第三节~


3. 日数据转月均数据(文末附转换函数daily2monthly)

特别说明下,文末所附转换函数需要在Rstudio 中source后才能使用

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

daily2monthly(index, start_date = '1960-08-01',end_date = '2012-07-01')函数:
输入项:

  • index,日时间序列
  • start_date,日时间序列的起始日期
  • end_date, 日时间序列的终止日期

日数据转月均数据

source('~/Documents/JianShu_Project/20191209/daily2monthly.R')
tas_month = daily2monthly(tas_df)
jd_month = daily2monthly(jd_df)

月数据可视化(图3)

date_tas_month = seq(as.Date('1960-08-01'),
                     as.Date('2012-07-31'),'month')
date_jd_month = seq(as.Date('2014-12-01'),
                    as.Date('2019-12-01'),'month')

pl_df1 = data.frame(date = date_tas_month, TAS_MON = tas_month$tas)
pl_df2 = data.frame(date = date_jd_month, JD_P = jd_month$close_price)

pl_df1_m = melt(pl_df1,'date')
pl_df2_m = melt(pl_df2,'date')

pl_df1_m$type = "(a) TAS_MON (\u00B0C)"
pl_df2_m$type = "(b) JD Close Price (yuan)"


pl_df_m = rbind(pl_df1_m,pl_df2_m)

p2 = ggplot()+
  geom_line(data = pl_df_m,aes(x= date,y = value,color = variable),
            linetype = 1,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))+
  facet_wrap(~ type, nrow = 2,scales = 'free')+
  xlab('Time (month)')+
  ylab('Index')

png('p2.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p2)
dev.off()
图3 气温及股价月均时间序列

通过对比图2与图3,我们可以发现通过将日数据序列转化月数据序列后,气温及股价时间序列明显变得更加平滑。但是对比气温与股价的月数据,我们可以发现将日数据转化为月数据这种方式对于长时间序列的日数据显然无法起到明显的信息提取的作用。

那么,当我们在处理长时间序列数据的时候我们应该如何处理呢,请阅读第4节~


4. 日序列趋势提取(函数附于文末 daily_trend)

daily_trend(df, start_year = 1960)

  • df: 日序列矩阵,共两列,第一列为date,第二列为指标列,如:
  • start_year, 数据序列起始年份,numeric
head(tas_df)
         date  tas
1: 1960-08-01 15.7
2: 1960-08-02 17.7
3: 1960-08-03 16.2
4: 1960-08-04 16.1
5: 1960-08-05 15.6
6: 1960-08-06 17.0

日数据序列趋势项提取

source('~/Documents/JianShu_Project/20191209/daily_trend.R')
tas_trend = daily_trend(tas_df,start_year = 1960)
jd_trend = daily_trend(jd_df,start_year = 2014)

日数据序列趋势项可视化

pl_df_trend1 = melt(tas_trend,'date')
pl_df_trend2 = melt(jd_trend,'date')

pl_df_trend1$type = "(a) TAS_MON (\u00B0C)"
pl_df_trend2$type = "(b) JD Close Price (yuan)"
pl_df_trend = rbind(pl_df_trend1,pl_df_trend2)

p3 = ggplot()+
  geom_line(data = pl_df_trend,aes(x= date,y = value,color = variable),
            linetype = 1,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))+
  facet_wrap(~ type, nrow = 2,scales = 'free')+
  xlab('Time (month)')+
  ylab('Index')

png('p3.png',
    height = 20,
    width = 20,
    units = 'cm',
    res = 800)
print(p3)
dev.off()
图4 气温及股价趋势项时间序列

通过对比图3-4,我们可以发现,长时间序列的日数据通过趋势项提取后,可显著体现出其在时间尺度的变化规律。

5. 总结

本篇主要解决了三个问题:

    1. 如何将日时间序列数据转化为月尺度数据?
    1. 如何从日时间序列数据中提取趋势项?
    1. 如何从日时间序列数据中挖掘规律?

6. 本文所使用的软件包没有需要安装

library(stats)
library(ggplot2)
library(data.table)

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,
  start_year= 1960
){
  
  ts_df = ts(df[,2],start = c(start_year,as.numeric(format(df$date[1],"%j"))),frequency = 365)
  ts_trend = decompose(ts_df)$trend
  
  ts_trend_df = data.frame(date = df$date,trend = ts_trend)
  
  return(ts_trend_df)
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容