一.知识

给定一些散点,拟合函数去分析其自变量和因变量变动关系,这时候可以选择多种函数去进行拟合

例如excel里面会有添加趋势线这种工具,里面可以选择不同的工具,spss里面有不同函数可以同时选择进行拟合。

但是以上两种方法对单组数据操作比较方便,如果有多组数据就要不停重复导入数据进行操作,查看趋势线,该工作过于繁杂,所以创建了该代码。该函数我已经封装好代码欢迎直接调用我的代码。

二、代码调用过程

我已经虚拟一套数据集作为列子

拟合函数虚拟数据
日期 标签 自变量 因变量
2021年1月1日 A 49.63594 5.540451
2021年1月2日 A 24.5104 5.234005
2021年1月3日 A 49.93535 5.543063
2021年1月4日 A 62.09605 5.637719
2021年1月5日 A 82.77789 5.762569
2021年1月6日 A 88.63828 5.792276
2021年1月7日 A 6.045908 4.626116
2021年1月8日 A 7.498912 4.719653
2021年1月9日 A 9.502011 4.82247
2021年1月10日 A 60.30125 5.624981
2021年1月11日 A 45.19309 5.499727
2021年1月12日 A 5.901614 4.615626
2021年1月13日 B 41.6386 135.8847
2021年1月14日 B 58.23258 188.4683
2021年1月15日 B 15.78591 52.23334
2021年1月16日 B 32.88107 108.2983
2021年1月17日 B 68.40336 219.6259
2021年1月18日 B 22.22 72.62345
2021年1月19日 B 8.048647 29.02982
2021年1月20日 B 33.13403 106.557
2021年1月21日 B 86.59669 277.6387
2021年1月22日 B 94.47097 304.685
2021年1月23日 B 57.93375 186.9587
2021年1月24日 B 30.49006 99.87595
2021年1月25日 C 25.24164 18.41345
2021年1月26日 C 38.64638 63.9966
2021年1月27日 C 18.45192 65.63098
2021年1月28日 C 84.22761 268.1763
2021年1月29日 C 23.32117 61.23712
2021年1月30日 C 97.17947 237.9303
2021年1月31日 C 48.25496 40.07267
2021年2月1日 C 16.88487 29.8532
2021年2月2日 C 24.10362 28.57303
2021年2月3日 C 61.63955 107.2201
2021年2月4日 C 72.30827 215.4583
2021年2月5日 C 81.15836 239.947

这里开始讲解我的参数

data_df:导入的dataframe列名如下,['日期',‘标签’,‘自变量’,‘因变量’],日期这一列名称可以进行自定义,可以不按照我的,设置自己喜欢的index方式,其他三列请按照我的名称。ps:标签是记录哪一组数据回归的意思。测试的数据集,我会放入我的资源里面,欢迎大家下载测试代码。

x_自变量: x_自变量='自变量' ,这里输入自变量的名称。

y_因变量: y_因变量='因变量' ,这里输入你变量的名称。

fw:np.arange(1,100,1)  ,这里numpy生产一系列数据,这里控制的是x轴的范围,怎么画图。

io_1:r'C:\Users\***\Desktop\临时文件',这个写入生成的回归图片保存的路径

