Python Data Analysis and Appplication

一. numpy使用

1.numpy中的数组属性使用

import numpy as np
a=np.array([[1,2,3,4],[3,5,5,5]])
print(a.shape)  #查看数组结构   (2, 4)
print(a.dtype)  #数组类型    int32
print(a.size)   #数组元素个数     8
print(a.itemsize)   #数组每个元素大小   4
a.shape = 4,2   #重新设置数组结构

2.用numpy创建不同的数组

#创建数组(开始值,终止值,步长)
a=np.arange(0,1,0.3)    #[0.  0.3 0.6 0.9]
#(开始元素,终止元素,元素个数) 创建一维数组
print(np.linspace(1,10,5))  #[ 1.    3.25  5.5   7.75 10.  ]
#创建等比数列
print(np.logspace(0,2,10))
#创建全为0的4行3列数组
print(np.zeros((4,3)))
#创建类似单位矩阵(主对角线上的元素为1)
print(np.eye(4))
#创建对角数组
print(np.diag([1,2]))   #[[1 0] [0 2]]
#创建元素全为1的数组
print(np.ones((3,4)))

3.用Numpy生成随机数

#生成随机数
print(np.random.random(2)) #生成2个随机数
#生成服从均匀分布的随机数
print(np.random.rand(1,2))  #[[0.4143075  0.71131708]]
#生成服从正态分布的随机数
print(np.random.randn(1,2))  #[[-0.53946837  0.11381361]]
#生成给定上下限范围的随机数  (最小值,最大值,数组结构)
print(np.random.randint(2,10,size=[1,3]))   #[[4 3 8]]

4.使用索引访问数组

#多维数组的索引
a=np.array([[1,2,3],[4,5,6]])
# 访问第0行第一列元素 a[行,列] :切片符号
print(a[0:1,2]) #[3]
#取出第一行的整数组成下标
print(a[1,(1,2)])   #[5 6]
#取 a[0,1]、a[1,2]
print(a[(0,1),(1,2)]) #[2 6]
#布尔值索引访问数组
mask=np.array([0,1],dtype=np.bool)
print(a[mask,2])    #[6]

5.改变数组的形状

#更改数组空间结构
a=np.arange(4).reshape((2,2)) #[[0,1] [2,3]]
#展开为一维数组
print(np.ravel(a)) #[0 1 2 3]
#横向展开为一维数组
print(a.flatten()) #[0 1 2 3]
#纵向展开为一维数组
print(a.flatten('f')) #[0 2 1 3]

#纵向组合
print(np.vstack((np.array([[1,2],[3,4]]),np.array([[5,6],[7,8]]))))
print(np.concatenate((np.array([[1,2],[3,4]]),np.array([[5,6],[7,8]])),axis=0))
"""
[[1 2][3 4][5 6][7 8]]
"""

#横向组合
print(np.hstack((np.array([[1,2],[3,4]]),np.array([[5,6],[7,8]]))))
print(np.concatenate((np.array([[1,2],[3,4]]),np.array([[5,6],[7,8]])),axis=1))
"""
[[1 2 5 6]  [3 4 7 8]]
"""
#纵向切割为2份,每份4个元素(8(元素总数)/2(分为2份)=4)
print(np.hsplit(np.array([[1,2,3,4],[5,6,7,8]]),2))
print(np.split(np.array([[1,2,3,4],[5,6,7,8]]),2,axis=1))

#纵向切割为2份,每份4个元素(8(元素总数)/2(分为2份)=4)
print(np.vsplit(np.array([[1,2,3,4],[5,6,7,8]]),2 ))
print(np.split(np.array([[1,2,3,4],[5,6,7,8]]),2,axis=0))


6.Numpy矩阵创建与矩阵运算

#矩阵分为复数矩阵和实数矩阵
#创建矩阵
print(np.mat("1 2 3;4 5 6;7 8 9"))
print(np.matrix([[1,2,3],[4,5,6]]))

#矩阵组合
a=np.array([[1],[2]])
b=np.array([[3],[4]])
print(np.bmat("a b;b a")) #[[1 3][2 4][3 1][4 2]]

