通过子集数据创建新变量

时间:2018-06-23 15:34:43

标签: r

我想制作一个包含一周内每个事件相关信息的新变量:事件之前3天,事件之后3天。 我所拥有的:

import tensorflow as tf

a = tf.constant([3, -0.5, 2, 7])
b = tf.constant([2.5, 0.0, 2, 8])
c = tf.metrics.mean_squared_error(a,b)
init = tf.global_variables_initializer() <--
sess = tf.Session()
sess.run(init) <---
print(sess.run(c))

我希望我的数据集看起来像什么

df <- Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882

我一直在尝试不同的方法,但是没有解决。

编辑

我想要的数据集与上面的一样。我需要它以便在图中绘制多条线以比较事件发生前后三天的市场影响。简而言之,我想要一个像下面这样的图,但有更多行,每行代表事件发生前后的发展。 APP Indicator DE10_Event1 DE10_Event2 0 1 1.050 0.996 0 2 1.061 0.996 0 3 1.067 0.996 1 4 1.082 0.970 0 5 1.041 0.955 0 6 1.047 0.931 0 7 0.996 0.882 指示事件发生的时间,因此APP=1时需要Indicator=4

我希望此修订有意义。否则请再次询问我。我非常感谢您的帮助。

enter image description here

3 个答案:

答案 0 :(得分:1)

读取示例数据:

df <- read.table( text = c('
  Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882' ),
  header = TRUE )

添加星期几:

df$Weekday <- strftime(df$Date, '%u')

现在计算每个APP和每个工作日的事件数,然后传播您的数据。您可以尝试使用dplyr / tidyr。我已经习惯了data.table,所以:

library(data.table)

df <- as.data.table(df)

df[ , Event := paste0('DE10_Event', 1:.N) , by = .(APP, Weekday) ]

df.s <- dcast(df, APP + Weekday ~ Event, value.var = 'DE10')

> df.s
   APP Weekday DE10_Event1 DE10_Event2 DE10_Event3 DE10_Event4
1:   0       1       1.010       1.067       0.953       0.882
2:   0       2       1.061       0.996       0.931          NA
3:   0       3       1.050       1.047       0.955          NA
4:   0       4       1.081       1.041          NA          NA
5:   0       5       1.043       0.928          NA          NA
6:   1       4       0.970          NA          NA          NA
7:   1       5       1.082          NA          NA          NA

答案 1 :(得分:1)

您的问题仍然不清楚,但是如果我理解正确,那么您所需的不是创建新变量,而是选择每次发生APP的日期。我要发布一个新答案,因为这是一个不同的问题。

读取示例数据:

df <- read.table( text = c('
  Date   APP  DE10 
  2014-09-22 0    1.010 
  2014-09-19 0    1.043
  2014-09-18 0    1.081
  2014-09-17 0    1.050
  2014-09-16 0    1.061
  2014-09-15 0    1.067
  2014-09-12 1    1.082
  2014-09-11 0    1.041
  2014-09-10 0    1.047
  2014-09-09 0    0.996
  2014-09-08 0    0.953
  2014-09-05 0    0.928
  2014-09-04 1    0.970
  2014-09-03 0    0.955
  2014-09-02 0    0.931
  2014-09-01 0    0.882' ),
  header = TRUE )

现在确定您的应用程序在哪里,并获取周围的数据。当然,有更优雅的方法可以做到这一点,但这确实可以做到。它将创建一个新的data.frame,其中包含绘图所需的全部内容:

# Itentify the rows where APP is 1:
APProws <- as.numeric(rownames( df[ df[,'APP'] == 1, ] ))

# An empty data.frame to receive the data:
APP.df <- data.frame(
  Event = rep(NA, length(APProws)*7),
  Date = as.Date('2000-12-31'),
  DE10 = NA,
  Indicator = NA )

n <- 0
for( i in APProws ) {

  rows <- (n*7+1):(n*7+7)

  APP.df$Event[rows] <- paste('Event', n+1)
  APP.df$Date[rows] <- df$Date[(i-3):(i+3)]
  APP.df$DE10[rows] <- df$DE10[(i-3):(i+3)]
  APP.df$Indicator[n*7+4] <- '1'

  n <- n+1
}; rm(i, n, rows)

现在,您已经有了所需的情节。

library(ggplot2)

ggplot(APP.df, aes(Date, DE10)) +
  geom_line() +
  geom_vline(
    data = subset(APP.df, Indicator == 1),
    aes(xintercept = as.numeric(Date)),
    color = 'red' ) +
  facet_grid( ~Event, scales = 'free_x')

enter image description here

如果这是您需要的,我真的建议您编辑帖子的标题,因为这会引起误解。描述您要实现的目标,而不是您认为达到目标的方式。

答案 2 :(得分:1)

感谢您的贡献!

对于正在寻找类似问题的解决方案的其他人,我将得到的答案结合在一起:

df$APProws <- 1:nrow(df) #Variable with row numbers
events_rows <- df %>% filter(APP==1) %>% select(APProws) #Indicator for row number for event, APP=1

减去两个变量以获得事件的行距:

diffs <- data.frame(df %>% 
    mutate(Event1_DE10=df$APProws-events_rows$APProws[1]) %>% 
    mutate(Event2_DE10=df$APProws-events_rows$APProws[2])) 

绘制图形:

diffs %>% ggplot() + 
  geom_line(aes(x=Event1_DE10,y=DE10), color="blue") +
  geom_line(aes(x=Event2_DE10,y=DE10), color="red") + 
  geom_vline(xintercept=0, linetype="dashed")  +
  scale_x_continuous(limits=c(-3,3)) +
  scale_y_continuous(limits=c(0.3,0.7))

这是结果:

Bond yield development