失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 大数据实验一 关联规则实验题目:蔬菜价格相关性分析

大数据实验一 关联规则实验题目:蔬菜价格相关性分析

时间:2020-01-20 20:55:32

相关推荐

大数据实验一 关联规则实验题目:蔬菜价格相关性分析

学习来源

实验目的:在掌握关联规则算法的原理的基础上,能够应用关联规则算法解决实际问题。

实验内容:根据实验数据,采用Apriori等关联规则发现算法,给出相关关联规则。

实验要求:给出数据预处理过程、关联规则发现算法及发现关联规则,并对关联规则结果进行分析说明。

实验题目:蔬菜价格相关性分析

蔬菜的价格会受季节、天气等多方面因素的影响,但许多会出现同涨或者同跌等现象,请根据给出的蔬菜价格数据,采用关联规则发现算法,发现哪些蔬菜之间具有同涨、同跌或者涨跌不同步的现象。

一、数据处理

slrd操作部分

import xlrd;import xlwt;import pandas as pd#一、准备部分#1、Excel表格读的部分:excel =xlrd.open_workbook('蔬菜价格.xls')#读入本地名为‘蔬菜价格3.xls’的Excel表格excelsheet=excel.sheets()[0]#获取excel表格中的第一个sheet工作表#2、Excel表格写的部分:newexcel=xlwt.Workbook(encoding='utf-8')#创建一个Excel对象,编码格式采用utf-8#创建一个表名为“蔬菜价格关联分析”的工作表,cell_overwrite_ok=True表示可覆盖之前已操作的单元格newsheet=newexcel.add_sheet('蔬菜价格关联分析',cell_overwrite_ok=True)#3、设置表格样式,这里主要用于设置日期的格式datastyle = xlwt.XFStyle() # 创建一个样式对象,初始化样式datastyle.num_format_str = 'M/D/YY' #设置日期格式#4、表格中有的空的位置不是真的为空,这里获取一个这样的值,待会用于特判tmp=excelsheet.cell_value(5,2)#二、正式开始处理数据,主要思路:从旧表中读出写入新表ri=2 #用于读原始第ri行rj=1#用于读原始第rj列wi=0#用于写入表格的第wi行wj=1#用于写入表格的第wj列#创建新表的第一行,包括日期和各个菜的菜名newsheet.write(0,0,excelsheet.cell_value(0,0))#将旧表的(0,0)位置的日期写到新表的(0,0)位置#1、先读取蔬菜列和禽肉类的列名,暂时先不处理禽肉类的一个K位置为空值的特殊情况while ri<42:rj=1#蔬菜在第1列,有40种,肉类在第3列,有23种newsheet.write(0,wj,excelsheet.cell_value(ri,rj))newsheet.write(0,wj+40,excelsheet.cell_value(ri,rj+2))ri=ri+1wj=wj+1#2、先整理蔬菜的价格ri=42 #遍历原始第ri行rj=2#遍历原始第rj列wi=0#写入表格的第wi行wj=1#写入表格的第wj行while ri<22320:if ri%47>=42:ri=ri+6wi=wi+1newsheet.write(wi,0,excelsheet.cell_value(ri,0),datastyle)else :if excelsheet.cell_value(ri,rj)!=tmp:newsheet.write(wi,wj,excelsheet.cell_value(ri,rj))wj=wj%40+1ri=ri+1#3、再整理禽肉类的价格ri=26 #遍历原始第ri行rj=4#遍历原始第rj列wi=0#写入表格的第wi行wj=41#写入表格的第wj行while ri<22320:if ri%47>=26:ri=ri+22wi=wi+1wj=41else :if excelsheet.cell_value(ri,rj)!=tmp:newsheet.write(wi,wj,excelsheet.cell_value(ri,rj))wj=(wj-40)%(24)+1+40#wj=wj%(41+24)+1#print(wj)ri=ri+1newexcel.save('蔬菜数据处理过渡版.xls')#生成处理后的表格

操作之后

padnas操作部分