def analysis_of_regression(data_df,x_自变量,y_因变量,fw,io_1):     import matplotlib.pyplot as pltimport pandas as pdfrom sklearn.metrics import r2_scoreplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号#%%需要外部加载的变量# df_a = pd.DataFrame( columns=['标签','类型', 'r2', '航司','公式']) df_a = pd.DataFrame() df_d = pd.DataFrame(columns=('标签','类型','r2','系数'))data_array = np.array(data_df[['标签']])b=data_array.tolist()a=[x for tup in b for x in tup]a = list(set(a))#开始进行函数拟合for i in a:    # for i in [1]:jj=data_df[(data_df['标签']==i)]# jj=data_df##线性x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(x_cz_2, y_cz_2, 1)print(L)Z=np.polyval(L,x_cz_2,)score = r2_score(y_cz_2, Z, multioutput='raw_values')print('线性:'+str(score))new=pd.DataFrame({'标签':i,'类型':'线性','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##指数x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(x_cz_2, np.log(y_cz_2), 1)Z=np.polyval(L,x_cz_2)true=np.exp(Z)score = r2_score(y_cz_2,true, multioutput='raw_values')print('指数:'+str(score))new=pd.DataFrame({'标签':i,'类型':'指数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))# ##二次# x_cz_2=jj[['自变量']].values.tolist()# y_cz_2=jj[['因变量']].values.tolist()# x_cz_2=sum(x_cz_2,[])# y_cz_2=sum(y_cz_2,[])# L=np.polyfit(x_cz_2, y_cz_2, 2)# print(L)# Z=np.polyval(L,x_cz_2,)# score = r2_score(y_cz_2, Z, multioutput='raw_values')# print('二次:'+str(score))# new=pd.DataFrame({'标签':i,#                   '类型':'二次',#                   'r2':score,#                   '系数':[L]})# df_d=df_d.append(new,ignore_index=(True))##幂函数x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(np.log(x_cz_2), np.log(y_cz_2), 1)Z=np.polyval(L,np.log(x_cz_2))true=np.exp(Z)score = r2_score(y_cz_2,true, multioutput='raw_values')print('幂函数:'+str(score))new=pd.DataFrame({'标签':i,'类型':'幂函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##对数x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(np.log(x_cz_2), y_cz_2, 1)Z=np.polyval(L,np.log(x_cz_2))score = r2_score(y_cz_2,Z, multioutput='raw_values')print('对数:'+str(score))new=pd.DataFrame({'标签':i,'类型':'对数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##复合函数x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(x_cz_2,np.log(y_cz_2), 1)Z=np.polyval(L,x_cz_2)true=np.exp(Z)score = r2_score(y_cz_2,true, multioutput='raw_values')print('复合函数:'+str(score))new=pd.DataFrame({'标签':i,'类型':'复合函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))##生长x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])y_cz_2=sum(y_cz_2,[])L=np.polyfit(x_cz_2, np.log(y_cz_2), 1)Z=np.polyval(L,x_cz_2)true=np.exp(Z)score = r2_score(y_cz_2,true, multioutput='raw_values')print('生长:'+str(score))new=pd.DataFrame({'标签':i,'类型':'生长','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))# ##三次# x_cz_2=jj[['自变量']].values.tolist()# y_cz_2=jj[['因变量']].values.tolist()# x_cz_2=sum(x_cz_2,[])# y_cz_2=sum(y_cz_2,[])# L=np.polyfit(x_cz_2, y_cz_2, deg=3)# Z=np.polyval(L,x_cz_2)# score = r2_score(y_cz_2,Z,multioutput='raw_values')# print('三次:'+str(score))# new=pd.DataFrame({'标签':i,#                   '类型':'三次',#                   'r2':score,#                   '系数':[L]})# df_d=df_d.append(new,ignore_index=(True))# ##S函数# x_cz_2=jj[['自变量']].values.tolist()# y_cz_2=jj[['因变量']].values.tolist()# x_cz_2=sum(x_cz_2,[])# x_cz_3 = [1/x for x in x_cz_2]# y_cz_2=sum(y_cz_2,[])# L=np.polyfit(x_cz_3, np.log(y_cz_2), 1)# Z=np.polyval(L,x_cz_3)# true=np.exp(Z)# score = r2_score(y_cz_2,true,multioutput='raw_values')# print('S函数:'+str(score))# new=pd.DataFrame({'标签':i,#                   '类型':'S函数',#                   'r2':score,#                   '系数':[L]})# df_d=df_d.append(new,ignore_index=(True))##逆函数x_cz_2=jj[['自变量']].values.tolist()y_cz_2=jj[['因变量']].values.tolist()x_cz_2=sum(x_cz_2,[])x_cz_3 = [1/x for x in x_cz_2]y_cz_2=sum(y_cz_2,[])L=np.polyfit(x_cz_3, y_cz_2, 1)Z=np.polyval(L,x_cz_3)score = r2_score(y_cz_2,true,multioutput='raw_values')print('逆函数:'+str(score))new=pd.DataFrame({'标签':i,'类型':'逆函数','r2':score,'系数':[L]})df_d=df_d.append(new,ignore_index=(True))df_zh=df_d.sort_values('r2', ascending=False).groupby('标签', as_index=False).first()ff=df_zh# second=df_e[(df_e['类型']=='二次')]j=0while  j < len(a):gg=ff.iloc[[j]].values.tolist()gg =sum(gg,[]) if gg[1] == '二次':x=fwy_sh=gg[3][0]*x**2+gg[3][1]*x+gg[3][2]formu_s='y='+str(gg[3][0])+str('x^2+')+str(gg[3][1])+str('x')+str('+(')+str(gg[3][2])+str(')')elif gg[1] == '线性':x=fwy_sh=gg[3][0]*x+gg[3][1]formu_s='y_zh='+str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str(')')elif gg[1] == '指数':x=fwy_sh=np.exp(gg[3][0]*x+gg[3][1])formu_s='y='+str(np.exp(gg[3][1]))+str('e')+'^'+str(gg[3][0]) +'x'elif gg[1] == '幂函数':x=fwy_sh=np.exp(gg[3][1]+(np.log(x)*gg[3][0]))   formu_s='y='+str(np.exp(gg[3][1]))+str('x')+'^'+str(gg[3][0])elif gg[1] == '对数':x=fwy_sh=gg[3][1]+(np.log(x)*gg[3][0])  formu_s='y='+str(gg[3][1])+'+'+str(gg[3][0])+'In(x)'      elif gg[1] == '生长':x=fwy_sh=np.exp(gg[3][0]*x+gg[3][1])   formu_s='y='+'e^('+str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str('))')     elif gg[1] == '三次':x=fwy_sh=gg[3][0]*x**3+gg[3][1]*x**2+gg[3][2]*x+gg[3][3]formu_s='y='+str(gg[3][0])+str('x^3+')+str(gg[3][1])+str('x^2+')+str(gg[3][2])+str('x')+str('+(')+str(gg[3][3])+str(')')elif gg[1] == 'S函数':x=fwy_sh=np.exp(gg[3][0]*(x)**(-1)+gg[3][1])   formu_s='y='+'e^('+str(gg[3][0])+str('(1/x)')+str('+(')+str(gg[3][1])+str('))')          elif gg[1] == '逆函数':x=fwy_sh=gg[3][0]*(x)**(-1)+gg[3][1]   formu_s='y='+str(gg[3][0])+str('(1/x)')+str('+(')+str(gg[3][1])+str(')')elif gg[1] == '复合函数':x=fwy_sh=np.exp(gg[3][1]+(gg[3][0]*x))   formu_s='y='+str(np.exp(gg[3][1])) +'*'+str(np.exp(gg[3][0])) +'^x'       gg.append(formu_s)del gg[3]gg=[gg]df_a=df_a.append(gg,ignore_index=(True))# if gg[1] == '二次':#     x=np.arange(0.15,0.4,0.002)#     y_nh=gg[3][0]*x**2+gg[3][1]*x+gg[3][2]-x#     formu_n='y_cz='+str(gg[3][0])+str('x^2+')+str(gg[3][1])+str('x')+str('+(')+str(gg[3][2])+str(')')+'-x'# elif gg[1] == '线性':#     x=np.arange(0.15,0.4,0.002)#     y_nh=gg[3][0]*x+gg[3][1]-x#     formu_n='y_cz='+str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str(')')+'-x'# elif gg[1] == '指数':#     x=np.arange(0.15,0.4,0.002)#     y_nh=np.exp(gg[3][0]*x+np.log(gg[3][1]))-x#     # formu=str(gg[3][0])+str('x')+str('+(')+str(gg[3][1])+str(')')    # else :#     x=np.arange(0.15,0.4,0.002)#     y_nh=np.exp(gg[3][0]*x+np.log(gg[3][1])) -x# if gg[5] == '二次':#     x=np.arange(0.15,0.4,0.002)#     y_sh=gg[7][0]*x**2+gg[7][1]*x+gg[7][2] -x#     formu_s='y_zh='+str(gg[7][0])+str('x^2+')+str(gg[7][1])+str('x')+str('+(')+str(gg[7][2])+str(')')+'-x'# elif gg[5] == '线性':#     x=np.arange(0.15,0.4,0.002)#     y_sh=gg[7][0]*x+gg[7][1] -x#     formu_s='y_zh='+str(gg[7][0])+str('x')+str('+(')+str(gg[7][1])+str(')')+'-x'# elif gg[5] == '指数':#     x=np.arange(0.15,0.4,0.002)#     y_sh=np.exp(gg[7][0]*x+np.log(gg[7][1])) -x # else :#     x=np.arange(0.15,0.4,0.002)#     y_sh=np.exp(ff[7][0]*x+np.log(ff[7][1])) -x# fig11=plt.figure(num=11,figsize=(20,17))# ax11=fig11.add_subplot(111)#调整保存图片的大小plt.figure(figsize=(20, 15))plt.plot(x,y_sh,'r-.o',label=y_因变量+formu_s+'  r2='+str(gg[0][2]),linewidth=0.05)plt.tick_params(labelsize=23)plt.xlabel(x_自变量,fontsize=40)plt.ylabel(y_因变量,fontsize=40)plt.title(str(gg[0][0])+'--'+x_自变量+'&'+y_因变量,fontsize=40) #要用plt调动titleplt.legend(fontsize=30)x2=data_df[(data_df['标签']==gg[0][0])][['自变量']]y2=data_df[(data_df['标签']==gg[0][0])][['因变量']]colors2 = '#DC143C'area = np.pi * 6**2.7  # 点面积 # 画散点图plt.scatter(x2, y2, s=area, c=colors2, alpha=0.5)plt.savefig('')plt.savefig(io_1+'/%s.jpg'%(gg[0][0]), bbox_inches='tight')plt.show()# plt.close()j=j+1if j > len(a)-1:    breakdf_a.columns= ['标签','类型', 'r2','公式'] return df_a

