从全局字典中提取数据框长脚本

如何解决从全局字典中提取数据框长脚本

警告:长帖。我已尽力将其分解成易于消化的内容,以便上帝保佑有人可以帮助我。

如此酷的堆栈猫,看看吧,我正在构建一个有效的投资组合分析前沿工具。通过直接从 excel 文件 (df = pd.read_csv(foo.csv)) 调用数据,我使该工具工作得很好。但是,现在我有数百个 excel 文件,可能很快就会有数千个,我想将它们一次加载到字典中,这样经过数十万次迭代将节省实时时间。

我编写了一个快速函数(如下)将数据加载到全局字典中。这本字典似乎工作得很好。

equityLibrary = {}

def listFiles(path):
    if os.path.isfile(path):
        return[path]
    else:
        files = []
        for filename in os.listdir(path):
            files += listFiles(path + '/' + filename)
        return files

def loadData():
    ##This function jsut lists the files in my data dir
    library = listFiles('./data')
    
    for stock in library:
        startKeyName = stock[7:]
        keyName = startKeyName[:-4]
        variableName = keyName.lower()
        df = readData(keyName)
        equityLibrary[variableName] = df

好的,很酷。数据帧被加载到一个全局字典中。现在,让我们获取必要的投资组合数据,我正在使用以下函数编译股票投资组合的波动率和回报:

def PortfolioVolAndReturn(holdings,weights):
    table = pd.DataFrame()
    weights = np.array(weights)

    for i in holdings:
        df = equityLibrary[i.lower()]
        table[i] = df.close

    df.index = pd.to_datetime(df.index)

    ##Convert to log return eventually
    dailyReturns = table.pct_change()
    annualReturn = dailyReturns.mean() * 252

    dailyCOVAR = dailyReturns.cov()
    annualCOVAR = dailyCOVAR * 252

    returnOut = np.dot(weights,annualReturn)
    volOut = np.sqrt(np.dot(weights.T,np.dot(annualCOVAR,weights)))
    
    return returnOut,volOut


##Return Sharp ratio
def sharpeRatio(vol,returns):
    return returns/vol

那行得通!! ……但只有一次。这是核心问题:当我在蒙特卡罗模拟中运行它时,我返回的数据帧有一个正确的行,而所有其他行都返回所有列的 NaN 值。我正在使用这个函数来运行模拟:

##takes in number of simulations for 
def runSim(holdings,simulations):
    weightsArray = []
    returnsArray = []
    volArray = []

    df = pd.DataFrame()

    for i in range(simulations):
        weights = np.random.rand(len(holdings))
        weights /= np.sum(weights)
        returns,vol = PortfolioVolAndReturn(holdings,weights)

        weightsArray.append(weights)
        returnsArray.append(returns)
        volArray.append(vol)
    
    df['weights'] = weightsArray
    df['return'] = returnsArray
    df['vol'] = volArray

    return df

我的退货坏了:

                                              weights    return      vol
0   [0.047066195990327415,0.27999255422401625,0....  0.269764  0.35462
1   [0.6172192455260814,0.08842975803644981,0.29...       NaN      NaN
2   [0.3610819481882519,0.5059521988331586,0.132...       NaN      NaN
3   [0.01626716037860542,0.16093554050483386,0.8...       NaN      NaN

我知道问题出在全局字典上。如果我直接从 csv 文件调用数据帧,它很好,但速度非常慢。我终其一生都无法弄清楚为什么我的字典在第二次通话后就会胡说八道。我做错了什么,为什么我不够聪明,无法弄清楚??

更新: 问题出在函数 PortfolioVolAndReturn 中。无论持仓争论多长或多空,最后一列都会作为 NaN 附加到数据框。示例:

       CSCO   INTC  CAT
0     26.84  34.23  NaN
1     26.52  34.47  NaN
2     26.15  34.19  NaN

      CSCO   INTC     CAT  JPM
0     26.84  34.23   69.24  NaN
1     26.52  34.47   69.22  NaN
2     26.15  34.19   68.25  NaN

这对我来说完全没有意义。运行代码我不知道是什么导致了这种情况。我没有正确地遍历字典吗?我觉得一切都是合乎逻辑的,不应错误地拉取数据帧。 O_o

解决方法

好吧,在休息并回来后,我使用另一个函数调用使一切运行得非常顺利:

def closingPriceTable(holdings):
    table = pd.DataFrame()
    for i in holdings:
        df = equityLibrary[i.lower()]
        table[i] = df.close
    
    return table

仍然不知道为什么我的原始调用不起作用。真的不介意有人看着让我知道我做了什么愚蠢的事情。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <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,添加如下 <property name="dynamic.classpath" value="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['font.sans-serif'] = ['SimHei'] # 能正确显示负号 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 -> 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("/hires") 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<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-