如何从DataFrame多列中获取各列与Time列的拟合斜率?
问题
我使用以下代码从单个DataFrame生成多个散点图,其中第一列Time为所有图表的X轴,其余列A、B、C…为各图表的Y轴:
import numpy as np import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel("output.xlsx") columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'] for i in enumerate(columns): plt.subplot(20,4, i[0]+1) x = 'Time' y = i[1] plt.scatter(x,y, data=df) plt.show()
我已成功生成所有图表,但还想获取每个图表对应的拟合斜率。我想到了如下代码:
from scipy import stats slope, intercept, r_value, p_value, std_err = stats.linregress(df['Time'], df['A'])
但如何扩展该代码以获取A、B、C…每一列的斜率?
解决方案
直接在遍历列的循环中加入线性回归计算即可,同时可以把斜率存储起来,还能把斜率标注在对应散点图上,方便对应查看:
完整代码示例
import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy import stats df = pd.read_excel("output.xlsx") columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'] # 用字典存储列名与对应斜率的映射 slope_dict = {} # 调整画布大小,优化子图布局(20列分成5行4列更合理) plt.figure(figsize=(16, 25)) for idx, col in enumerate(columns): plt.subplot(5, 4, idx+1) # 绘制散点图 plt.scatter(df['Time'], df[col]) # 计算当前列的线性回归参数 slope, intercept, r_value, p_value, std_err = stats.linregress(df['Time'], df[col]) # 存储斜率 slope_dict[col] = slope # 绘制拟合直线(可选,让趋势更直观) plt.plot(df['Time'], intercept + slope * df['Time'], color='red', linestyle='--') # 在子图左上角标注斜率值 plt.text(0.05, 0.95, f"Slope: {slope:.4f}", transform=plt.gca().transAxes, bbox=dict(facecolor='white', alpha=0.8)) plt.title(f"{col} vs Time") plt.xlabel("Time") plt.ylabel(col) # 自动调整子图间距,避免重叠 plt.tight_layout() plt.show() # 打印所有列的斜率 print("各列拟合斜率:") for col, slope in slope_dict.items(): print(f"{col}: {slope:.4f}") # 可选:将斜率结果保存到Excel文件 slope_df = pd.DataFrame.from_dict(slope_dict, orient='index', columns=['Slope']) slope_df.to_excel("column_slopes.xlsx")
关键说明
- 遍历每一列时,对当前列
col调用stats.linregress(df['Time'], df[col])即可计算出对应斜率 - 用字典
slope_dict可以清晰存储列名与斜率的对应关系,方便后续调用 - 调整子图布局为5行4列,避免原20行4列导致的图表过于狭长的问题
- 可选添加拟合直线和斜率标注,让可视化结果更直观
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

