首页 > 编程语言 >python——pandas数据分析(表格处理)工具实现Apriori算法

python——pandas数据分析(表格处理)工具实现Apriori算法

时间:2023-06-04 10:32:01浏览次数:58  
标签:python series support Apriori 项集 频繁 ms print pandas


pandas 是基于NumPy 的一种工具, 名字很卡哇伊,来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。主要应用于处理大型数据集。数据处理速度算是最大的特色,剩下的就是个python版的excel了吧。

API文档:http://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html

数据结构:

Series:一种一维数组,和 NumPy 里的数组很相似。事实上,Series 基本上就是基于 NumPy 的数组对象来的。和 NumPy 的数组不同,Series 能为数据自定义标签,也就是索引(index),然后通过索引来访问数组中的数据。

DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。

Panel :三维的数组,可以理解为DataFrame的容器。

例如:

import numpy as np 
import pandas as pd

datafile='.\opt\list.csv'
outfile='.\opt\output.csv'
df = pd.DataFrame(pd.read_csv(datafile,encoding="utf_8"))#导入文件
print(df.shape)#输入维度
print(df.head())#输出默认前10行
df.pop('video')#删除列
print(df['type'])#输出列
df['type'].replace('科技','科学',inplace = True)#列替换
df.to_csv(outfile,encoding="utf_8")#输出文件

list.csv:

python——pandas数据分析(表格处理)工具实现Apriori算法_数据挖掘

output.csv:

python——pandas数据分析(表格处理)工具实现Apriori算法_数据关联_02

 

python——pandas数据分析(表格处理)工具实现Apriori算法_Apriori_03

 

下面介绍Apriori算法:

Apriori算法是常用的用于挖掘出数据关联规则的算法,算法的目标是找到最大的K项频繁集,采用了迭代的方法,先搜索出候选1项集及对应的支持度,剪枝去掉低于支持度的1项集,得到频繁1项集。然后对剩下的频繁1项集进行连接,得到候选的频繁2项集,筛选去掉低于支持度的候选频繁2项集,得到真正的频繁二项集,以此类推,迭代下去,直到无法找到频繁k+1项集为止,对应的频繁k项集的集合即为算法的输出结果。

算法流程:

1)扫描整个数据集,得到所有出现过的数据,作为候选频繁1项集。k=1,频繁0项集为空集。

2)挖掘频繁k项集

    a) 扫描数据计算候选频繁k项集的支持度

    b) 去除候选频繁k项集中支持度低于阈值的数据集,得到频繁k项集。如果得到的频繁k项集为空,则直接返回频繁k-1项集的集合作为算法结果,算法结束。如果得到的频繁k项集只有一项,则直接返回频繁k项集的集合作为算法结果,算法结束。

    c) 基于频繁k项集,连接生成候选频繁k+1项集。

3) 令k=k+1,转入步骤2。

参考代码https://spaces.ac.cn/archives/3380

#-*- coding: utf-8 -*-
from __future__ import print_function
import pandas as pd

d = pd.read_csv('./opt/test.csv',header=None, dtype = object)

print(u'\n转换原始数据至0-1矩阵...')
import time
start = time.clock()
ct = lambda x : pd.Series(1, index = x)
b = map(ct, d.values)
d = pd.DataFrame(list(b)).fillna(0)
d = (d==1)
end = time.clock()
print(u'\n转换完毕,用时:%0.2f秒' %(end-start))
print(u'\n开始搜索关联规则...')
del b

support = 0.06 #最小支持度
confidence = 0.75 #最小置信度
ms = '--' #连接符,用来区分不同元素,如A--B。需要保证原始表格中不含有该字符

#自定义连接函数,用于实现L_{k-1}到C_k的连接
def connect_string(x, ms):
    x = list(map(lambda i:sorted(i.split(ms)), x))
    l = len(x[0])
    r = []
    for i in range(len(x)):
        for j in range(i,len(x)):
            if x[i][:l-1] == x[j][:l-1] and x[i][l-1] != x[j][l-1]:
                r.append(x[i][:l-1]+sorted([x[j][l-1],x[i][l-1]]))
    return r

#寻找关联规则的函数
def find_rule(d, support, confidence):
    import time
    start = time.clock()
    result = pd.DataFrame(index=['support', 'confidence']) #定义输出结果

    support_series = 1.0*d.sum()/len(d) #支持度序列
    column = list(support_series[support_series > support].index) #初步根据支持度筛选
    k = 0

    while len(column) > 1:
        k = k+1
        print(u'\n正在进行第%s次搜索...' %k)
        column = connect_string(column, ms)
        print(u'数目:%s...' %len(column))
        sf = lambda i: d[i].prod(axis=1, numeric_only = True) #新一批支持度的计算函数

        #创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。
        d_2 = pd.DataFrame(list(map(sf,column)), index = [ms.join(i) for i in column]).T

        support_series_2 = 1.0*d_2[[ms.join(i) for i in column]].sum()/len(d) #计算连接后的支持度
        column = list(support_series_2[support_series_2 > support].index) #新一轮支持度筛选
        support_series = support_series.append(support_series_2)
        column2 = []
        
        for i in column: #遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?
            i = i.split(ms)
            for j in range(len(i)):
                column2.append(i[:j]+i[j+1:]+i[j:j+1])
        
        cofidence_series = pd.Series(index=[ms.join(i) for i in column2]) #定义置信度序列
        
        for i in column2: #计算置信度序列
            cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))]/support_series[ms.join(i[:len(i)-1])]
        
        for i in cofidence_series[cofidence_series > confidence].index: #置信度筛选
            result[i] = 0.0
            result[i]['confidence'] = cofidence_series[i]
            result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]

    result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出
    end = time.clock()
    print(u'\n搜索完成,用时:%0.2f秒' %(end-start))
    print(u'\n结果为:')
    print(result)
    
    return result

