标签分类
当前位置:首页 > 程序设计电子书 > Python电子书网盘下载
Python数据科学:技术详解与商业实践 Python数据科学:技术详解与商业实践
qq_39974

qq_39974 提供上传

资源
31
粉丝
32
喜欢
192
评论
15

    Python数据科学:技术详解与商业实践 PDF 影印版

    Python电子书
    • 发布时间:

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python、数据科学、技术详解、商业实践方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小154 MB,常国珍编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:9.4,更多相关的学习资源可以参阅 程序设计电子书Python电子书Python视频、等栏目。

  • Python数据科学:技术详解与商业实践 PDF 下载
  • 下载地址:https://pan.baidu.com/s/1EJs44il9z08vcLLW5DbezQ
  • 分享码:cga7
  • Python数据科学:技术详解与商业实践

    Python数据科学:技术详解与商业实践

    读者评价

    虽然我不是搞金融数据的,但这本书上的很多思路和方法却是可以借鉴的,希望以后能够多一些研究非金融类的其它行业的数据挖掘的人
    课程和书同步的,上课免费拿了一本~课程讲的很详细,书就略过了一些琐碎的知识点了。非常全面,感觉是今年在数据方面特别好的内容了。非常推荐
    近几年Python成为数据科学行业中大受欢迎的编程语言,初看了一下目前录,这本书为总结一下数据科学家和工程师几个最实用的python库以各种函数。如果你是正在学习Python的学生,我想你能从书中找到学习的重心。  关键是这几个作者都还是蛮牛的数据科学专家。
    客户洞察是分析型客户关系管理的核心,是实现客户智能的必要手段,其旨在增加CRM系统的商业分析与辅助决策能力。分析型CRM需要整合外部客户数据、渠道数据和大量交易数据,并从中提取出隐含有用的信息,这便是数据科学的用武之地。客户生命周期是客户洞察中最常用的分析工具,企业对初次接触的客户了解甚少,随着交往时间的延长,对其洞察越深入,分析主题越丰富。本课程就按照客户产品生命周期逐步展开数据科学的不同议题

    内容介绍

    本书共19章,第1章介绍数据科学中涉及的基本领域;第2~3章介绍与数据工作紧密相关的Python语言基础;第4章讲解描述性统计分析在宏观业务领域的分析;第5章讲解数据规整、清洗的重要技能;第6章介绍数据科学领域实用的四大统计检验;第7章讲解当被解释变量为连续变量时,如何使用线性回归作预测;第8章讲解使用逻辑回归作评分卡模型;第9章讲解另外一个可解释模型——决策树。第10~12章分别讲解了BP神经网络、朴素贝叶斯、近邻域、支持向量机的原理和在决策类模型中的运用;第13~14章作为一个整体讲解商业分析场景下的信息压缩;第15章以产品推荐作为案例,讲解发现事件与事件伴生关系的关联分析和序列分析算法;第16章使用欺诈识别案例讲解当被解释变量分布极 端不平衡时的处理方法;第17章继续使用欺诈识别案例讲解集成学习算法;第18章讲解了使用效应分解和ARIMA方法实现宏观业务指标预测;第19章用案例展现了分类和聚类模型的CRISP-DM和SEMMA流程。

    目录

    • 前言
    • 第1章数据科学家的武器库
    • 1.1数据科学的基本概念
    • 1.2数理统计技术
    • 1.2.1描述性统计分析
    • 1.2.2统计推断与统计建模
    • 1.3数据挖掘的技术与方法
    • 1.4描述性数据挖掘算法示例
    • 1.4.1聚类分析——客户细分
    • 1.4.2关联规则分析
    • 1.5预测性数据挖掘算法示例
    • 1.5.1决策树
    • 1.5.2KNN算法
    • 1.5.3Logistic回归
    • 1.5.4神经网络
    • 1.5.5支持向量机
    • 1.5.6集成学习
    • 1.5.7预测类模型讲解
    • 1.5.8预测类模型评估概述
    • 第2章Python概述
    • 2.1Python概述
    • 2.1.1Python简介
    • 2.1.2Python与数据科学
    • 2.1.3Python2与Python3
    • 2.2Anaconda Python的安装、使用
    • 2.2.1下载与安装
    • 2.2.2使用Jupyter Notebook
    • 2.2.3使用Spyder
    • 2.2.4使用conda或pip管理
    • 第三方库
    • 第3章数据科学的Python编程基础
    • 3.1Python的基本数据类型
    • 3.1.1字符串(str)
    • 3.1.2浮点数和整数(float、int)
    • 3.1.3布尔值(Bool:True/False)
    • 3.1.4其他
    • 3.2Python的基本数据结构
    • 3.2.1列表(list)
    • 3.2.2元组(tuple)
    • 3.2.3集合(set)
    • 3.2.4字典(dict)
    • 3.3Python的程序控制
    • 3.3.1三种基本的编程结构简介
    • 3.3.2顺承结构
    • 3.3.3分支结构
    • 3.3.4循环结构
    • 3.4Python的函数与模块
    • 3.4.1Python的函数
    • 3.4.2Python的模块
    • 3.5Pandas读取结构化数据
    • 3.5.1读取数据
    • 3.5.2写出数据
    • 第4章描述性统计分析与绘图
    • 4.1描述性统计进行数据探索
    • 4.1.1变量度量类型与分布类型
    • 4.1.2分类变量的统计量
    • 4.1.3连续变量的分布与集中趋势
    • 4.1.4连续变量的离散程度
    • 4.1.5数据分布的对称与高矮
    • 4.2制作报表与统计制图
    • 4.3制图的步骤
    • 第5章数据整合和数据清洗
    • 5.1数据整合
    • 5.1.1行列操作
    • 5.1.2条件查询
    • 5.1.3横向连接
    • 5.1.4纵向合并
    • 5.1.5排序
    • 5.1.6分组汇总
    • 5.1.7拆分、堆叠列
    • 5.1.8赋值与条件赋值
    • 5.2数据清洗
    • 5.2.1重复值处理
    • 5.2.2缺失值处理
    • 5.2.3噪声值处理
    • 5.3RFM方法在客户行为分析上的运用
    • 5.3.1行为特征提取的RFM方法论
    • 5.3.2使用RFM方法计算变量
    • 5.3.3数据整理与汇报
    • 第6章数据科学的统计推断基础
    • 6.1基本的统计学概念
    • 6.1.1总体与样本
    • 6.1.2统计量
    • 6.1.3点估计、区间估计和中心极限定理
    • 6.2假设检验与单样本t检验
    • 6.2.1假设检验
    • 6.2.2单样本t检验
    • 6.3双样本t检验
    • 6.4方差分析(分类变量和连续变量关系检验)
    • 6.4.1单因素方差分析
    • 6.4.2多因素方差分析
    • 6.5相关分析(两连续变量关系检验)
    • 6.5.1相关系数
    • 6.5.2散点矩阵图
    • 6.6卡方检验(二分类变量关系检验)
    • 6.6.1列联表
    • 6.6.2卡方检验
    • 第7章客户价值预测:线性回归模型与诊断
    • 7.1线性回归
    • 7.1.1简单线性回归
    • 7.1.2多元线性回归
    • 7.1.3多元线性回归的变量筛选
    • 7.2线性回归诊断
    • 7.2.1残差分析
    • 7.2.2强影响点分析
    • 7.2.3多重共线性分析
    • 7.2.4小结线性回归诊断
    • 7.3正则化方法
    • 7.3.1岭回归
    • 7.3.2LASSO回归
    • 第8章Logistic回归构建初始信用评级
    • 8.1Logistic回归的相关关系分析
    • 8.2Logistic回归模型及实现
    • 8.2.1Logistic回归与发生比
    • 8.2.2Logistic回归的基本原理
    • 8.2.3在Python中实现Logistic回归
    • 8.3Logistic回归的极大似然估计
    • 8.3.1极大似然估计的概念
    • 8.3.2Logistics回归的极大似然估计
    • 8.4模型评估
    • 8.4.1模型评估方法
    • 8.4.2ROC曲线的概念
    • 8.4.3在Python中实现ROC曲线
    • 第9章使用决策树进行初始信用评级
    • 9.1决策树概述
    • 9.2决策树算法
    • 9.2.1ID3建树算法原理
    • 9.2.2C4.5建树算法原理
    • 9.2.3CART建树算法原理
    • 9.2.4决策树的剪枝
    • 9.3在Python中实现决策树
    • 9.3.1建模
    • 9.3.2模型评估
    • 9.3.3决策树的可视化
    • 9.3.4参数搜索调优
    • 第10章神经网络
    • 10.1神经元模型
    • 10.2单层感知器
    • 10.3BP神经网络
    • 10.4多层感知器的scikitlearn代码实现
    • 第11章分类器入门:最近邻域与朴素贝叶斯
    • 11.1KNN算法
    • 11.1.1KNN算法原理
    • 11.1.2在Python中实现KNN算法
    • 11.2朴素贝叶斯分类
    • 11.2.1贝叶斯公式
    • 11.2.2朴素贝叶斯分类原理
    • 11.2.3朴素贝叶斯的参数估计
    • 11.2.4在Python中实现朴素贝叶斯
    • 第12章高级分类器:支持向量机
    • 12.1线性可分与线性不可分
    • 12.2线性可分支持向量机
    • 12.2.1函数间隔和几何间隔
    • 12.2.2学习策略
    • 12.2.3对偶方法求解
    • 12.2.4线性可分支持向量机例题
    • 12.3线性支持向量机与软间隔最大化
    • 12.4非线性支持向量机与核函数
    • 12.4.1核函数
    • 12.4.2非线性支持向量机的学习
    • 12.4.3示例与Python实现
    • 12.5使用支持向量机的案例
    • 第13章连续变量的特征选择与转换
    • 13.1方法概述
    • 13.2主成分分析
    • 13.2.1主成分分析简介
    • 13.2.2主成分分析原理
    • 13.2.3主成分分析的运用
    • 13.2.4在Python中实现主成分分析
    • 13.3基于主成分的冗余变量筛选
    • 13.4因子分析
    • 13.4.1因子分析模型
    • 13.4.2因子分析算法
    • 13.4.3在Python中实现因子分析
    • 第14章客户分群与聚类
    • 14.1聚类算法概述
    • 14.2聚类算法基本概念
    • 14.2.1变量标准化与分布形态转换
    • 14.2.2变量的维度分析
    • 14.3聚类模型的评估
    • 14.4层次聚类
    • 14.4.1层次聚类原理
    • 14.4.2层次聚类在Python中的实现
    • 14.5基于划分的聚类
    • 14.5.1kmeans聚类原理
    • 14.5.2kmeans聚类

    读书笔记

    《Python编程:从入门到实践》第二章:变量和简单数据类型

    什么是变量

    举例:

    >>> message = "Hello,Python!"
    >>> print (message)
    Hello,Python!

    这里的message就是变量,可以理解成变量就是一个存储数据的容器。在程序中可随时修改变量的值,而python将始终记录变量的最新值。

    变量命令的规则有哪些呢?

    • 变量只能包含字母数字下划线。
    • 变量名不能包含空格,但可以使用下划线来分割其中的单词
    • 不要将python关键字和函数名作为变量名
    • 变量名应既简单又具有描述性
    • 慎用小写字符l和大写字母O,因为他们可能被人错看成数字1和0

    什么是字符串?

    字符串就是一系列字符,在python中用单引号或者双引号括起来。

    因为拥有两种方式,可以灵活在字符串中包含引号和撇号。

    'I told my friend, "Python is my favorite language!"'
    "The language 'Python' is named after Monty Python, not the snake."
    "One of Python's strengths is its diverse and supportive community."

    一些基本的方法

    1.title()首字符大写

    >>> name = "liu bin"
    >>> print (name.title())
    Liu Bin

    2.upper()全部大写转换

    >>> name = "liu bin"
    >>> print (name.upper())
    LIU BIN

    3.lower()全部小写转换

    >>> name = "Liu Bin"
    >>> print (name.lower())
    liu bin

    怎么将字符串合在一起呢?

    简单的"+"加号既可以实现啦。

    >>> first_name = "Bin"
    >>> last_name = "Liu"
    >>> full_name = last_name + " " + first_name
    >>> print (full_name)
    Liu Bin

    制表符和换行符

    制表符:\t 

    >>> print ("python")
    python
    >>> print ("\tpython")
        python

    换行符:\n

    >>> print ("pythonPHP")
    pythonPHP
    >>> print ("python\nPHP")
    python
    PHP

    怎么删除空白?

    • 删除尾部空白:rstrip()
    • 删除头部空白:lstrip()
    • 删除两端空白:strip()

    运算

    整数加减乘除

    >>> 2 + 3
    5
    >>> 3 - 2
    1
    >>> 2 * 3
    6
    >>> 3 / 2
    1.5

    乘方运算

    >>> 3 ** 2
    9
    >>> 3 ** 3
    27
    >>> 10 ** 6
    1000000

    支持括号优先

    >>> 2 + 3*4
    14
    >>> (2 + 3) * 4
    20

    浮点运算

    >>> 0.1 + 0.1
    0.2
    >>> 0.2 + 0.2
    0.4
    >>> 2 * 0.1
    0.2
    >>> 2 * 0.2
    0.4

    浮点运算结果包含的小数位可能是不确定的,所有语言都会存在这种问题,不用担心,后面有解决方法的

    >>> 0.2 + 0.1
    0.30000000000000004
    >>> 3 * 0.1
    0.30000000000000004

    非字符串转换为字符串? 

    str()

    错误的例子:

    >>> age = 23
    >>> message = "Happy" + age +"rd Birthday!"
    Traceback (most recent call last):
      File "<pyshell#79>", line 1, in <module>
        message = "Happy" + age +"rd Birthday!"
    TypeError: must be str, not int

    所以用str()转换

    >>> message = "Happy " + str(age) + "rd Birthday!"
    >>> print (message)
    Happy 23rd Birthday!

    注释

    Python中使用#注释,换行注释可以使用三引号

    # 向大家问好
    print("Hello Python people!")

    课后习题

    2-1

    message = "Code Geass"
    print(message)

    2-2

    message = "Code Geass"
    print(message)
    message = "Psycho-Pass"
    print(message)

    2-3

    name = "Victorique"
    print("Hello, " + name + "!")

    2-4

    name = "Victorique"
    print(name.lower())
    print(name.upper())
    print(name.title())

    2-5

    print('Lelouch said, "Yes, your mejesty."')

    2-6

    famous_person = "Lelouch"
    message = famous_person + ' said, "Yes, your mejesty."'
    print(message)  

    2-7

    name = "\tLelouch\n"
    print(name.lstrip())
    print(name.rstrip())
    print(name.strip())

    2-8

    print(5 + 3)
    print(10 - 2)
    print(2 * 4)
    print(int(16 / 2))

    2-9

    num = 6
    message = "My favorite nummber is " + str(num) + "."
    print(message)

     

    Python从SQL型数据库读写dataframe型数据的方法总结

    本文实例讲述了Python实现从SQL型数据库读写dataframe型数据的方法。分享给大家供大家参考,具体如下:

    Python的pandas包对表格化的数据处理能力很强,而SQL数据库的数据就是以表格的形式储存,因此经常将sql数据库里的数据直接读取为dataframe,分析操作以后再将dataframe存到sql数据库中。而pandas中的read_sql和to_sql函数就可以很方便得从sql数据库中读写数据。

    read_sql

    参见pandas.read_sql的文档,read_sql主要有如下几个参数:

    • sql:SQL命令字符串
    • con:连接sql数据库的engine,一般可以用SQLalchemy或者pymysql之类的包建立
    • index_col: 选择某一列作为index
    • coerce_float:非常有用,将数字形式的字符串直接以float型读入
    • parse_dates:将某一列日期型字符串转换为datetime型数据,与pd.to_datetime函数功能类似。可以直接提供需要转换的列名以默认的日期形式转换,也可以用字典的格式提供列名和转换的日期格式,比如{column_name: format string}(format string:"%Y:%m:%H:%M:%S")。
    • columns:要选取的列。一般没啥用,因为在sql命令里面一般就指定要选择的列了
    • chunksize:如果提供了一个整数值,那么就会返回一个generator,每次输出的行数就是提供的值的大小。
    • params:其他的一些执行参数,没用过不太清楚。。。

    以链接常见的mysql数据库为例:

    import pandas as pd
    import pymysql
    import sqlalchemy
    from sqlalchemy import create_engine
    # 1. 用sqlalchemy构建数据库链接engine
    connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE) #1
    engine = create_engine(connect_info)
    # sql 命令
    sql_cmd = "SELECT * FROM table"
    df = pd.read_sql(sql=sql_cmd, con=engine)
    # 2. 用DBAPI构建数据库链接engine
    con = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8', use_unicode=True)
    df = pd.read_sql(sql_cmd, con)
    
    

    解释一下 #1: 这个是sqlalchemy中链接数据库的URL格式:dialect[+driver]://user:password@host/dbname[?key=value..]。dialect代表书库局类型,比如mysql, oracle, postgresql。driver代表DBAPI的名字,比如psycopg2,pymysql等。具体说明可以参考这里。此外由于数据里面有中文的时候就需要将charset设为utf8。

    to_sql

    参见pandas.to_sql函数,主要有以下几个参数:

    • name: 输出的表名
    • con: 与read_sql中相同
    • if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail
    • index:是否将df的index单独写到一列中
    • index_label:指定列作为df的index输出,此时index为True
    • chunksize: 同read_sql
    • dtype: 指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,具体数据类型可以参考这里

    还是以写到mysql数据库为例:

    df.to_sql(name='table', 
       con=con, 
       if_exists='append', 
       index=False,
       dtype={'col1':sqlalchemy.types.INTEGER(),
         'col2':sqlalchemy.types.NVARCHAR(length=255),
         'col_time':sqlalchemy.DateTime(),
         'col_bool':sqlalchemy.types.Boolean
       })
    
    

    注:如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出,比如字符型会以sqlalchemy.types.TEXT类型输出,相比NVARCHAR,TEXT类型的数据所占的空间更大,所以一般会指定输出为NVARCHAR;而如果df的列的类型为np.int64时,将会导致无法识别并转换成INTEGER型,需要事先转换成int类型(用map,apply函数可以方便的转换)。

    参考:

    http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sql-standard-and-multiple-vendor-types
    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html
    http://docs.sqlalchemy.org/en/latest/core/engines.html
    http://docs.sqlalchemy.org/en/latest/core/type_basics.html#sql-standard-and-multiple-vendor-types
    http://stackoverflow.com/questions/30631325/writing-to-mysql-database-with-pandas-using-sqlalchemy-to-sql
    http://stackoverflow.com/questions/5687718/how-can-i-insert-data-into-a-mysql-database
    http://stackoverflow.com/questions/32235696/pandas-to-sql-gives-unicode-decode-error
    http://stackoverflow.com/questions/34383000/pandas-to-sql-all-columns-as-nvarchar

    更多关于Python相关内容感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

    希望本文所述对大家Python程序设计有所帮助。

    《Python编程:从入门到实践》第十五章:生成数据

    15-1 立方

    数字的三次方被称为其立方。请绘制一个图形,显示前5个整数的立方值,在绘制一个图形,显示前面5000个整数的立方值。

    前5个整数的立方值:

    import matplotlib.pyplot as plt
    
    x_values  = [1,2,3,4,5]
    y_values = [1,8,27,64,125]
    plt.title("Li Fang ")
    plt.plot(x_values,y_values,linewidth = 5)
    plt.xlabel("Value",fontsize = 14)
    plt.ylabel("Square of Value",fontsize = 14)
    plt.tick_params(axis = 'both' , labelsize = 14)
    plt.show()

    结果:

    前面5000个整数的立方值:

    import matplotlib.pyplot as plt
    
    x_values  = list(range(1,50001))
    y_values = [x**3 for x in x_values]
    plt.title("Li Fang ")
    plt.scatter(x_values,y_values,linewidth = 5,edgecolor = 'none')
    plt.xlabel("Value",fontsize = 14)
    plt.ylabel("Square of Value",fontsize = 14)
    plt.tick_params(axis = 'both' , labelsize = 14)
    plt.show()

    结果:

    15-2 彩色立方

    给你前面的立方图指定颜色映射

    import matplotlib.pyplot as plt
    
    x_values  = [1,2,3,4,5]
    y_values = [1,8,27,64,125]
    plt.title("Li Fang ")
    plt.plot(x_values,y_values,linewidth = 5,c = 'red')
    plt.xlabel("Value",fontsize = 14)
    plt.ylabel("Square of Value",fontsize = 14)
    plt.tick_params(axis = 'both' , labelsize = 14)
    plt.show()

    结果:


     

    15-3 分子运动

    修改rw_visual.py,将其中的plt.scatter()替换为plt.plot(),为模拟花粉在水滴表面的运动路径,向plt.plot()传递rw.x_values和rw.y_values,并指定实参值linewidth。使用5000个点而不是50000个点。

    rw_visual.py

    import matplotlib.pyplot as plt
    
    from random_walk import RandomWalk
    rw = RandomWalk()
    rw.fill_walk()
    plt.plot(rw.x_values,rw.y_values,linewidth = 2)
    
    plt.show()
    

    random_walk.py

    from random import choice
    class RandomWalk(object):
    	"""docstring for RandomWalk"""
    	def __init__(self, num_points = 5000):
    		self.num_points = num_points
    
    		self.x_values = [0]
    		self.y_values = [0]
    
    	def fill_walk(self):
    		while len(self.x_values) < self.num_points: 
    			x_direction = choice([1,-1])
    			x_distance = choice([0,1,2,3,4])
    			x_step = x_direction * x_distance
    
    			y_direction = choice([1,-1])
    			y_distance = choice([0,1,2,3,4])
    			y_step = y_direction * y_distance
    
    			if x_step == 0  and y_step ==0:
    				continue
    			else:
    				next_x = self.x_values[-1] + x_step
    				next_y = self.y_values[-1] + y_step
    
    				self.x_values.append(next_x)
    				self.y_values.append(next_y)
    

    结果:

    15-4 改进的随机漫步

    在类RandomWalk中,x_step 和 y_step 是根据相同的条件生成的:从列表【1,-1】中随机地选择方向,并经列表【0,1,2,3,4】中随机地选择距离。请修改这些列表中的值,看看对随机漫步路径有何影响。长沙使用更长距离选择列表,如0~8;或者将-1从x或y方向列表中删除

    15-5 重构

    方法fill_walk()很长。请新建一个名为get_step()的方法,用于确定每次漫步的距离和方向,并计算这次漫步将如何移动。然后,在fill_work() 中调用get_step()两次:

    x_step = self.get_step()

    y_step = self.get_step()

    通过这样的重构,可缩小fill_walk() 的规模,让这个方法阅读和理解起来更容易

    from random import choice class RandomWalk(object): """docstring for RandomWalk""" def __init__(self, num_points = 5000): self.num_points = num_points self.x_values = [0] self.y_values = [0] def fill_walk(self): while len(self.x_values)< self.num_points: x_step = self.get_step() y_step = self.get_step() if x_step == 0 and y_step ==0: continue else: next_x = self.x_values[-1] + x_step next_y = self.y_values[-1] + y_step self.x_values.add(next_x) self.y_values.add(next_y) def get_step(self): direction = choice([1,-1]) distance = choice([0,1,2,3,4]) step = direction * distance
    return step

    15-6 自动生成标签

    请修改die.py 和 dice_visual.py,将用来设置 hist.x_labels 值的列表替换为字节自动生成这种列表的循环。如果你熟悉列表解析,可尝试将 die_visual.py 和 dice_visual.py 中的其他 for 循环也替换为列表解析。

    die_visual.py

    from die import Die
    import pygal
    def num2char(x):
    	return str(x)
    die1 = Die()
    die2 = Die()
    results = []
    
    for roll_num in range(1000):
    	result = die1.roll() + die2.roll()
    	results.append(result)
    # print(results)
    frequencies = []
    max_result = die1.num_sides + die2.num_sides
    for value in range(1,max_result+1):
    	frequency = results.count(value)
    	frequencies.append(frequency)
    
    hist = pygal.Bar()
    hist.title = "Result of rolling me D6 1000 times."
    hist.x_labels = list(map(num2char,list(range(1,max_result+1))))
    print(hist.x_labels)
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    hist.add('D6+D6',frequencies)
    hist.render_to_file('dice1_visual.svg')

    15-7 两个D8骰子

    请模拟同时透支两个8面骰子1000次的结果。逐渐增加投掷骰子的次数,知道系统不堪重负为止。

    die.py

    from random import randint
    class Die(object):
    	"""docstring for Die"""
    	def __init__(self, num_sides = 8):
    		self.num_sides = num_sides
    
    	def roll(self):
    		return randint(1,self.num_sides)
    		

    die_visual.py

    from die import Die
    import pygal
    
    die1 = Die()
    die2 = Die()
    results = []
    
    for roll_num in range(1000):
    	result = die1.roll() + die2.roll()
    	results.append(result)
    frequencies = []
    max_result = die1.num_sides + die2.num_sides
    for value in range(2,max_result+1):
    	frequency = results.count(value)
    	frequencies.append(frequency)
    
    hist = pygal.Bar()
    hist.title = "Result of rolling me D8 1000 times."
    hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    hist.add('D8+D8',frequencies)
    hist.render_to_file('dice1_visual.svg')

    结果:

    15-8 同时投掷三个骰子

    如果你同时掷三个D6骰子,可能得到的最小点数为3,而最大点数为18,。请通过可视化展示同时掷三个D6骰子的结果

    die_visual.py

    from die import Die
    import pygal
    
    die1 = Die()
    die2 = Die()
    die3 = Die()
    results = []
    
    for roll_num in range(1000):
    	result = die1.roll() + die2.roll() +  die3.roll()
    	results.append(result)
    frequencies = []
    max_result = die1.num_sides + die2.num_sides + die3.num_sides
    for value in range(2,max_result+1):
    	frequency = results.count(value)
    	frequencies.append(frequency)
    
    hist = pygal.Bar()
    hist.title = "Result of rolling me D6 1000 times."
    hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18']
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    hist.add('D6+D6+D6',frequencies)
    hist.render_to_file('dice1_visual.svg')

    结果:

    15-9 将点数相乘

    同时掷两个骰子时,通常将它们的点数相加。通过可视化展示将两个骰子的点数相乘的结果

    from die import Die
    import pygal
    def num2char(x):
    	return str(x)
    die1 = Die()
    die2 = Die()
    results = []
    
    for roll_num in range(1000):
    	result = die1.roll() * die2.roll()
    	results.append(result)
    # print(results)
    frequencies = []
    max_result = die1.num_sides * die2.num_sides
    for value in range(1,max_result+1):
    	frequency = results.count(value)
    	frequencies.append(frequency)
    
    hist = pygal.Bar()
    hist.title = "Result of rolling me D6 1000 times."
    hist.x_labels = list(map(num2char,list(range(1,max_result+1))))
    print(hist.x_labels)
    hist.x_title = "Result"
    hist.y_title = "Frequency of Result"
    
    hist.add('D6*D6',frequencies)
    hist.render_to_file('dice1_visual.svg')

    结果:


     

    15-10 练习使用本章介绍的两个库

    尝试使用 matplotlib 通过可视化来模拟值骰子的情况。

    die_scatter.py

    import matplotlib.pyplot as plt
    from die import Die
    
    die1 = Die()
    die2 = Die()
    results = []
    
    for roll_num in range(1000):
    	result = die1.roll() + die2.roll()
    	results.append(result)
    # print(results)
    frequencies = []
    max_result = die1.num_sides + die2.num_sides
    for value in range(1,max_result+1):
    	frequency = results.count(value)
    	frequencies.append(frequency)
    print(frequencies)
    plt.plot(list(range(1,max_result+1)),frequencies,linewidth = 2)
    plt.title("Result of rolling me D6 1000 times.")
    plt.xlabel ("Result",fontsize = 14)
    plt.ylabel("Square of D6 1000 times")
    plt.show()

    结果:

    random_walk_Pygal.py

    Python实现数据可视化监控爬虫状态

    今天主要是来说一下怎么可视化来监控你的爬虫的状态。

    相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样。今天我来讲一种可视化的方法。

    关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据。

    1.成品图

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M。爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图。

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    可以实现对爬虫数量,增量,大小,大小增量的实时监控。

    2. 环境

    • InfluxDb ,是目前比较流行的时间序列数据库;
    • Grafana ,一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源
    • Ubuntu
    • influxdb (pip install influxdb)
    • Python 2.7

    3. 原理

    获取要展示的数据,包含当前的时间数据,存到InfluxDb里面,然后再到Grafana里面进行相应的配置即可展示;

    4. 安装

    4.1 Grafana安装

    官方安装指导

    安装好以后,打开本地的3000端口,即可进入管理界面,用户名与密码都是 admin 。

    4.2 InfulxDb安装

    这个安装就网上自己找吧,有很多的配置我都没有配置,就不在这里误人子弟了。

    5. InfluxDb简单操作

    碰到了数据库,肯定要把增删改查学会了啊, 和sql几乎一样,只有一丝丝的区别,具体操作,大家可以参考官方的文档。

    • influx 进入命令行
    • CREATE DATABASE test 创建数据库
    • show databases 查看数据库
    • use test 使用数据库
    • show series 看表
    • select * from table_test 选择数据
    • DROP MEASUREMENT table_test 删表

    6. 存数据

    InfluxDb数据库的数据有一定的格式,因为我都是利用python库进行相关操作,所以下面将在python中的格式展示一下:

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    其中:

    • measurement, 表名
    • time,时间
    • tags,标签
    • fields,字段
    •  

    可以看到,就是个列表里面,嵌套了一个字典。其中,对于时间字段,有特殊要求,可以参考这里, 下面是python实现方法:

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    所以,到这里,如何将爬虫的相关属性存进去呢?以MongoDB为例

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    那么现在我们已经往数据里存了数据了,那么接下来要做的就是把存的数据展示出来。

    7.展示数据

    7.1 配置数据源

    以admin登录到Grafana的后台后,我们首先需要配置一下数据源。点击左边栏的最下面的按钮,然后点击DATA SOURCES,这样就可以进入下面的页面:

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    点击ADD DATA SOURCE,进行配置即可,如下图:

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    其中,name自行设定;Type 选择InfluxDB;url为默认的http://localhost:8086, 其他的因为我前面没有进行配置,所以默认的即可。然后在InfluxDB Details里的填入Database名,最后点击测试,如果没有报错的话,则可以进入下一步的展示数据了;

    7.2 展示数据

    点击左边栏的+号,然后点击GRAPH

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    接着点击下图中的edit进入编辑页面:

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    Python实现数据可视化看如何监控你的爬虫状态【推荐】

    从上图中可以发现:

    中间板块是最后的数据展示
    下面是数据的设置项
    右上角是展示时间的设置板块,在这里可以选择要展示多久的数据

    7.2.1 配置数据

    在Data Source中选择刚刚在配置数据源的时候配置的NAME字段,而不是database名。
    接着在下面选择要展示的数据。看着就很熟悉是不是,完全是sql语句的可视化。同时,当我们的数据放到相关的字段上的时候,双击,就会把可以选择的项展示出来了,我们要做的就是直接选择即可;
    设置右上角的时间,则可以让数据实时进行更新与展示
    因为下面的配置实质就是sql查询语句,所以大家按照自己的需求,进行选择配置即可,当配置完以后,就可以在中间的面板里面看到数据了。

    8. 总结

    到这里,本篇文章就结束了。其中,对于Grafana的操作我没有介绍的很详细,因为本篇主要讲的是怎么利用这几个工具完成我们的任务。

    同时,里面的功能确实很多,还有可以安装的插件。我自己目前还是仅仅对于用到的部分比较了解,所以大家可以查询官方的或者别的教程资料来对Grafana进行更深入的了解,制作出更加好看的可视化作品来。

    文末知识点摘要①:sql中dateiff函数的用法

    DATEDIFF

    返回跨两个指定日期的日期和时间边界数。

    一、 语法

    DATEDIFF ( datepart , startdate , enddate )

    二、参数

    datepart

    是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server? 识别的日期部分和缩写。

    日期部分 缩写

    year yy, yyyy
    quarter qq, q
    Month mm, m
    dayofyear dy, y
    Day dd, d
    Week wk, ww
    Hour hh
    minute mi, n
    second ss, s
    millisecond ms
    startdate

    是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

    因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

    如 果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后 两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

    enddate

    是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。

    三、返回类型

    integer

    四、用法

    此函数计算两个指定日期之间日期部分的数目。结果为日期部分中等于(date2 - date1)的有符号的整数值。

    当结果不是日期部分的偶数倍时,DATEDIFF 将被截断而不是被舍入。

    当使用 day 作为日期部分时,DATEDIFF 返回两个指定的时间之间(包括第二个日期但不包括第一个日期)的午夜数。

    当使用 month 作为日期部分时,DATEDIFF 返回两个日期之间(包括第二个日期但不包括第一个日期)出现的月的第一天的数目。

    当使用 week 作为日期部分时,DATEDIFF 返回两个日期(包括第二个日期但不包括第一个日期)之间星期日的数目。

    对于更小的时间单位存在溢出值:

    milliseconds 24 天

    seconds 68 年

    minutes 4083 年

    others 没有溢出限制

    如果超出这些限制,此函数将返回溢出错误。

    五、标准和兼容性

    SQL/92 Transact-SQL 扩展。
    SQL/99 Transact-SQL 扩展。

    Sybase 与 Adaptive Server Enterprise 兼容。

    六、示例

    下面的语句返回 1 :

    select datediff( hour, ''4:00am'', ''5:50am'' )

    下面的语句返回 102 :

    select datediff( month, ''1987/05/02'', ''1995/11/15'' )

    下面的语句返回 0 :

    select datediff( day, ''00:00'', ''23:59'' )

    下面的语句返回 4 :

    select datediff( day, ''1999/07/19 00:00'',''1999/07/23 23:59'' )

    下面的语句返回 0 :

    select datediff( month, ''1999/07/19'', ''1999/07/23'' )

    下面的语句返回 1 :

    select datediff( month, ''1999/07/19'', ''1999/08/23'' ) 

    总结

    以上所述是小编给大家介绍的Python实现数据可视化看如何监控你的爬虫状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

    实例讲解python MNIST手写识别数据调用API的方法

    MNIST数据集比较小,一般入门机器学习都会采用这个数据集来训练

    下载地址:yann.lecun.com/exdb/mnist/

    有4个有用的文件:
    train-images-idx3-ubyte: training set images
    train-labels-idx1-ubyte: training set labels
    t10k-images-idx3-ubyte: test set images
    t10k-labels-idx1-ubyte: test set labels

    The training set contains 60000 examples, and the test set 10000 examples. 数据集存储是用binary file存储的,黑白图片。

    下面给出load数据集的代码:

    import os
    import struct
    import numpy as np
    import matplotlib.pyplot as plt
    
    def load_mnist():
      '''
      Load mnist data
      http://yann.lecun.com/exdb/mnist/
    
      60000 training examples
      10000 test sets
    
      Arguments:
        kind: 'train' or 'test', string charater input with a default value 'train'
    
      Return:
        xxx_images: n*m array, n is the sample count, m is the feature number which is 28*28
        xxx_labels: class labels for each image, (0-9)
      '''
    
      root_path = '/home/cc/deep_learning/data_sets/mnist'
    
      train_labels_path = os.path.join(root_path, 'train-labels.idx1-ubyte')
      train_images_path = os.path.join(root_path, 'train-images.idx3-ubyte')
    
      test_labels_path = os.path.join(root_path, 't10k-labels.idx1-ubyte')
      test_images_path = os.path.join(root_path, 't10k-images.idx3-ubyte')
    
      with open(train_labels_path, 'rb') as lpath:
        # '>' denotes bigedian
        # 'I' denotes unsigned char
        magic, n = struct.unpack('>II', lpath.read(8))
        #loaded = np.fromfile(lpath, dtype = np.uint8)
        train_labels = np.fromfile(lpath, dtype = np.uint8).astype(np.float)
    
      with open(train_images_path, 'rb') as ipath:
        magic, num, rows, cols = struct.unpack('>IIII', ipath.read(16))
        loaded = np.fromfile(train_images_path, dtype = np.uint8)
        # images start from the 16th bytes
        train_images = loaded[16:].reshape(len(train_labels), 784).astype(np.float)
    
      with open(test_labels_path, 'rb') as lpath:
        # '>' denotes bigedian
        # 'I' denotes unsigned char
        magic, n = struct.unpack('>II', lpath.read(8))
        #loaded = np.fromfile(lpath, dtype = np.uint8)
        test_labels = np.fromfile(lpath, dtype = np.uint8).astype(np.float)
    
      with open(test_images_path, 'rb') as ipath:
        magic, num, rows, cols = struct.unpack('>IIII', ipath.read(16))
        loaded = np.fromfile(test_images_path, dtype = np.uint8)
        # images start from the 16th bytes
        test_images = loaded[16:].reshape(len(test_labels), 784)  
    
      return train_images, train_labels, test_images, test_labels
    
    

    再看看图片集是什么样的:

    def test_mnist_data():
      '''
      Just to check the data
    
      Argument:
        none
    
      Return:
        none
      '''
      train_images, train_labels, test_images, test_labels = load_mnist()
      fig, ax = plt.subplots(nrows = 2, ncols = 5, sharex = True, sharey = True)
      ax =ax.flatten()
      for i in range(10):
        img = train_images[i][:].reshape(28, 28)
        ax[i].imshow(img, cmap = 'Greys', interpolation = 'nearest')
        print('corresponding labels = %d' %train_labels[i])
    
    if __name__ == '__main__':
      test_mnist_data()

    跑出的结果如下:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

    上一篇:用户体验设计:100堂入门课  下一篇:Eclipse RCP深入浅出

    展开 +

    收起 -

    Python相关电子书
    学习笔记

    Copyright 2018-2019 xz577.com 码农之家

    版权责任说明