三、开始调用代码,验证成果

import pandas as pd
import numpy as  np
#需要加载的数据集
io=r'C:\Users\**\Desktop\测试集.xlsx'
data_df=pd.read_excel(io,sheet_name='测试数据集')
x_自变量='自变量'
y_因变量='因变量'
io_1=r'C:\Users\**\Desktop\临时文件'
fw=np.arange(1,100,1)answer=analysis_of_regression(data_df,x_自变量,y_因变量,fw,io_1)

撒花,完美调用~。本篇都是原创的代码,如果代码好用请点赞!

封装好的散点图拟合八大函数回归模型(逆、幂函、对数、S、复合、生长、指数 、线性函数,)相关推荐

  1. R语言glm.nb函数构建负二项分布回归模型、epiDisplay包的poisgof函数对拟合的负二项分布回归模型进行拟合优度检验、即模型拟合的效果、验证模型是否有过度离散overdispersion

    R语言glm.nb函数构建负二项分布回归模型(negative binomial).使用epiDisplay包的poisgof函数对拟合的负二项分布回归模型进行拟合优度检验.即模型拟合的效果.验证模型 ...

  2. R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型、或者pysch包计算偏相关系数(Partial Correlation)、通过方差分析获得偏相关系数的F统计量(偏F检验、二型检验)

    R语言偏相关或者部分相关性系数计算实战:通过拟合两个回归模型.或者pysch包计算偏相关系数(Partial Correlation).通过方差分析获得偏相关系数的F统计量(偏F检验.二型检验) 目录

  3. 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型

    # -*- coding: utf-8 -*- ''' Created on 2018年1月24日 @author: Jason.F @summary: 有监督回归学习-RANSAC拟合高鲁棒性回归模 ...

  4. predict函数 R_R包randomForest的随机森林回归模型以及对重要变量的选择

    R包randomForest的随机森林回归模型以及对重要变量的选择关于随机森林(random forest),前文"随机森林分类以及对重要变量的选择"中已经对其基本原理作了简单概括 ...

  5. 基于spss的分段回归模型(piecewise linear regression)

    基于spss的分段回归模型 一.简介 二.模型分析 三.基于spss的案例分析 (一)图像分析 (二)回归分析 参考文章: 一.简介  分段线性回归是指当y对x的回归在x的某一范围的服从某种线性关系, ...

  6. 第五章 逻辑回归模型在评分卡开发中的应用

    逻辑回归模型在评分卡开发中的应用 课程简介:在分类场景中,逻辑回归模型是常用的一类算法.它具有结构简单.可解释性强.输出结果是"软分类"的特点.评分模型多采用这类算法.同时逻辑回归 ...

  7. origin中文版散点图拟合曲线_origin中两组数已经画出散点图,如何新增类似于excel中的趋势线?而且是幂函式的,求高手指点...

    origin中两组数已经画出散点图,如何新增类似于excel中的趋势线?而且是幂函式的,求高手指点以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让 ...

  8. R:ggplot2各类回归模型的回归线绘制方法

    展示各类回归模型的回归线绘制方法,包括通用绘制方法以及ggplot2提供的一些回归线简单绘制方法: 线性回归 多项式回归 loess(局部加权)回归 分段线性回归 样条回归 稳健回归 分位数回归 li ...

  9. R构建指数回归模型(Exponential Regression)

    R构建指数回归模型(Exponential Regression) 目录 R构建指数回归模型(Exponential Regression) 指数回归(Exponential Regression) ...

