zoukankan      html  css  js  c++  java
  • Python大数据应用

    一、三国演义人物出场统计

    先检查安装包

    1、jieba库基本介绍

    (1)jieba库概述

    jieba是优秀的中文分词第三方库

    • 中文文本需要通过分词获得单个的词语
    • jieba是优秀的中文分词第三方库,需要额外安装
    • jieba库提供三种分词模式,最简单只需掌握一个函数

    (2)jieba分词的原理

    jieba分词依靠中文词库

    • 利用一个中文词库,确定汉字之间的关联概率
    • 汉字间概率大的组成词组,形成分词结果
    • 除了分词,用户还可以添加自定义的词组

    (3)jieba库使用说明

    三种模式 :精确模式全模式搜索引擎模式

    • 精确模式:把文本精确的切分开,不存在冗余单词
    • 全模式:把文本中所有可能的词语都扫描出来,有冗余
    • 搜索引擎模式:在精确模式基础上,对长词再次切分

    库常用函数:    

    2、代码实现

    首先,我们实现排名前15的用词:

    import jieba
    
    txt = open("三国演义.txt", "r", encoding='utf-8').read()
    words  = jieba.lcut(txt)
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        else:
            counts[word] = counts.get(word,0) + 1
    
    items = list(counts.items())
    items.sort(key=lambda x:x[1], reverse=True)
    for i in range(15): #可修改,前15
        word, count = items[i]
        print ("{0:<10}{1:>5}".format(word, count))
    

    我们会发现,其中有其他非人名的名词(将军、不能、如此),或者重复(丞相=曹操),或者相等(孔明=孔明曰)

    所以我们对代码进行小小的修改:

    import jieba
    excludes = {"将军","却说","荆州","二人","不可","不能","如此"} #改进之处
    txt = open("三国演义.txt", "r", encoding='utf-8').read()
    words  = jieba.lcut(txt)
    counts = {}
    for word in words:
        if len(word) == 1:
            continue
        elif word == "诸葛亮" or word == "孔明曰":       #改进之处
            rword = "孔明"
        elif word == "关公" or word == "云长":
            rword = "关羽"
        elif word == "玄德" or word == "玄德曰":
            rword = "刘备"
        elif word == "孟德" or word == "丞相":
            rword = "曹操"
        else:
            rword = word
        counts[rword] = counts.get(rword,0) + 1
    for word in excludes:
        del(counts[word])
    items = list(counts.items())
    items.sort(key=lambda x:x[1], reverse=True)
    for i in range(15):
        word, count = items[i]
        print ("{0:<10}{1:>5}".format(word, count))
    

    由此我们可以运用相同方法继续优化。

    二、霍兰德人格分析雷达图

    1、问题分析

    雷达图 Radar Chart (摘抄来自网络)

    雷达图是多特性直观展示的重要方式

    2、霍兰德人格分析

    • 霍兰德认为:人格兴趣与职业之间应有一种内在的对应关系
    • 人格分类:研究型、艺术型、社会型、企业型、传统型、现实性
    • 职业:工程师、实验员、艺术家、推销员、记事员、社会工作者

    3、霍兰德人格分析雷达图

    • 需求:雷达图方式验证霍兰德人格分析
    • 输入:各职业人群结合兴趣的调研数据
    • 输出:雷达图
    • 通用雷达图绘制:matplotlib
    • 专业的多维数据表示:numpy
    • 输出:雷达图

    4、NumPy Ndarray学习

    NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。

    ndarray 对象是用于存放同类型元素的多维数组。

    ndarray 中的每个元素在内存中都有相同存储大小的区域。

    ndarray 内部由以下内容组成:

    • 一个指向数据(内存或内存映射文件中的一块数据)的指针。
    • 数据类型或 dtype,描述在数组中的固定大小值的格子。
    • 一个表示数组形状(shape)的元组,表示各维度大小的元组。
    • 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
    import numpy as np 
    a = np.array([1,2,3])  
    print (a)
    

    Ndarray更多学习

    5、NumPy Matplotlib学习

    Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

    举例学习:

    import numpy as np 
    import matplotlib.pyplot as plt
    
    t = np.arange(0, 10, 0.2) 
    plt.plot(t,t*2 , 'r--', t, t**2, 'g^', t, t**3, 'bs') 
    plt.show()
    

    以上实例中,np.arange() 函数创建 x 轴上的值。y 轴上的对应值存储在另一个数组对象 y 中。 这些值使用 matplotlib 软件包的 pyplot 子模块的 plot() 函数绘制。图形由 show() 函数显示。

    再来绘制一个三角函数复合图:

    import numpy as np
    import matplotlib.pyplot as plt
    x = np.linspace(0, 6, 100)
    y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8
    plt.plot(x, y, 'k', color='r', linewidth=3, linestyle="-")
    plt.show()
    

    巨难的复杂图形:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    matplotlib.rcParams['font.family']='SimHei'
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    def Draw(pcolor, nt_point, nt_text, nt_size):
        plt.plot(x, y, 'k', label="$exp_decay$", color=pcolor, linewidth=3, linestyle="-")
        plt.plot(x, z, "b--", label="$cos(x^2)$", linewidth=1)
        plt.xlabel('时间(s)')
        plt.ylabel('幅度(mV)')
        plt.title("阻尼衰减曲线绘制")
        plt.annotate('$cos(2 pi t) exp(-t)$', xy=nt_point, xytext=nt_text, fontsize=nt_size,
                   arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.1"))
    def Shadow(a, b):
        ix = (x>a) & (x<b)
        plt.fill_between(x,y,0,where=ix,facecolor='grey', alpha=0.25)
        plt.text(0.5 * (a + b), 0.2, "$int_a^b f(x)mathrm{d}x$", 
                 horizontalalignment='center')
    def XY_Axis(x_start, x_end, y_start, y_end):
        plt.xlim(x_start, x_end)
        plt.ylim(y_start, y_end)
        plt.xticks([np.pi/3, 2 * np.pi/3, 1 * np.pi, 4 * np.pi/3, 5 * np.pi/3], 
                   ['$pi/3$', '$2pi/3$', '$pi$', '$4pi/3$', '$5pi/3$'])
    x = np.linspace(0.0, 6.0, 100)
    y = np.cos(2 * np.pi * x) * np.exp(-x)+0.8
    z = 0.5 * np.cos(x ** 2)+0.8
    note_point,note_text,note_size = (1, np.cos(2 * np.pi) * np.exp(-1)+0.8),(1, 1.4), 14
    fig = plt.figure(figsize=(8, 6), facecolor="white")
    plt.subplot(111)
    Draw("red", note_point, note_text, note_size)
    XY_Axis(0, 5, 0, 1.8)
    Shadow(0.8, 3)
    plt.legend()
    plt.savefig('sample.JPG')
    plt.show()
    

    Matplotlib更多学习

    6、雷达图代码实现

    雷达图是通过多个离散属性比较对象的最直观工具,比如N年前(小学四年级?),玩的DNF,那时候为了转职对比剑魂、瞎子、狂战、鬼泣哪项哪项更牛逼,就看对比的雷达图,好像还记得剑魂耗蓝轻盈,狂战耗血伤害高,瞎子比较综合,鬼泣上手难,所以当全服几乎全是剑魂陪光剑,嗨,青春啊。其他游戏,王者、LOL、DOTA亦如此。感受一下雷达图的魅力:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    matplotlib.rcParams['font.family']='SimHei'
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    labels = np.array(['综合', 'KDA', '发育', '推进', '生存','输出'])
    nAttr = 6
    data = np.array([7, 5, 6, 9, 8, 7]) #数据值
    angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
    data = np.concatenate((data, [data[0]]))
    angles = np.concatenate((angles, [angles[0]]))
    fig = plt.figure(facecolor="white")
    plt.subplot(111, polar=True)
    plt.plot(angles,data,'bo-',color ='g',linewidth=2)
    plt.fill(angles,data,facecolor='g',alpha=0.25)
    plt.thetagrids(angles*180/np.pi, labels)
    plt.figtext(0.52, 0.95, 'DOTA能力值雷达图', ha='center')
    plt.grid(True)
    plt.show()
    

    然后实现一下本节课我们要绘制的霍兰德人格分析雷达图:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    matplotlib.rcParams['font.family']='SimHei'
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    radar_labels = np.array(['研究型(I)','艺术型(A)','社会型(S)','企业型(E)','常规型(C)','现实型(R)'])
    nAttr = 6
    data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
                     [0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
                     [0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
                     [0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
                     [0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
                     [0.34, 0.31, 0.38, 0.40, 0.92, 0.28]]) #数据值
    data_labels = ('工程师', '实验员', '艺术家', '推销员', '社会工作者','记事员')
    angles = np.linspace(0, 2*np.pi, nAttr, endpoint=False)
    data = np.concatenate((data, [data[0]]))
    angles = np.concatenate((angles, [angles[0]]))
    fig = plt.figure(facecolor="white")
    plt.subplot(111, polar=True)
    plt.plot(angles,data,'o-', linewidth=1.5, alpha=0.2)
    plt.fill(angles,data, alpha=0.25)
    # plt.thetagrids(angles*180/np.pi, radar_labels,frac = 1.2) 
    # 因为用是库的最新版本,其方法内部是不需要使用到该关键字参数的,去掉即可
    plt.thetagrids(angles*180/np.pi, radar_labels)
    plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
    legend = plt.legend(data_labels, loc=(0.94, 0.80), labelspacing=0.1)
    plt.setp(legend.get_texts(), fontsize='small')
    plt.grid(True)
    plt.show()
    

  • 相关阅读:
    宝宝的成长脚印9/2
    宝宝的成长脚印9/5
    手动作花灯10/6
    EasyUI中EasyLoader加载数组模块
    easyui常用属性
    VS2010如何在一个web项目中使用APP_CODE下的自定义类
    MSSQL系统常用视图命令及其作用
    db_autopwn渗透流程
    渗透测试工具Nmap从初级到高级
    EasyUI中在表单提交之前进行验证
  • 原文地址:https://www.cnblogs.com/wangzheming35/p/12884706.html
Copyright © 2011-2022 走看看