import pandas as pd#header = None用于不让蔬菜名那一行作为“表头”,便于之后步骤的数据获取data=pd.read_excel('蔬菜数据处理过渡版.xls',header = None)#删除第60列空值列,axis=1表示纵向,inplace=True表示删除操作对原数据生效data.drop(labels=[60],axis=1,inplace=True)ri=1while ri<data.shape[0]-1:rj=1while rj<data.shape[1]:if (len(str(data.values[ri,rj]))==0 or len(str(data.values[ri+1,rj]))==0):data.iloc[ri,rj]=0else:d=float(data.values[ri,rj])-float(data.values[ri+1,rj]) #上-下 今天-昨天 正为涨,负为跌if d>0:data.iloc[ri,rj]='up'elif d<0:data.iloc[ri,rj]='down'else:data.iloc[ri,rj]=0rj=rj+1ri=ri+1data.drop(labels=[data.shape[0]-1],axis=0,inplace=True)#删除最后一行data.to_excel("蔬菜数据处理完成版.xlsx")

操作之后得到了价格涨跌的数据

二、采用Apriori算法对蔬菜价格数据进行关联分析

目前只写了一部分

import pandas as pd#获取数据def vegetable():excel =pd.read_excel('蔬菜数据处理完成版.xlsx',header = None) #只读data=[]ri=2while ri<excel.shape[0]:rj=1temp=[]while rj<excel.shape[1]:if excel.values[ri,rj]=='up':temp.append(excel.values[1,rj]+'up')elif excel.values[ri,rj]=='down':temp.append(excel.values[1,rj]+'down') rj=rj+1data.append(temp)ri=ri+1return excel.shape[0]-2,data #两个返回值分别代表有多少个日期 以及处理过的list# 将所有元素转换为frozenset型字典,存放到列表中 便于之后的Scan操作def createC1(dataSet):C1 = []for transaction in dataSet:for item in transaction:if not [item] in C1:C1.append([item])C1.sort()# 使用frozenset是为了后面可以将这些值作为字典的键return list(map(frozenset, C1)) # frozenset一种不可变的集合,set可变集合# 过滤掉不符合支持度的集合# 返回 频繁项集列表retList 所有元素的支持度字典def scanD(D, Ck, minSupport):ssCnt = {}for tid in D:for can in Ck:if can.issubset(tid): # 判断can是否是tid的《子集》 (这里使用子集的方式来判断两者的关系)if can not in ssCnt: # 统计该值在整个记录中满足子集的次数(以字典的形式记录,frozenset为键)ssCnt[can] = 1else:ssCnt[can] += 1numItems = float(len(D))retList = [] # 重新记录满足条件的数据值(即支持度大于阈值的数据)supportData = {} # 每个数据值的支持度for key in ssCnt:support = ssCnt[key] / numItemsif support >= minSupport:retList.insert(0, key)supportData[key] = support return retList, supportData # 排除不符合支持度元素后的元素 每个元素支持度# 生成所有可以组合的集合# 频繁项集列表Lk 项集元素个数k [frozenset({2, 3}), frozenset({3, 5})] -> [frozenset({2, 3, 5})]def aprioriGen(Lk, k):retList = []lenLk = len(Lk)for i in range(lenLk): # 两层循环比较Lk中的每个元素与其它元素for j in range(i+1, lenLk):L1 = list(Lk[i])[:k-2] # 将集合转为list后取值L2 = list(Lk[j])[:k-2]L1.sort(); L2.sort() # 这里说明一下:该函数每次比较两个list的前k-2个元素,如果相同则求并集得到k个元素的集合if L1==L2:retList.append(Lk[i] | Lk[j]) # 求并集return retList # 返回频繁项集列表Ck# 封装所有步骤的函数# 返回 所有满足大于阈值的组合 集合支持度列表def apriori(dataSet, minSupport = 0.5):D = list(map(set, dataSet)) # 转换列表记录为字典 C1 = createC1(dataSet)# 将每个元素转会为frozenset字典 [frozenset({1}), frozenset({2}), frozenset({3}), frozenset({4}), frozenset({5})]L1, supportData = scanD(D, C1, minSupport) # 过滤数据L = [L1]k = 2while (len(L[k-2]) > 0): # 若仍有满足支持度的集合则继续做关联分析Ck = aprioriGen(L[k-2], k) # Ck候选频繁项集Lk, supK = scanD(D, Ck, minSupport) # Lk频繁项集supportData.update(supK) # 更新字典(把新出现的集合:支持度加入到supportData中)L.append(Lk)k += 1 # 每次新组合的元素都只增加了一个,所以k也+1(k表示元素个数)return L, supportData

上面是获取频繁项集 以及支持度列表的函数

关联规则未完待续

如果觉得《大数据实验一 关联规则实验题目:蔬菜价格相关性分析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。