Python 如果第二个“嵌入”的;如果;声明被注释掉了吗?

Python 如果第二个“嵌入”的;如果;声明被注释掉了吗?,python,pandas,numpy,if-statement,quantitative-finance,Python,Pandas,Numpy,If Statement,Quantitative Finance,我有一个名为stocks的股票数据框架,看起来如下: stocks.head() RET MktRet Mkt-RF ... RF XMktRet XRET permno date ... 10001 2007-01 0.023279 0.019397 0.0140 ... 0.0044

我有一个名为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']
        )
#估计数据超过60个月的所有公司的CAPM Beta和t统计数据
stats=pd.DataFrame(data=np.nan,index=stocks.index.get_level_value(0).unique(),
列=['beta'、't-stat'、'White t-stat'])
ct=0#初始化计数器
对于stats.index中的permno:
ct+=1#提前计数器
如果np.mod(ct,500)==0:
打印(“库存”,ct,“at”,strtimenow())
#必须有60个OB
如果(stocks.loc[permno].dropna().shape[0])<60:
持续
reg=sm.OLS(endog=stocks.loc[permno]['XRET'],
exog=sm.add_常量(stocks.loc[permno]['XMktRet']),
缺少class='drop').fit()
统计位置[permno]=(
注册表参数['XMktRet'],
注册价值['XMktRet'],
(reg.params/reg.HC0_se)['XMktRet']
)

如果我想删除这个限制,并因此注释掉第二个“If”语句,我会得到一个键错误。为什么会这样?我试着在第一个if语句后添加“continue”,但它仍然给了我相同的错误。

要注释某些内容,必须以这种方式添加到每行代码中,这样代码就不会以注释格式出现。或者,如果你想遵循刚才的逻辑,你可以写pass而不是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']
        )

然后一次返回一个语句。通过这种方式,您可以确定您正试图访问不存在的索引的位置。

最好检查它在哪一行返回此错误。我猜,当stock的观测值少于60个时,reg对象是不同的,因此它在
stats.loc[permno]
行中返回错误,或者stats本身缺少permno

如果stocks是dataframe,我敢打赌它有'XRET'或'XMktRet'键(不管怎样,您还是展示了它)

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


注释更多的行对您没有帮助,最好添加打印行,这样您可以真正看到对象的外观,或者使用内置调试器模式(或者使用IDE中的任何类似模式)。

错误到底是什么?
continue
将导致跳过循环的下半部分,因此,如果有任何代码导致错误,则不会发生错误。我粘贴的代码是工作版本,但当我在第二个“if”语句的每一行上都加上一个#时,我就得到了错误。如果我只是删除这些行,为什么代码会中断?
 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']
     )