用python怎么实现多个excel自动两列位置对调?

 

可以增加单列,并赋值,如果想同时对多列进行赋值

 
 

  

先前的例子,用如下的方法就行了

 

如果'月份','企业'列存在,用如下也可,上例中,直接可以创建不存在的列。

 
 

今天又遇到一个从某列截取字符串长度写到另一列的,也一并写到这里:

货品列在原表中无,取货品代码的前12位。

 

后记:又遇到想新增两列并赋值的问题

 
 
 
 

方法二:使用zip打包返回结果来处理

 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

}

自动驾驶、智能家居、语音助手、人脸识别、无人汽车、购物推荐、机器人等人工智能不知不觉已经在我们身边不断成为我们逐步习惯的生活一部分,机器学习算法正是实现人工智能的重要工具,如何利用机器学习算法挖掘大数据中储藏的价值依然成为各行各业关乎企业未来的核心竞争力,在泛金融领域内的保险板块,近年来保险科技一直在从保险发展的痛点出发,探索机器学习算法赋能业务发展,不乏很多成功的金融科技案例,比如精准营销推荐、智能核保、保险反欺诈等,在精算生态圈中也在不推探索新技术对传统技术的推陈出新,本文基于相关研究运用机器学习算法,对物联网下的保险大数据进行保险产品风险区分,可以较好的帮助进行分类费率的厘定。

机器学习旨在研究如何通过计算机手段,利用经验(数据)来改善系统自身的性能(模型算法),让计算机能更具有人工智能,让产品更好的体现和适应这个世界。常用的基学习器算法有线性回归、逻辑回归、支持向量机、k均值聚类、密度聚类、贝叶斯分类器、协同过滤、决策树、神经网络等,结合集成学习方法可以实现大数据机器学习。

保险产品是保险经营的核心,风险量化区分又是产品设计的核心,通俗的说,就是根据对不同承保对象风险状况的评估进行科学精准的收取与其风险状况相匹配的保费。

三、机器学习提升保险风险区分能力

以基于UBI数据的汽车保险产品为例,通过机器学习比较传统模型提升车险风险区分能力,探索思路方法如下:

下文基于监督学习体系(有目标变量),采用历史赔款(或赔付率)数据作为目标变量,组织赔案对应保单车辆的驾驶人性别年龄等从人因子、车龄车系等从车因子、历史出险次数等奖惩因子、平均行驶时长里程等UBI动态数据,其中车联网的大数据不断大量积累,里面蕴含了丰富的标签因子可以解释量化风险。

按照经典机器学习的样本数据分组方法,将样本数据分为训练集、验证集和测试集,其中使用训练集来训练模型和估计参数等,使用验证集来验证模型和调优参数,以防止过拟合后预测效果较差等情况的发生,提高模型的泛化能力,使用测试集来检验所选模型对研究项目的性能如何,以及进行泛化结果的展示。常用经验的划分比例使用留出法随机抽取样本,如训练集占总样本的50%左右,而其它各占25%左右。

对于动辄上百个因子的车辆网大数据,传统的定价方法难以有效适应,至少在前期有效因子识别上无法做到满足许多经典分类定价方法的假设条件,这时提出使用机器学习算法则可以充分发挥其长处,通过实践表明对多因子进行处理的机器学习算法对风险识别能力有较好的提升度。在这里机器学习算法包括进行分类的基学习器模型和多模型融合的集成学习方法两部分。

tree的简称,一种著名的决策树学习算法)决策树模型作为机器学习的基学习器,其原理简单来说,假设我们简化为三个因子变量和一个目标变量,采用最小方差的方法来进行属性的最优特征选择,以及叶节点等参数的选择。比如对汽车电池类型属性有两类(纯电,混动)特征,对高峰行驶占比连续属性需要进行排序后取两两特征值的中位数分别作为划分点(25.5,28.0,30.5,32.5,34.5,37.0,42.5)进行特征选择,对于地区属性每次取其中一个离散值作为划分点,如(北京,其他)或(山西,其它)等。分别计算上述每个属性的每个分类对数据集拆分后的方差,然后选择最小方差作为当前划分的特征选择,通过计算划分前后的方差的大小或是否可继续拆分等来决定是否成为叶节点。

