如果第二个嵌入式“ if”语句被注释掉,为什么此循环会导致Key错误?

问题描述

我有一个名为stocks的股票数据数据框,如下所示:

stocks.head()

                     RET    MktRet  Mkt-RF  ...      RF   XMktRet      XRET
permno date                                 ...                            
10001  2007-01  0.023279  0.019397  0.0140  ...  0.0044  0.014997  0.018879
       2007-02  0.261621 -0.013988 -0.0196  ...  0.0038 -0.017788  0.257821
       2007-03  0.019732  0.012950  0.0068  ...  0.0043  0.008650  0.015432
       2007-04  0.002764  0.039815  0.0349  ...  0.0044  0.035415 -0.001636
       2007-05  0.043418  0.038932  0.0324  ...  0.0041  0.034832  0.039318

[5 rows x 8 columns]

    stocks.tail()

Out[3]: 
                     RET    MktRet  Mkt-RF  ...      RF   XMktRet      XRET
permno date                                 ...                            
93436  2018-08  0.011806  0.030221  0.0344  ...  0.0016  0.028621  0.010206
       2018-09 -0.122290  0.000443  0.0006  ...  0.0015 -0.001057 -0.123790
       2018-10  0.274011 -0.074031 -0.0768  ...  0.0019 -0.075931  0.272111
       2018-11  0.039013  0.018530  0.0169  ...  0.0018  0.016730  0.037213
       2018-12 -0.050445 -0.089810 -0.0955  ...  0.0019 -0.091710 -0.052345

[5 rows x 8 columns]

我正在尝试遍历每个“ permno”(公司)以对每个子集运行回归并将结果返回到称为“ stats”的新数据框中。我最初想过滤出少于60个观测值的索引,并提出了以下工作代码

# estimate CAPM betas and t-statistics for all firms with more than 60 months of data
stats = pd.DataFrame(data=np.nan,index=stocks.index.get_level_values(0).unique(),columns=['beta','t-stat','White t-stat'])
ct=0 # initialize counter
for permno in stats.index:
    ct+=1 # advance counter
    if np.mod(ct,500)==0:
        print("On stock",ct,"at",strtimeNow())
    # must have 60 obs
    if (stocks.loc[permno].dropna().shape[0]) < 60:
        continue
    
    reg = sm.OLS(endog=stocks.loc[permno]['XRET'],exog=sm.add_constant(stocks.loc[permno]['XMktRet']),missing='drop').fit()
    stats.loc[permno] = (
        reg.params['XMktRet'],reg.tvalues['XMktRet'],(reg.params/reg.HC0_se)['XMktRet']
        )

如果我想删除此限制,并因此注释掉第二条“ if”语句,则会收到Key错误。为什么是这样?我尝试在第一个if语句之后添加“ continue”,但仍然给我相同的错误

解决方法

要注释某些内容,您必须以这种方式在每行代码中添加#,以使代码完全不在注释格式上。或者,如果您想遵循自己的逻辑,则可以写通行证而不是继续:)我希望我的回答在某种程度上有所帮助,如果您认为应该给我要点,那么我可以继续努力,很棒的社区。​​ p>

,

我也建议先对此进行评论:

reg = sm.OLS(endog=stocks.loc[permno]['XRET'],exog=sm.add_constant(stocks.loc[permno]['XMktRet']),missing='drop').fit()
    stats.loc[permno] = (
        reg.params['XMktRet'],reg.tvalues['XMktRet'],(reg.params/reg.HC0_se)['XMktRet']
        )

然后一次返回一个语句。这样一来,您就可以找出试图访问不存在的索引的位置。

,

检查在哪一行返回此错误将是很棒的。我猜想当库存少于60个观察值时, reg 对象是不同的,因此它在stats.loc[permno]行中返回错误,或者统计信息缺少 permno 本身。 / p>

如果 stocks 是数据框,我敢打赌它具有'XRET''XMktRet'键,(无论如何您都已显示过)。 / p>

 reg = sm.OLS(endog=stocks.loc[permno]['XRET'],missing='drop').fit()
 
stats.loc[permno] = (
     reg.params['XMktRet'],(reg.params/reg.HC0_se)['XMktRet']
     )

当代码在循环中运行并遇到 Continue 时,循环在那里停止并获取下一个项目。

注释更多行将无济于事,更好地添加 print 行,您可以在其中真正地查看对象的外观,或使用内置的调试器模式(或如果使用的是IDE中的任何类似功能) )。