人工智能
python,大数据,机器学习,深度学习,计算机视觉
五、机器学习数据科学包(numpy、pandas、matpotlib)篇(二)pandas
前言
Pandas可以处理大量的数据(如几G,几十G大小的),比Excel(VB)性能要强大,
学习Pandas要时时想着联系数据库知识。
ipython
[说明]:前面装过Anaconda环境都自带了,直接用即可。
1. ipython优点和基本使用
ipython比python要更好些,ipython的很多命令类似于Linux,ipython优点如下:
(1)ipython显示界面友好,输出结果更直观!
ipython:
python:
(2)ipython编辑代码时有提示补全功能,如输入一部分后按“Tab”键,类似Linux。
(3)ipython用“?”命令就可以查看文档功能,比python的“help”命令更方便。如:
ipython用“?”命令:
而python用“help”命令:(4)ipython “pwd"命令查看当前目录,“ls”查看当前目录下的文件,“cd"切换目录(左右斜线”/“和”“都支持),这都是python不具备的命令,如下:
ipython:
python:
(5)可以用”!echo"命令:写代码输出成一新文件。
注意:
echo后面没有引号”"
正确写法:!echo print('hello pandas') > hello.py
(代码存的是 print('hello pandas')
)
错误写法:!echo "print('hello pandas')" > hello.py"
(代码存的是 "print('hello pandas')"
)
这是新版规定,简化了不用写引号直接echo xxxx代码
即可!
下面用生成100*100矩阵,可以用%timeit看执行时间。
2. ipython notebook
前面博文numpy说过win+R输入cmd后,输入jupyter notebook
可以启动jupyter。同样输入ipython notebook
也可以启动jupyter。
进入后我们可以新建文件夹和文件,并重命名为ipythondemo
(这里后缀默认是.ipynb 即ipython notebook的意思)
常用的功能:
如图代码运行,代码编辑插入新一栏。
当然鼠标很麻烦,有快捷键,点图中Help下的"Keyboard Shortcuts"查看。
常用快捷键:
ctrl + Enter 代码运行
Shift +Enter代码编辑插入新一栏
代码如下:
(1)可看当前目录等信息
(2)将圆周从0~2pi用linspace分成100份存入矩阵,作为自变量x
import matplotlib.pyplot as plt
生成图像库。这个像matlab
【巧记】mat plot lib = matlib(看成matlab) + plot pyplot = python plot 并将plot简称plt
%matplotlib inline 意思是图片显示在网页上。输出显示图像。
(3)引用np带的sin函数,数学y = sin(x),代码y = np.sin(x)
(4)用matplotlib.pyplot带的plot函数画出图像。
附:
PyCharm运行一下,结尾需要加上一句代码plt.show()
才能显示出来图像。
2_pandas.py完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2*np.pi, num = 100)
print(x)
y = np.sin(x)
print(y)
plt.plot(x, y)
plt.show()# 重要!!!
运行结果:
若将x = np.linspace(0, 2*np.pi, num = 100)
改为x = np.linspace(0, np.pi, num = 100)
,则结果:
若将改成x = np.linspace(0, 2*np.pi, num = 100)
改成x = np.linspace(0, 2*np.pi, num = 10)
,则由于点很少,将点串联起来后看起来不再圆滑了,结果:
再看num=2呢?如下:
接着,num = 1时,因为只有一个点,所以串联不起来,结果什么都不显示,如下:
综上:点越多越圆滑,原理同图像滤波、信号降噪。
pandas快速入门(一)
推荐个高质量的文档《10分钟了解pandas》,这个英文的,下载地址:
https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html
下面内容参考的上面的官方文档。
import numpy as np
import pandas as pd
from time import time
#pandas带的数据结构型函数Series创建一行或一列的列表。
s = pd.Series([1, 3, 5, np.NaN, 8, 4])#Series大写
print(s, '\n')
#date_range()生成时间序列
dates = pd.date_range('20191012','20191030', periods = 6)#如同range
print(dates,'\n')
dates = pd.date_range('20191012', periods = 6)
print(dates,'\n')
#DataFrame将数据转化为Frame表格格式。 DataFrame(矩阵,index=序列1, columns=序列2),index表行索引,columns表列标题
#例1
data = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
print(data, '\n')
print(data.shape, '\n')
print(data.values, '\n')
#例2
d = {'A':1, 'B':pd.Timestamp('20180101'), 'C':range(4), 'D':np.arange(4)}#字典
print(d, '\n')
df = pd.DataFrame(d)
print(df, '\n')
print(df.dtypes, '\n')
print(df.A, '\n')
print(df.B, '\n')
print(type(df.B), '\n')
print(data, '\n')
#头5行数据,默认5。
print(data.head(), '\n')#head()要有括号,是函数
#头2行数据
print(data.head(2), '\n')
#尾5行数据,默认5。
print(data.tail(), '\n')#tail()要有括号,是函数
#尾3行数据
print(data.tail(3), '\n')
#行索引,行标题
print(data.index, '\n')#index是关键字,不是函数,没有括号
#列标题
print(data.columns, '\n')#columns是关键字,不是函数,没有括号
#值!即去除索引/标题后的值
print(data.values, '\n')
#详细描述describe()
print(data.describe(), '\n')#describe()要有括号,是函数
print(data.T, '\n')
print(data.T.shape, '\n')
print(data.shape, '\n')
#下面重点,见numpy博文后面对axis=1或0的总结
#按索引排序sort_index(axis=1或0, ascending=True(默认)或False)。
print(data.sort_index(axis=1, ascending=False), '\n')#axis=1表数据水平方向变动,ascending=False表逆序从大到小
print(data.sort_index(axis=1), '\n')#ascending默认True表顺序从小到大
print(data.sort_index(axis=0, ascending=False), '\n')
print(data.sort_index(axis=0), '\n')#ascending默认True
#按值排序sort_values
print(data.sort_values(by='A'), '\n')
#下面选择数据,如同array
#写法1(数组法)
print(data['A'], '\n')
#写法2(对象属性法)
print(data.A, '\n')
#写法1(下标法)
print(data[2:4], '\n')#下标2~3(不含4)
#写法2(直接法)
print(data['20191014':'20191015'], '\n')
#写法3(loc高效法),运行最快!loc即location
print(data.loc['20191014':'20191015'], '\n')#data.loc只认值,因为不能像data那样即可输入下标又可直接输入值,所以功能单一效率高!
# iloc = index location索引下标位置
print(data.iloc[2:4], '\n')
print(data.loc[:, ['B', 'C']], '\n')
print(data.loc['20191012':'20191015', ['B', 'C']], '\n')
print(data.loc['20191012','B'], '\n')
print(data.at[pd.Timestamp('20191012'), 'B'], '\n')
print(data.iloc[1], '\n')
print(data.iloc[1:3], '\n')
print(data.iloc[1:3, 2:4], '\n')
print(data.iloc[:, 1:3], '\n')
print(data.iloc[1,1], '\n')
#iat比iloc更高效
print(data.iat[1,1], '\n')
#ipython可以用魔术方法:print(%timeit df.iloc[1,1]) 来测试运行时间
#ipython可以用魔术方法:print(%timeit df.iat[1, 1]) 来测试运行时间
#显示data.A列里所有大于0的,array就如同数据库
print(data[data.A > 0], '\n')
#data表里所有大于0的
print(data[data > 0], '\n')
data2 = data.copy()
print(data2, '\n')
#扩列,新加一列
tag = ['a']*2 + ['b']*2 + ['c']*2
data2['TAG'] = tag
print(data2, '\n')
print(data2[data2.TAG.isin(['a', 'c'])], '\n')
#修改表格数据
print(data, '\n')
#改某个值
data.iat[0, 0] = 100
print(data, '\n')
#改某一列
data.B = 200
print(data, '\n')
data.A = range(6)#数要匹配。若range(5)则错
print(data, '\n')
data.iloc[:, 2:5] = 1000
print(data)
运行结果:
C:\Python\Anaconda3\python.exe C:/AI/AnacondaProject/2_pandas.py
0 1.0
1 3.0
2 5.0
3 NaN
4 8.0
5 4.0
dtype: float64
DatetimeIndex(['2019-10-12 00:00:00', '2019-10-15 14:24:00',
'2019-10-19 04:48:00', '2019-10-22 19:12:00',
'2019-10-26 09:36:00', '2019-10-30 00:00:00'],
dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15',
'2019-10-16', '2019-10-17'],
dtype='datetime64[ns]', freq='D')
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
(6, 4)
[[-0.77742935 1.24212761 -1.17257211 1.55290247]
[-0.83242779 1.051917 -0.61222523 1.57708791]
[-0.96227744 0.15767828 -1.34087005 0.01187076]
[-1.2353565 1.4331129 -0.97617989 0.19018693]
[ 0.3926603 -0.31296585 -0.2022165 0.34392391]
[ 0.25240514 0.34676844 -0.34608194 -1.298857 ]]
{'A': 1, 'B': Timestamp('2018-01-01 00:00:00'), 'C': range(0, 4), 'D': array([0, 1, 2, 3])}
A B C D
0 1 2018-01-01 0 0
1 1 2018-01-01 1 1
2 1 2018-01-01 2 2
3 1 2018-01-01 3 3
A int64
B datetime64[ns]
C int64
D int32
dtype: object
0 1
1 1
2 1
3 1
Name: A, dtype: int64
0 2018-01-01
1 2018-01-01
2 2018-01-01
3 2018-01-01
Name: B, dtype: datetime64[ns]
<class 'pandas.core.series.Series'>
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
A B C D
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
DatetimeIndex(['2019-10-12', '2019-10-13', '2019-10-14', '2019-10-15',
'2019-10-16', '2019-10-17'],
dtype='datetime64[ns]', freq='D')
Index(['A', 'B', 'C', 'D'], dtype='object')
[[-0.77742935 1.24212761 -1.17257211 1.55290247]
[-0.83242779 1.051917 -0.61222523 1.57708791]
[-0.96227744 0.15767828 -1.34087005 0.01187076]
[-1.2353565 1.4331129 -0.97617989 0.19018693]
[ 0.3926603 -0.31296585 -0.2022165 0.34392391]
[ 0.25240514 0.34676844 -0.34608194 -1.298857 ]]
A B C D
count 6.000000 6.000000 6.000000 6.000000
mean -0.527071 0.653106 -0.775024 0.396186
std 0.678304 0.690940 0.459846 1.076899
min -1.235357 -0.312966 -1.340870 -1.298857
25% -0.929815 0.204951 -1.123474 0.056450
50% -0.804929 0.699343 -0.794203 0.267055
75% -0.005053 1.194575 -0.412618 1.250658
max 0.392660 1.433113 -0.202217 1.577088
2019-10-12 2019-10-13 2019-10-14 2019-10-15 2019-10-16 2019-10-17
A -0.777429 -0.832428 -0.962277 -1.235357 0.392660 0.252405
B 1.242128 1.051917 0.157678 1.433113 -0.312966 0.346768
C -1.172572 -0.612225 -1.340870 -0.976180 -0.202217 -0.346082
D 1.552902 1.577088 0.011871 0.190187 0.343924 -1.298857
(4, 6)
(6, 4)
D C B A
2019-10-12 1.552902 -1.172572 1.242128 -0.777429
2019-10-13 1.577088 -0.612225 1.051917 -0.832428
2019-10-14 0.011871 -1.340870 0.157678 -0.962277
2019-10-15 0.190187 -0.976180 1.433113 -1.235357
2019-10-16 0.343924 -0.202217 -0.312966 0.392660
2019-10-17 -1.298857 -0.346082 0.346768 0.252405
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-12 -0.777429
2019-10-13 -0.832428
2019-10-14 -0.962277
2019-10-15 -1.235357
2019-10-16 0.392660
2019-10-17 0.252405
Freq: D, Name: A, dtype: float64
2019-10-12 -0.777429
2019-10-13 -0.832428
2019-10-14 -0.962277
2019-10-15 -1.235357
2019-10-16 0.392660
2019-10-17 0.252405
Freq: D, Name: A, dtype: float64
A B C D
2019-10-14 -0.962277 0.157678 -1.34087 0.011871
2019-10-15 -1.235357 1.433113 -0.97618 0.190187
A B C D
2019-10-14 -0.962277 0.157678 -1.34087 0.011871
2019-10-15 -1.235357 1.433113 -0.97618 0.190187
A B C D
2019-10-14 -0.962277 0.157678 -1.34087 0.011871
2019-10-15 -1.235357 1.433113 -0.97618 0.190187
A B C D
2019-10-14 -0.962277 0.157678 -1.34087 0.011871
2019-10-15 -1.235357 1.433113 -0.97618 0.190187
B C
2019-10-12 1.242128 -1.172572
2019-10-13 1.051917 -0.612225
2019-10-14 0.157678 -1.340870
2019-10-15 1.433113 -0.976180
2019-10-16 -0.312966 -0.202217
2019-10-17 0.346768 -0.346082
B C
2019-10-12 1.242128 -1.172572
2019-10-13 1.051917 -0.612225
2019-10-14 0.157678 -1.340870
2019-10-15 1.433113 -0.976180
1.242127607313205
1.242127607313205
A -0.832428
B 1.051917
C -0.612225
D 1.577088
Name: 2019-10-13 00:00:00, dtype: float64
A B C D
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
C D
2019-10-13 -0.612225 1.577088
2019-10-14 -1.340870 0.011871
B C
2019-10-12 1.242128 -1.172572
2019-10-13 1.051917 -0.612225
2019-10-14 0.157678 -1.340870
2019-10-15 1.433113 -0.976180
2019-10-16 -0.312966 -0.202217
2019-10-17 0.346768 -0.346082
1.051916995617705
1.051916995617705
A B C D
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-12 NaN 1.242128 NaN 1.552902
2019-10-13 NaN 1.051917 NaN 1.577088
2019-10-14 NaN 0.157678 NaN 0.011871
2019-10-15 NaN 1.433113 NaN 0.190187
2019-10-16 0.392660 NaN NaN 0.343924
2019-10-17 0.252405 0.346768 NaN NaN
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D TAG
2019-10-12 -0.777429 1.242128 -1.172572 1.552902 a
2019-10-13 -0.832428 1.051917 -0.612225 1.577088 a
2019-10-14 -0.962277 0.157678 -1.340870 0.011871 b
2019-10-15 -1.235357 1.433113 -0.976180 0.190187 b
2019-10-16 0.392660 -0.312966 -0.202217 0.343924 c
2019-10-17 0.252405 0.346768 -0.346082 -1.298857 c
A B C D TAG
2019-10-12 -0.777429 1.242128 -1.172572 1.552902 a
2019-10-13 -0.832428 1.051917 -0.612225 1.577088 a
2019-10-16 0.392660 -0.312966 -0.202217 0.343924 c
2019-10-17 0.252405 0.346768 -0.346082 -1.298857 c
A B C D
2019-10-12 -0.777429 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-12 100.000000 1.242128 -1.172572 1.552902
2019-10-13 -0.832428 1.051917 -0.612225 1.577088
2019-10-14 -0.962277 0.157678 -1.340870 0.011871
2019-10-15 -1.235357 1.433113 -0.976180 0.190187
2019-10-16 0.392660 -0.312966 -0.202217 0.343924
2019-10-17 0.252405 0.346768 -0.346082 -1.298857
A B C D
2019-10-12 100.000000 200 -1.172572 1.552902
2019-10-13 -0.832428 200 -0.612225 1.577088
2019-10-14 -0.962277 200 -1.340870 0.011871
2019-10-15 -1.235357 200 -0.976180 0.190187
2019-10-16 0.392660 200 -0.202217 0.343924
2019-10-17 0.252405 200 -0.346082 -1.298857
A B C D
2019-10-12 0 200 -1.172572 1.552902
2019-10-13 1 200 -0.612225 1.577088
2019-10-14 2 200 -1.340870 0.011871
2019-10-15 3 200 -0.976180 0.190187
2019-10-16 4 200 -0.202217 0.343924
2019-10-17 5 200 -0.346082 -1.298857
A B C D
2019-10-12 0 200 1000 1000
2019-10-13 1 200 1000 1000
2019-10-14 2 200 1000 1000
2019-10-15 3 200 1000 1000
2019-10-16 4 200 1000 1000
2019-10-17 5 200 1000 1000
Process finished with exit code 0
pandas快速入门(二)
试着用ipython notebook来编写。好处:针对输出结果图形比较多的,可以方便地快速显示。
pandas快速入门(三)
数据整形:即把行列互换
实战:MovieLens 电影评分数据分析
准备文件
在 https://grouplens.org/datasets/movielens/ 下载如下文件(6000个用户对4000个电影的评分数据):
代码
打开jupyter notebook,新建文件movie_lens_1m.ipynb,并将上面上面下载好的文件解压后放到同级目录。
大概看一下这几个解压文件,如图,通过README文件我们知道user.dat文件里的信息是UerID、性别Gender、年龄Age、职业Occupation(数字编号表示)、邮政号Zip-code。其中年龄信息:1表示“18岁以下”,18表“18-24”…
了解后,可以写代码了,如下:
pandas 核心数据结构(Series,DataFrame,Xarray)
- Series:一维数据结构
- DataFrame:二维表
- Xarray:三维
(1)Series
(2)DataFrame(重点)
(3)Xarray
这个用的比较少,因为这三维实际都能转化为二维DataFrame,上面的DataFrame是重点。
以前这部分功能是Panel,但是在新版本中,被xarray包代替!
(1)旧版已不支持,报错:
(2)用之前先下载xarray包,Anaconda没有这包。
打开win命令窗口(win+r->cmd),输入pip install xarray
,大概600KB左右
如图,已经安装完成
(3)实例代码:
pandas 基础运算
【注意】
sort_values()用法在新版本已变。
详见官方文档:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html
例:
df = pd.DataFrame(np.random.randn(4, 3), index=['one', 'two', 'three', 'four'], columns=list('ABC'))
# 按 by='two' 排序
df.sort_values(by='two', axis=1, ascending=False)#重点,按行一定要有axis=1
# 按 by=['two', 'three'] 排序, 即先按two 再按three排
df.sort_values(by=['two', 'three'], axis=1, ascending=False)