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())
  • 相关阅读:
    第4章 排序
    第5章 算术与代数
    第6章 组合数学
    第7章 数论
    第8章 回溯法
    第9章 图遍历
    第11章 动态规划
    第10章 图算法
    第12章 网格
    第13章 几何
  • 原文地址:https://www.cnblogs.com/Qi-Lin/p/12178265.html
Copyright © 2011-2022 走看看