2018-12-07 17:35:38 RedPintings 阅读数 1602
  • Python入门视频精讲

    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    8447 人正在学习 去看看 汤小洋

Python在大数据行业非常火爆近两年,as a pythonic,所以也得涉足下大数据分析,下面就聊聊它们。

Python数据分析与挖掘技术概述

所谓数据分析,即对已知的数据进行分析,然后提取出一些有价值的信息,比如统计平均数,标准差等信息,数据分析的数据量可能不会太大,而数据挖掘,是指对大量的数据进行分析与挖倔,得到一些未知的,有价值的信息等,比如从网站的用户和用户行为中挖掘出用户的潜在需求信息,从而对网站进行改善等。
数据分析与数据挖掘密不可分,数据挖掘是对数据分析的提升。数据挖掘技术可以帮助我们更好的发现事物之间的规律。所以我们可以利用数据挖掘技术可以帮助我们更好的发现事物之间的规律。比如发掘用户潜在需求,实现信息的个性化推送,发现疾病与病状甚至病与药物之间的规律等。

预先善其事必先利其器

我们首先聊聊数据分析的模块有哪些:

  1. numpy 高效处理数据,提供数组支持,很多模块都依赖它,比如pandas,scipy,matplotlib都依赖他,所以这个模块都是基础。所以必须先安装numpy。
  2. pandas 主要用于进行数据的采集与分析
  3. scipy 主要进行数值计算。同时支持矩阵运算,并提供了很多高等数据处理功能,比如积分,微分方程求样等。
  4. matplotlib 作图模块,结合其他数据分析模块,解决可视化问题
  5. statsmodels 这个模块主要用于统计分析
  6. Gensim 这个模块主要用于文本挖掘
  7. sklearn,keras 前者机器学习,后者深度学习。

下面就说说这些模块的基础使用。

numpy模块安装与使用

安装:
下载地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/
我这里下载的包是1.11.3版本,地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/f9r7rmd8/numpy-1.11.3+mkl-cp35-cp35m-win_amd64.whl
下载好后,使用pip install "numpy-1.11.3+mkl-cp35-cp35m-win_amd64.whl"
安装的numpy版本一定要是带mkl版本的,这样能够更好支持numpy

numpy简单使用

import numpy

x=numpy.array([11,22,33,4,5,6,7,])  #创建一维数组
x2=numpy.array([['asfas','asdfsdf','dfdf',11],['1iojasd','123',989012],["jhyfsdaeku","jhgsda"]])    #创建二维数组,注意是([])

x.sort()   #排序,没有返回值的,修改原处的值,这里等于修改了X
x.max()    # 最大值,对二维数组都管用
x.min()    # 最小值,对二维数组都管用
x1=x[1:3]   # 取区间,和python的列表没有区别

生成随机数

主要使用numpy下的random方法。

#numpy.random.random_integers(最小值,最大值,个数)  获取的是正数
data = numpy.random.random_integers(1,20000,30)   #生成整形随机数
#正态随机数  numpy.random.normal(均值,偏离值,个数)  偏离值决定了每个数之间的差 ,当偏离值大于开始值的时候,那么会产生负数的。
data1 = numpy.random.normal(3.2,29.2,10)    # 生成浮点型且是正负数的随机数

pandas

使用pip install pandas即可

直接上代码:
下面看看pandas输出的结果, 这一行的数字第几列,第一列的数字是行数,定位一个通过第一行,第几列来定位:

print(b)
      0     1     2    3    
0     1     2     3  4.0
1  sdaf  dsaf  18hd  NaN
2  1463  None  None  NaN

常用方法如下:

import pandas
a=pandas.Series([1,2,3,34,])   # 等于一维数组
b=pandas.DataFrame([[1,2,3,4,],["sdaf","dsaf","18hd"],[1463]])   # 二维数组
print(b.head())  # 默认取头部前5行,可以看源码得知
print(b.head(2))  # 直接传入参数,如我写的那样
print(b.tail())   # 默认取尾部前后5行
print(b.tail(1))     # 直接传入参数,如我写的那样

下面看看pandas对数据的统计,下面就说说每一行的信息

# print(b.describe())   # 显示统计数据信息
         3      # 3表示这个二维数组总共多少个元素
count  1.0      # 总数
mean   4.0      # 平均数
std    NaN      # 标准数
min    4.0      # 最小数
25%    4.0      # 分位数
50%    4.0      # 分位数
75%    4.0      # 分位数
max    4.0      # 最大值

转置功能:把行数转换为列数,把列数转换为行数,如下所示:

print(b.T)   # 转置
   0     1     2   
0  1  sdaf  1463
1  2  dsaf  None
2  3  18hd  None
3  4   NaN   NaN

通过pandas导入数据

pandas支持多种输入格式,我这里就简单罗列日常生活最常用的几种,对于更多的输入方式可以查看源码后者官网。

CSV文件