面对海量数据和特征,提升单个模型的效果已经是事倍功半,因此当前主流的做法是通过构建多个不同的模型进行集成学习,并将这些模型融合起来从而提高最终模型的效果,提高模型泛化能力。目前融合模型主要有两类:Bagging和Boosting。Bagging是并行运算,将原始数据分为n份,每份单独进行模型训练,并得到该数据集最优的基学习器。Boosting是串行运算,本次模型学习依赖于前一次模型结果,基于前一次模型结果更新预测偏差较大的样本权重,并重新学习。无论是Bagging,还是Boosting,最终模型是n个基学习器的加权综合,对于回归模型取各个基学习器的均值作为最终预测结果。

选取随机森林(RandomForest)作为其中一种机器学习评分方法。随机森林是基于Bagging思想所改进的算法,在样本和特征上都体现了随机性,每个子集都采用自助法(bootstrap)有放回的随机抽取样本和特征,构建基学习器(CART),采用此种方法能够降低所构建的不同的决策树的相关度,增强模型的泛化能力,并行运算效率高等。

      选取Xgboost与GBDT作为另外两种机器学习评分方法。GBDT是基于Boosting的思想,基本原理是让样本的损失变得更小,即每次迭代是对上一次的损失进行学习,进而拟合一个CART回归树。优点是用更少的树个数与深度达到更好的效果。此外目前比较流行的 Xgboost框架与GBDT相比,对损失函数采用二阶泰勒展开进行优化,并且将树的复杂度和目标函数结合起来,此外在运算方面也做了很多优化,运算效率得到极大的提升。

首先使用赔付率区分倍数进行单因子一维分析,从示例因子结果来看汽车被保险人年龄单因子风险区分度最高为3.0倍。其中,赔付率区分倍数计算方法:按风险因子的值由小到大排序并等分10组后,区分倍数=第10组赔付率/第1组赔付率。

       对汽车行驶省份进行分组查看满期赔付率的差异,假设示例数据可说明因子对风险差异的影响显著程度。

一种比较简单的评估模型表现的方法就是将实际目标变量和各个模型的预测目标变量画图,通常将预测目标变量按照从小到大排序,分为100份,计算每份中的实际平均值放在y轴,预测平均值放在x轴,进行作图,如果模型比较好,图形应该比较接近分布在对角线上。亦可以使用样本残差和模型残差进行QQ图比较。较为简单不再展开。

GBDT三种算法建模训练后应用于测试集,然后将测试集的风险评分从小到大排序并等分为10组,得到三种模型各自风险评分对赔付率区分能力。从赔付率区分倍数分析,使用模型的区分效果均好于单因子的区分效果,三种模型区分率倍数分别为XGBoost3.5倍,RF3.2倍,GBDT3.0倍(假设数据),从区分倍数以及曲线波动性两方面评价,XGBoost选为最终模型。

2.3差异比率分布比较法

对数据集分别采用XGBoost,RF, GBDT三种算法建模训练后应用于测试集,对模型结果和真实值分别做差异比率(模型值/真实值-1),按照差异比率大小排序分为十组(或百组),比较各组模型值与真实值的差异情况,以及对应的承保数量情况,从下图示例中可以看出模型1与真实值的差异更小一些。选定模型1为最终结果。

采用XGBoost算法建模后,将测试集建模后的风险评分从小到大排序并等分为10组,得到风险评分对赔付率区分能力如绿线所示,可以看出随着高风险分组的递增,实际赔付率也呈现了递增趋势,说明测试集展示的模型训练效果还是很好的,再将对应分组下使用传统模型进行预估的赔付率用黄色线来对比,可以看到在低风险组中,传统评分对部分保单高估了实际风险,在高风险组中,传统评分对部分保单低估了实际风险,而新的评分可以起到一个风险细分的提升作用。

