Python 如果第二个“嵌入”的;如果;声明被注释掉了吗?
我有一个名为stocks的股票数据框架,看起来如下: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.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']
)