使用API​​调用向量化R循环

如何解决使用API​​调用向量化R循环

我对向量化的概念还比较陌生,想问一下社区是否对改善我用来下载Bloomberg API数据并将其绑定到矩阵的流程的运行时间有任何建议。

当前,此过程会遍历我的API调用中的每个日期,这需要花费大量时间。我想知道是否可以“矢量化”的方式进行此操作,以便一次进行大量调用,然后绑定到数据帧,从而减少运行时间。 '''

#create fund names to feed through as param in loop below
fundList <- c("fund 1 on bloomberg","fund 2 on bloomberg","fund 3 on bloomberg","fund 4 on bloomberg","fund 5 on bloomberg","fund 6 on bloomberg","fund 7 on bloomberg",)

#create datelist for params for loop
newDateList <- seq(as.Date(today()-1401),length=1401,by="days")
newDateListReformatted <- gsub("-","",newDateList)


#create df object and loop through bloomberg API,assign to dataframe object
df_total = data.frame()

for(fund in 1:length(fundList)){
  
  df_total = data.frame()
  
  for(b in 1:length(newDateListReformatted)){
    ovrd <- c("CUST_TRR_START_DT"=newDateListReformatted[b],"CUST_TRR_END_DT"=newDateListReformatted[b+1])
    print(ovrd)
    model <- bdp(fundList[fund],"CUST_TRR_RETURN_HOLDING_PER",overrides=ovrd)
    print(model)
    df <- data.frame(model)
    df1 <- data.frame(newDateListReformatted[b+1])
    df2 <- cbind(df,df1)
    df_total <- rbind(df_total,df2)
  }
  
  assign(fundList[fund],df_total)

}

'''

首先,循环移动到第一级的某个基金,迭代所有日期,然后一次将行绑定到数据框,然后再移动到fundList中的下一个基金,并再次遍历时间序列。

以这种方式考虑,我将向函数调用多个日期参数的向量,然后“垂直”将它们一次分配给df_total矩阵,且每次分配的数目大于一个,并且每个循环都会增加运行时间。或者,我可以给每个单独的日期打电话,但要用很多资金来完成,然后将它们“水平”分配给矩阵。

任何想法都值得赞赏。

解决方法

向量化包含使我们具有有效实现每个输入的多个参数处理功能的功能。例如,可以使用循环lapply(mtcars,mean)或使用向量化函数colMeans(mtcars)计算列的平均值。后者比使用循环更有效,因为该功能针对输入进行了优化。

在堆栈溢出时,矢量化常常被误认为是代码readability,因此通常使用*apply函数被认为是矢量化,而这些功能对于可读性更有用,并且不能(单独)加速您的代码。

对于您的特定示例,瓶颈(和问题)部分来自对bdp的调用,部分归因于使用cbindrbind和{{1 }}。
为了加速您的代码,我们首先需要知道该函数是如何实现的。从文档中我们可以了解到assignfields接受多个参数。因此,这些参数为securities,而vectorized仅接受覆盖字段的命名向量。这意味着我们可以通过一次性提供所有字段来消除代码中的外部循环。

接下来,为了通过迭代扩展overrides来减少多次调用的开销,我们可以将中间结果存储在data.frame中,然后组合输出。使用此代码,我们可以得到类似于以下代码的内容:

list

请注意,我最后使用n <- length(newDateListReformatted) # Create override matrix (makes it easier to subset,but not strictly necessary periods <- matrix(c(newDateListReformatted[-n],newDateListReformatted[-1]),ncol = 2,byrow = FALSE) colnames(periods) <- c('CUST_TRR_START_DT','CUST_TRR_END_DT') ovrds <- newDateListReformatted models <- vector('list',n - 1) for(i in seq_len(n - 1)){ models[[i]] <- bdp(fundList,'CUST_TRR_RETURN_HOLDING_PER',overrides = periods[i,] ) # Add identifier columns models[[i]][,'CUST_TRR_START_DT'] <- periods[i,1] models[[i]][,'CUST_TRR_END_DT'] <- periods[i,2] } # Combine results in single data.frame (if wanted) model <- do.call(rbind,models) 合并了结果,从而给出了一个do.call(rbind,models),但是可以使用data.frame包或bind_rows中的dplyr也来自rbindlist包。

还请注意,我目前无法访问Bloomberg,也无法测试我的代码是否存在拼写错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-