csv文件导入后显示输出的话,是按照csv文件默认的行输出的,有多少列就输出多少列,比如我有五列数据,那么它就在prinit输出结果的时候,就显示五列

csv_data = pandas.read_csv('F:\Learnning\CSDN-python大数据\hexun.csv')
print(csv_data)

excel表格

依赖于xlrd模块,请安装它。
老样子,原滋原味的输出显示excel本来的结果,只不过在每一行的开头加上了一个行数

excel_data = pandas.read_excel('F:\Learnning\CSDN-python大数据\cxla.xls')
print(excel_data)

读取SQL

依赖于PyMySQL,所以需要安装它。pandas把sql作为输入的时候,需要制定两个参数,第一个是sql语句,第二个是sql连接实例。

conn=pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="test")
sql="select * from fortest"
e=pda.read_sql(sql,conn)

读取HTML

依赖于lxml模块,请安装它。
对于HTTPS的网页,依赖于BeautifulSoup4,html5lib模块。
读取HTML只会读取HTML里的表格,也就是只读取<table>标签包裹的内容.

html_data = pandas.read_html('F:\Learnning\CSDN-python大数据\shitman.html')   # 读取本地html文件。
html_from_online = pandas.read_html('https://book.douban.com/')  # 读取互联网的html文件
print(html_data)
print('html_from_online')

显示的是时候是通过python的列表展示,同时添加了行与列的标识

读取txt文件

输出显示的时候同时添加了行与列的标识

text_data = pandas.read_table('F:\Learnning\CSDN-python大数据\dforsay.txt')
print(text_data)

scipy

安装方法是先下载whl格式文件,然后通过pip install “包名” 安装。whl包下载地址是:http://www.lfd.uci.edu/~gohlke/pythonlibs/f9r7rmd8/scipy-0.18.1-cp35-cp35m-win_amd64.whl

matplotlib 数据可视化分析

我们安装这个模块直接使用pip install即可。不需要提前下载whl后通过 pip install安装。

下面请看代码:

from matplotlib import  pylab
import numpy
# 下面2行定义X轴,Y轴
x=[1,2,3,4,8]
y=[1,2,3,4,8]
# plot的方法是这样使用(x轴数据,y轴数据,展现形式)
pylab.plot(x,y)   # 先把x,y轴的信息塞入pylab里面,再调用show方法来画图
pylab.show()    # 这一步开始画图,默认是至线图

画出的图是这样的:
image

下面说说修改图的样式

关于图形类型,有下面几种:

  1. 直线图(默认)
  2. - 直线
  3. -- 虚线
  4. -. -.形式
  5. : 细小虚线

关于颜色,有下面几种:

  1. c-青色
  2. r-红色
  3. m-品红
  4. g-绿色
  5. b-蓝色
  6. y-黄色
  7. k-黑色
  8. w-白色

关于形状,有下面几种:

  1. s 方形
  2. * 星形
  3. p 五角形

我们还可以对图稍作修改,添加一些样式,下面修改圆点图为红色的点,代码如下:

pylab.plot(x,y,'or')   # 添加O表示画散点图,r表示red
pylab.show()

image

我们还可以画虚线图,代码如下所示:

pylab.plot(x,y,'r:')
pylab.show()

还可以给图添加上标题,x,y轴的标签,代码如下所示

pylab.plot(x,y,'pr--')   #p是图形为五角星,r为红色,--表示虚线
pylab.title('for learnning')   # 图形标题
pylab.xlabel('args')   # x轴标签
pylab.ylabel('salary')   # y轴标签
pylab.xlim(2)    # 从y轴的2开始做线
pylab.show()

image

直方图

利用直方图能够很好的显示每一段的数据。下面使用随机数做一个直方图。

data1 = numpy.random.normal(5.0,4.0,10)   # 正态随机数
pylab.hist(data1)
pylab.show()

image
Y轴为出现的次数,X轴为这个数的值(或者是范围)

还可以指定直方图类型通过histtype参数:

图形区别语言无法描述很详细,大家可以自信尝试。

  1. bar :is a traditional bar-type histogram. If multiple data
    are given the bars are aranged side by side.
  2. barstacked :is a bar-type histogram where multiple
    data are stacked on top of each other.
  3. step :generates a lineplot that is by default
    unfilled.
  4. stepfilled :generates a lineplot that is by default
    filled.

举个例子:

sty=numpy.arange(1,30,2)
pylab.hist(data1,histtype='stepfilled')
pylab.show() 

image

子图功能

什么是子图功能呢?子图就是在一个大的画板里面能够显示多张小图,每个一小图为大画板的子图。
我们知道生成一个图是使用plot功能,子图就是subplog。代码操作如下:

