电子商务网站开发实训报告网站一直显示建设中

当前位置: 首页 > news >正文

电子商务网站开发实训报告,网站一直显示建设中,如何做网站本地服务器,课程网站开发的开题报告分组聚合进行组内计算 前言1、groupby方法拆分数据2、agg方法聚合数据3、apply方法聚合数据4、transform方法聚合数据5 小案例5.1 按照时间对菜品订单详情表进行拆分5.2 使用agg方法计算5.3 使用apply方法统计单日菜品销售数目 前言 依据某个或者几个字段对数据集进行分组并对各组应用一个函数无论是聚合还是转换都是数据分析的常用操作。pandas提供了一个灵活高效的groupby方法配合agg或apply方法能够实现分组聚合的操作。 原理图如下
1、groupby方法拆分数据 groupby方法提供的是分组聚合步骤中的拆分功能能够根据索引或者字段对数据进行分组。方法格式如下 DataFrame.groupby(byNone,axis0,levelNone,as_indexTrue,sortTrue,group_keyTrue,squeezeFalse,kwargs)参数说明 by 接收list、string、mapping或 generator。用于确定进行分组的依据。如果传人的是一个函数则对索引进行计算并分组如果传入的是一个字典或者Series则字典或者Series的值用来作为分组依据如果传入一个NumPy数组则数据的元素作为分组依据如果传人的是字符串或者字符串列表则使用这些字符串所代表的字段作为分组依据。无默认 。axis表示操作的轴向默认对列进行操作。默认为0。level接收int或者索引名。代表标签所在级别。默认为None。as_index表示聚合后的聚合标签是否以DataFrame 索引形式输出。默认为 True。sort接收boolean。表示是否对分组依据、分组标签进行排序。默认为True。group_keys接收boolean。表示是否显示分组标签的名称。默认为 True。squeeze接收boolean。表示是否在允许的情况下对返回数据进行降维。默认为False。 以餐饮企业的菜品订单详情表为例依据订单编号对数据进行分组。 import pandas as pd import numpy as np from sqlalchemy import create_engine username root # 替换为你的数据库用户名 password 1234 # 替换为你的数据库密码 host localhost # 数据库地址 database testdb # 数据库名称# 创建数据库连接 engine create_engine(fmysqlpymysql://{username}:{password}{host}/{database}) detail pd.read_sql_table(meal_order_detail1,con engine) detailGroup detail[[order_id,counts,amounts]].groupby(by order_id) print(分组后的订单详情表为,detailGroup)输出 由输出可知分组后的结果并不能直接看而是被存在内存中输出的是内存地址。实际上分组后的数据对象Groupby类似于Series与DataFrame是pandas提供的一种对象。常用的描述性统计方法如下表 方法名称说明count计算分组的数目包括缺失值head返回每组的前n个值max返回每组最大值mean返回每组的均值median返回每组的中位数cumcount对每个分组中的组员进行标记0~n-1size返回每组的大小min返回每组最小值std返回每组的标准差sum返回每组的和 对餐饮企业的菜品订单表经过分组操作后的每一组的均值、标准差、中位数 print(订单详情表分组后前5组每组的均值为\n, detailGroup.mean().head()) print(订单详情表分组后前5组每组的标准差为\n, detailGroup.std().head()) print(订单详情表分组后前5组每组的大小为,\n, detailGroup.size().head())2、agg方法聚合数据 agg、aggregate方法支持对每个分组应用某函数包括python内置函数或自定义函数。同时这两个方法也能直接对DataFrame进行函数应用操作。 注意agg函数能够对DataFrame对象进行操作师从pandas0.20版本开始的在之前版本中没有此功能。针对DataFrame的aggyuaggregate函数使用格式如下 DataFrame.agg(func,axis0,*args,kwargs) DataFrame.aggregate(func,axis0,*args,kwargs) 参数说明如下 func接收list、dict、function。表示应用于每行或者每列的函数。无默认axis接收0或1。代表操作的轴向。默认为0 agg、aggregate几乎完全相同以T餐饮企业的菜品订单信息表为例使用agg方法一次求出当前数据中所有菜品销量和售价的总和与均值如下 print(订单详情表的菜品销量与售价的和与均值为\n,detail[[counts,amounts]].agg([np.sum,np.mean]))输出 一个字段求和另一个求均值 print(订单详情表的菜品销量总和与售价的均值为\n,detail.agg({counts:np.sum,amounts:np.mean}))输出
求某个字段多个统计量 print(菜品订单详情表的菜品销量总和与售价的总和与均值为\n,detail.agg({counts:np.sum,amounts:[np.mean,np.sum]}))输出 上述都是numpy库的统计函数也可以传入自定义的函数。例如 ##自定义函数求两倍的和 def DoubleSum(data):s data.sum()*2return s print(菜品订单详情表的菜品销量两倍总和为,\n,detail.agg({counts:DoubleSum},axis 0))输出 在自定义函数中使用numpy库中的这些函数时如果计算的时候是单个序列则无法得出想要的结果如果是多列数据同时计算就不会出现这个问题。例如 ##自定义函数求两倍的和 def DoubleSum1(data):s np.sum(data)*2return s print(订单详情表的菜品销量两倍总和为\n,detail.agg({counts:DoubleSum1},axis 0).head())print(订单详情表的菜品销量与售价的和的两倍为\n,detail[[counts,amounts]].agg(DoubleSum1))输出 使用agg方法也能够实现对每一个字段的每一组使用相同的函数如下 print(订单详情表分组后前3组每组的均值为\n, detailGroup.agg(np.mean).head(3))print(订单详情表分组后前3组每组的标准差为\n, detailGroup.agg(np.std).head(3)) 输出 如果需要对不同的字段应用不同的函数则与DataFrame中使用agg方法的操作相同。使用agg方法对分组后的菜品订单表求取每组菜品总数和售价均值。 print(订单详情分组前3组每组菜品总数和售价均值为\n, detailGroup.agg({counts:np.sum,amounts:np.mean}).head(3))3、apply方法聚合数据 apply方法类似于agg方法能够将函数应用于每一列。不同之处在与与agg方法相比apply方法传入的函数只能够作用于整个DataFrame或者Series而无法像agg一样能够对不同字段应用不同函数来获取不同结果。 apply方法的形式如下 DataFrame.apply(funcaxis0broadcastFalserawFalsereduceNone,args(),
kwds) 参数说明 func接收functions,表示应用于每行或每列的函数无默认axis接收0或1代表操作的轴向。默认为0broadcast接收boolean表示是否进行广播。默认为Falseraw接收boolean表示是否直接将ndarray对象传递给函数。默认为Falsereduce接收boolean或者None表示返回值的格式。默认None apply方法的使用方式和agg方法相同如下 print(订单详情表的菜品销量与售价的均值为\n,detail[[counts,amounts]].apply(np.mean))使用apply方法对groupby对象进行聚合操作的方法和agg方法也相同只是使用agg方法能够实现对不同的字段应用不同的函数而apply不行。 4、transform方法聚合数据 transform方法能够对整个DataFrame的所有元素进行操作。transform方法只有一个参数“func”,表示对DataFrame操作的函数如下 print(订单详情表的菜品销量与售价的两倍为\n,detail[[counts,amounts]].transform(lambda x:x*2).head(4)) 输出 同时transform方法还能够对DataFrame分组后的对象groupby进行操作可以实现组内离差标准化等操作。 print(订单详情表分组后实现组内离差标准化后前五行为\n, detailGroup.transform(lambda x:(x.mean()-x.min())/(x.max()-x.min())).head())输出 输出中部分为NaN,这是由于销量中的许多订单的最大值和最小值是相同的根据离差标准化公式最大值和最小值相同的情况下分母是0而分母为0的数在python中表示为NaN 5 小案例 5.1 按照时间对菜品订单详情表进行拆分 通过分组聚合的方式能够将每天的数据放在一个组内从而可以方便地对每一个组的内容进行分析。 import pandas as pd import numpy as np from sqlalchemy import create_engine engine create_engine(mysqlpymysql://root:1234127.0.0.1:
3306/testdb?charsetutf8) detail pd.read_sql_table(meal_order_detail1,con engine) detail[place_order_time] pd.to_datetime(detail[place_order_time]) detail[date] [i.date() for i in detail[place_order_time]] detailGroup detail[[date,counts,amounts]].groupby(bydate) print(订单详情表前5组每组的数目为\n,detailGroup.size().head())5.2 使用agg方法计算 对已经拆分完成的订单详情表进行聚合得出每组的销售均价和售价中位数等信息 dayMean detailGroup.agg({amounts:np.mean}) print(订单详情表前五组每日菜品均价为\n,dayMean.head())dayMedian detailGroup.agg({amounts:np.median}) print(订单详情表前五组每日菜品售价中位数为\n,dayMedian.head())输出
5.3 使用apply方法统计单日菜品销售数目 除了可以对售价进行计算外还可以计算单日总共销售的菜品数目如下 daySaleSum detailGroup.apply(np.sum)[counts] print(订单详情表前五组每日菜品售出数目为\n,daySaleSum.head())输出