#矩阵运算
a=np.mat("1 2;3 4")
b=np.mat("5 6;7 8")
#矩阵与数相乘
print(a*3)  #[[ 3  6] [ 9 12]]
#矩阵相加
print(a+b)  #[[ 6  8] [10 12]]
#矩阵相减
print(a-b)  #[[-4 -4] [-4 -4]]
#矩阵相乘(条件:a的列数等于b的行数)
print(a*b)  #[[19 22] [43 50]]
#矩阵对应元素相乘
print(np.multiply(a,b))  #[[ 5 12] [21 32]]

a=np.mat("1 2;3 4")
#矩阵的转置(行和列互换)
print(a.T) #[[1 3] [2 4]]

#矩阵共轭转置(先共轭后转置.实数的共轭是其本身.复数a+bi共轭为a-bi)
print(a.H) #[[1 3] [2 4]] (实数矩阵共轭转置)
#复数表示
b=1+2j
print(b.real,b.imag) # 1.0 2.0
b=np.mat("1+1j 1+2j;1-3j 1-4j")
print(b.H) #[[1.-1.j 1.+3.j] [1.-2.j 1.+4.j]] (复数矩阵共轭转置)

#逆矩阵 AB=BA=E(B是A的逆矩阵.E为单位矩阵)
print(a.I)  #求逆矩阵需将A化为单位矩阵

7.ufunc函数

"""
ufunc函数是针对数组进行操作的函数。
该函数有四则运算、比较运算、逻辑运算等。
"""
x=np.array([1,2,3])
y=np.array([4,5,6])
print(x+y) #[5 7 9]
print(x-y) #[-3 -3 -3]
print(x*y) #[ 4 10 18]
print(x/y) #[0.25 0.4  0.5 ]
print(x**y) #[  1  32 729]

print(x<y) #[ True  True  True]
print(x>y) #[False False False]
print(x==y) #[False False False]
print(x>=y) #[False False False]
print(x<=y) #[ True  True  True]
print(x!=y) #[ True  True  True]

print(np.all(x==y)) #(and) False
print(np.any(x==y)) #(or) False

#ufunc函数的广播机制
a=np.array([1,2,3])
print(a.shape) #(3,)一维数组 第一维度有3个元素
b=np.array([[1],[2],[3]])
print(b.shape) #(3,1)二维数组第一维度有3个元素,第二维度有1个元素
#一维数组与二维数组的广播机制
print(a+b)
"""a原本的第一维度变为第二维度,然后其复制第二维度。
   复制b中第二维度的元素
 [1 2 3]    [[1]               [[2 3 4]
        +    [2]       =        [3 4 5]
             [3]]               [4 5 6]]
"""

8.numpy中读/写文件的方法

#numpy 的文件读/写主要有二进制的文件读/写
#将数组已二进制格式保存到file_data.npy文件中
np.save("./file_data",np.array([1,2,3]))
#读取二进制文件
print(np.load("./file_data.npy")) #[1 2 3]

#将多个数组保存到file_data1.npz文件中
np.savez("file_data1.npz",np.array([1]),np.array([2]))
#读取二进制文件
print(np.load("./file_data1.npz")['arr_0']) #读取第0个数组的值

# 文本格式数据,如TXT和CSV格式。
# fmt="%d" 表示保存为整数。
np.savetxt("./file_data.txt",np.array([1.8,2,3]),fmt="%f",delimiter=",")
print(np.loadtxt("./file_data.txt",delimiter=",")) #读入时候也需要指定逗号分隔
print(np.genfromtxt("./file_data.txt",delimiter=",")) #读入时候也需要指定逗号分隔

np.random.seed(42) #设置随机种子(如果不更换随机种子,每一次生成的随机数都一样)
a=np.random.randint(1,20,size=3) #生成随机数组 [ 7 15 11]
a.sort() #[ 7 11 15]

#生成3行3列数组
a=np.random.randint(1,10,size=(3,3))
a.sort(axis=0) #沿着纵轴排序
a.sort(axis=1) #沿着横轴排序

a=np.array([4,2,7]) #[0 1 2]
print(a.argsort()) #返回原值下标排序后的位置 [1 0 2]

9.数组内数据去重与重复数据

#数组内数据去重
y_n=np.array(['yes','no','yes','no'])
print(np.unique(y_n))

#数组内数据重复
print(np.tile(y_n,2)) #原始数据重复一次
#数组根据行或列重复
a=np.array([[1]])
#原始数据重复一次,(axis=0)按行进行元素重复
print(a.repeat(2,axis=0)) # [[1] [1]]
#原始数据重复一次,(axis=0)按列进行元素重复
print(a.repeat(2,axis=1)) # [[1 1]]