find_rule(d, support, confidence).to_csv('./opt/out.csv')

测试文本:https://spaces.ac.cn/usr/uploads/2015/07/3424358296.txt

python——pandas数据分析(表格处理)工具实现Apriori算法_数据关联_04

推荐参考博客:

https://www.jianshu.com/p/a77b0bc736f2

https://spaces.ac.cn/archives/3380

 

 

 

 

 

标签:python,series,support,Apriori,项集,频繁,ms,print,pandas
From: https://blog.51cto.com/u_15937541/6410104

相关文章

  • 【python基础】复杂数据类型-列表类型(列表切片)
    1.列表切片前面学习的是如何处理列表的所有数据元素。python还可以处理列表的部分元素,python称之为切片。1.1创建切片创建切片,可指定要使用的第一个数据元素的索引和最后一个数据元素的索引。与range函数一样,python在到达指定的第二个索引前面的数据元素后停止。比如要输出列表......
  • Python可视化模块
    Python可视化模块一个简单的python包就能够实现数据的可视化功能,这个第三方动态可视化的数据模块就是Pynimate效果是这样的安装pipinstallpynimate使用指南想要使用Pynimate,直接import一下就行importpynimateasnim输入数据后,Pynimate将使用函数Barplot()......
  • 【python】函数print
    f-string python中的字符串通常被括在双引号("")或单引号('')内。要创建f-string,你只需要在字符串的开头引号前添加一个 f 或 F。例如,"This" 是一个字符串,而 f"This" 是一个f-string。当使用f-string来显示变量时,你只需要在一组大括号 {} 内指定变量的名字。而在运行时......
  • Reinforcement Learning之Q-Learning - Python实现
    算法特征①.以真实reward训练Q-function;②.从最大Q方向更新policy\(\pi\)算法推导PartⅠ:RL之原理整体交互流程如下,定义策略函数(policy)\(\pi\),输入为状态(state)\(s\),输出为动作(action)\(a\),则,\[\begin{equation*}a=\pi(s)\end{equation*}\]令......
  • 【Python】如何在FastAPI中使用UUID标记日志,以跟踪一个请求的完整生命周期
    为什么要使用uuid标记日志?在分布式系统中,一个请求可能会经过多个服务,每个服务都会生成自己的日志。如果我们只使用普通的日志记录,那么很难将这些日志串联在一起,以至难以跟踪一个请求的完整生命周期。如果能够使用uuid标记日志,为每个请求生成一个唯一的uuid,且这个日志可以在不同......
  • python版本的“共轭梯度法”算法代码
    在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。  ......
  • VSCode 如何将已编辑好的python文件中的 tab 键缩进转换成4个空格键缩进
    事情起源:使用vscode维护一个7年前的python项目,发现编辑后运行报错,提示缩进错误,原因是当时的项目使用tab做缩进,而我正在用的vscode是使用4空格做缩进,因此造成了缩进不匹配的问题。  如何解决?把自己的vscode缩进从4空格改为tab貌似是最可行的,但是考虑其他项目的匹配问题又总不能老......
  • 【python基础】复杂数据类型-列表类型(排序/长度/遍历)
    1.列表数据元素排序在创建的列表中,数据元素的排列顺序常常是无法预测的。这虽然在大多数情况下都是不可避免的,但经常需要以特定的顺序呈现信息。有时候希望保留列表数据元素最初的排列顺序,而有时候又需要调整排列顺序。python提供了很多列表数据元素排序的方式,可根据情况选用。1......
  • [转] 十分钟掌握Seaborn,进阶Python数据可视化分析
      -为什么用Seaborn-Seaborn是基于Python且非常受欢迎的图形可视化库,在Matplotlib的基础上,进行了更高级的封装,使得作图更加方便快捷。即便是没有什么基础的人,也能通过极简的代码,做出具有分析价值而又十分美观的图形。Seaborn可以实现Python环境下的绝大部分探索......
  • 02 python爬虫-bs4
    目录步骤代码结果new.csv图片步骤爬取主页面中的文章详情的url和图片地址下载图片并请求加文章详情中的页面内容爬取文章详情中的标题、作者、发布时间代码importrequestsimportcsvfrombs4importBeautifulSoup#请求的一级页面的地址q_url='http://xinfadi.com.cn/new......