常用第三方库
Pandas
Pandas是基于NumPy库的一种解决数据分析任务的工具库
Pandas库纳入了大量模块和一些标准的数据模型,提供了高效的操作大型数据集所需的工具
Pandas库的主要功能有:
创建Series(系列)和DataFrame(数据帧)、索引选取和过滤、算术运算、数据汇总和描述性统计、数据排序和排名、处理缺失值和层次化索引等
系列 Series
系列与NumPy库中的一维数组(array)类似,能保存字符串、Bool值、数字等不同的数据类型
创建格式:pands.Series(data,index,dtype,copy)
data:数据,采取各种形式,如ndarray、list、constants等
index:索引值,必须是唯一的和散裂的
dtype:数据类型
copy:复制数据,默认为False
import pandas as pd
import numpy as np
data=np.array(['需求分析','概要设计','详细设计','编制代码','运行维护'])
s=pd.Series(data)
print(s)
#
0 需求分析
1 概要设计
2 详细设计
3 编制代码
4 运行维护
dtype: object
从字典创建一个系列
import pandas as pd
d={
'A':"优秀",'B':"良好",'C':"合格",'D':"不合格"}
s=pd.Series(d)
print(s)
print("s[0]:",s[0])
print("s['A']:",s['A'])
print("s[0]'s key:",s.index[0])
#
A 优秀
B 良好
C 合格
D 不合格
dtype: object
s[0]: 优秀
s['A']: 优秀
s[0]'s key: A
与字典的不同之处,索引方面,pd既可以用index索引,又可以用key索引。而字典只能用key索引。
但是效率方面还是字典更高一筹
"D" in d # 49.7 ns
"D" in s # 799 ns
"不合格" in d.values() # 237 ns
"不合格" in s.values # 6.54 µs
那么Series的意义:
pandas 学习(1): pandas 数据结构之Series
里面介绍到pandas同时拥有字典和数组的结构,算是融合了两者的使用,又增加了字典没有的index索引,和对齐输出。
那么就只看看对齐输出这项!
%%timeit
d={
'A':"优秀",'B':"良好",'C':"合格",'D':"不合格"}
s=pd.Series(d)
print(s)
883 µs / noprint 214 µs
那么字典实现对齐输出呢
字典一般是这种模式:可以考虑字符替换,但无法保证对齐,也可以考虑,循环输出
{‘A’: ‘优秀’, ‘B’: ‘良好’, ‘C’: ‘合格’, ‘D’: ‘不合格’}
A 优秀
B 良好
C 合格
DDDDDDDDDDDDDDDDDDDD 不合格
dtype: object
%%timeit
l=0
for i in d:
if len(i)>l:l=len(i)
for i in d:
print(i+" "*(l-len(i)),1)
补空格法,886 µs
%%timeit
l=0
for i in d:
if len(i)>l:l=len(i)
for i in d:
exec("print('%%-%ds 1'%%i)"%l)
exec + %-10s法,514 µs,因为不知道如何实现变量,突然想,如果exec在for外面的话
518 µs ,好奇并没有变化,推测exec和自定义函数变量一样,只生效第一次,不在变化,看似他在for里面,可能只执行了一次,而不是每次都执行!?
但是如果key中有中文的话,这个方法就不行了,但其实pd也并不能完美显示的样子
A 优秀
B 良好
1111 合格
ddddD瓦房 不合格
这里不再讨论对齐这个事情,接着啃书,计算unicode的个数快呢,还是使用decode快呢!?
数据帧(DataFrame)
数据帧是二维的表格型数据结构,即数据以行和列的表格方式排列。与系列相比,数据帧使用得更普遍。
pandas.DataFrame(data,index,columns,dtype,copy)
data: 数据,可以是各种类型,如ndarray、series、lists、dict、constant、DataFrame等
index,columns: 分别为行标签和列标签
dtype: 每列的数据类型
copy: 复制数据,默认值为False
从列表创建DataFrame
import pandas as pd
data=[['Tom',3],['Jerry',1]]
df=pd.DataFrame(data,columns=['Name','Age'])
print(df)
#
Name Age
0 Tom 3
1 Jerry 1
访问:
(1)df[r,c]: row: 行 column: 列 ???运行失败
(2)df.loc(r,c): 基于标签访问数据,函数中的r和c分别为行标签和列标签
(3)df.iloc(r,c): 基于整数访问数据,函数中的r和c分别为行标签索引和列标签索引
import numpy as np
import pandas as pd
df=pd.DataFrame(np.arange(9).reshape((3,3)),index=['A','B','C'],columns=['one','two','three'])
df
#
one two three
A 0 1 2
B 3 4 5
C 6 7 8
df[1:2]
# columns是一直显示的,index只决定哪一行会显示
one two three
B 3 4 5
df[['three','one']]
#
three one
A 2 0
B 5 3
C 8 6
df[['three','one']][1:2]
# 如果再分的细一点呢,但我觉得应该有更好的方法,530 µs df[1:2][['three','one']],556 µs
three one
B 5 3
df[df['three']>5]
one two three
C 6 7 8
df.loc['A','two']
#
1
df.loc['A']
one 0
two 1
three 2
Name: A, dtype: int32
df.loc['A':'B','one':'two']
one two
A 0 1
B 3 4
df.loc[['A','B'],['one','three']]
one three
A 0 2
B 3 5
df.loc['B',['three','one']]
three 5
one 3
Name: B, dtype: int32
468 µs
df.iloc[1,1]
#
4
df.iloc[1]
#
one 3
two 4
three 5
Name: B, dtype: int32
df.iloc[1:2]
one two three
B 3 4 5
df.iloc[[1,2]]
one two three
B 3 4 5
C 6 7 8
df.iloc[1,2]
5
pandas 获取不符合条件/不包含某个字符串的dataframe
SciPy库
SciPy库是一款方便、易于使用、专为科学和工程设计的工具库,包括统计、优化、整合、线性代数、傅里叶变换、信号和图像处理、常微分方程求解等
scipy库中的模块很多,不同模块的功能相对独立,如scipy.constants(数学常量),scipy.fftpack(快速傅里叶变换)、scipy.integrate(积分)、scipy.optimize(优化算法)、scipy.stats(统计函数)、scipy.special(特殊数学函数)、scipy.signal(信号处理)、scipy.ndimage(N维图像、图像处理)模块等
维度:dimension
constants模块
from scipy import constants as con
con.hour
3600.0
con.c
299792458.0
con.inch
0.0254
con.degree
0.017453292519943295
con.golden
1.618033988749895
除了这些常数之外,还提供了诸多转换、计算方法。
special模块
from scipy import special as sp
sp.cbrt(27)
1.28 µs
pow(27,1/3) #精度不足
223 ns
sp.sindg(30) # 角度正弦
0.49999999999999994 # 又精度不足?
sp.comb(