10.Numpy中常用的统计函数

a=np.arange(10).reshape(2,5) #[[0 1 2 3 4] [5 6 7 8 9]]
print(np.sum(a)) #45
print(a.sum(axis=0)) #沿着纵轴求和 [ 5  7  9 11 13]
print(a.sum(axis=1)) #沿着横轴求和 [10 35]
print(np.mean(a)) #4.5 计算数组平均值
print(a.mean(axis=0)) #沿着纵轴计算数组平均值 [2.5 3.5 4.5 5.5 6.5]
print(a.mean(axis=1)) #沿着横轴计算数组平均值 [2. 7.]
print(np.std(a)) #标准差 sqrt[[(x1-x)^2+(x2-x)^2+..+(xn-x)^2]/n]
print(np.var(a)) #方差=标准差的平方
print(np.min(a)) #最小值
print(np.max(a)) #最大值
print(np.argmin(a)) #返回数组最小元素的索引
print(np.argmax(a)) #返回数组最大元素的索引
print(np.cumsum(a)) #累加 [ 0  1  3  6 10 15 21 28 36 45]
print(np.cumprod(a)) #累乘 [0 0 0 0 0 0 0 0 0 0]

二.matplotlib绘图

11.用matplotlib绘制曲线图

折线图也是用plot()函数绘制。

#曲线图
# 用matplotlib.pyplot绘图分为创建画布、添加画布内容、显示保存图形
# 本例使用默认画布,只需向画布添加内容和显示图形
plt.title("图例") #添加标题
#对于中文字符需以下两句
plt.rcParams['font.sans-serif']='SimHei' #设置字体为黑体
plt.rcParams['axes.unicode_minus']=False

plt.rcParams['lines.linestyle']=':' #线条样式 - , -- , -. , :
plt.rcParams['lines.linewidth']=1  #线条宽度,取值范围0-10
plt.rcParams['lines.marker']="d" #线条上点的形状[o、D、h、.、S等] 默认None
plt.rcParams['lines.markersize']=2 #线条上点的大小0-10,默认1
plt.plot(np.arange(10),np.arange(10)**2) #必须放在rcparams后才能显示上诉rc样式
plt.xlabel("的") #添加x轴名称
plt.ylabel("y") #添加y轴名称
plt.xlim((0,50)) #确定x轴范围
plt.ylim((0,50)) #确定y轴范围
plt.legend(['y=x']) #添加线条与解析式标识
plt.savefig("./雨.png") #保存图片
plt.show() #显示图形

12.同一个画布绘制不同或相同类型的图

#曲线图子图
import matplotlib.pyplot as plt
# 用matplotlib.pyplot绘图分为创建画布、添加画布内容、显示保存图形
# 本例创建画布,添加子图,再绘制图形
pl=plt.figure(figsize=(8,6),dpi=80) #确定画布大小
pl.add_subplot(3,1,1) #将画布分为3行1列,从上到下第一块放入子图
plt.plot([1,2,3],[1,2,3])
pl.add_subplot(3,2,3) #将画布分为3行2列,从左到右第三块放入子图
plt.plot([1,2,3],[1,4,9])
pl.add_subplot(3,2,4) #将画布分为3行2列,从左到右第四块放入子图
plt.show() #显示图形

13.用matplotlib绘制散点图

#散点图
import numpy as np
import matplotlib.pyplot as plt

#读取当前目录下文件的数据
people=np.load("populations.npz") # 资源:https://download.csdn.net/download/yfcjava/11783312
value=people['data'] #取出值 //shap->(22, 6)
name=people['feature_names'] #取出值 //shape->(6,)
print(value)
print(name)

