File "D:\kelly\PycharmProjects\pythonProject8\大作业.py", line 29, in <module> mhat, shat = norm.fit(r[i-50:i]) File "D:\python3.10\lib\site-packages\scipy\stats\_continuous_distns.py", line 66, in wrapper return fun(self, *args, **kwds) File "D:\python3.10\lib\site-packages\scipy\stats\_continuous_distns.py", line 408, in fit raise ValueError("The data contains non-finite values.") ValueError: The data contains non-finite values.如何修改代码
时间: 2023-07-07 19:35:54 浏览: 216
这个错误提示是说你的数据包含了非有限的值,因此 norm.fit 函数无法处理这些值。你需要先对数据进行清洗,去除这些非有限值,然后再进行拟合。可以尝试使用 pandas 的 dropna 函数来去除非有限值,如下所示:
```python
import pandas as pd
import numpy as np
from scipy.stats import norm
# 假设你的数据存储在一个名为 data 的 pandas 数据框中
# 先将数据框中的非有限值替换为 NaN
data = data.replace([np.inf, -np.inf], np.nan)
# 再将包含 NaN 的行删除
data = data.dropna()
# 对剩下的数据进行拟合
mhat, shat = norm.fit(data)
```
这样就可以避免 ValueError: The data contains non-finite values 这个错误。当然,如果你的数据中可能包含其他非有限值,如 NaN 或 None 等,可以使用 pandas 的 dropna 函数的更多参数进行更加精细的控制。
相关问题
l = np.fix(len(r)/3).astype(int) VaR_RM = np.zeros(len(r)) qalpha = norm.ppf(0.05) #计算分位数 for i in range(l, len(r)): mhat, shat = norm.fit(r[i-50:i]) VaR_RM[i] = -(mhat + qalpha*shat) print(VaR_RM) plt.plot(r) plt.plot(VaR_RM*-1) plt.show()解析这段代码
这段代码主要实现了对收益率序列r的风险价值(Value at Risk, VaR)的计算与绘图。具体地,代码实现了以下步骤:
1. 首先,代码计算了VaR所需的分位数qalpha,这里使用了标准正态分布的累计分布函数的逆函数(norm.ppf()),计算的是0.05分位数,即95%置信水平下的VaR。
2. 接着,代码遍历了r中的每个元素,从r的第l个元素开始进行计算,l为r长度的1/3取整后转换为整数的结果。这里的l相当于是一个滞后期,是为了避免计算的过程中出现“未来数据泄露”的问题。
3. 对于每个i,代码使用norm.fit()函数对r[i-50:i]这个区间内的收益率进行正态分布拟合,得到拟合的均值mhat和标准差shat。
4. 最后,代码将VaR_RM[i]赋值为-(mhat + qalpha*shat),即计算出在95%置信水平下的VaR。同时,代码还绘制了r和计算出的VaR_RM的曲线图。
需要注意的是,这里的VaR计算过程假设收益率服从正态分布,因此可能存在一定的局限性。此外,代码中的一些函数来自于numpy和matplotlib库,需要先导入这些库才能运行。
figure, index=[1,I:-1:2];%为什么通道的对应顺序是这样的? for k=1:I%产生I路信号 %频域去噪 mf=fft(mhat(k,:)); thrd_mf=max(abs(mf))/2;%阈值设置 mf(abs(mf)<thrd_mf)=0; mhat(k,:)=ifft(mf);%还原时域信号 subplot(4,2,k);plot(t,I*real(mhat(index(k),:)),'.-', t,m(k,:),'ro-');legend('接收解调信号','原始发射信号');% pause()%虚部是cos end
这段代码中的通道对应顺序是 [1, I, -1, -(I-1), ..., -I+1]。这是因为在频域去噪时,信号的频域表示是对称的,即 $M_f(k)=M_f^*(-k)$,其中 $M_f(k)$ 是信号在频域中的表示,$M_f^*(-k)$ 是其共轭复数。因此,频域去噪时需要同时处理正频率和负频率,而且它们的处理方式是相同的,因此可以通过以下方式对信号进行处理:首先对正频率进行处理,然后将负频率的处理结果按照相反的顺序排列,即可得到最终的处理结果。
阅读全文