比对模型提升度图的作图步骤为,第一对每个记录计算新模型预测值和原模型预测值的比率;第二步,将此比率按照从小到大排序;第三步,将排序好的比率分为十等份;第四步,分别计算在每个分组下,新模型的预测平均值,原模型的预测平均值,以及实际值的平均值;第五步,将上面计算三个数据画曲线。模型解读为,在每个分类中跟实际值最吻合的为模型提升度比较好,尤其在第一组为新模型相对原模型认为纯保费最低的组,最后一组为新模型相对原模型认为纯保费最高的组,在这里可以看出,在这两组中新模型更切合实际值,相对原模型,风险区分度提升效果更好。

对新模型评分和原模型评分放入二维表中可以更直观看出风险细分的提升,将样本按照原评分分为十组,同时按照新评分分为十组,两两交叉后统计每个格子的实际赔付率和承保数量,图表上部为实际赔付率展示,下部为相对应的保单数量展示,从右上角的部分可以看出,对于原评分低风险组中,存在实际赔付率比较高的样本,从左下角可以看出对于原评分风险比较高的组,也存在实际赔付率比较低的样本,通过新风险评分可以起到风险细分提升的作用。

3.4基尼系数提升效果

基尼系数也常用来在保费费率中使用,第一步,对模型预测值按照从小到大排序,在前面的为优质低风险业务,在后面的劣质高风险业务;第二步,对上面排序好的风险暴露累计百分比作为x轴;第三步,对x轴对应的损失值累计百分比作为y轴,作图。计算洛伦兹曲线与45度线之间的面积,2倍此面积为基尼系数,基尼系数越大说明模型区分优质和劣质业务的能力越强,如果基尼系数为零,说明低风险和高风险业务同样风险暴露数量的赔付一样,即风险风险区分能力不好。下图可见新模型区分能力更好一些。

四、分类费率定价进一步应用

    通过机器学习模型可以从成百上千的大数据影响因素中挑选出影响显著程度较高,累计能解释信息量n%以上的m个因子,再结合GLM模型,进行分类费率系数的计算,可进一步应用于产品的分类费率厘定。

综上,通过机器学习对大数据处理的固有优势,可输出费率参考、风险评价等结果,为保险公司在风险成本定价,创新产品开发,核保业务风险识别与资源配置,理赔业务反欺诈成本控制,多维度用户画像增值服务等方面提供价值赋能。本文所用图表数据为模拟假设数据,方法思路参考了《机器学习》、《机器学习算法保险场景应用》等相关参考文献,以及作者自身团队过往已公开发表的相关研究成果。

最后,本汽车保险风险分类区分方法可以拓展应用到其他保险类型,如家财险,健康险等,也可通过选择适合的基学习器拓展应用到银行业信贷信用水平评价、基金绩效水平评价、互联网客户群体细分等大数据渗透率比较高的场景,真正挖掘数据时代的价值。


当中秋遇上国庆,当家睦与国安同在,当花好陪伴月圆。祝福大家中(秋)国(庆)节节日快乐,幸福安康,吉祥如意!

}
  • Excel能完成一般办公中绝大多数的数据分析工作,但是当数据量大、数据表格多时,可借助Python中功能丰富而强大的第三方模块来提高工作效率。本章将讲解如何利用pandas、xlwings等模块编写Python代码,快速完成排序、筛选、分类汇总、相关性分析、回归分析等数据分析工作。

105排序一个工作表中的数据(方法一)

  • 如下图所示为工作簿“销售表.xlsx”的工作表“总表”中的数据表格。本案例要通过Python编程对表格按指定列进行排序。
  • 第3行代码用于对读取的数据按照“利润”列进行降序排序,读者可根据实际需求修改列名。如果要做升序排序,则将参数ascending设置为True。如果想要先按“利润”列做降序排序,遇到相同的利润值时再按“销售金额”列做降序排序,可将该行代码修改为“data=data.sort_values(by=[‘利润’,‘销售金额’],ascending=False)”。

106 排序一个工作表中的数据(方法二)

  • 在案例105中,使用pandas模块操作数据后,数据的格式设置会丢失。如果想要保持格式不变,可结合使用pandas模块和xlwings模块来完成排序。