最新文章

  1. int(1) 和 int(10) 的区别?很多老程序都理解错了!
  2. 使用Struts2上传文件超过2M报错解决方法
  3. 150名打工人被AI判定“效率低”遭开除,网友:属实是人工智能,能治工人
  4. mac睡眠快捷键_mac键盘快捷键大全
  5. html如何引入less,VueJS如何引入css或者less文件的一些坑
  6. Send data format set as XML
  7. 校友管理软件 JAVA_开源项目1:某大学校友管理系统
  8. 老牌开源Office操作组件NPOI现已支持.NET Core
  9. c++STL中的find()函数 有两种使用方法
  10. oracle18c升级19,Upgrading Oracle 18c To 19c
  11. kettle 用cmd bat来运行ktr和kjb
  12. 【MySQL】insert into 和select 搭配使用进行表间复制
  13. commit work php,GitHub - sbzhu/weworkapi_php: official lib of wework api
  14. OSG StateSet
  15. Python split()函数的用法
  16. 干货 | 滴滴 数据分析原来是这样做的!
  17. 沣东新城镐京遗址规划_沣东新城稳步推进镐京遗址保护 确保文化遗产保护成果惠及民生...
  18. Nmon服务器资源监控工具
  19. Asp.net core 3.1利用IHostedService为系统注入自己的主机
  20. 离散数学 - 容斥原理

热门文章

  1. Rosenfeld细化算法 matlab(速度超慢)
  2. Python图像处理之识别图像中的文字
  3. argument和parameter的区别:
  4. 关于xp系统下的IIS 500错误
  5. python/sympy计算施密特正交化向量
  6. 你们怎么都有自己的聊天机器人?给我也来一个!
  7. 正交变换法中的A矩阵怎么求
  8. 开启Windows的文件大小写区分功能
  9. 高中数学必修二立体几何中的向量方法(经典案例讲解)
  10. 初学SNMP,在spring boot 下使用snmp4j 做本地测试调通的记录