plt.figure(figsize=(9,7),dpi=85)
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
"""
#x,y,点的大小,颜色,绘制点的类型,点的透明度(0~1)的小数
#plt.scatter(range(1,21,1),value[:-2,1],s=None,c=None,marker=None,alpha=None)
"""
plt.scatter(range(1,21,1),value[range(19,-1,-1),1],s=None,c="green",marker=None,alpha=None)
plt.scatter(range(1,21,1),value[range(19,-1,-1),2],s=None,c="black",marker="v",alpha=None)
plt.scatter(range(1,21,1),value[range(19,-1,-1),3],s=None,c="red",marker="p",alpha=None)
plt.scatter(range(1,21,1),value[range(19,-1,-1),4],s=None,c="brown",marker="D",alpha=None)
plt.scatter(range(1,21,1),value[range(19,-1,-1),5],s=None,c="purple",marker="h",alpha=None)
plt.xlabel("时间")
plt.ylabel("万人")
plt.title("1996-2015年人口普查")
plt.legend(['green=年末总人口(万人)','black=男性人口(万人)','red=女性人口(万人)','brown=城镇人口(万人)','purple=乡村人口(万人)'])
#设置20个刻度间距为1,每个刻度的标签,标签在图中旋转45度
plt.xticks(range(1,21,1),value[range(19,-1,-1),0],rotation=45)
plt.show()

14.用matplotlib绘制箱线图、直方图、饼图

import numpy as np
import matplotlib.pyplot as plt

#读取当前目录下文件的数据
people=np.load("populations.npz")
value=people['data'] #取出值 //shap->(22, 6)
name=people['feature_names'] #取出值 //shape->(6,)
print(type(value[0][1]))
print(name)

area=plt.figure(figsize=(9,6),dpi=85)
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
"""
(x,y,0~1之间float指定直方图的宽度,填充的颜色)
plt.bar(left,height,width=0.8,color="red")
"""
#直方图
area.add_subplot(2,2,1)
plt.bar(range(2),value[0,2:4],width=0.2,color="red")
plt.xlabel("性别")
plt.ylabel("万人")
plt.title("2015年男女人口分布直方图")
#设置20个刻度间距为1,每个刻度的标签,标签在图中旋转45度
plt.xticks(range(2),["男","女"],rotation=45)

#箱线图 :是一种用作显示一组数据分散情况资料的统计图。
area.add_subplot(2,2,2)
#plt.boxplot(接送array,notch=中间箱是否有缺口(默认None),sym=接送String(指定异常点形状,默认None),
# vert=接送boolean(图形是纵向或横向,默认None),positions=接送array(指定每个箱体的位置),
# widths=指定每个箱体的宽度,labels=指定每个箱体对应的标签,meanline=接收boolean是否显示均值线)
plt.boxplot(value[:,1:],notch=True,sym='p',vert=True,positions=[1,2,3,4,6],widths=[0.1,0.2,0.3,0.4,0.5],
            labels=["年末总人口","男","女",'城镇','乡村'],meanline=True)
plt.xlabel("类别")
plt.ylabel("(人口)万人")
print(value[:,2])
print(value[:,0])

#饼图
area.add_subplot(3,2,6)
#plt.pie(x=数据,explode=每块饼图距圆心的距离(默认None),
# autopct=点后面为保留小数2位(默认None),colors=指定每块饼的颜色(默认None),
# labels=指定每块饼的标签(默认None),pctdistance=每一项的比例距离圆心的半径(默认0.6),
# labeldistance=每一项的名称距离圆心的半径(默认1.1),radius=饼图的半径(默认1))
plt.pie(value[0,2:4],explode=[0.03,0.03],autopct="%.2f%%",
        colors=['yellow','green'],labels=["男","女"],pctdistance=0.2,
        labeldistance=1.1,radius=1)
plt.title("2015年男女人口比例")
plt.show()

三.pandas统计分析

pandas 数据读取源: Excel、数据库数据、文本文件

15.认识pandas中的DataFrame和序列

#序列:Series 用于存储一行或者一列的数据,
#     以及与之相关的索引集合(类似于列表,但是有索引)
import pandas as pd

s1=pd.Series([1,2]) #列表构造序列
s2=pd.Series({'1':1,'2':2}) #字典构造序列
s3=pd.Series([1,2,3],index={'a','b','c'}) #构造序列

print(s1.values) #打印值
print(s1.index) #显示索引范围

print(s1[0]) #根据元素下标取值
print(s1.to_dict()) #序列转为字典
print(pd.isnull(s1)) #序列中的元素是否为空

DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。DataFrame的每一列其实是一个序列

import pandas as pd
import webbrowser
from pandas import DataFrame
#DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。

#浏览器打开该网页成功返回True
print(webbrowser.open("https://www.tiobe.com/tiobe-index/"))#选中2行复制后在运行一遍该程序

df=pd.read_clipboard() #打开剪切板将里面的数据给df
print(df.columns) #打印列名
print(df['Ratings']) #打印列名Ratings下的所有数据
print(df.Ratings) #打印列名Ratings下的所有数据

# DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。
df_new = DataFrame(df,columns=['Programming Language','Sep 2019','Sep 2018','Sep 2017'])
df_new['Sep 2017']=range(0,2) #给Sep 2017列赋值
df_new['Sep 2017']=pd.Series([100],index=[0]) #给Sep 2017列赋值
df_new['Sep 2016']=pd.Series([1,2,3]) #给2016列赋值. 
# 用Series可以不用给该列的全部赋值。若用‘[1,2,3]’需给该列的全部赋值,否则会报错。
#注意列的序列号与列属性名的区别
a=DataFrame(np.random.rand(25).reshape(5,5))
b=a.reindex(index=[0,1,5]) #取得DataFrame中的index=0、index=1并增加一个index=5
print(b,'\n')
c=b.dropna(axis=0) #行中有一个空值去掉该行
print(c,'\n')
d=b.fillna(value='a') #用value填充所有空值
print(d,'\n')
e=d.reindex(columns=[0,5]) #取得DataFrame中的columns=0并增加一个columns=5
print(e,'\n')
f=e.fillna({5:'90'}) #为DataFrame的columns=5中的空值赋值为'9'
print(f,'\n')
print(f[0].replace({'a':"ABC"}),'\n') #对序列的内容替换(被替换的内容,新内容)
# DataFrame常用属性
print(f.dtypes,'\n') #显示每个columns序列中数据的类型
print(f.size,'\n') #取得DataFrame中元素个数
print(f.ndim) #取得DataFrame中的维度数
print(f.shape) #查看该DataFrame的形状
print(f.T.shape) #DataFrame转置
#DataFrame的访问
print(f[[0,5]][:1],'\n') #取DataFrame多列的多行数据
print(f.head(2),'\n') #取DataFrame前2行数据
print(f.tail(2),'\n') #取DataFrame后2行数据
print(f.iloc[:1,:1],'\n') #(行索引位置,列索引位置)
print(f.loc[5,0],'\n') #(行索引名称,列索引名称)本例名称是int型
#DataFrame中的删除
print(f.drop(0),'\n') #删除行索引名称为0的行
print(f.drop(0,axis=1),'\n') #删除列索引名称为0的列

16.读写数据库数据

import pandas as pd
from sqlalchemy import create_engine
from pandas import DataFrame

# 数据库数据读取
# pd.read_sql_table() 只能够读取数据库的某一个表格,不能实现查询操作
# pd.read_sql_query() 只能实现查询的操作,不能直接读取数据库中的某个表
# pd.read_sql() 既能实现查询的操作,也能读取数据库中的某个表

# create_engine() 建立一个数据库连接,mydb为一个数据库
#engine=create_engine('mysql+pymysql://root:123456@localhost:3306/mydb')
engine=create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/mydb')
#读取该数据库下有哪些表
print(pd.read_sql_query(sql="select * from user",con=engine))
print("该数据库中的总表数:",len(pd.read_sql("show tables",con=engine)))
#读取某个表的详细信息.columns=['price']为读取某一列的数据.
# len()计算出有几条记录
print("记录总数:",len(pd.read_sql_table(table_name="books",con=engine)))

#数据库数据存储
# 数据库数据存储只有一个to_sql方法
from sqlalchemy.types import NVARCHAR, Float, Integer
# https://www.tiobe.com/tiobe-index/ 打开该网页复制2段内容
df=pd.read_clipboard() ##打开剪切板将里面的数据给df
df=DataFrame(df,columns=['Sep 2019','Programming Language','Change.1'])
print(df)

#   name=给所存数据起一个表名
#   index=是否将索引存入数据库,默认为True
#   if_exists=fail(表名存在,不执行写入操作)、
#             replace(表名存在,则将原数据库表删除,在重建)、
#             append(在原数据表的基础上追加数据)
#   dtype={"属性名(列名)":数据类型} 代表写入的数据类型

#   to_sql可将DataFrame存入数据库中.
df.to_sql(name="cj",con=engine,index=False,
          if_exists='replace',dtype={'Sep 2019':Float})

17.读取和保存execl、csv、html、json文件

先打开该 https://www.tiobe.com/tiobe-index/ 网站,复制编程语言排名数据表,
然后运行以下程序.

import pandas as pd

