Повторение цикла по двум спискам - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь зациклить несколько фреймов данных в R и извлечь один столбец из каждого фрейма данных и вычесть значение элемента в отдельном списке.Например, я хочу

df1$my_new_col<-df1$my_col - my_list[[1]]
df2$my_new_col<-df2$my_col - my_list[[2]] 

etc...

Код, который я написал, извлекает только последний элемент в списке и использует его во всех вычислениях.

Проще говоря, у меня есть один список, называемый датами, который представляет собой список дат, и другой список, называемый spx_list, который представляет собой список годовых отчетов S & P 500.

В моем коде япопытка перебрать каждую дату и извлечь фрейм данных о возвратах акций на эту дату.Во втором цикле я зацикливаюсь на списке возвратов S & P, которые также соответствуют каждой дате, и я пытаюсь вычесть каждое возвращение S & P 500 из дохода каждой акции в этот период.Мои кадры данных выглядят следующим образом при извлечении для каждой даты:

Для даты 1

Ticker            Name                  Total.Return.Y.3..I.
JNS US Equity   JANUS CAPITAL GR    25.27
UNP US Equity   UNION PAC CORP      24.98
CVX US Equity   CHEVRON CORP        24.87
BHI US Equity   BAKER HUGHES A G    24.81
RAI US Equity   REYNOLDS AMERICA    24.72
XOM US Equity   EXXON MOBIL CORP    24.55
CBRE US Equity  CBRE GROUP INC-A    24.43
GT US Equity    GOODYEAR TIRE       24.39


Для даты 2

Ticker            Name                  Total.Return.Y.3..I.
JNS US Equity   JANUS CAPITAL GR    21.03
UNP US Equity   UNION PAC CORP      16.33
CVX US Equity   CHEVRON CORP        12.21
BHI US Equity   BAKER HUGHES A G    47.69
RAI US Equity   REYNOLDS AMERICA    18.39
XOM US Equity   EXXON MOBIL CORP    24.50
CBRE US Equity  CBRE GROUP INC-A    10.81
GT US Equity    GOODYEAR TIRE       11.13

И для моих данных S & P:

Ticker     date         Annualized 3
SPX INDEX   3/31/2019   11.22854225
SPX INDEX   12/31/2018  7.041799573
SPX INDEX   9/30/2018   14.91926793
SPX INDEX   6/30/2018   9.629826851

Список данных

dates <- list('2019-03-31','2018-12-31','2018-09-30','2018-06-30',
            '2018-03-31','2017-12-31','2017-09-30','2017-06-30',
            '2017-03-31','2016-12-31','2016-09-30','2016-06-30',
            '2016-03-31','2015-12-31','2015-09-30','2015-06-30',
            '2015-03-31','2014-12-31','2014-09-30','2014-06-30',
            '2014-03-31','2013-12-31','2013-09-30','2013-06-30',
            '2013-03-31','2012-12-31','2012-09-30','2012-06-30',
            '2012-03-31','2011-12-31','2011-09-30','2011-06-30',
            '2011-03-31','2010-12-31','2010-09-30','2010-06-30',
            '2010-03-31','2009-12-31','2009-09-30','2009-06-30',
            '2009-03-31','2008-12-31','2008-09-30','2008-06-30',
            '2008-03-31','2007-12-31','2007-09-30','2007-06-30',
            '2007-03-31','2006-12-31','2006-09-30','2006-06-30',
            '2006-03-31','2005-12-31','2005-09-30','2005-06-30',
            '2005-03-31','2004-12-31','2004-09-30','2004-06-30',
            '2004-03-31','2003-12-31','2003-09-30','2003-06-30',
            '2003-03-31','2002-12-31','2002-09-30','2002-06-30',
            '2002-03-31','2001-12-31','2001-09-30','2001-06-30',
            '2001-03-31','2000-12-31','2000-09-30','2000-06-30',
            '2000-03-31')

Код

library(Rblpapi)
blpConnect()

library(dplyr)

spx <- read.csv('spx_3.csv')
spx_list <- as.list(spx$Annualized.3)

totals <- list()
returns <- list()

for(i in dates){

  df <- beqs('ROLLING RETURNS','PRIVATE',date=as.Date(i))
  df_beats <- df%>%
    select(date,Ticker,Total.Return.Y.3..I.)

  df_beats <- na.omit(df_beats)

  for(j in 1:length(spx_list)){

    df_beats$Relative_Performance <- df_beats$Total.Return.Y.3..I.-spx_list[[j]]

    counts <- sum(df_beats$Relative_Performance>0)
    yes <- df_beats%>%
      filter(df_beats$Relative_Performance>0)

    averages <- mean(yes$Total.Return.Y.3..I.)

    totals[[i]] <- counts
    returns[[i]] <- averages

  }
}

Цель состоит в том, чтобы определить, какой процент акций превзошел S & P 500 в данномгод и выяснить, насколько каждая акция уступает или превосходит, вычитая доходность S & P 500 из индивидуальной доходности акции.

Когда цикл завершен, я обнаружил, что используется только последний элемент списка S & P 500в расчетах остальные возвраты пропускаются.Таким образом, в этом случае значение 9,629 используется в расчете для каждого кадра данных в каждом периоде времени.В идеале я хотел бы, чтобы у Date 1 Total.Return.Y.3..I было вычтено 11,22, а у Date 2 $ Total.Return.Y.3..I у меня было вычтено 7,04 итд ...

Мне было интересно, сможет ли кто-нибудь помочь мне извлечь данные за каждый период, а не просто использовать последний элемент в списке S & P 500?

1 Ответ

0 голосов
/ 31 мая 2019

Рассмотрите возможность обработки вашего процесса в наборах вместо вложенных циклов.В частности, создайте один набор данных beqs , затем объедините его с spx по дате для расчета разницы.Наконец, агрегируйте по дате для необходимых итогов и возвращает .

spx <- read.csv('spx_3.csv')

# BUILD LIST OF BEQS DATA FRAMES FOR EACH QUARTERLY DATE
df_list <- lapply(spx$date, function(i) {
      df <- beqs('ROLLING RETURNS', 'PRIVATE', date=as.Date(i))
      df <- df[c("date", "Ticker", "Total.Return.Y.3..I.")]
      return(na.omit(df))
})

# APPEND ALL FOR SINGLE DATA FRAME
df_beqs <- do.call(rbind, df_list)

# MERGE AND ADD NEW COLUMN
final_df <- transform(merge(df_beats, spx, by = "date"),
                      Relative_Performance = `Total.Return.Y.3..I.` - `Annualized 3`)
# FILTER DATA FRAME
final_df <- final_df[final_df$Relative_Performance > 0,]

# AGGREGATE BY DATE FOR MATRIX OUTPUT
agg_df <- aggregate(Total.Return.Y.3..I. ~ date, final_df, 
                    function(x) c(totals = length(x), returns = mean(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...