绘制子图触发TypeError:Timestamp与float无法执行减法运算
问题解决:直方图叠加正态分布曲线的类型错误修复
错误原因
触发TypeError的核心问题是:你传给norm.pdf的是完整的DataFrame(包含Timestamp类型列),但norm.pdf仅接受数值型数据。当函数尝试用DataFrame里的Timestamp值和均值(float类型)做减法运算时,就会出现类型不兼容的错误。
另外,直方图默认是计数分布,而正态分布PDF是密度分布,两者纵轴尺度不匹配,需要统一为密度尺度才能让曲线和直方图对齐。
修正步骤与完整代码
1. 提取排序后的数值列
将排序操作限定在%Returns列,只保留数值型数据,而非整个DataFrame:
# 修正:仅提取并排序%Returns列 s1 = Read_FDX['%Returns'].sort_values() s2 = Read_PAG['%Returns'].sort_values() s3 = Read_R['%Returns'].sort_values() s4 = Read_UPS['%Returns'].sort_values()
2. 绘制密度直方图
给hist函数添加density=True参数,让直方图纵轴表示概率密度,和正态分布PDF的尺度匹配:
fig , axes = plt.subplots(2, 2, figsize = (15,8)) # 绘制密度直方图(纵轴为概率密度) axes[0, 0].hist(Read_FDX['%Returns'], bins=100, color='red', density=True) axes[0, 1].hist(Read_PAG['%Returns'], bins=100, color='blue', density=True) axes[1, 0].hist(Read_R['%Returns'], bins=100, color='green', density=True) axes[1, 1].hist(Read_UPS['%Returns'], bins=100, color='black', density=True)
3. 绘制正态分布曲线
用提取的数值序列计算PDF并绘制曲线:
from scipy.stats import norm # 叠加正态分布拟合曲线 axes[0, 0].plot(s1, norm.pdf(s1, mean1, std1), color='darkred', linewidth=2) axes[0, 1].plot(s2, norm.pdf(s2, mean2, std2), color='darkblue', linewidth=2) axes[1, 0].plot(s3, norm.pdf(s3, mean3, std3), color='darkgreen', linewidth=2) axes[1, 1].plot(s4, norm.pdf(s4, mean4, std4), color='gray', linewidth=2) # 可选:添加标题、优化布局 axes[0,0].set_title('FDX Returns with Normal Fit') axes[0,1].set_title('PAG Returns with Normal Fit') axes[1,0].set_title('R Returns with Normal Fit') axes[1,1].set_title('UPS Returns with Normal Fit') plt.tight_layout() plt.show()
可选优化:更平滑的拟合曲线
如果想要曲线更平滑,可以用numpy.linspace生成覆盖数据范围的密集x值,替代原始排序数据:
import numpy as np # 以FDX为例,生成1000个均匀分布的x值 x1 = np.linspace(s1.min(), s1.max(), 1000) axes[0,0].plot(x1, norm.pdf(x1, mean1, std1), color='darkred', linewidth=2)
内容的提问来源于stack exchange,提问作者Seyed Hossein Fatemi
相关产品推荐
相关产品推荐

