首页 > 编程语言 > 详细

python笔记

时间:2020-01-10 22:26:42      阅读:82      评论:0      收藏:0      [点我收藏+]

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

这两门课挺不错,入门挺好
本文主要包含了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}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))
    for i in range(num):
        u=ulist[i]
        print("{:^10}\t{:^6}\t{:^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())

python笔记

原文:https://www.cnblogs.com/Qi-Lin/p/12178265.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!