107 排序一个工作簿中所有工作表的数据

  • 在案例105和案例106的基础上,可批量完成多个工作表数据的排序。现在需要对所有工作表的数据按“销售金额”列做降序排序。

108 排序多个工作簿中同名工作簿的数据

  • 先要对工作表“销售金额”中的数据按“销售金额”列做降序排列。

109 根据单个条件筛选一个工作表中的数据

  • 筛选是最常用的数据分析工具之一。本案例要通过Python编程对一个工作表中的数据按单个筛选条件进行筛选。

110 根据多个条件筛选一个工作表中的数据

111 筛选一个工作簿中所有工作表的数据

112 筛选一个工作簿中所有工作表的数据并汇总

  • 案例111将筛选出的数据存放在不同的工作表中,本案例则要将筛选出的数据汇总存放在一个工作表中。

113 分类汇总一个工作表

  • 案例059使用pandas模块中的groupby()函数实现了数据分组,本案例要在此基础上实现数据的分类汇总,即先分组,再对组内数据进行求和、求平均值、计数等汇总运算。
  • 用groupby()函数对数据进行分组后,接着使用sum()函数对各组数据进行求和运算。如果要进行其他方式的汇总运算,如求平均值、计数、求最大值、求最小值,可以分别使用mean()、count()、max()、min()函数。

114 对一个工作表求和

  • 如果不需要对工作表中的数据进行分类汇总,而是直接做求和运算,可以使用pandas模块中的sum()函数实现。
  • 用于求和的sum()函数也可以修改为mean()、count()、max()、min()等函数来完成其他类型的统计运算。

115 对一个工作簿的所有工作表分别求和

  • 将用于求和的sum()函数修改为mean()、count()、max()、min()等函数来完成其他类型的统计运算。本案例要将求和结果放在“采购金额”列最后一个单元格下方的单元格中,但是每个工作表的数据行数不一定相同,所以先通过第9行和第10行代码获取相关单元格的列号和行号,再通过第11行和第12行代码写入所需内容。

116 在一个工作表中制作数据透视表

  • Excel中的数据透视表能快速汇总大量数据并生成报表,是工作中分析数据的好帮手。虽然在Excel中制作数据透视表的过程不算复杂,但是操作步骤也不少。如果想要通过Python编程制作数据透视表,就需要掌握pandas模块中的pivot_table()函数。
  • 第7行代码是制作数据透视表的核心代码。其中“销售数量”和“销售金额”是数据透视表的值字段,“产品名称”是数据透视表的行字段,可根据实际需求修改;‘sum’是指使用pandas模块中的sum()函数对值字段进行求和,可根据实际需求修改为’mean’、‘count’、‘max’、'min’等其他统计函数。
  • 第10行代码中的A1是指在工作表中写入数据透视表的起始单元格,读者可根据实际需求修改为其他单元格。
  • 第7行代码中的pivot_table()是pandas模块中的函数,用于创建一个电子表格样式的数据透视表。函数的第1个参数用于指定数据透视表的数据源;参数values用于指定值字段;参数index用于指定行字段;参数aggfunc用于指定汇总计算的方式,如’sum’(求和)、‘mean’(求平均值),如果要设置多个值字段的计算方式,可使用字典的形式,其中字典的键是值字段,值是计算方式;参数fill_value用于指定填充缺失值的内容,默认不填充;参数margins用于设置是否显示行列的总计数据,为False时不显示;参数margins_name用于设置总计数据行的名称。

117 使用相关系数判断数据的相关性

  • 如下页图所示为某公司的产品销售利润、广告费用和成本费用数据,现要判断产品销售利润与哪些费用的相关性较大。在Excel中,可以使用CORREL()函数和相关系数工具来分析数据的相关性。在Python中,则可以使用pandas模块中DataFrame对象的相关系数计算函数——corr()。
  • 第2行代码用于读取工作簿“销售额统计表.xlsx”的第1个工作表中的数据,并使用“序号”列的数据作为行索引。
  • 第3行代码用于计算第2行代码读取的数据中任意两个变量之间的相关系数。如果只想判断某个变量与其他变量之间的相关性,可将第3行代码修改为“result=data.corr()[‘销售利润(万元)’]”,它表示计算销售利润与其他变量之间的相关系数
  • 运行本案例的代码后,会得到如下所示的相关系数矩阵。第4行第2列的数值为0.985442,表示销售利润与广告费用的相关系数,其余数值的含义依此类推。需要说明的是,矩阵中从左上角至右下角的对角线上的数值都为1,这个1没有实际意义,因为它表示变量自身与自身的相关系数,自然是1。从该矩阵可以看出,销售利润与广告费用之间存在较强的线性正相关,而与成本费用之间的相关性较弱。