#subplot(行,列,当前区域)
pylab.subplot(2,2,1)   # 申明一个大图里面划分成4块(即2*2),子图使用第一个区域(坐标为x=1,y=1)
pylab.subplot(2,2,2)  # 申明一个大图里面划分成4块(即2*2),子图使用第二个区域(坐标为x=2,y=2)
x1=[1,4,6,9]
x2=[3,21,33,43]
pylab.plot(x1,x2)   # 这个plot表示把x,y轴数据塞入前一个子图中。我们可以在每一个子图后使用plot来塞入x,y轴的数据
pylab.subplot(2,1,2)  # 申明一个大图里面划分成2块(即),子图使用第二个区域(坐标为x=1,y=2)
pylab.show()

实践小例子

我们现在可以通过一堆数据来绘图,根据图能够很容易的发现异常。下面我们就通过一个csv文件来实践下,这个csv文件是某个网站的文章阅读数与评论数。
先说说这个csv的文件结构,第一列是序号,第二列是每篇文章的URL,第三列每篇文章的阅读数,第四列是每篇评论数。
我们的需求就是把评论数作为Y轴,阅读数作为X轴,所以我们需要获取第三列和第四列的数据。我们知道获取数据的方法是通过pandas的values方法来获取某一行的值,在对这一行的值做切片处理,获取下标为3(阅读数)和4(评论数)的值,但是,这里只是一行的值,我们需要是这个csv文件下的所有评论数和阅读数,那怎么办?聪明的你会说,我自定义2个列表,我遍历下这个csv文件,把阅读数和评论数分别添加到对应的列表里,这不就行了嘛。呵呵,其实有一个更快捷的方法,那么就是使用T转置方法,这样再通过values方法,就能直接获取这一评论数和阅读数了,此时在交给你matplotlib里的pylab方法来作图,那么就OK了。了解思路后,那么就写吧。

下面看看代码:


csv_data = pandas.read_csv('F:\Learnning\CSDN-python大数据\hexun.csv')
dt = csv_data.T   # 装置下,把阅读数和评论数转为行
readers=dt.values[3]   
comments = dt.values[4]
pylab.xlabel(u'reads')
pylab.ylabel(u'comments')   # 打上标签
pylab.title(u"The Article's reads and comments")
pylab.plot(readers,comments,'ob')
pylab.show()

image

 

2018-12-20 16:02:29 zwx19921215 阅读数 670
  • Python入门视频精讲

    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    8447 人正在学习 去看看 汤小洋

python数据分析入门,作为入门文章系列主要包含以下几个内容:

1.数据的来源(本案例采用的数据来自于上一篇文章中爬取的智联招聘信息):读取数据库数据、数据写入csv文件、读取csv文件等

2.数据的处理:对载入到内存的数据进行一系列的操作(处理总共包含清洗、过滤、分组、统计、排序、计算平均数等一系列操作,本文只简单涉及了其中某几个)

3.对处理后的数据进行可视化分析等

# !/usr/bin/env python
# -*-coding:utf-8-*-
"""
@Author  : xiaofeng
@Time    : 2018/12/19 15:23
@Desc : Less interests,More interest.(数据分析入门)
@Project : python_appliction
@FileName: analysis1.py
@Software: PyCharm
@Blog    :https://blog.csdn.net/zwx19921215
"""
import pymysql as db
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt

# mysql config
mysql_config = {
    'host': '110.0.2.130',
    'user': 'test',
    'password': 'test',
    'database': 'xiaofeng',
    'charset': 'utf8'
}

"""
read data from mysql and write to local file
(从数据库中读取数据写入本地文件)
@:param page_no
@:param page_size
@:param path 文件写入路径
"""


def read_to_csv(page_no, page_size, path):
    # read from database
    database = db.connect(**mysql_config)
    if page_no > 1:
        page_no = (page_no - 1) * page_size
    else:
        page_no = 0
    sql = 'select * from zhilian limit ' + str(page_no) + ',' + str(page_size) + ''
    df = pd.read_sql(sql, database)
    print(df)
    database.close()
    # write to csv
    local = path
    df.to_csv(local, encoding='gbk')


"""
read data from remote address or local address
(读取文件从远程地址或者本地)
"""


def read_from_csv(path):
    # remote address
    # data_url = 'https://xxxx/zhilian.csv'
    # local address
    # data_url = 'G:/zhilian.csv'
    df = pd.read_csv(path, encoding='gbk')
    return df


"""
数据集的简单(过滤、分组、排序)处理
"""


def simple_op(path):
    df = read_from_csv(path)
    # top 10 :获取前10行
    print('--------------top 10-----------')
    top = df.head(10)
    print(top)
    # tail 10:获取后10行
    print('------------tail 10------------')
    tail = df.tail(10)
    print(tail)
    # filter:根据指定条件过滤
    print('-------------filter----------')
    special_jobid = df[df.JobID == 595950]
    print(special_jobid)
    special = df[(df.id >= 110) & (df.PublishDate == '2018-12-18')]
    print(special)
    # check :检查各列缺失情况
    print('-------------check----------------')
    check = df.info()
    print(check)
    print('--------------data describe-----------')
    # count,平均数,标准差,中位数,最小值,最大值,25 % 分位数,75 % 分位数
    describe = df.describe()
    print(describe)
    # 添加新列
    df2 = df.copy()
    df2['AnnualSalaryAvg'] = (df['AnnualSalaryMax'] + df['AnnualSalaryMin']) / 2
    # 重新排列指定列
    columns = ['JobID', 'JobTitle', 'CompanyName', 'AnnualSalaryMin', 'AnnualSalaryMax', 'AnnualSalaryAvg']
    df = pd.DataFrame(df2, columns=columns)
    print(df)