# DataFrame对象调用to_xxx("保存的文件名")函数,为将DataFrame中的数据保存为xxx格式
# pandas.read_xxx("某路径下的文件")函数,为返回该文件的内容

board=pd.read_clipboard()
print(type(board)) #<class 'pandas.core.frame.DataFrame'>

board.to_json("board.json")
print(type(pd.read_json("board.json")))#<class 'pandas.core.frame.DataFrame'>

board.to_html("board.html",index=False)
print(type(pd.read_html("board.html"))) #<class 'list'>

board.to_excel("board.xlsx",index=False)
#print(pd.read_excel("board.xlsx"))#<class 'pandas.core.frame.DataFrame'>

# index是否将索引写入、sep是代表分隔符
board.to_csv("board.csv",index=False,sep=',',encoding='gbk')
#print(pd.read_csv("board.csv"))#<class 'pandas.core.frame.DataFrame'>
# nrows=2为读取前2行
print(pd.read_csv("board.csv",nrows=2,sep=',',encoding='gbk'))

解析json.json
DataFrame中to_json(force_ascii=False)可得str,然后用loads解析为json格式(就是字典或列表)

#  {"employe":[{"apple":"one"},{"huawei":"two"}]}
import json
import urllib.request
# json.dumps() #转为json字符串
# json.loads() #解析json字符串

# with open('yll.json',encoding='gbk') as f: 
#     a=f.read()读取json文件

json_=json.dumps({'a':[1,2,3]})
response = urllib.request.urlopen("file:///C:/Users/asus/Desktop/json.json")
jsonString = response.read()
json_load=json.loads(jsonString)
print(json_load['employe'][1]['huawei'])
#读取json文件并解析
import json
g=json.load(open("llk.json")) #读取文件,并将文件输出流转为python对象(dict)
json.dump(json.dumps(g),open("new_00.json",'w')) #json字符串(str)转为文件输入流并写入文件
str1=json.dumps(g) #python对象转(dict)为json字符串(str)
print(type(json.loads(str1))) #json字符串(str)转为python对象(dict)
Excel里的数据转为*.npz
Excel中的数据:
				['地区', '家庭和集体户']
				['全国', 417722698]
				['北京', 7355291]
				['天津', 3963604]
				['河北', 20813492]
				['山西', 10654162]
				['内蒙古', 8470472]
				['辽宁', 15334912]
				['吉林', 9162183]
				['黑龙江', 13192935]
				['上海', 8893483]
				['江苏', 25635291]
				['浙江', 20060115]
				['安徽', 19322432]
				['福建', 11971873]
				['江西', 11847841]
				['山东', 30794664]
				['河南', 26404973]
				['湖北', 17253385]
				['湖南', 19029894]
				['广东', 32222752]
				['广西', 13467663]
				['海南', 2451819]
				['重庆', 10272559]
				['四川', 26383458]
				['贵州', 10745630]
				['云南', 12695396]
				['西藏', 689521]
				['陕西', 11084516]
				['甘肃', 7113833]
				['青海', 1586635]
				['宁夏', 1945064]
				['新疆', 6902850]

#encoding=utf-8
import xlrd #对excel文件内容读取
import re
import numpy as np
import xlwt #对excel文件的写入

data = xlrd.open_workbook('001.xlsx') ## 打开Excel文件读取数据
table = data.sheet_by_index(0) #读取工作表
#sheet_names=data.sheet_names() #获取所有sheet名称

#获取表格行数和列数
rownum = table.nrows
colnum = table.ncols
print(str(rownum)," ",str(colnum))#33 2

value=[]
name=table.row_values(0)[0:2]
for i in range(1,rownum):
    chanage_data=table.row_values(i)[0:2]#根据列数调整操作范围

    #split方法中不带参数时,表示分割所有换行符、制表符、空格。
    #join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。
    #value.append(["".join(chanage_data[0].split()),chanage_data[1]]) #方法一

    #value.append([chanage_data[0].replace("\xa0",""),chanage_data[1]])#方法二 将字符中的\xa0替换为空字符

    str=re.compile('\xa0') #方法三 正则表达式
    value.append([str.sub('',chanage_data[0]),chanage_data[1]]) #方法三

np.savez('people.npz',name=name,value=value)
###########################
people=np.load("people.npz")
value=people['value']
name=people['name']

