还剩6页未读,继续阅读
文本内容:
**学校“寻找关联次数最多的商品”问题之算法实现分析报告姓名:班级学号指导老师日期〜
1.项目目标通过项目设计,初步掌握数据采集、数据整理和数据预处理的方法,领悟数据的价值、数据计算的意义学会使用Python语言编写程序,解决实际问题,掌握程序调试与运行的方法通过小组合作完成项目活动,提升团队协作、与人沟通分享的能力2项目准备阶段
2.1背景人们通过研究发现,将某些不同商品(比如休闲食品和饮料)陈列在一起销售,能使相关商品的销售量增长20Q30%为了寻找这些能相互促进销量的商品,就需要进行商品的关联分析“支持度”是反映商品关联性的一个重要度量值,为了统计相关商品的支持度,需要先统计相关商品的关联次数关联次数指的是不同商品同时出现在同一个购物篮中的次数表1购物篮中的关联商品如表1所示,商品xl和x4的关联次数是2(这两个不同商品在购物篮1和购物篮2中同时出现);商品x2x5和x6的关联次数是2(这三个不同商品在购物篮1和购物篮3中同时出现);商品x5和x6的关联次数是2(这两个不同商品在购物篮1和购物篮3中同时出现)o我们需要根据超市某个时期内的流水记录,找出超市内关联次数最多的一对或多对商品,通过商品的关联分析来改进商品的陈列,从而方便顾客购物
2.2项目内容我们通过联系超市相关负责人,承诺帮助他们进行商品的关联分析,以便为他们的营销策略提供重要参考,获得了大量超市流水账数据,为了便于存储和处理商品信息,我们按照「n的顺序重新编辑了货号,并把数据存储在Excel电子表格中(如下图所示)程序基本要求
(1)从Excel电子表格中读取货号和流水号;
(2)将流水号相同的商品存储到同一列表中;
(3)统计各商品关联次数;
(4)找出关联次数最多一对或多对的商品3程序总体功能程序总体流程图如下图所示lib[n][n]-0初始化bas[m][n+1]统计商品的关联次数寻找最大的关联次数输出sp1sp2和mannum程序包含了3个主要部分读取和预处理数据,统计商品的关联次数,寻找最大的关联次数相应的具体实现代码,在之后的篇幅中详细介绍3程序设计过程根据程序设计的模块化思想,我们将程序进行功能的模块化因为本项目功能比较单一,代码相对简单,再加上Python提供了丰富的内置函数,所以我们没有自定义函数,而是直接在主函数中按顺序实现了各环节功能以下是我们的程序设计过程1读取超市流水账我们引用了第三方库openpyxl从Excel电子表格中读取超市流水账数据Openpyxl是一个专门用来处理xlsx文件的库,它非常简单实用,只需调用一些简单的函数就能轻松的实现xlsx文件的读写和数据处理我们使用语句fromopenpyxlimportload_workbook引入库然后打开“超市流水账.X1SX文件,读取“流水账”工作表,并把货号和流水号提取出来,分别存储到列表a和b中wb=load_workbook超市流水账.xlsx”ws=流水账a=listmaplambdax:x.valuews[A*]#提取货号b=listmaplambdax:x.valuews[F]#提取流水号2初始化商品关联次数我们设货号的最大值为n则货号取值范围因为后面的计算是以货号值为下标,舍弃了下标为0的元素,故需要设置大小为n+1*n+1的二维数组incidence_times并初始化所有数组元素均为0on=maxa[l:]#各商品的货号取值范围#存储各商品关联次数的二维数组incidence_times=[[0foriinrangen+l]forjinrangen+l]3存储流水号相同的商品为了便于统计各商品的关联次数,我们建立一个字典serial_number该字典以流水号为键,以流水号相同的商品列表为值serial_number={}#以流水号为键,存储相同流水号的商品#将流水号相同的商品存储到同一列表中forinuminenumeratea[l:]:ifb[i]inserial_number:serial_number[b[i]].appendnumelse:serial_number[b[i]]=[num]4统计各商品关联次数遍历所有购物篮,为每个购物篮内的商品建立关联,并使其关联次数增工,这样就可以统计出所有商品之间的关联次数#统计各商品关联次数forkeyvinserial_number.items:printf{key:{v}1foriinrangelenv-l:forjinrangei+llenv:incidence_times[v[i]][v[j]]+=1incidence_times[v[j]][v[i]]+=15寻找关联次数最多的商品采用枚举算法,遍历二维数组incidencjtimes找出关联次数最多的商品,输出其关联次数max_num和对应的商品货号spl和sp2o#寻找关联次数最多的商品max_numJsplsp2=000foriinrangeln:forjinrangei+ln+1:ifincidence_times[i][j]=max_num:max_numsplsp2=incidence_times[i][j]ij6输出关联次数最多的商品因为有可能存在多对关联次数最多的商品,所以我们需要再次二维数组incidence_times找出关联次数等于max_num的所有商品对#输出一对或多对关联次数最多的商品foriinrangelJn:forjinrangei+lJn+1:ifincidence_times[i][j]==max_num:printf关联次数最多的商品是{i}和{j}最大关联次数为{max_num}
14.程序测试1输出各流水号中的货号信息(此处只截取了部分流水号信息)
[51182121322]
[10560164843233]
[1163359]
[512748362127]
[33328174055]
[4134]口5413]
[24426453603444]
[118]
[50552857224]
[11311841423748]
[543957]2输出一对或多对关联次数最多的商品关联次数最多的商品是2和41最大关联次数为6关联次数最多的商品是14和53最大关联次数为6程序改进
5.1改进寻找和输出关联次数最多的商品的代码在第1版的程序中,我们通过遍历二维数组的方式,采用二重循环,寻找并输出了关联次数最多的商品这是常规做法,但是没有利用Python语言强大内置函数和列表生成式的功能,代码不够简洁在第2版中,我们充分利用了Python的内置函数max()和列表生成式功能,可以快速简洁地实现相同功能#寻找关联次数最多的商品max_num=max[maxiforiinincidence_times]#有可能存在多对关联次数最多的商品sp=[ijforiinrangelnforjinrangei+ln+1ifincidence_times[i][j]==max_num]forijinsp:print(f1关联次数最多的商品是{i}和{j}最大关联次数为{max_num}1)2增加查询关联次数为任意值的商品对功能考虑到超市为了更好地制定营销策略,可能想知道关联次数为任意值的商品对功能,我们增加了一个查询关联次数的功能#寻找关联次数最多的商品max_num=max[maxiforiinincidence_times]printf最大关联次数为{max_num}#输出关联次数为num的商品num=intinput「请输入商品的关联次数,结束程序输入0whilenum0:sp=[ijincidence_times[i][j]foriinrangelJnforjinrangei+lJn+1ifincidence_times[i][j]==num]forijnuminsp:print产商品{i}和{j}的关联次数为{num},num=intinput「请输入商品的关联次数,结束程序输入
06.总结经过这一周的项目挑战,我们对Python程序设计的知识有了更深的理解,特别是对程序设计的基本步骤以及思想有了更具体、深刻的体会通过一次次的解决难题,使我们不仅巩固了理论知识还培养了我们灵活运用知识、解决实际问题的能力其次,这个项目是我们小组团队协作完成的,在项目挑战过程中,我们团队成员相互激励,相互帮助,共同面对困难和挑战,极大地激发了我们的创新意识和团队协作能力在这次的项目挑战中,我们也体会到了程序设计的辛苦首先是采集数据的困难,那么多的数据要输入到Excel电子表格,还要进行数据的预处理,耗费了我们很多的时间其次就是编写程序,这么长的一段代码,敲写时难免会犯错,往往一个字母敲错或者缩进错误,就需要用上几分钟的时间来查找由于我们的实践经验还很浅薄,程序在测试时也出现了几个bug或者某些功能无法实现,我们只能重新返回到对应的代码段,通过查询书本和网络来一一排除错误当程序终于能正常运行,获得正确的结果时,那种成就感是无以言表的但我们小组并没有满足于只获得正确的结果,我们精益求精,继续改善代码,优化算法,想到了很多改进的思路特别是当我们增加了查询关联次数为任意值的商品对功能时,老师和同学都对我们给予了很大的肯定,我们获得了极大的满足感,觉得之前的辛苦都是值得的,同时下定决心今后要取得更大的成就参考文献.作者MagnusLieHetland译者司维/曾军威/谭颖华.Python基础教程.人民邮电出版社.2010-
7.第二版..作者MarkSummerfield[美]译者王弘博/孙传庆.Python3程序开发指南.人民邮电出版社.2011-2•第二版.购物篮购物流水号商品购物篮1201609270027xlx2x3x4x5x6购物篮2201609270028xlx4x7x8x9购物篮3201609270029x2x5x6x7x9ABCDEFI1货号o士nnxi价格数量金额流水号24596g康师傅妙芙欧式
4.
514.5201903060135180g善飘飘奶茶(麦香)
2.
625.2r2019030601418120g上好佳缤纷什锦软糖
4.
15312.45“2019030601521480ml原叶冰红茶
2.
324.620190306016270g香飘飘珍珠奶茶
3.
5310.52019030601713阿尔卑斯棒棒糖(香蕉)
0.542r201903060182280g康师傅咸酥(葱香奶油)
2.
812.8201903060291040g妙脆角(美式茄汁)34122019030602105596ml娃哈哈纯真年代14420190306021160雀巢咖啡伴侣
8.
55434.220190306021216亿合什锦派3392019030602134225e阿尔卑斯(草盘条装)
1.
923.812019030602。