第5章 机器学习库
机器学习算法的通用步骤:
数据采集,数据预处理,数据清洗,建模,测试
1.Numpy库
用于高性能科学计算和数据分析,是常用的高级数据分析库的基础包
A.numpy的安装
-
输入命令:pip3 install numpy
-
在终端中输入:***which python3***可以获取到系统python的位置
-
在PyCharm中设置***Preferences->Project->Project Interpreter->设置->Add***,添加python地址
-
在PyCharm中设置***Run->Edit Configurations***,解释器选择刚刚添加的解释器
B.numpy的使用
- numpy.array(?)传入一个列表,返回一个被numpy封装过的列表,计算的效率远远高于python自带的列表
- numpy.array(?).dtype返回列表中的数据类型
- numpy.array(?) + numpy.array(?)可以实现列表的累加
import numpy as np
arr1 = np.array([2, 3, 4])
print(arr1)
print(arr1.dtype)
arr2 = np.array([1.2, 2.3, 3.4])
print(arr2.dtype)
print(arr1 + arr2)
"""
输出结果
[2 3 4]
int64
float64
[3.2 5.3 7.4]
"""
C.numpy数组和标量的计算
- numpy数组可以直接和标量进行计算
- numpy.zeros((3,4))定义一个3行4列全部为0的矩阵
- numpy.ones((4,5))定义一个4行5列的全部为1的矩阵
- numpy.empty((2,3,2))定义一个3维矩阵,矩阵全部设置为空值对程序计算是不安全的,会随机填入空值
import numpy as np
arr2 = np.array([1.2, 2.3, 3.4])
print(arr2 * 10)
print(np.zeros((3, 4)))
print(np.ones((4, 5)))
print(np.empty((2, 3, 2)))
"""
输出结果
[12. 23. 34.]
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[[0. 0.]
[0. 0.]
[0. 0.]]
[[0. 0.]
[0. 0.]
[0. 0.]]]
"""
D.numpy数组的索引和切片
- numpy.arange(start,stop,step),和python的range()功能相似,产生一个数组,下标索引从0开始计算
import numpy as np
arr = np.arange(10, 30, 2)
arr[5:8] = 11
print(arr)
arr_slice = arr[5:8].copy()
print(arr_slice)
arr_slice[:] = 13
print(arr_slice)
print(arr)
"""
输出结果
[10 12 14 16 18 11 11 11 26 28]
[11 11 11]
[13 13 13]
[10 12 14 16 18 11 11 11 26 28]
"""
2.Pandas库
用于进行数据的预处理和数据的清洗
A.pandas的安装
在终端中输入:pip3 install pandas
B.Series
- Series就是对numpy的array进行了封装,自动添加了索引
- 单独取出索引可以用Series.index
- 单独取出值可以用Series.value
from pandas import Series
obj = Series([4, 5, 6, -7])
print(obj)
print(obj.index)
print(obj.values)
"""
输出结果
0 4
1 5
2 6
3 -7
dtype: int64
RangeIndex(start=0, stop=4, step=1)
[ 4 5 6 -7]
"""
- 可以自定义索引值,而且pandas
- 可以通过索引进行赋值
from pandas import Series
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'c', 'd'])
print(obj2)
obj2['d'] = 6
print(obj2)
print('a' in obj2)
"""
输出结果
d 4
b 7
c -5
d 3
dtype: int64
d 6
b 7
c -5
d 6
dtype: int64
False
"""
- 索引可以进行相应的修改
from pandas import Series
sdata = {'beijing': 35000, 'shanghai': 71000, 'guangzhou': 16000,'shenzhen': 5000}
obj3 = Series(sdata)
print(obj3)
obj3.index = ['bj', 'sh', 'gz', 'sz']
print(obj3)
"""
输出结果
beijing 35000
shanghai 71000
guangzhou 16000
shenzhen 5000
dtype: int64
bj 35000
sh 71000
gz 16000
sz 5000
dtype: int64
"""
- Series.reindex(index,fill_value,method="ffill,bfill")index表示索引,fill_value表示用于填充缺失值的数,ffill用前面的值填充,bfill表示用后面的值进行填充
from pandas import Series
obj4 = Series([4.5, 7.2, -5.3, 3.5], index=['b', 'd', 'c', 'a'])
obj5 = obj4.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
print(obj5)
obj6 = Series(['blue', 'purple', 'yellow'], index=[0, 2, 4])
print(obj6.reindex(range(6), method='bfill'))
"""
输出结果
a 3.5
b 4.5
c -5.3
d 7.2
e 0.0
dtype: float64
0 blue
1 purple
2 purple
3 yellow
4 yellow
5 NaN
dtype: object
"""
- Series.dropna()可以删除缺失值
from numpy import nan as NA
data = Series([1, NA, 2])
print(data.dropna())
"""
输出结果
0 1.0
2 2.0
dtype: float64
"""
C.DataFrame
多维数组的处理
- DataFrame()添加参数columns=可以对列进行位置排序(列的位置替换,非列里面进行排序)
- DataFrame['key']或者DataFrame.key可以根据key值获取到对应列的数据
- DataFrame['newkey']=?可以添加新的列
from pandas import DataFrame
data = {'city': ['shanghai', 'shanghai', 'beijing', 'beijing'],
'year': [2016, 2017, 2017, 2018],
'pop': [1.5, 1.7, 2.4, 2.9]}
frame = DataFrame(data)
frame2 = DataFrame(data, columns=['year', 'pop', 'city'])
print(frame)
print(frame2)
print(frame2['city'])
print(frame2.year)
frame2['new'] = 100
print(frame2)
frame2['cap'] = frame2.city == 'beijing'
print(frame2)
"""
输出结果
city year pop
0 shanghai 2016 1.5
1 shanghai 2017 1.7
2 beijing 2017 2.4
3 beijing 2018 2.9
year pop city
0 2016 1.5 shanghai
1 2017 1.7 shanghai
2 2017 2.4 beijing
3 2018 2.9 beijing
0 shanghai
1 shanghai
2 beijing
3 beijing
Name: city, dtype: object
0 2016
1 2017
2 2017
3 2018
Name: year, dtype: int64
year pop city new
0 2016 1.5 shanghai 100
1 2017 1.7 shanghai 100
2 2017 2.4 beijing 100
3 2018 2.9 beijing 100
year pop city new cap
0 2016 1.5 shanghai 100 False
1 2017 1.7 shanghai 100 False
2 2017 2.4 beijing 100 True
3 2018 2.9 beijing 100 True
"""
- DataFrame.T可以将数据的行和列进行反转
from pandas import DataFrame
pop = {'beijing': {2008: 1.5, 2009: 2.0},
'shanghai': {2008: 2.0, 2009: 3.6}}
frame3 = DataFrame(pop)
print(frame3)
print(frame3.T)
"""
输出结果
beijing shanghai
2008 1.5 2.0
2009 2.0 3.6
2008 2009
beijing 1.5 2.0
shanghai 2.0 3.6
"""
- DataFrame.dropna()可以删除多维数组的缺失值
- 添加参数how='all'只删除整行都是缺失值的数据,部分缺失值的可以保留
- 添加参数axis=1,删除一整列都是缺失值的数据
from pandas import DataFrame
from numpy import nan as NA
data2 = DataFrame([[1, 2, 3], [5, 6, NA], [NA, NA, NA]])
print(data2.dropna())
print(data2.dropna(how='all'))
data2[4] = NA
print(data2)
print(data2.dropna(axis=1, how='all'))
"""
输出结果
0 1 2
0 1.0 2.0 3.0
0 1 2
0 1.0 2.0 3.0
1 5.0 6.0 NaN
0 1 2 4
0 1.0 2.0 3.0 NaN
1 5.0 6.0 NaN NaN
2 NaN NaN NaN NaN
0 1 2
0 1.0 2.0 3.0
1 5.0 6.0 NaN
2 NaN NaN NaN
"""
- DataFrame.fillna(x)将数据中所有的缺失值都用x进行填充,如果需要直接修改的话,需要添加inplace=True,如果不添加直接填充的副本
from pandas import DataFrame
from numpy import nan as NA
data2 = DataFrame([[1, 2, 3], [5, 6, NA], [NA, NA, NA]])
data2.fillna(3)
print(data2)
data2.fillna(4, inplace=True)
print(data2)
"""
输出结果
0 1 2
0 1.0 2.0 3.0
1 5.0 6.0 NaN
2 NaN NaN NaN
0 1 2
0 1.0 2.0 3.0
1 5.0 6.0 4.0
2 4.0 4.0 4.0
"""
3.层次化索引
- Series.unstack(),可以将数据转换为DataFrame
- DataFrame.stack(),可以将数据转换为Series
import numpy as np
from pandas import Series, DataFrame
data = Series(np.random.randn(10),
index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],
[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
print(data)
print(data['b':'c'])
print(data.unstack())
print(data.unstack().stack())
"""
输出结果
a 1 0.959932
2 -0.308277
3 -0.677998
b 1 -0.632334
2 -0.776489
3 -0.201669
c 1 -0.014423
2 0.364285
d 2 -0.124033
3 0.228125
dtype: float64
b 1 -0.632334
2 -0.776489
3 -0.201669
c 1 -0.014423
2 0.364285
dtype: float64
1 2 3
a 0.959932 -0.308277 -0.677998
b -0.632334 -0.776489 -0.201669
c -0.014423 0.364285 NaN
d NaN -0.124033 0.228125
a 1 0.959932
2 -0.308277
3 -0.677998
b 1 -0.632334
2 -0.776489
3 -0.201669
c 1 -0.014423
2 0.364285
d 2 -0.124033
3 0.228125
dtype: float64
"""
4.Matplotlib的安装与绘图
在终端输入:pip3 install matplotlib进行安装
然后再py文件中引入:import matplotlib.pyplot as plt
1.plt.plot()绘制一条曲线
plt.plot([1, 3, 5], [5, 8, 9])
plt.show()

2.Matplotlib绘制numpy和pandas里面的数据
x = np.linspace(-np.pi, np.pi, 100)#定义域为-π到π,平均取100个点
plt.plot(x, np.sin(x))
plt.show()

3.绘制多条曲线
y = np.linspace(-np.pi * 2, np.pi * 2, 100)
plt.figure(2, dpi=50) # 创建图表2,精度为50,dpi越大文件越大,杂志要300以上
for i in range(1, 5):
plt.plot(y, np.sin(y / i))
plt.show()

4.绘制直方图(hist)
plt.figure(1, dpi=50) # 创建图表1,精度50
data = [1, 2, 3, 4, 5, 2, 3, 1, 1, 4, 2, 4, 2]
plt.hist(data) # 只要传入数据,直方图就会统计出数据出现的次数
plt.show()

5.绘制散点图(scatter)
x = np.arange(1, 10)
y = x
plt.scatter(x, y, c='r', marker='o') # c='r'表示颜色为红色,marker表示形状为圆形
plt.show()

4.Pandas和Matplotlib结合使用
warnings.filterwarnings('ignore')#可以忽略运行时的warning
1.pandas读取csv并绘制散点图
iris = pd.read_csv("./iris_training.csv")
#打印csv的前五行数据
print(iris.head())
# 绘制散点图,120和4分别为csv中数据的列名
iris.plot(kind='scatter', x='120', y='4')
# 让pandas的plot()方法在PyCharm上显示
plt.show()
"""
输出结果
120 4 setosa versicolor virginica
0 6.4 2.8 5.6 2.2 2
1 5.0 2.3 3.3 1.0 1
2 4.9 2.5 4.5 1.7 2
3 4.9 3.1 1.5 0.1 0
4 5.7 3.8 1.7 0.3 0
"""

2.seaborn安装和使用
安装方法:pip3 install seaborn
导入方法:import seaborn as sns
- seabrorn可以直接使用的主题:darkgrid,whitegrid,dark,white,和ticks,默认为darkgrid
iris = pd.read_csv("./iris_training.csv")
# 设置样式
sns.set(style='white', color_codes=True)
# 设置绘制格式为散点图,size表示图标的大小
sns.jointplot(x='120', y='4', data=iris, size=5)
# distplot绘制曲线
sns.distplot(iris['120'])
plt.show()

iris = pd.read_csv("./iris_training.csv")
# 设置样式
sns.set(style='white', color_codes=True)
sns.FacetGrid(iris, hue='virginica', size=5).map(plt.scatter, 'setosa', 'versicolor').add_legend()
plt.show()

5.Tensorflow库
安装方法:pip3 install tensorflow