"""
可视化分析
"""


def visualized_analysis(path):
    df = read_from_csv(path)
    df_post_count = df.groupby('JobLactionStr')['AnnualSalaryMax'].count().to_frame().reset_index()
    # subplots(1, 1) 表示1x1个子图,figsize=(25, 8) 子图的宽度和高度
    # f, [ax1,ax2] = plt.subplots(1, 2, figsize=(25, 8)) 表示1x2个子图
    f, ax2 = plt.subplots(1, 1, figsize=(25, 8))

    sns.barplot(x='JobLactionStr', y='AnnualSalaryMax', palette='Greens_d', data=df_post_count, ax=ax2)
    ax2.set_title('各城市职位数量对比', fontsize=15)
    ax2.set_xlabel('城市')
    ax2.set_ylabel('数量')
    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    plt.show()


if __name__ == '__main__':
    path = 'G:/zhilian.csv'
    read_to_csv(0, 100, path)
    df = read_from_csv(path)
    simple_op(path)
    visualized_analysis(path)

控制台输出如下:

 

写入本地csv文件效果如下:

 

可视化效果如下:

 

注:由于是入门文章第一篇,所以并没有对数据分析做过深的探索,更深层次的研究将会在后续系列中呈现!

2018-05-15 22:04:17 qq_41597912 阅读数 802
  • Python入门视频精讲

    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    8447 人正在学习 去看看 汤小洋

上一篇文章带大家一起了解了Pandas库中的数据合并,本文是Python大数据与机器学习系列文章中的第16篇,将带大家一起了解一下Pandas库中的其他数据操作。

Pandas提供了很多针对数据的操作,本文列出一些非常常用的。



在这里还是要推荐下我自己建的Python开发学习群:483546416,群里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2018最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴

实战练习

在Jupyter Notebook上执行以下代码:

import pandas as pd

df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})

df.head()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

获取唯一值

df['col2'].unique()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

获取非唯一值

df['col2'].nunique()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

获取每个值的个数

df['col2'].value_counts()

newdf = df[(df['col1']>2) & (df['col2']==444)]

newdf

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

应用函数

def times2(x):

return x*2

df['col1'].apply(times2)

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df['col2'].apply(lambda x:x*2)

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df['col3'].apply(len)

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df['col1'].sum()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

永久删除一列

del df['col1']

df

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df = pd.DataFrame({'col1':[1,2,3,4],'col2':[444,555,666,444],'col3':['abc','def','ghi','xyz']})

df.drop('col1',axis=1,inplace=True)

df

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

获取列名和索引

df.columns

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df.index

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

排序

df

df.sort_values(by='col2') #inplace=False by default

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

查找和检测Null值

df.isnull()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df.dropna()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

将Null值填充为其它值

import numpy as np

df = pd.DataFrame({'col1':[1,2,3,np.nan],

'col2':[np.nan,555,666,444],

'col3':['abc','def','ghi','xyz']})

df.head()

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

df.fillna('FILL')

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

data = {'A':['foo','foo','foo','bar','bar','bar'],

'B':['one','one','two','two','one','one'],

'C':['x','y','x','y','x','y'],

'D':[1,3,2,5,4,1]}

df = pd.DataFrame(data)

df

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

透视表:df.pivot_table(values='D',index=['A', 'B'],columns=['C'])

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

进度介绍

本系列文章共分为26个部分目前已经进行到了第6部分,所有内容计划如下:

  1. 预热

  2. 环境搭建

  3. Jupyter教程

  4. Python速成

  5. Python数据分析,NumPy库的使用

  6. Python数据分析,Pandas库的使用

  7. Python数据分析,Pandas库练习

  8. Python数据可视化,Matplotlib

  9. Python数据可视化,Seaborn

  10. Python数据可视化,Pandas内建数据可视化

  11. Python数据可视化,Plotly和Cufflinks

  12. Python数据可视化,Geographical Plotting

  13. 数据 Capstone 项目

  14. 机器学习介绍

  15. 线性回归

  16. 交叉验证与偏方差

  17. 逻辑回归算法

  18. k-近邻算法

  19. 决策树与随机森林

  20. 支持向量机

  21. k-means聚类

  22. 主成分分析

  23. 推荐系统

  24. 自然语言处理(NLP)

  25. Python大数据与Spark

  26. 神经网络(NN)与深度学习(DL)

  27.  