118 使用描述统计和直方图制定目标

  • 某公司计划对销售员实行目标管理。为了制定出科学且合理的销售目标,销售主管从几百名销售员的销售额数据中随机抽取了部分数据,作为制定销售目标的依据,如下页图所示。通过仔细观察可以发现,有很大一部分数据都落在一定的区间内,因此,可以运用Excel中的描述统计工具获取这批数据的平均数、中位数等指标,从而估算出销售目标。本案例则要通过Python编程对销售额数据进行分组并绘制直方图,然后通过进一步分析,制定出合理的销售目标。
  • 第5行代码用于计算数据的个数、平均值、最大值和最小值等描述统计数据。第6行代码用于将“销售额(万元)”列的数据分为6个均等的区间,第8行代码用于统计各个区间的人数。第9行和第10行代码将第5、6、8行代码的分析结果整理成数据表格。
  • 第11~18行代码完成直方图的绘制。其中最核心的是第14行代码,它使用Matplotlib模块中的hist()函数绘制直方图,绘制时将数据平均划分为6个区间(bins=6),与第6行代码所做的分组统计保持一致,此外还适当设置了直方图中柱子边框的颜色和粗细,以提高图表的可读性。第15行代码将绘制直方图的过程中划分区间得到的端点值标注在x轴上。
  • 第19~25行代码用于打开工作簿“员工销售业绩表.xlsx”,在第1个工作表中写入分析结果,并以图片的形式插入绘制的直方图。其中第22行和第23行代码中的单元格E1和H1为要写入数据的区域左上角的单元格,可根据实际需求修改为其他单元格。
  • (1)第2行代码中导入的Matplotlib模块是一个绘图模块,第7章将详细介绍该模块的用法。
  • (2)第5行代码中的describe()是pandas模块中的函数,对于一维数组,describe()函数会返回一系列描述统计数据,如count(个数)、mean(平均值)、std(标准差)、min(最小值)、25%(下四分位数)、50%(中位数)、75%(上四分位数)和max(最大值)。
  • (3)第6行代码中的cut()是pandas模块中的函数,用于对数据进行离散化处理,也就是将数据从最大值到最小值进行等距划分。函数的第1个参数是要进行离散化的一维数组;第2个参数如果为整数,表示将第1个参数中的数组划分为多少个等间距的区间,如果为序列,表示将第1个参数中的数组划分在指定的序列中。


119 拟合回归方程并判断拟合程度

  • 如下图所示为某公司某年每月的销售额和在两种渠道投入的广告费,如果现在需要根据广告费预测销售额,可以使用Excel中的回归分析工具拟合出线性回归方程,并通过计算R2值判断方程的拟合程度。本案例要使用Scikit-Learn模块的LinearRegression()函数快速拟合出线性回归方程,然后使用score()函数计算R2值。
x = df[['视频门户广告费(万元 )','电视台广告费(万元)']]

120 使用回归方程预测未来值

  • 案例119中通过计算R2值知道了方程的拟合程度较高,接下来就可以利用这个方程进行预测。假设某月在电视台和视频门户投入的广告费分别为30万元和40万元,下面通过Python编程预测该月的销售额。
x = df[['视频门户广告费(万元 )','电视台广告费(万元)']]
  • 第10行代码使用f-string方法拼接字符串。其中{model_intercept:+}表示在拼接截距时,不论截距值是正数还是负数,都显示相应的正号或负号。
}

我要回帖

更多关于 如何将表格中两列位置对调 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信