常用的第三方模块
数据分析的常用模块(导师安排)
numpy
numpy就是操作多维数组,对象是ndarray,就相当于python自己内置的列表list,但是ndarray比list更高效。
type(),dtype,astype:
在numpy里面有比python内置更多的数据类型,也更精确,比如int32,uint(无符号整数),dtype和type(),都是返回对象数据类型,用法不一样,type()是括号括起来,dtype是a.dtype,除此之外,还有a.astype(int32)就是把数组a的元素都化成这样。
创建数组
注意:当创建多维数组的时候,切记子数组的数量一定要一样。
np.array()
这样是创建了一个二维数组,注意,里面的俩数组数量必须一样,不然会报错。
还有就是np.array()里面放入的可以是列表和元组,不能是字符串。
还有如果在这下面输入一行ar1.dtype,就会返回一个不知道的字符,是因为俩数组的元素不一样。
这样就可以显示数组内元素的数据类型了,这就是dtype和type的区别,就是type不能直接返回容器内部元素的数据类型。
np.arange()
np.arange()和python内置的range()一样包头不包尾。
np.linspace()
可以传入五个参数,就是会返回起始值和终止值按数量n,平均分n个。
np.linspace(起始值,终止值,数量n,endpoint(默认True,使包尾),retstep(返回结果和间距))
数组ndarray的属性
type()是函数,dtype是方法,这种细节概念弄清楚,方法是有对象调用的,函数可以传入参数直接用。
import numpy as np
ar = np.array([[1,2,3],[4,5,6]])
print(ar)
print(ar.shape)#返回数组是几行几列的,这个就是两行三列的
print(ar.ndim)#返回数组是几维的,也叫做轴数,几维,轴数就是几。从外往里数,几个中括号就是几维的
print(ar.dtype)#返回元素的类型,这里是int32。(这里重点提一下,dtype是方法,type()是函数)
print(ar.itemsize)#返回元素的大小,占几个字节,这里占4个字节
print(ar.size)#返回这个数组有几个元素
numpy的函数
这几个改变数组形状的函数,切记数量要对得上
array.T
数组转置,就是把几行几列换一下:
array.reshape()
np.resize()
resize()函数跟上面俩不一样,操作对象是np,不是数组,因为它需要传入数组和一个元组(表示形状),然后根据传入的形状和数组一行一行。
数组类型转换
numpy索引及切片
索引切片
一维数组的切片跟列表一样,没区别
二维的切片:
import numpy as np
ar1 = np.arange(10)
ar2 = np.resize(ar1,(3,4))
print(ar2)
print("*"*70)
print("得到第几行的一维数组")
print(ar2[2])#得到的是一个一维的数组,第三行
print(ar2[1:3])#得到的是后两行
print("*"*70)
print("得到第几行的第几个数字")
print(ar2[2][1])#得到的是上一句一维数组里的第三个数
print(ar2[2,1])#第三行的第二个
print("*"*70)
print(ar2[:2,:3])#这个就是把行也切了,列也切了。
print(ar2[:2][:3])#一样的效果
#放一个中括号里面中间就加逗号隔开,也可以写成两个中括号,第一个是行,第二个是列
布尔型索引
感觉不常用,知道有这个东西
就是把全是True和Flase的数组作为索引切片,True就是得到的,Flase就不要了。
随机数,几个常用的方法(重点)
import numpy as np
print(np.random.normal())#生成一个标准正太分布数组
print(np.random.rand(5))#随机生成五个0到1的数组,服从均匀分布
print(np.random.randn(5))#随机生成五个0到1的数组,服从正态分布
print(np.random.randint(3,7,9))#随机生成从3到7的9个int的数组
pandas
series
series的数据结果就是带有标签的一维数组。
创建方法:
- 传入一个字典,字典的键key会作为索引,值value作为值
d = {'a':1,'b':2,'c':3,'d':4,'e':5}
s3 = pd.Series(d)
print(s3)
- 传入index=列表或者元组作为索引
import numpy as np
import pandas as pd
s1 = pd.Series(np.random.rand(5))
s2 = pd.Series(np.random.rand(5),index=['a','b','c','d','e'])
print(s1[1:4])
print(s2['a':'d'])
np.random.rand(5),随机生成五个范围从0到1的服从均匀分布的数。
可以看到第一个s1切片包头不包尾,没有打印下标为4的键值对;但是看以index为索引来切片包含了末端。
还有一个布尔值作为索引,就是切片的时候把数组传入。
Series的查操作:
Series的head(),tail()方法,head()默认查前五位,括号可以写参数,tail()从后面开始查。
h = s1.head()
print(h)
t = s1.tail(3)
print(t)
value——counts()方法
用来统计每个值的出现的次数,并返回一个新的series。
reindex()
这个方法就是将你原来的Series,按着索引重新排序,不是根据自己定义的索引自己再重新排序。
Series对象的reindex()里面传入一个列表,里面必须是前面series对象的索引,然后根据传入的列表重新排序得到一个新的series。
如果reindex传入的列表多一个索引,值就会得到一个空的,可以再在后面添加个fill_value=0,对值填充。
s1 = s.reindex([2,3,0,1,4],fill_value=0)
Series对象之间相加
与ndrrary不同的是,series会根据标签自动对齐。
因为Series里面单独对标签处理,所以不同的Series对象会根据标签自动相加值,不同的就会直接返回空,而不是会返回原来的那个数;而ndrrary数组因为索引就是下标,都一样,就按着顺序相加。
Series的删除方法:s1 = s.drop('a')
删除这索引是'a'的值和这个索引。
Series的增添方法:就是跟列表一样。直接append
Series的修改方法:根据下标修改,跟字典根据键修改值一样。
DataFrame
DataFrame就是二维的,Series是个一维的,DataFrame可以看作Series组成的字典。DataFrame就相当于一个表格,有行属性和列属性,创建的时候需要传入值,行标签,列标签。
这个传入的值必须是个二维的数组,有着几行几列。
创建方法:
- 创建dataframe的时候传入的参数data必须是个二维数组,而且每行之间场长度必须相同。
传入字典作为参数,字典的key是唯一标识列的,key作为列名,在colunms列标签参数里传入key,可以更改顺序,而index行标签必须跟字典里的列表值数量一样,默认是下标。
import pandas as pd
d = {'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
df1 = pd.DataFrame(d,index=['A','B','C'],columns=['a','b','c','d'])
print(df1)
- 传入ndrray二维数组作为data必须是几行几列,再写index列表作为行标签,数量跟ndrray几行一样,传入columns作为列标签。
import pandas as pd
n = np.array([[1,2,3],[4,5,6]])
df2 = pd.DataFrame(n,index=['a','b'],columns=['A','B','C'])
print(df2)
- 传入Series组成的字典
因为Series自带的有index,而组成字典,上面说的key作为列标签,所以就不用在自己写了。
因为Series里面可以index跟对象里面的值数量不一样,空的就是NaN,所以使用Series创建的dataFrame,Series里面的值的数量可以不一样。
注意一点就是字典里不同的Series对象的index列表里,要是一样就会合并,不一样就另起一行。
import numpy as np
import pandas as pd
d = {"A":pd.Series(np.random.rand(3),index=['a','b','c']),
"B":pd.Series(np.random.rand(3),index=['a','b','e'])
}
df1 = pd.DataFrame(d)
print(df1)
这里再介绍一下Dataframe的rename方法:
这个例子就是更改列名,要是行名可以换index,也可以都加
dataframe = dataframe.rename(columns={"a":"A",......})
索引查找
-
列索引
列索引默认[]中括号
print(df1['A'])
里面输入列名,不能输入行名,不然会报错,得到的结果是这个列,包含有行标签。
要是想多显示几列,不能直接在后面加列名,必须使用俩中括号
prin(df1[['A','B']]),不然会报错。 -
行索引
有俩方法loc[]和iloc[]
loc[]只能使用行标签作为索引,包尾,使用数字会报错
iloc[]只能使用数字作为索引,不包尾,使用行标签会报错。
import numpy as np
import pandas as pd
d = {"A":pd.Series(np.random.rand(3),index=['a','b','c']),
"B":pd.Series(np.random.rand(3),index=['a','b','e'])
}
df1 = pd.DataFrame(d)
print("这是源表格")
print(df1)
print('\n'*3)
print("这是列索引")
print(df1['A'])
#print(df1['a'])#这样会报错,不能这样进行行索引查找
print(df1[['A','B']])
print('\n'*3)
print("这是行索引,使用loc[]方法")
#不能使用数字作为行索引,会报错,使用行键作为索引包含末端。
print(df1.loc['a'])
print(df1.loc['a':'c'])#包含末端
#print(df1.loc[0:3])报错
print('\n'*3)
print("这是列索引,使用iloc[]方法")
#只能使用数字,不然会报错,而且不包尾。
#print(df1.iloc['a'])
#print(df1.iloc['a':'c'])
print(df1.iloc[1:3])
pandas的时间操作模块
这个暂时先跳过
panads的相关操作
计算时候需要的两个参数
axis(轴,默认是0按着列计算,为1的时候按着行计算),skipna(默认是True,跳过空值统计,False不跳过空值)
import pandas as pd
d = {'A':pd.Series([1,2,3],index=['a','b','c']),
'B':pd.Series([4,5,6],index=['a','b','c']),
'C':pd.Series([7,8,9,0],index=['a','c','b','e'])}
df = pd.DataFrame(d)
print(df)
print("计算列'A'的均值")
print(df['A'].mean())#因为已经告知是列了,就不需要向mean方法传入参数了
print("计算每列的均值,axis默认是0,计算列的均值")
print(df.mean())
print("计算行的均值,skipna为False不过滤掉空的值,结果就是空")
print(df.mean(axis=1,skipna=False))
pandas的计算方法
- count()计算非Nan值的数量
import pandas as pd
d = {'A':pd.Series([1,2,3],index=['a','b','c']),
'B':pd.Series([4,5,6],index=['a','b','c']),
'C':pd.Series([7,8,9,0],index=['a','c','b','e'])}
df = pd.DataFrame(d)
print("原表格是这样的")
print(df)
print("count()计算非空值的数量\n里面还是需要传入axis轴的参数表明是行还是列")
print(df.count(axis=1))#默认为0,列,这里写1,统计行。
- min(),max()找最大值和最小值
print("max()和min()根据传入的axis值来统计行或者列的最大最小值")
print("统计每列的最小值")
print(df.min())
print("统计每行的最大值")
print(df.max(axis=1))
-
quantile()统计分位数,需要传入一个参数确定位置
-
.std(),.var()分别求标准差,方差
print("求方差")
print(df.std(axis=1))
print("求标准差")
print(df.var(axis=1))
- .skew()样本的偏度、.kurt()样本的峰度
print("求偏度")
print(df.skew(axis=1))
print("求峰度")
print(df.kurt(axis=1))
unique()返回只有去掉重复值的数组(ndrray)
import pandas as pd
s = pd.Series(list('agsrgrgs'))
print(s,'\n',"列表里面的字符串元素作为值构成一个Series对象")
u = s.unique()#unique是pd的内置方法,返回一个数组
print(u)>>>['a' 'g' 's' 'r']
print(type(u))>>><class 'numpy.ndarray'>
Value_counts()
这个函数就是对Series重复的值统计个数,最后返回的还是一个新的Series,下标就是那些被统计的元素,值就是个数。
就暂时了解这些,还有许多更详细的看链接:
panads资料链接
numpy和panads数据分析练手链接:
链接
matplotlib
#导入模块
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10,10,20)
y1 = 2*x+1#得到的都是数组对象
y2 = x**2
#定义图像窗口
plt.figure('画布名称',figsize=(9,7))#设置画布的名字和大小,也可以添加facecolor颜色参数
#画图
plt.plot(x,y1,linestyle='--')
plt.plot(x,y2,color='r',linewidth=1)#把上面两个数组按着x,y画出来
#定义坐标轴名称及范围
plt.xlim(-10,10)
plt.ylim(-10,10)
#设置x轴,y轴的名称
plt.xlabel("This is x")
plt.ylabel("This is y")
#显示图像
plt.show()
#plt.xticks(),使用这个方法可以改变刻度名称
pillow
这是个图像操作的库
-
创建图像image对象
打开图像还是用open这个句子,暂时先不用with语句,还有panads打开CSV文件的时候最好还是直接用open语句,with语句适用那些有close的。
-
image对象的属性
print("图像的尺寸")
w,h = im.size
print(im.size)
print(type(im.size))#返回的是一个元组
print(w,h)#得到图片的长度和宽度,单位是像素
print(type(w))
print('\n'+"图像的格式")
print(im.format)#得到的是PNG格式的
print('\n'+"图像是否是只读的"+'\n'+"返回0(不是)或者1(是)")
print(im.readonly)
print('\n'+"查看图像相关信息,许多信息")
print(im.info)#这里返回的是一个字典,太多了,先换个方式显示
#这个字典只有两个键,一个对应的是分辨率,一个对应不知道的一大堆东西
print('\n'+"查看图像的模式")
print(im.mode)#得到的是RGB,三通道,还有的可能是RGBA四通道,多一个透明通道
- 图像格式的转换
save(),保存为其他的格式,需要传入俩参数,一个是需要保存的路径,一个是要保存的格式,png或者jpg。
im.save('路径','格式')
这样可以实现图像的格式转换和另存为。
convert()
由于图片的模式可以不一样,比如四通道的转换成三通道JPG就不能直接用save()来转,所以就需要用到convert()先转一下模式,再save保存。
im2 = im1.convert("RGB")
im2.save()
pillow库还有很多东西,具体的学习点链接。
requests
re.findall(),返回的是列表。
前面语已经学过内置的urllib模块里面的request模块,还有一个requests这个第三方模块,这个模块更厉害,用起来也更方便。
requests可以直接通过get方法来直接获取网页
chardet
编码的
psutil
主要是获取代电脑CPU,内存,网络状态等信息的
Seaborn
Facetgrid方法
把数据集当中很多的子集展示,用这个函数
BeautifulSoup4库
BeauSouped4可以将复杂的HTML文档转换成复杂的树形结构:
- Tag:网页的标签及其内容,但只能获取到匹配的第一个标签;
- NavigableString:标签的内容(即字符串);
- BeautifulSoup:表示文档本身,会直接打印输出HTML源码;
- Comment:表示注释里面的内容
举例,有这样一个HTML源码:
<!DOUCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>标题</title>
</head>
<body>
<div>
<span><!-- 这是注释 --></span>
<a href="https://www.bilibili.com" name="bilibili">这是指向哔哩哔哩的链接</a>
<a href="http://huanc.love/" name="huanc">这是指向自己网站的链接</a>
</div>
</body>
</html>
Python测试
from bs4 import BeautifulSoup
file = open("./test.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
print(type(bs))
# >>><class 'bs4.BeautifulSoup'>,是一个封装bs4.BeautifulSoup的对象
print(bs)
print(type(bs.a))
# >>><class 'bs4.element.Tag'>,是一个标签对象
print(bs.a)
# >>>直接打印a标签的全部内容,但只能获取到一个
print(type(bs.a.string))
# >>><class 'bs4.element.NavigableString'>,NavigableString的对象
print(bs.a.string)
# 直接打印标签a里面的内容
print(type(bs.span))# >>> <class 'bs4.element.Tag'>,这里还是tag对象,不是注释comment对象
print(type(bs.span.string))# >>> <class 'bs4.element.Comment'>,这里才是Comment对象
print(bs.span.string)# 这里才会打印注释内容。
# 所以注意一下,带有string的标签对象,一般都是NavigableString对象,
# 但属于注释的标签对象带string,仍然是Comment对象。
print(bs.div.contents)
# 会返回一个列表,列表里面都是,各个标签元素和换行字符。
标签:index,进阶,Python,Series,数组,np,pd,print
From: https://www.cnblogs.com/huanc/p/17441381.html