zoukankan      html  css  js  c++  java
  • python慕课笔记

    本文主要是慕课北京理工大学的数据分析和爬虫两门课的简单笔记

    这两门课挺不错,入门挺好
    本文主要包含了numpy、matploitlib、pandas、requests、beautiful soup、re库的简单入门笔记

    数据维度

    • 一维数据:数组,列表,集合
      • 列表数据类型可以不同,数组相同。
      • 可用列表(有序)和集合表示(无序)
    • 二维数据
      • 用列表表示
    • 高维数据:仅用二元关系即可表示复杂关系
      • 用字典表示或数据表示格式(json,xml,yaml)

    numpy

    • numpy的引用import numpy as np

    numpy的n维数组对象——ndarray

    • 组成:由实际的数据和描述这些数据的元数据组成
    • 生成:np.array()
    • 轴:保存一个维度的数据
    • 秩:保存轴的数量
    • ndarray对象的五个属性:
      • ndim 秩即维度
      • shape 尺度,如对与矩阵的n行m列
      • size 元素的个数
      • dtype 元素的类型
      • itemsize 每个元素的大小,单位字节
    • 数据类型:支持整型,无符号,浮点,复数等各种精度类型
    • ndarray应该由同质的对象组成

    ndarray数组创建方法

    • 用列表或元组创建 np.array(列表或元组,dtype=自己指定的数据类型,如果不指定,自动匹配)
    • 利用函数创建
      • np.arange(n)数组元素从0到1
      • np.ones(shape)数组全为1,shape是一个元组类型如(2,3)指生成两行三列
      • np.zeros(shape)数组全0
      • np.full(shape,val)数组值为val指定
      • np.eye(n)生成n*n的单位矩阵,对交线为1,其余为0
      • np.ones_like(a) np.zeros.like(a) np.full_like(a,val)根据数组a的形状生成一个数组,数组值为0,1,val
      • np.concatenate()将多个数组合成一个数组
      • 对数组的变化
        • .reshape(shape)不改变数组元素,返回一个shape形状的数组,不会修改原数组
        • .resize(shape)会修改原数组
        • .swapaxes(ax1,ax2)将n维的两个维度调换
        • .flatten()将多维数组变为一维
        • .astype(new_type)改变数组的类型为new_type,是创建了一个新数组
        • .tolist转换为列表
    • 从字节流创建
    • 从文件中读取特定格式

    ndarray的索引和切片

    • 索引:利用编号读取,如a{2}读取一维数组a的第3个元素;a[1,2,3]
    • 切片:a[起始:终止:步长];多维数组可用a[::,1::2,3:5:1]

    ndarray的运算

    其实是对数组的每一个值进行运算,相关函数
    np.rint(x)对数组各元素四舍五入
    np.modf(x)将数组各元素的小数和整数部分以两个独立的数组形式返回
    数组之间也可用加减乘除等,数数组元素与对应另一个数组元素之间的运算。还可使用比较符,产生一个相同形式的布尔类型的数组

    数据csv文件的存取

    csv只能读取存取一维二维数组
    将数据保存为csv文件:np.savetxt(frame,array,fmt='%.18e',delimiter=None)
    trame:文件,字符串或产生器
    array:存入文件的数组
    fmt:写入文件的格式
    delimiter:分隔字符串,默认为任何空格
    读入csv文件:np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=Falase)
    dtype:数据类型
    unpack:默认读入一个数组,如果为true,读入属性分别写入不同变量

    多维数组存取

    1、存入文件:数组.tofile(frame,sep='',format)
    保存的为一个没有维度的文件
    sep指定分割符如果不指定分割符,将保存为二进制文件
    format表示写入数据的格式
    2、读取文件:数组.fromfile(frame,dtype,count=-1,sep='')
    count默认为-1即读入整个文件,也可以指定读入文件的个数
    3、numpy自定义的文件存取:
    np.save(fname,array)或np.savez(fname,array)
    np.load(fname)

    numpy中的随机函数np.random.

    rand(1,2,3)生成元素是0到1之间的浮点数的3,4,5维度的数组
    randn()与上相似,元素为符合正态分布的数
    randint(1,4,shape)生成元素为1到4之间的整数,且形式为shape的数组
    seed(s)s为给定种子值
    shuffle(a)将数组a的最外维度的第一个轴进行随机排列,会改变原本数组
    permutation(a)与上相同,不改变原数组
    choice(a,size,replace,p)从a数组中选取元素,形成size形状的数组,replace表示为是否可以重复选取,默认为ture,p为每个元素选取的概率,默认为等概率
    uniform(low,high,size)产生具有均匀分布的数组,low起始值,high结束值,size形状
    normal(loc,scale,size)产生正态分布的数组,Loc均值,scale标准差,size形状
    poisson(lam,size)产生具有泊松分布的数组,lam随机事件发生率

    numpy中的统计函数

    sum(a,axis=None)根据给定轴计算数组a相关元素之和
    mean(a,axis=NOne)求期望
    average(a,axis=None,weights=None)加权平均
    std(a,axis=None)标准差
    var(a,axis=None)方差
    min(a)最小值
    max(a)最大值
    argmin(a) argmax(a)数组a降1维后的下标
    unravel_index(index,shape)一维下标转化为shape形状的多维下标
    ptp(a)最大最小值差
    median(a)中位数

    梯度函数

    np.gradient(f)计算数组f中元素的梯度

    from PIL import Image
    import numpy as np
    
    '''图像手绘化
    灰度变化模拟人眼视觉明暗效果,梯度是灰度变化率
    通过改变梯度值,间接改变图像的明暗
    通过虚拟深度值增加3D效果
    '''
    im=np.array(Image.open('C:/Users/Desktop/1.jpg').convert('L')).astype('float')
    depth=20. #虚拟深度值范围为0到100
    grad=np.gradient(im) #提取梯度值
    grad_x,grad_y=grad
    #根据深度添加对梯度值的影响因素,除以100为归一化
    grad_x=grad_x*depth/100
    grad_y=grad_y*depth/100
    #虚拟光源效果
    el=np.pi/2.2#俯视角
    az=np.pi/4.#方位角
    dx=np.cos(el)*np.cos(az)#光源对x方向影响
    dy=np.cos(el)*np.sin(az)#y
    dz=np.sin(el)#z
    #梯度归一化
    A=np.sqrt(grad_x**2+grad_y**2+1.)#构造x和y轴梯度的三维归一化单位坐标系
    uni_x=grad_x/A#各个面的单位法向量
    uni_y=grad_y/A
    uni_z=1./A
    b=255*(dx*uni_x+dy*uni_y+dz*uni_z)#梯度和光源相互作用,将梯度转化为灰度
    b=b.clip(0,255)#避免越界
    im=Image.fromarray(b.astype('uint8'))
    im.save('C:/Users/Desktop/2.jpg')
    

    matplotlib

    matplotlib.pylot是绘制各类可视化图形的子库
    引入import matplotlib.pylot as plt

    import matplotlib.pyplot as plt
    
    plt.subplot(2,3,4)
    plt.plot([1,4,7,2,8],[0,3,2,6,5])
    plt.xlabel("number")
    plt.ylabel('grade')
    plt.axis([0,10,0,9])
    plt.show()
    plt.savefig('C:/Users/Guoyang/Desktop/t',dpi=600)
    

    subplot将区域分为2行3列,在第四个区域显示
    plot(x,y,format_string,kwargs)
    format_string包含线条颜色,线条形式,值点的样式的控制,如'bo-'值画的线为蓝色实线,值点为o的形状,
    kwargs指一个图可以包含其它多条线。还可通过一些参数值进行控制
    plot一个参数时作为y轴,x轴为对应序号。两个参数时为xy轴,xlable可为x轴设置轴名称
    axis设置轴的x,y起始和终止坐标
    savefig保存文件dpi设置保存图像的质量

    显示中文字体的方法

    • 通过引入import matplotlib matplotlib.rcParams['front.flamy']='中文的字体'这样会改变全局字体
    • 在有中文的地方增加frontproperties如plt.ylabel('成绩',frontproperties='字体')

    文本函数

    xlabel
    ylabel
    title对整体加文本
    text(2,1,'文本')在任意位置加文本,在x轴为2,y轴为1的地方显示文本
    annotate(s,xy=,xytext=,arrowprops=dict)增加带箭头的注解,s为注解,xy为箭头位置,xytext为注解位置,arrowprops为表示箭头风格,需传入dict字典类型

    子绘图区域

    subplot
    subplot2grid((3,3)(1,0),colspan=2,rowspan=2)绘制复杂区域,编号都从0开始,示例为将区域分成3行3列,选中第2行1列向列方向延伸成占两行,向行方向延伸成占两行
    通过

    import matplotlib.gridspec as gridspec#引入该类
    gs=gridspec.GridSpec(3,3)#将区域分成3行三列
    ax1=plt.subplot(gs[1,:1])#取第2行,列至第2列
    ax2=plt.subplot(gs[1:,2])#取第2行至所有,第三列
    

    图表类型

    共有16种

    饼图

    plt.pie()

    lables='dog','cat','pig','bird'#每一块的名字
    sizes=[15,30,45,10]#每一块占的大小
    explode=(0,0.1,0,0)#是否突出,突出多少
    plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=90)
    #autopct数字显示形式,shadow带不带阴影,startangle饼图起始显示角度
    plt.axis('equal')#将饼图变为正圆形
    

    直方图

    plt.hist()

    plt.hist(a,10,normed=1,histtype='stepfilled',facecolor='b',alpha='0.75')
    #a为一个数组,10为bin参数即将a中最小值和最大值之间划分10个区域,normed为1则纵坐标为每个区域比例为小数,为0则纵坐标显示每个区域值的个数,histtype为条形形状,facecolor为颜色,alpha为透明度
    

    极坐标

    ax=plt.subplot(111,projection='polar')
    #可以使用如下绘制
    bars=ax.bar(left,height,width)#left即从哪开始,height即极径有多高,width即有多宽
    #也可以使用如下
    ax.plot(theta,r)#theta角度,r极径
    

    散点图

    fig,ax=plt.subplots()
    ax.plot(x,y,'o')#x,y点的横纵坐标,'o'点的形状
    

    pandas

    提供两种数据类型Series(一维),DataFrame(二维多维)
    import pandas as pd

    Series

    由数据和相关的索引组成

    创建Series

    index指定标签的值,如果没有,会自动生成

    • 从标量创建 pd.Series(25,index=['a','b','c'])
    • 从字典创建 pd.Series({'a':1,'b':2})键名为索引,键值为值,如果指定index,会代替键名做索引
    • 从ndarray创建 pd.Series(np.arrange(5))
    • 从列表创建
    • 从range函数等创建

    基本操作

    b=pd.Series(25,index=['a','b','c'])

    • b.index得到索引
    • b.value得到值
    • b[0],即使指定了索引,默认也会生成0123这样的索引,所以和b['a']相同
    • 也可以用默认索引进行切片
    • 判断是否存在:'c'in b即判断b中索引是否存在c。使用get函数,b.get('c',100)判断索引是否存在c,如果不存在则返回100
    • 自动对齐问题:运算时按相同索引自动对齐

    DataFrame

    二维带标签的数组
    共用相同索引的一组列,常用2维:0轴(index),1轴(column)

    创建DataFrame

    • 二维ndarray创建
    • 一维ndarray字典创建 字典{a:Series()},键名为column,键值中的ndex为DataFrame的index,键值中的值为值。字典{a:列表}也可以。

    数据类型操作

    • .reindex()改变重排索引
      • index或column指定新的索引顺序
      • fill_value重新索引中用于填充缺失位置的值
      • method填充方法ffill向前填充,bfill向后填充
      • copy生成新对象
      • limit最大填充量
    • .index 0轴索引
    • .column 1轴索引
    • 对于所有的索引的操作,索引都为Index对象
      • 如.column.insert(6,'a')
      • .append(idx),连接另一个Index对象,产生一个新的Index
      • .diff(idx) .intersection(idx) .union(idx)计算差交并
      • .delete(loc)删除loc处的元素
      • .insert(loc,e)在loc处加一个元素e
    • .drop()删除指定行和列索引,默认为0轴,使用参数axis=1操作1轴

    数据类型运算

    • 标签相同的运算,标签不同的补齐后运算,缺项填充NaN
    • 运算使用可以加减符号运算,也可以使用函数如:add(),mul()等,好处是可以使用参数如:full_value等指定缺项填充的数字然后参加运算
    • 不同维度间采用广播运算,默认在1轴,如果指定0轴,采用如上等的函数,参数为axis=0
    • 比较运算,运算结果为bool,在同维度需要大小相同,不进行补齐,不同维度广播运算

    排序

    NaN统一放到末尾
    .sort_index(axis=0,ascending=True)根据索引进行排序,默认升序
    .sort_value(axis=0,ascending=True)在DataFrame中还增加一个参数by,可以通过索引指定哪一行那一列排序

    基本统计分析

    基本的求平均和等如numpy中sum mean等
    Series特有的:argmin argmax 最大最小值自动索引的位置idxmin idxmax最大最小值自定义索引的位置
    describe()对0轴进行所有各种统计,返回Series或DataFrame对象
    .cumsum() .cumprod() .summax() .cummin()计算前1、2、n个数的和积等
    .rolling(w).sum() .rolling(w).mean()等计算相邻w个元素的和,平均等

    相关分析

    .cov()计算协方差
    .corr()计算相关系数,如pearson等 b.corr(a)计算b与a的

    requests

    request()

    requests.request(method,url,**kwargs)构造请求,是以下方法的基础方法

    • method包含get,post,put,head,options,delete,patch
    • **kwargs有13个控制参数
      • params为能添加到Url中的参数,如:
      key={'id':3}
      r=requests.request('get','http://www.baidu.com',params=key)
      #r.url=http://www.baidu.com?id=3
      
      • data提交的数据,可以为字典,字节序列或文件
      • json提交json格式的数据
      • headers定制http头,字典,如:
      key={'user-agent':'chrome'}
      r=requests.request('get','http://www.baidu.com',headers=key)
      
      • cookies提供cookies,字典或cookiejar
      • auth提供认证,元组
      • files传输文件,字典,如:
      fs={'file':open(文件)}
      r=requests.request('POST','http://www.baidu.com',files=fs)
      
      • timeout设置超时时间
      • proxies设置代理
      • allow_redirects默认True,重定向开关
      • stream默认True,获取内容立即下载开关
      • verify默认True,认证ssl证书开关
      • cert本地ssl证书路径

    get()

    r=requests.get(url,params=None,**kwargs)url为链接,params为url的额外参数,kwargs为其它额外控制参数。r.status_code返回请求状态,r.text返回对应页面内容,r.encoding从header中猜测的内容编码,r.apparent_encoding从内容分析的编码方式,r.content内容的二进制形式,r.raise_for_status()判断是否为200,如果不是,引发异常

    其它方法

    requests.head().post() .put() .patch() .delete()等,与http的方法一一对应

    beautifulsoup

    基本使用:

    from bs4 import BeautifulSoup
    soup=BeautifulSoup(内容,解释器)
    解释器有html.parser,lxml(需要安装lxml库),xml(需要安装lxml库),html5lib(需要安装html5lib库)
    prettify()使相关内容更好显示,便于阅读
    

    基本元素

    <p class="abc">123</p>

    • soup.p返回p标签,如果有多个返回第一个
    • soup.p.name返回标签的名字,即为p
    • soup.p.attrs返回p的属性,字典形式,即为{class:abc}
    • soup.p.string返回p标签包含的内容,即为123

    结点遍历

    • .contents将所有子节点存入列表
    • .children迭代类型,用于循环遍历儿子节点
    • .descendants子孙节点的迭代类型
      for child in soup.body.children:
        print(child)
      

    内容查找

    find_all(name,attrs,recursive,string,**kwargs)

    • 返回一个列表,存储查找结果
    • name按标签名称查找soup.find_all('p'
    • attrs按属性查找soup.find_all('p','link') soup.find_all(id='my')
    • recursive是否查找子孙,默认为True
    • string查找尖括号包围的内容

    其他方法

    • find()只返回一个结果
    • find_parents()只在父辈节点搜索
    • find_parent()只返回一个
    • find_next_siblings()只在兄弟节点中后序搜索
    • find_next_sibling()只返回一个结果
    • find_previous_siblings()只在兄弟节点中前序搜索
    • find_previous_sibling()只返回一个结果
    #CrawUnivRankingA.py
    import requests
    from bs4 import BeautifulSoup
    import bs4
     
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return ""
     
    def fillUnivList(ulist, html):
        soup = BeautifulSoup(html, "html.parser")
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):
                tds = tr('td')
                ulist.append([tds[0].string, tds[1].string, tds[3].string])
     
    def printUnivList(ulist, num):
        print("{:^10}	{:^6}	{:^10}".format("排名","学校名称","总分"))
        for i in range(num):
            u=ulist[i]
            print("{:^10}	{:^6}	{:^10}".format(u[0],u[1],u[2]))
         
    def main():
        uinfo = []
        url = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
        html = getHTMLText(url)
        fillUnivList(uinfo, html)
        printUnivList(uinfo, 20) # 20 univs
    main()
    

    正则表达式

    正则表达式常用操作符

    • .任何单个字符
    • |左右表达式任何一个,如a|b 为1或b
    • *前面一个字符的0次或多次
    • +前面一个字符的1次或多次
    • ?前面一个字符的0次或1次
    • []单个字符的取值范围,如[abc]为a或b或c
    • []上面的否定,如[abc]为不为a或b或c
    • {m}前面一个字符扩展m次
    • {m,n}前面一个字符扩展m到n次,含m,n
    • 匹配字符串开头,如ab表示ab且为开头
    • $匹配字符串结尾
    • d数字
    • w字符
    • ()分组标记
    • [u4e00-u9fa5]匹配中文字符

    re库的基本使用

    使用方法

    • 函数式使用rst=re.search(正则式,字符串)
    • 面向对象
      pat=re.compile(正则式)
      rst=pat.serch(字符串)
      
    • compile(pattern,flags)pattern正则表达式的字符串或原生字符串表示flags控制标记
    • 控制标记有
      • re.I忽略大小写
      • re.M使^操作符可以对给定字符串的每行当做匹配开始
      • re.S使.操作符可以匹配所有字符,默认.不匹配换行符
    • re默认采用贪婪匹配,如果要使用最小匹配,可在*,+,?,{m,n}后加?

    常用函数

    • re.search(pattern,string,flags=0)搜索匹配正则表达式的第一个位置,返回match对象
    • re.match(pattern,string,flags=0)从字符串开始位置匹配,返回match对象
    • re.findall(pattern,string,flags=0)以列表返回所有 匹配
    • re.split(pattern,string,maxsplit,flags=0)将字符串按正则表达式匹配的字符串分割,返回列表形式。maxsplit可以指定最大分割数,剩余部分不分割
    • re.finditer(pattern,string,flags=0)返回迭代类型,match对象
    • re.sub(pattern,repl,string,count,flags=0)将匹配的串替换为repl指定的串,count为最大匹配次数

    match对象

    • 对象属性
      • .string返回待匹配文本
      • .re匹配使用的pattern
      • .pos搜索文本的开始位置
      • .endpos搜索文本的结束位置
    • 对象方法
      • .group(0)匹配的第一个字符串
      • .start()匹配字符串在原始字符串的开始位置
      • .end()匹配字符串在原始字符串的结束位置
      • .span()返回(.start(),.end())
  • 相关阅读:
    linux软件安装方式
    docker 安装 jenkins touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
    [ERR] Node goodsleep.vip:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    Linux 常用命令 服务器间scp 用户 export 创建文件、软连接
    redis 安装 集群 主从 哨兵 docker
    WPF密码框中禁止复制、粘贴
    Application 统计在线人数
    【转义字符】HTML 字符实体&lt; &gt: &amp;等
    SQL语句统计每天的数据
    正则表达式计算代码数
  • 原文地址:https://www.cnblogs.com/Qi-Lin/p/12178265.html
Copyright © 2011-2022 走看看