Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x .descripe()在表中返回错误的列值_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 3.x .descripe()在表中返回错误的列值

Python 3.x .descripe()在表中返回错误的列值,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,查看图1的gld_weight列。它抛弃了完全错误的价值观。btc\u权重+gld\u权重的总和应始终为1。但是当我使用descripe函数时,为什么gld_weight列与返回的行值不对应 图1: 图2: 图3: 这是我的源代码: import numpy as np import pandas as pd from pandas_datareader import data as wb import matplotlib.pyplot as plt assets = ['BTC-USD',

查看图1的
gld_weight
列。它抛弃了完全错误的价值观。
btc\u权重+gld\u权重
的总和应始终为1。但是当我使用descripe函数时,为什么
gld_weight
列与返回的行值不对应

图1:

图2:

图3:

这是我的源代码:

import numpy as np
import pandas as pd
from pandas_datareader import data as wb
import matplotlib.pyplot as plt

assets = ['BTC-USD', 'GLD']
mydata = pd.DataFrame()

for asset in assets:
    mydata[asset] = wb.DataReader(asset, data_source='yahoo', start='2015-1-1')['Close']

cleandata = mydata.dropna()
log_returns = np.log(cleandata/cleandata.shift(1))

annual_log_returns = log_returns.mean() * 252 * 100
annual_log_returns

annual_cov = log_returns.cov() * 252
annual_cov

我不能100%确定我是否正确回答了您的问题,但问题可能是,您没有将输出重新分配给新变量,因此没有保存它。 尝试在这方面调整您的代码:

new_portfolio = new_portfolio.sort_values(by="Returns")
或者将inplace参数设置为True-

简短回答:

当初始权重值标准化完成时,在for循环中发现了手头的问题。如何修复:请参见下面答案中的更新1

获取解决方案的背景信息:

乍一看,OP的代码似乎是有序的,数组中的值按照OP通过书面代码发出的请求进行了拟合。从测试中可以看出,使用
范围(1000)
是在自找麻烦,因为大量的“随机性”结果导致价值结果疏忽。特别是当这个问题被写成一个转化问题时。因此,x/y轴值混合或其他类型的转换误差很难研究

  • 为了解决这个问题,我使用了静态值,如
    annual\u log\u returns
    annual\u cov
    所示

  • 然后我锁定了打印的所有输出,因此值被锁定在适当的位置,无法在处理过程中进一步更改。。有可能是因为数组没有被锁定(Pavel Klammert在他的回答中也提出了这一点),所以代码的打印在运行时发生了变化

  • 在对反馈进行评论之后,我明白了OP对“值是错误的”的含义。然后,我将重点放在了如何创建用于填充数组的值的方法上

  • 发现了抛出错误值的问题:

    使用
    weights[0]=weights[0]/np.sum(weights)
    替换新
    weights[0]
    的原始列表
    value,该列表随后用作
    weights[1]=weights[1]/np.sum(weights)
    的新输入,因此永远无法达到sum=1

  • 在创建
    权重[0]和[1]值后,变量名
    权重[0]
    权重[1]
    在两个位置直接更改为“a”和“b”,以防止覆盖初始
    权重值。那么结果就是“计划的”
  • 问题解决了

    
    将numpy作为np导入
    作为pd进口熊猫
    pfolio_返回=[]
    pfolio_波动率=[]
    btc_重量=[]
    gld_重量=[]
    年度收益率=[0.69,0.71]
    年平均值=0.73
    游骑兵=5
    对于范围内的x(ranger):
    权重=np.随机。随机(2)
    权重[0]=权重[0]/np.和(权重)
    权重[1]=权重[1]/np.和(权重)
    权重/=np.和(权重)
    btc_weight.append(权重[0])
    gld_weight.append(权重[1])
    pfolio_returns.append(np.dot(年度_log_returns,权重))
    pfolio_volatility.append(np.sqrt(np.dot(weights.T,np.dot(annual_cov,weights)))
    打印(权重[0])
    打印(权重[1])
    打印(重量)
    #打印(pfolio_返回)
    #打印(pfolio_挥发性)
    npfolio_returns=np.array(pfolio_returns)
    npfolio\u volatility=np.数组(pfolio\u volatility)
    #数据帧(数组,索引=行名称,列=列名称,数据类型=数据类型)
    新的投资组合=pd.DataFrame({'Returns':npfolio\u Returns,'Volatility':npfolio\u Volatility,'btc\u weight':btc\u weight,'gld\u weight':gld\u weight})
    打印(新的\u公文包,“\n”)
    排序=新的\u投资组合。排序\u值(按='Returns')
    sort_max_gld_weight=sort.loc[ranger-1,'gld_weight']
    打印('排序:\n',排序'\n')
    打印('sort max\u gld\u weight:“%s”\n'%sort\u max\u gld\u weight)#如果“999”包含最高gld\u weight。。。但在大多数情况下,情况并非如此!
    sort_max_gld_weight=sort.max(axis=0)[3]#返回第4列的“gld_weight”值。
    打印('sort max\u gld\u weight:“%s”\n'%sort\u max\u gld\u weight)#这将返回第4列的'gld\u weight'值。
    desc=新的投资组合。descripe()
    desc_max_gld_weight=desc.loc['max','gld_weight']
    打印('description:\n',desc',\n')
    打印('desc max\u gld\u weight:“%s”\n“%desc max\u gld\u weight”)
    max_val_gld=new_portfolio.loc[new_portfolio['gld_weight']==sort_max_gld_weight]
    打印('max-val-gld:\n',max-val-gld',\n')
    地点=新组合。loc[新组合['gld\U权重']>0.99]
    打印('位置:\n',位置)
    
    结果可以是,例如:

    0.9779586087178525
    0.02204139128214753
    [0.97795861 0.02204139]
    返回波动率btc_权重gld_权重
    0  0.702820    0.627707    0.359024    0.640976
    1  0.709807    0.846179    0.009670    0.990330
    2  0.708724    0.801756    0.063786    0.936214
    3  0.702010    0.616237    0.399496    0.600504
    4  0.690441    0.835780    0.977959    0.022041 
    排序:
    返回波动率btc_权重gld_权重
    4  0.690441    0.835780    0.977959    0.022041
    3  0.702010    0.616237    0.399496    0.600504
    0  0.702820    0.627707    0.359024    0.640976
    2  0.708724    0.801756    0.063786    0.936214
    1  0.709807    0.846179    0.009670    0.990330 
    排序最大总重量:“0.02204139128214753”
    最大分拣重量:“0.9903330036638084”
    描述:
    返回波动率btc_权重gld_权重
    计数5.000000 5.000000 5.000000 5.000000
    平均值0.702760 0.745532 0.361987 0.638013
    标准0.007706 0.114057 0.385321 0.385321
    最小值0.690441 0.616237 0.009670 0.022041
    25%    0.702010    0.627707    0.063786    0.600504
    50%    0.702820    0.801756    0.359024    0.640976
    75%    0.708724    0.835780    0.399496    0.936214
    最大值0.709807 0.846179 0.977959 0.990330
    描述最大总重量:“0.9903330036638084”
    最大值gld:
    返回波动率btc_权重gld_权重
    1  0.709807    0.846179
    
    npfolio_returns = np.array(pfolio_returns)
    npfolio_volatility = np.array(pfolio_volatility)
    
    new_portfolio = pd.DataFrame({
        'Returns': npfolio_returns,
        'Volatility': npfolio_volatility,
        'btc_weight': btc_weight,
        'gld_weight': gld_weight
    })
    
    new_portfolio = new_portfolio.sort_values(by="Returns")