2019-08-10 12:36:34 weixin_43216249 阅读数 104
  • Python入门视频精讲

    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    8447 人正在学习 去看看 汤小洋

PaddlePaddle学习课程

课节1:Python数据分析处理

Python数据分析入门

波士顿房价的预测(数据分析和建模的初步知识)(附带相应知识的链接)

一、基础库介绍
1.Seaborn:

Seaborn是基于matplotlib的Python可视化库。 它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,不需要经过大量的调整就能使你的图变得精致。但应强调的是,应该把Seaborn视为matplotlib的补充,而不是替代物。

作者:W_hy
链接:https://www.jianshu.com/p/844f66d00ac1
来源:简书

2.XGBoost:

XGBoost可以成为机器学习的大杀器,广泛用于数据科学竞赛和工业界,是因为它有许多优点:

(1.使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。

(2. 目标函数优化利用了损失函数关于待求函数的二阶导数

(3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。

(4.添加了对稀疏数据的处理。

(5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。

(6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本

原文链接:http://blog.itpub.net/31542119/viewspace-2199549/

3.Sklearn:

官方文档地址:https://scikit-learn.org/stable/
参考文档:https://www.cnblogs.com/wj-1314/p/10179741.html
在这里插入图片描述

5.Matplotlib

Matplotlib 是基于 NumPy 数组构建的多平台数据可视化库。它是John Hunter 在2002年构想的,原本的设计是给 IPython 打补丁,让命令行中也可以有交互式的 MATLAB 风格的画图工具。

在近些年,已经出现了更新更好的工具最终替代了 Matplotlib(比如 R 语言中的ggplot和ggvis), 但 Matplotlib 依旧是一个经过良好测试的、跨平台的图形引擎。
http://www.sohu.com/a/318173714_464033

二、代码详情
安装或导入必要的package
!pip install seaborn
!pip install xgboost
!pip install sklearn
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib as mpl

import matplotlib.pyplot as plt
from IPython.display import display
plt.style.use("fivethirtyeight")
sns.set_style({'font.sans-serif':['simhei','Arial']})
%matplotlib inline
#导入数据
housing = pd.read_csv('E:\\Anaconda\\work\\Paddlepaddle\\learning\\housingPrices_train.csv')
display(housing.head(n=5))#显示数据前5个

在这里插入图片描述

housing.info()#信息统计

在这里插入图片描述在这里插入图片描述

housing.describe()#信息描述

在这里插入图片描述

可视化处理
# 对区域分组对比每平米房价
housing_count = housing.groupby('LotArea')['SalePrice'].count().sort_values(ascending=False).to_frame().reset_index()


f, [ax2,ax3] = plt.subplots(2,1,figsize=(15,15))#几个子图,


sns.barplot(x='LotArea', y='SalePrice', palette="Greens_d", data=housing_count, ax=ax2)#条形图
ax2.set_title('数量',fontsize=15)
ax2.set_xlabel('区域')
ax2.set_ylabel('数量')

sns.boxplot(x='LotArea', y='SalePrice', data=housing, ax=ax3)
ax3.set_title('总价',fontsize=15)
ax3.set_xlabel('区域')
ax3.set_ylabel('房屋总价')

plt.show()

groupby:进行分组,并且进行组内运算
分组统计GroupBy技术详解:https://blog.csdn.net/Asher117/article/details/85614034
关于男女分组的具体应用:https://blog.csdn.net/shujuelin/article/details/79635848

在这里插入图片描述
在这里插入图片描述

f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))#figsize为设定的尺寸
# 建房时间的分布情况
sns.distplot(housing['YearBuilt'], bins=20, ax=ax1, color='r')#displot()集合了matplotlib的hist()与核函数估计kdeplot的功能,增加了rugplot分布观测条显示与利用scipy库fit拟合参数分布的新颖用途。
sns.kdeplot(housing['YearBuilt'], shade=True, ax=ax1)#核密度估计图
# 建房时间和出售价格的关系
sns.regplot(x='YearBuilt', y='SalePrice', data=housing, ax=ax2)
plt.show()

subplots详解:https://blog.csdn.net/htuhxf/article/details/82986440
在这里插入图片描述
具体的几种图像在上方seaborn连接中。

#缺失值查找
misn = len(housing.loc[(housing['Fence'].isnull()), 'Fence'])
print('Fence缺失值数量为:'+ str(misn))

在这里插入图片描述
loc:通过行标签索引数据

iloc:通过行号索引行数据

ix:通过行标签或行号索引数据(基于loc和iloc的混合)

特征工程

在机器学习的具体实践任务中,选择一组具有代表性的特征用于构建模型是非常重要的问题。特征选择通常选择与类别相关性强、且特征彼此间相关性弱的特征子集,具体特征选择算法通过定义合适的子集评价函数来体现。在现实世界中,数据通常是复杂冗余,富有变化的,有必要从原始数据发现有用的特性。人工选取出来的特征依赖人力和专业知识,不利于推广。于是我们需要通过机器来学习和抽取特征,促进特征工程的工作更加快速、有效。特征选择的目标是寻找最优特征子集

对波士顿房价数据做特征工程

数据预处理要点: 1.使用log(x+1)来转换偏斜的数字特征 -,这将使我们的数据更加正常 2.为分类要素创建虚拟变量 3.将数字缺失值(NaN)替换为各自列的平均值

import pandas as pd
import numpy as np
from scipy.stats import skew
import xgboost as xgb
from sklearn.model_selection  import KFold
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import Ridge, RidgeCV, ElasticNet, LassoCV, Lasso
from math import sqrt
参数设置
TARGET = 'SalePrice'
NFOLDS = 5#K-Fold 交叉验证 (Cross-Validation)中的组数
SEED = 0
NROWS = None
SUBMISSION_FILE = 'E:\\Anaconda\\work\\Paddlepaddle\\learning\\sample_submission.csv'
  
## Load the data ##
train = pd.read_csv("E:\\Anaconda\\work\\Paddlepaddle\\learning\\housingPrices_train.csv")
test = pd.read_csv("E:\\Anaconda\\work\\Paddlepaddle\\learning\\housingPrices_test.csv")

ntrain = train.shape[0]#1460
ntest = test.shape[0]#1459
y_train = np.log(train[TARGET]+1)
train.drop([TARGET],axis = 1, inplace = True)#删除指定范围
all_data = pd.concat((train.loc[:,'MSSubClass':'SaleCondition'],
                       test.loc[:,'MSSubClass':'SaleCondition']))#数据合并与重塑

pd.concat详解:https://blog.csdn.net/mr_hhh/article/details/79488445

#log transform skewed numeric features
numer_feats = all_data.dtypes[all_data.dtypes != "object"].index

保留非"object"元素
在这里插入图片描述

skewed_feats1 = train[numer_feats].apply(lambda x: skew(x.dropna()))#运用偏度以及过滤缺失值
skewed_feats2 = skewed_feats1[skewed_feats1 > 0.75]#利用偏度缩小范围,设为0.75原因是因为skew 太高的情况下,特征值会有较为严重的 shake up,特征的变化对于 模型的影响很大。这里选的是>0.75,选的大的,可以发现偏得很严重。
skewed_feats3 = skewed_feats2.index#保留skewed_feats2的索引

dropna详解:https://blog.csdn.net/weixin_40283816/article/details/84304055

all_data[skewed_feats3] = np.log1p(all_data[skewed_feats3])#平滑化数据,使其符合正态分布
all_data = pd.get_dummies(all_data)#哑变量编码,类似于独热编码

dummies详解:https://www.jianshu.com/p/5f8782bf15b1

#filling NA's with the mean of the column:
all_data =all_data.fillna(all_data.mean())#将空缺的位置填充平均值
#creating matrices for sklearn:
x_train = np.array(all_data[:train.shape[0]])
x_test = np.array(all_data[train.shape[0]:])
kf = KFold(NFOLDS,shuffle=True,random_state=SEED)

关于kfold的一些其他解释及应用:
https://www.jianshu.com/p/284581d9b189

https://blog.csdn.net/GitzLiu/article/details/82670315

https://blog.csdn.net/accumulate_zhang/article/details/78490394

class SklearnWrapper(object):
    def __init__(self,clf,seed=0,params=None):
        params['random_state'] = seed
        self.clf = clf(**params)
        
    def train(self,x_train,y_train):
        self.clf.fit(x_train,y_train)#训练方法,可设置值。表示用数据X来训练某种模型。 函数返回值一般为调用fit方法的对象本身。fit(X,y=None)为无监督学习算法,fit(X,Y)为监督学习算法
        
    def predict(self,x):
        return self.clf.predict(x)
class XgbWrapper(object):
    def __init__(self,seed=0,params=None):
        self.param = params
        self.param['seed'] = seed
        self.nrounds = params.pop('nrounds',250)
        
    def train(self,x_train,y_train):
        dtrain = xgb.DMatrix(x_train,label = y_train)
        self.gbdt = xgb.train(self.param,dtrain,self.nrounds)
        
    def predict(self,x):
        return self.gbdt.predict(xgb.DMatrix(x))
#clf是选择的分类模型,x_train是所有训练集,y_train是所有训练集样本的类别标签,x_test是给定的所有测试集
def get_oof(clf):
    oof_train = np.zeros((ntrain,))#全0array
    oof_test = np.zeros((ntest,))#全0array
    oof_test_skf = np.empty((10,ntest))#一个用随机值填充的矩阵,用来存放10次交叉后的预测结果
    #10次交叉,10次循环
    #kf实际上是一个迭代器,是从样本中分成了10组训练集和测试集的索引号
    for i,(train_index, test_index) in enumerate(kf.split(x_train)):
        #train
        x_tr = x_train[train_index]#当前循环,当前实验的训练数据
        y_tr = y_train[train_index]#当前循环的训练数据标签
        #test
        x_te = x_train[test_index]#当前循环的测试数据
        
        clf.train(x_tr,y_tr)#用模型去拟合数据,也就是训练预测模型
        
        oof_train[test_index] = clf.predict(x_te)#把测试数据的预测标签按照对应索引,放到oof_train对应索引处
        oof_test_skf[i, :] = clf.predict(x_test)#用当前的模型,预测所有测试数据的标签,并放到oof_test_skf的一行中
        
    #10次实验做完,把10次得到的结果求平均
    oof_test[:] = oof_test_skf.mean(axis=0)
    return oof_train.reshape(-1,1),oof_test.reshape(-1,1)
#进行查看
for i,(train_index, test_index) in enumerate(kf.split(x_train)):
    print (i,train_index,test_index)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可发现已经分成了10组

et_params = {
    'n_jobs': 16,
    'n_estimators': 100,
    'max_features': 0.5,
    'max_depth': 12,
    'min_samples_leaf': 2,
}
 
rf_params = {
    'n_jobs': 16,
    'n_estimators': 100,
    'max_features': 0.2,
    'max_depth': 12,
    'min_samples_leaf': 2,
}
 
xgb_params = {
    'seed': 0,
    'colsample_bytree': 0.7,
    'silent': 1,
    'subsample': 0.7,
    'learning_rate': 0.075,
    'objective': 'reg:linear',
    'max_depth': 4,
    'num_parallel_tree': 1,
    'min_child_weight': 1,
    'eval_metric': 'rmse',
    'nrounds': 500
}
 

rd_params={
    'alpha': 10
}
 
ls_params={
    'alpha': 0.005
}

各种模型的参数设置

xg = XgbWrapper(seed = SEED,params=xgb_params)
et = SklearnWrapper(clf = ExtraTreesRegressor,seed = SEED, params = et_params)#极端随机森林
rf = SklearnWrapper(clf = RandomForestRegressor, seed = SEED, params = rf_params)#随机森林
rd = SklearnWrapper(clf = Ridge, seed = SEED, params = rd_params)#岭回归
ls = SklearnWrapper(clf = Lasso, seed = SEED, params = ls_params)#LASSO回归
xg_oof_train, xg_oof_test = get_oof(xg)
et_oof_train, et_oof_test = get_oof(et)
rf_oof_train, rf_oof_test = get_oof(rf)
rd_oof_train, rd_oof_test = get_oof(rd)
ls_oof_train, ls_oof_test = get_oof(ls)
print("XG-CV: {}".format(sqrt(mean_squared_error(y_train, xg_oof_train))))
print("ET-CV: {}".format(sqrt(mean_squared_error(y_train, et_oof_train))))
print("RF-CV: {}".format(sqrt(mean_squared_error(y_train, rf_oof_train))))
print("RD-CV: {}".format(sqrt(mean_squared_error(y_train, rd_oof_train))))
print("LS-CV: {}".format(sqrt(mean_squared_error(y_train, ls_oof_train))))

在这里插入图片描述

x_train = np.concatenate((xg_oof_train, et_oof_train, rf_oof_train, rd_oof_train, ls_oof_train), axis=1)
x_test = np.concatenate((xg_oof_test, et_oof_test, rf_oof_test, rd_oof_test, ls_oof_test), axis=1)
print("{},{}".format(x_train.shape, x_test.shape))

在这里插入图片描述

dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test)
xgb_params = {
    'seed': 0,
    'colsample_bytree': 0.8,
    'silent': 1,
    'subsample': 0.6,
    'learning_rate': 0.01,
    'objective': 'reg:linear',
    'max_depth': 1,
    'num_parallel_tree': 1,
    'min_child_weight': 1,
    'eval_metric': 'rmse',
}
res = xgb.cv(xgb_params, dtrain, num_boost_round=1000, nfold=4, seed=SEED, stratified=False,
             early_stopping_rounds=25, verbose_eval=10, show_stdv=True)

在这里插入图片描述
在这里插入图片描述

best_nrounds = res.shape[0] - 1
cv_mean = res.iloc[-1, 0]
cv_std = res.iloc[-1, 1]
print('Ensemble-CV: {0}+{1}'.format(cv_mean, cv_std))

在这里插入图片描述

gbdt = xgb.train(xgb_params, dtrain, best_nrounds)
!cat /dev/null > sample_submission.csv#创建相应文件
submission = pd.read_csv(SUBMISSION_FILE,engine = 'python',encoding = 'utf-8')
submission.iloc[:,0] = gbdt.predict(dtest)
saleprice = np.exp(submission['SalePrice'])-1
submission['SalePrice'] = saleprice
submission.to_csv('xgstacker_starter.sub.csv', index=None)

写入结果

三、遇见的问题
1、TypeError: ‘KFold’ object is not iterable:

主要是参数NFOLDS的设置,必须一一对应,另外在进行迭代的时候,如下:

for i, (train_index, test_index) in enumerate(kf):
        x_tr = x_train[train_index]
        y_tr = y_train[train_index]
        x_te = x_train[test_index]

如是使用enumerate(kf),则是可能出现问题的,所以在查阅之后,我改成了以下代码:

for i,(train_index, test_index) in enumerate(kf.split(x_train)):
        #train
        x_tr = x_train[train_index]#当前循环,当前实验的训练数据
        y_tr = y_train[train_index]#当前循环的训练数据标签
        #test
        x_te = x_train[test_index]#当前循环的测试数据

问题解决

2. No columns to parse from file

解决方法:在本地用Excel创建一个csv文件,注意要用UTF-8格式保存。另外,文件开头需要写入”SalePrice",在后面会用到。
在这里插入图片描述
问题解决

应用的数据集,等下会一起发布,有问题可以私戳。

2019-01-07 11:03:16 u012080686 阅读数 130
  • Python入门视频精讲

    Python入门视频培训课程以通俗易懂的方式讲解Python核心技术,Python基础,Python入门。适合初学者的教程,让你少走弯路! 课程内容包括:1.Python简介和安装 、2.第一个Python程序、PyCharm的使用 、3.Python基础、4.函数、5.高级特性、6.面向对象、7.模块、8.异常处理和IO操作、9.访问数据库MySQL。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    8447 人正在学习 去看看 汤小洋

  Python在编程语言中数据弱类型语言,变量不需要声明类型,只需要赋值即可,我们就可以了解到该变量为什么类型。在Python中有很多数据类型,天天Python只为大家讲解一些常用常见的数据类型,包括number类型,str字符串类型,list列表类型,tuple元组类型,set集合类型以及dict字典类型。

  在讲解数据类型之前,先为大家讲解一个方法type(),type可以用来检测数据类型,当然是用isinstance也可以进行判断检测。为了更直观的得出类型结果,下文会使用type方法。

  Number类型:

  首先我们想说一些number类型,number其中又包括四个类型:int整型、float浮点数、bool布尔值和complex复数。int整型包含正整数、负整数和0;float浮点数则为小数,0.0也属于浮点数,bool布尔值则只有两个值:Ture和False;complex复数为实数+虚数。我们使用Pythonshell进行number类型的变量赋值和类型检测,如下图所示:  

Python七天入门-天天Python
number中的四种数据类型

  Str字符串:

  字符串是Python中最常见的类型之一,变量赋值的时候将值加上引号,则表示字符串,单引号、双引号和三引号均可。其中三种引号可以嵌套使用,为了不产生歧义,尽量不要在嵌套使用时使用同类引号。其中使用var = str(1)进行声明,则var的类型同样为str类型,下图为字符串的几种表达方式及字符串的声明方式:  

Python七天入门-天天Python
2字符串类型的表达方式和声明方式

  List列表:

  列表类型其实和其他语言中的数组较为类似,Python中也有数组类型,只不过定义的方式不同并且没有list常用。列表顾名思义就是一个队列,将一个或一组数字放到[ ]中,就是list列表类型。大家可以查看下图来了解list列表的声明方式和表达方式:

Python七天入门-天天Python
列表的表达和声明方式

  Tuple元组:

  元组与列表类似,也是一些序列的顺序组合,但是组合之后不可以进行修改,元组中每个数据之间也是和列表一样,使用英文逗号隔开。元组还有另外一个特点,就是空元祖,默认的()则为一个元组,还有就是只有一个数据的时候,一个数据后面则需要有一个小逗号,否则会出错。大家可以参考以下代码示例:

Python七天入门-天天Python
4元组的表达方式和特点

  Set集合:

  set集合类型一组特定数据的无序组合,并且组合内的数据不会重复,这组数据存在{}中,因为集合不会重复,可以用来做去重工作。下面我们通过代码示例对元组进行详细的操作讲解,如下图:

Python七天入门-天天Python
5集合的表达方式和特点

  Dict字典:

  字典类型和其他的几种数据类型有所区别,同样的使用{}进行表示,但是需要两个变量进行组合成一对才叫做字典,一个叫做键,一个叫做值。虽然都是用{},但如果是{}中的内容为空,则数据类型依然为字典类型。字典和集合一样,属于无序类型,打印出来的结果随机排序。下图我们进行字典的创建和了解字典的声明方式:

Python七天入门-天天Python
6字典的表达方式和声明方式

  以上数据类型中,list、tuple、set和dict均属于容器类数据,可以放置多个数据内容。Python的数据类型远不止这几种,还有自定义的类型、对象等多种类型。今天所涉及的只是数据类型概念性的内容,等到大家学习更多内容的时候还可以接触到类型转换和相应的函数操作。学习更多Python相关内容,请关注天天Python系列教程--【Python七天入门

没有更多推荐了,返回首页