data_value=np.array([]) #各个城市户数的一维数组
data_name=np.array([]) #各个城市的中文名
#因为数值部分是str数据,所以中文名和数值部分要单独取出,
# 不然数据可视化会出现问题(出现的问题是y轴数字没有按从小到大排列,
# 因为是数值类型是str类型)。
for x in range(0,32):
    data_value=np.append(data_value,int(value[x,1]))
    data_name=np.append(data_name,value[x,0])
data_value=data_value.astype("int")

plt.figure(figsize=(9,7),dpi=85)
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

plt.scatter(range(1,33,1),data_value[range(0,32,1)],s=None,c="green",marker=None,alpha=None)
plt.xticks(range(1,33,1),data_name[0:],rotation=45)
plt.yticks(np.arange(0.,5e8,1.25e7))
plt.title("中国2010人口户数普查")
plt.xlabel("地区")
plt.ylabel("个 /数")
plt.show()

18.pandas数据处理

pandas数据处理1: https://blog.csdn.net/weixin_42398658/article/details/82926901
pandas数据处理2: https://blog.csdn.net/weixin_42398658/article/details/82934073
pandas数据处理3: https://blog.csdn.net/weixin_42398658/article/details/82936185
pandas数据处理4: https://blog.csdn.net/weixin_42398658/article/details/82936525
pandas数据处理5: https://blog.csdn.net/weixin_42398658/article/details/82950223

四.Python之Sklearn

19.Sklearn参考教程

参考: https://blog.csdn.net/xiaoyi_eric/article/details/79952325

20.对0到1内的闭区间进行分类

以下现实现对0~1之间的区间进行分类,分为3类:
第一类0:类型如 [0.1,0.5]、[0.3,0.4]
第二类1:类型如 [0,1]、[0.3,0.6]
第三类2:类型如 [0.6,1]、[0.6,0.7]

from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
import numpy as np

x_train=np.array([[0.1,0.3],[0.2,0.4],[0.5,0.6],
                  [0.1,0.7],[0.6,0.9],[0.8,0.7],
                  [0.1,0.3],[0.2,0.4],[0.5,0.6],
                  [0.1,0.7],[0.6,0.9],[0.8,0.7]])#shape(12,2)
y_train=np.array([0,0,1,1,2,2,0,0,1,1,2,2]) #shape(12)

x_test=np.array([[0.3,0.3],[0.5,0.9],[0.4,0.2], #shape(6,2)
                 [0.9,0.8],[0.6,0.0],[0.7,0.7]])
y_test=np.array([0,1,0,2,1,2]) #shape(6)

knn=KNeighborsClassifier()#引入训练方法
knn.fit(x_train,y_train)#进行填充测试数据进行训练
print(knn.predict(x_test))#预测特征值
print(knn.score(x_test,y_test)) #测式学习结果,以小数返回

#引入sklearn中自带的保存模块
from sklearn.externals import joblib
joblib.dump(knn,'knn.pkl')#保存model
s=joblib.load('knn.pkl') #读取model
print(s.score(x_test,y_test))

21.线性回归

通俗理解线性回归:https://blog.csdn.net/alw_123/article/details/82193535

我要完成的任务是预测一个连续值的话,那这个任务就是回归。是离散值的话就是分类。

一个简单的单变量线性回归题目:
******https://www.cnblogs.com/dofstar/p/11448832.html

from sklearn import datasets#引入数据集
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression#引入线性回归模型

train_x=np.array([6,8,10,14,18]).reshape(-1,1)
train_y=np.array([7,9,13,17.5,18]).reshape(-1,1)

plt.scatter(train_x,train_y)
###训练数据###
model=LinearRegression()
model.fit(train_x,train_y)#训练后得到欧式距离加和(计算误差的函数,损失函数)最小的线性回归方程(y=kx+b)
plt.scatter(train_x,model.predict(train_x))
plt.legend(['true_data','line_data'])#实际的数据,回归方程中的数据
print(model.predict(np.array([[12]])))#预测自变量为12时的因变量

# ###属性和功能###
# print(model.coef_) #y=kx+b中的k
# print(model.intercept_) #y=kx+b中的b
# print(model.get_params())#得到模型的参数
# print(model.score(train_x,train_y))#对训练情况进行打分
plt.show()

22.

过拟合: 训练得到的模型,对训练数据的分类准确度很准确,但对训练数据外的数据集分类准确度很差。
泛化能力:

KNeighborsClassifier算法:
https://blog.csdn.net/pengjunlee/article/details/82713047
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值