python数据分析与机器学习(Numpy,Pandas,Matplotlib)

机器学习怎么学?

  • 机器学习包含数学原理推导和实际应用技巧,所以需要清楚算法的推导过程和如何应用。
  • 深度学习是机器学习中神经网络算法的延伸,在计算机视觉和自然语言处理中应用更厉害一些。
  • 自己从头开始做笔记。

机器学习怎么动手,哪里去找案例?

  • 最好的资源:github ,kaggle
  • 案例积累的作用很大,很少从头去写一个项目。先学会模仿,再去创作。

科学计算库Numpy

numpy(Numerical Python extensions)是一个第三方的Python包,用于科学计算。这个库的前身是1995年就开始开发的一个用于数组运算的库。经过了长时间的发展,基本上成了绝大部分Python科学计算的基础包,当然也包括所有提供Python接口的深度学习框架。
numpy.genfromtxt方法
从文本文件加载数据,并按指定的方式处理缺少的值

delimiter : 分隔符:用于分隔值的字符串。可以是str, int, or sequence。默认情况下,任何连续的空格作为分隔符。
dtype:结果数组的数据类型。 如果没有,则dtypes将由每列的内容单独确定。

import numpy
world_alcohol = numpy.genfromtxt("world_alcohol.txt",delimiter=",",dtype=str)
print(type(world_alcohol))
print(world_alcohol)
print(help(numpy.genfromtxt)) #当想知道numpy.genfromtxt用法时,使用help查询帮助文档

输出结果:
<class 'numpy.ndarray'>  #所有的numpy都是ndarray结构
[['Year' 'WHO region' 'Country' 'Beverage Types' 'Display Value']
 ['1986' 'Western Pacific' 'Viet Nam' 'Wine' '0']
 ['1986' 'Americas' 'Uruguay' 'Other' '0.5']
 ..., 
 ['1987' 'Africa' 'Malawi' 'Other' '0.75']
 ['1989' 'Americas' 'Bahamas' 'Wine' '1.5']
 ['1985' 'Africa' 'Malawi' 'Spirits' '0.31']]

numpy.array
创建一个向量或矩阵(多维数组)

import numpy as np
a = [1, 2, 4, 3]        #vector
b = np.array(a)             # array([1, 2, 4, 3])
type(b)                     # <type 'numpy.ndarray'>

对数组元素的操作1

b.shape                     # (4,) 返回矩阵的(行数,列数)或向量中的元素个数
b.argmax()                  # 2 返回最大值所在的索引
b.max()                     # 4最大值
b.min()                            # 1最小值
b.mean()                    # 2.5平均值

numpy限制了nump.array中的元素必须是相同数据结构。使用dtype属性返回数组中的数据类型

>>> a = [1,2,3,5]
>>> b = np.array(a)
>>> b.dtype
dtype('int64')

对数组元素的操作2

c = [[1, 2], [3, 4]]    # 二维列表
d = np.array(c)             # 二维numpy数组
d.shape                     # (2, 2)
d[1,1]                        #4,矩阵方式按照行、列获取元素
d.size                      # 4 数组中的元素个数
d.max(axis=0)               # 找维度0,也就是最后一个维度上的最大值,array([3, 4])
d.max(axis=1)               # 找维度1,也就是倒数第二个维度上的最大值,array([2, 4])
d.mean(axis=0)              # 找维度0,也就是第一个维度上的均值,array([ 2.,  3.])
d.flatten()                 # 展开一个numpy数组为1维数组,array([1, 2, 3, 4])
np.ravel(c)               # 展开一个可以解析的结构为1维数组,array([1, 2, 3, 4])

对数组元素的操作3

import numpy as np
matrix = np.array([
                [5,10,15],
                [20,25,30],
                [35,40,45]
                ])
print(matrix.sum(axis=1))  #指定维度axis=1,即按行计算
输出结果:
[ 30  75 120]

import numpy as np
matrix = np.array([
                [5,10,15],
                [20,25,30],
                [35,40,45]
                ])
print(matrix.sum(axis=0))  #指定维度axis=0,即按列计算
输出结果:
[60 75 90]

矩阵中也可以使用切片

import numpy as np
vector = [1, 2, 4, 3]       
print(vector[0:3])  #[1, 2, 4] 对于索引大于等于0,小于3的所有元素

matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix[:,1])  #[10 25 40]取出所有行的第一列
print(matrix[:,0:2])   #取出所有行的第一、第二列
#[[ 5 10]
 [20 25]
 [35 40]]

对数组的判断操作,等价于对数组中所有元素的操作

import numpy as np
matrix = np.array([[5,10,15],[20,25,30],[35,40,45]])
print(matrix == 25)
输出结果:
[[False False False]
 [False  True False]
 [False False False]]

second_colum_25 = matrix[:,1]== 25
print(second_colum_25)
print(matrix[second_colum_25,:])  #bool类型的值也可以拿出来当成索引
输出结果:
[False  True False]
[[20 25 30]]

对数组元素的与操作,或操作

import numpy as np
vector = np.array([5,10,15,20])
equal_to_ten_and_five = (vector == 10) & (vector == 5)
print (equal_to_ten_and_five)
输出结果:
[False False False False]

import numpy as np
vector = np.array([5,10,15,20])
equal_to_ten_and_five = (vector == 10) | (vector == 5)
print (equal_to_ten_and_five)
vector[equal_to_ten_and_five] = 50  #bool类型值作为索引时,True有效
print(vector)  
输出结果:
[ True  True False False]
[50 50 15 20]

对数组元素类型的转换

import numpy as np
vector = np.array(['lucy','ch','dd'])
vector = vector.astype(float) #astype对整个vector进行值类型的转换
print(vector.dtype)
print(vector)
输出结果:
float64
[  5.  10.  15.  20.]

Numpy常用函数

reshape方法,变换矩阵维度

import numpy as np
print(np.arange(15))
a = np.arange(15).reshape(3,5) #将向量变为3行5列矩阵
print(a)
print(a.shape)  #shape方法获得(行数,烈数)

输出结果:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
(3, 5)

初始化矩阵为0或1

>>> import numpy as np
>>> np.zeros((3,4))   #将一个三行四列矩阵初始化为0
输出结果:
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])

>>> import numpy as np
>>> np.ones((3,4),dtype=np.int32)  #指定类型为int型
输出结果:
array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]], dtype=int32)

构造序列

np.arange( 10, 30, 5 )   #起始值10,终止值小于30,间隔为5
输出结果:
array([10, 15, 20, 25])

np.arange( 0, 2, 0.3 )
输出结果:
array([ 0. ,  0.3,  0.6,  0.9,  1.2,  1.5,  1.8])

random模块

np.random.random((2,3)) #random模块中的random函数,产生一个两行三列的随机矩阵。(-1,+1)之间的值
输出结果:
array([[ 0.40130659,  0.45452825,  0.79776512],
       [ 0.63220592,  0.74591134,  0.64130737]])

linspace模块,将起始值与终止值之间等分成x份

from numpy import pi
np.linspace( 0, 2*pi, 100 )
输出结果:
array([ 0.        ,  0.06346652,  0.12693304,  0.19039955,  0.25386607,
        0.31733259,  0.38079911,  0.44426563,  0.50773215,  0.57119866,
        0.63466518,  0.6981317 ,  0.76159822,  0.82506474,  0.88853126,
        0.95199777,  1.01546429,  1.07893081,  1.14239733,  1.20586385,
        1.26933037,  1.33279688,  1.3962634 ,  1.45972992,  1.52319644,
        1.58666296,  1.65012947,  1.71359599,  1.77706251,  1.84052903,
        1.90399555,  1.96746207,  2.03092858,  2.0943951 ,  2.15786162,
        2.22132814,  2.28479466,  2.34826118,  2.41172769,  2.47519421,
        2.53866073,  2.60212725,  2.66559377,  2.72906028,  2.7925268 ,
        2.85599332,  2.91945984,  2.98292636,  3.04639288,  3.10985939,
        3.17332591,  3.23679243,  3.30025895,  3.36372547,  3.42719199,
        3.4906585 ,  3.55412502,  3.61759154,  3.68105806,  3.74452458,
        3.8079911 ,  3.87145761,  3.93492413,  3.99839065,  4.06185717,
        4.12532369,  4.1887902 ,  4.25225672,  4.31572324,  4.37918976,
        4.44265628,  4.5061228 ,  4.56958931,  4.63305583,  4.69652235,
        4.75998887,  4.82345539,  4.88692191,  4.95038842,  5.01385494,
        5.07732146,  5.14078798,  5.2042545 ,  5.26772102,  5.33118753,
        5.39465405,  5.45812057,  5.52158709,  5.58505361,  5.64852012,
        5.71198664,  5.77545316,  5.83891968,  5.9023862 ,  5.96585272,
        6.02931923,  6.09278575,  6.15625227,  6.21971879,  6.28318531])

对矩阵的运算以矩阵为单位进行操作

import numpy as np
a = np.array( [20,30,40,50] )
b = np.arange( 4 )  #[0 1 2 3]
c = a-b 
print(c)  #[20 29 38 47]
print(b**2)  #[0 1 4 9]
print(a<35)  #[ True  True False False]

矩阵乘法

A = np.array( [[1,1],
               [0,1]] )
B = np.array( [[2,0],
               [3,4]] )
print A.dot(B)  #求矩阵乘法的方法一
print np.dot(A, B)  ##求矩阵乘法的方法二
输出结果:
[[5 4]
 [3 4]]
[[5 4]
 [3 4]]

e为底数的运算&开根运算

import numpy as np
B = np.arange(3)
print (np.exp(B))  #[ 1.          2.71828183  7.3890561 ] e的B次方
print (np.sqrt(B))  #[ 0.          1.          1.41421356]

floor向下取整

import numpy as np
a = np.floor(10*np.random.random((3,4)))  #floor向下取整
print(a)
print (a.ravel())  #将矩阵中元素展开成一行
a.shape = (6, 2)     #当采用a.reshape(6,-1) 第二个参数-1表示默认根据行数确定列数
print (a)
print (a.T)  #a的转置(矩阵行列互换)

[[ 8.  7.  2.  1.]
 [ 5.  2.  5.  1.]
 [ 8.  7.  7.  2.]]
[ 8.  7.  2.  1.  5.  2.  5.  1.  8.  7.  7.  2.]
[[ 8.  7.]
 [ 2.  1.]
 [ 5.  2.]
 [ 5.  1.]
 [ 8.  7.]
 [ 7.  2.]]
[[ 8.  2.  5.  5.  8.  7.]
 [ 7.  1.  2.  1.  7.  2.]]

hstack与vstack实现矩阵的拼接(拼接数据常用)

a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))
print(a)
print(b)
print(np.hstack((a,b)))  #横着拼接
print(np.vstack((a,b)))   #竖着拼接
输出结果:
[[ 8.  6.]
 [ 7.  6.]]
[[ 3.  4.]
 [ 8.  1.]]
[[ 8.  6.  3.  4.]
 [ 7.  6.  8.  1.]]
[[ 8.  6.]
 [ 7.  6.]
 [ 3.  4.]
 [ 8.  1.]]

hsplit与vsplit实现矩阵的切分

a = np.floor(10*np.random.random((2,12)))
print(a)
print(np.hsplit(a,3))  #横着将矩阵切分为3份
print(np.hsplit(a,(3,4)))  # 指定横着切分的位置,第三列和第四列
输出结果:
[[ 7.  1.  4.  9.  8.  8.  5.  9.  6.  6.  9.  4.]
 [ 1.  9.  1.  2.  9.  9.  5.  0.  5.  4.  9.  6.]]
[array([[ 7.,  1.,  4.,  9.],
       [ 1.,  9.,  1.,  2.]]), array([[ 8.,  8.,  5.,  9.],
       [ 9.,  9.,  5.,  0.]]), array([[ 6.,  6.,  9.,  4.],
       [ 5.,  4.,  9.,  6.]])]
[array([[ 7.,  1.,  4.],
       [ 1.,  9.,  1.]]), array([[ 9.],
       [ 2.]]), array([[ 8.,  8.,  5.,  9.,  6.,  6.,  9.,  4.],
       [ 9.,  9.,  5.,  0.,  5.,  4.,  9.,  6.]])]

a = np.floor(10*np.random.random((12,2)))
print(a)
np.vsplit(a,3)  #竖着将矩阵切分为3份
输出结果:
[[ 6.  4.]
 [ 0.  1.]
 [ 9.  0.]
 [ 0.  0.]
 [ 0.  4.]
 [ 1.  1.]
 [ 0.  4.]
 [ 1.  6.]
 [ 9.  7.]
 [ 0.  9.]
 [ 6.  1.]
 [ 3.  0.]]
[array([[ 6.,  4.],
        [ 0.,  1.],
        [ 9.,  0.],
        [ 0.,  0.]]), array([[ 0.,  4.],
        [ 1.,  1.],
        [ 0.,  4.],
        [ 1.,  6.]]), array([[ 9.,  7.],
        [ 0.,  9.],
        [ 6.,  1.],
        [ 3.,  0.]])]

直接把一个数组赋值给另一个数组,两个数组指向同一片内存区域,对其中一个的操作就会影响另一个结果

a = np.arange(12)
b = a    #a和b是同一个数组对象的两个名字
print (b is a)
b.shape = 3,4
print (a.shape)
print (id(a))   #id表示指向内存区域,具有相同id,表示a、b指向相同内存区域中的值
print (id(b))
输出结果:
True
(3, 4)
4382560048
4382560048

view方法创建一个新数组,指向的内存区域不同,但元素值共用

import numpy as np
a = np.arange(12)
c = a.view()
print(id(a))  #id值不同
print(id(c))
print(c is a) 
c.shape = 2,6
print (a.shape) #改变c的shape,a的shape不变
c[0,4] = 1234  #改变c中元素的值
print(a)   #a中元素的值也会发生改变
输出结果:
4382897216
4382897136
False
(12,)
[   0    1    2    3 1234    5    6    7    8    9   10   11]

copy方法(深复制)创建一个对数组和元素值的完整的copy

d = a.copy() 

按照矩阵的行列找出最大值,最大值的索引

import numpy as np
data = np.sin(np.arange(20)).reshape(5,4) 
print (data)
ind = data.argmax(axis=0)   #找出每列最大值的索引
print (ind)
data_max = data[ind, range(data.shape[1])]  #通过行列索引取值
print (data_max)
输出结果:
[[ 0.          0.84147098  0.90929743  0.14112001]
 [-0.7568025  -0.95892427 -0.2794155   0.6569866 ]
 [ 0.98935825  0.41211849 -0.54402111 -0.99999021]
 [-0.53657292  0.42016704  0.99060736  0.65028784]
 [-0.28790332 -0.96139749 -0.75098725  0.14987721]]
[2 0 3 1]
[ 0.98935825  0.84147098  0.99060736  0.6569866 ]

tile方法,对原矩阵的行列进行扩展

import numpy as np
a = np.arange(0, 40, 10)
b = np.tile(a, (2, 3))  #行变成2倍,列变成3倍
print(b)
输出结果:
[[ 0 10 20 30  0 10 20 30  0 10 20 30]
 [ 0 10 20 30  0 10 20 30  0 10 20 30]]

两种排序方法
sort方法对矩阵中的值进行排序,argsort方法得到元素从小到大的索引值,根据索引值的到排序结果

a = np.array([[4, 3, 5], [1, 2, 1]])
b = np.sort(a, axis=1)  #对a按行由小到大排序,值赋给b
print(b)
a.sort(axis=1)   #直接对a按行由小到大排序
print(a)
a = np.array([4, 3, 1, 2])
j = np.argsort(a)  #argsort方法得到元素从小到大的索引值
print (j)
print (a[j])  #根据索引值输出a
输出结果:
[[3 4 5]
 [1 1 2]]
-------
[[3 4 5]
 [1 1 2]]
-------
[2 3 1 0]
-------
[1 2 3 4]

数据分析处理库Pandas,基于Numpy

read_csv方法读取csv文件

import pandas as pd
food_info = pd.read_csv("food_info.csv")
print(type(food_info))  #pandas代表的DataFrame可以当成矩阵结构
print(food_info.dtypes)  #dtypes在当前数据中包含的数据类型
输出结果:
<class 'pandas.core.frame.DataFrame'>
NDB_No               int64
Shrt_Desc           object
Water_(g)          float64
Energ_Kcal           int64
......
Cholestrl_(mg)     float64
dtype: object

获取读取到的文件的信息

print(food_info.head(3))  #head()方法如果没有参数,默认获取前5行
print(food_info.tail())  #tail()方法获取最后5行
print(food_info.columns)  #columns获取所有的列名
print(food_info.shape) #获取当前数据维度(8618, 36)

取出指定某行的数据

print(food_info.loc[0])  #取出第零行的数据
food_info.loc[8620]  # 当index值超过最大值,throw an error: "KeyError: 'the label [8620] is not in the [index]'"
food_info.loc[3:6]  #取出第三到第六行数据,3、4、5、6
two_five_ten = [2,5,10] 
food_info.loc[two_five_ten] #取出第2、5、10行数据

取出指定某列的数据

ndb_col = food_info["NDB_No"] #取出第一列NDB_No中的数据
print (ndb_col)

columns = ["Zinc_(mg)", "Copper_(mg)"] #要取出多列,就写入所要取出列的列名
zinc_copper = food_info[columns]
print(zinc_copper)

取出以(g)为结尾的列名

col_names = food_info.columns.tolist()  #tolist()方法将列名放在一个list里
gram_columns = []
for c in col_names:
    if c.endswith("(g)"):  
        gram_columns.append(c)
gram_df = food_info[gram_columns]
print(gram_df.head(3))
输出结果:
  Water_(g)  Protein_(g)  Lipid_Tot_(g)  Ash_(g)  Carbohydrt_(g)  \
0      15.87         0.85          81.11     2.11            0.06   
1      15.87         0.85          81.11     2.11            0.06   
2       0.24         0.28          99.48     0.00            0.00   
3      42.41        21.40          28.74     5.11            2.34   
4      41.11        23.24          29.68     3.18            2.79   

   Fiber_TD_(g)  Sugar_Tot_(g)  FA_Sat_(g)  FA_Mono_(g)  FA_Poly_(g)  
0           0.0           0.06      51.368       21.021        3.043  
1           0.0           0.06      50.489       23.426        3.012  
2           0.0           0.00      61.924       28.732        3.694  
3           0.0           0.50      18.669        7.778        0.800  
4           0.0           0.51      18.764        8.598        0.784  

对某列中的数据进行四则运算

import pandas
food_info = pandas.read_csv("food_info.csv")
iron_grams = food_info["Iron_(mg)"] / 1000  #对列中的数据除以1000
food_info["Iron_(g)"] = iron_grams  #新增一列Iron_(g) 保存结果

water_energy = food_info["Water_(g)"] * food_info["Energ_Kcal"] #将两列数字相乘

求某列中的最大值、最小值、均值

max_calories = food_info["Energ_Kcal"].max()
print(max_calories)
min_calories = food_info["Energ_Kcal"].min()
print(min_calories)
mean_calories = food_info["Energ_Kcal"].mean()
print(mean_calories)
输出结果:
902
0
226.438616848

使用sort_values()方法对某列数据进行排序

food_info.sort_values("Sodium_(mg)", inplace=True)
 #默认从小到大排序,inplace=True表示返回一个新的数据结构,而不在原来基础上做改变
print(food_info["Sodium_(mg)"])

food_info.sort_values("Sodium_(mg)", inplace=True, ascending=False)  
#ascending=False表示从大到小排序,
print(food_info["Sodium_(mg)"])

针对titanic_train.csv 的练习(含pivot_table()透视表方法)

import pandas as pd
import numpy as np
titanic_survival = pd.read_csv("titanic_train.csv")
titanic_survival.head()

age = titanic_survival["Age"]
print(age.loc[0:20])  #打印某一列的0到20行
age_is_null = pd.isnull(age)  #isnull()方法用于检测是否为缺失值,缺失为True 不缺失为False
print(age_is_null)
age_null_true = age[age_is_null] #得到该列所有缺失的行
print(age_null_true)  
age_null_count = len(age_null_true)
print(age_null_count)    #缺失的行数

#存在缺失值的情况下无法计算均值
mean_age = sum(titanic_survival["Age"]) / len(titanic_survival["Age"]) #sum()方法对列中元素求和
print(mean_age)  #nan

#在计算均值前要把缺失值剔除
good_ages = titanic_survival["Age"][age_is_null == False] #不缺失的取出来
correct_mean_age = sum(good_ages) / len(good_ages) 
print(correct_mean_age)  #29.6991176471

#当然也可以不这么麻烦,缺失值很普遍,pandas提供了mean()方法用于自动剔除缺失值并求均值
correct_mean_age = titanic_survival["Age"].mean()
print(correct_mean_age)  #29.6991176471

#求每个仓位等级,船票的平均价格
passenger_classes = [1, 2, 3]
fares_by_class = {}
for this_class in passenger_classes:
    pclass_rows = titanic_survival[titanic_survival["Pclass"] == this_class]
    pclass_fares = pclass_rows["Fare"]  #定为到同一等级舱,船票价格的那一列
    fare_for_class = pclass_fares.mean()  
    fares_by_class[this_class] = fare_for_class
print(fares_by_class)
运算结果:
{1: 84.154687499999994, 2: 20.662183152173913, 3: 13.675550101832993}

#pandas为我们提供了更方便的统计工具,pivot_table()透视表方法
#index 告诉pivot_table方法是根据哪一列分组
#values 指定对哪一列进行计算
#aggfunc 指定使用什么计算方法
passenger_survival = titanic_survival.pivot_table(index="Pclass", values="Survived", aggfunc=np.mean)
print(passenger_survival)
运算结果:
Pclass  Survived
1       0.629630
2       0.472826
3       0.242363

#计算不同等级舱乘客的平均年龄
passenger_age = titanic_survival.pivot_table(index="Pclass", values="Age")  #默认采用aggfunc=np.mean计算方法
print(passenger_age)
运算结果:          
Pclass    Age
1       38.233441
2       29.877630
3       25.140620

#index 根据一列分组
##values 指定对多列进行计算
port_stats = titanic_survival.pivot_table(index="Embarked", values=["Fare","Survived"], aggfunc=np.sum)
print(port_stats)
运算结果:
Embarked       Fare  Survived                  
C         10072.2962        93
Q          1022.2543        30
S         17439.3988       217

#丢弃有缺失值的数据行
new_titanic_survival = titanic_survival.dropna(axis=0,subset=["Age", "Cabin"])  #subset指定了Age和Cabin中任何一个有缺失的,这行数据就丢弃
print(new_titanic_survival)

#按照行列定位元素,取出值
row_index_83_age = titanic_survival.loc[103,"Age"]
row_index_1000_pclass = titanic_survival.loc[766,"Pclass"]
print(row_index_83_age)
print(row_index_1000_pclass)

#sort_values()排序,reset_index()重新设置行号
new_titanic_survival = titanic_survival.sort_values("Age",ascending=False) #ascending=False从大到小
print(new_titanic_survival[0:10])  #但序号是原来的序号
itanic_reindexed = new_titanic_survival.reset_index(drop=True)  #reset_index(drop=True)更新行号
print(itanic_reindexed.iloc[0:10])  #iloc通过行号获取行数据

#通过定义一个函数,把操作封装起来,然后apply函数
def hundredth_row(column):   #这个函数返回第100行的每一列数据
    # Extract the hundredth item
    hundredth_item = column.iloc[99]
    return hundredth_item
hundredth_row = titanic_survival.apply(hundredth_row) #apply()应用函数
print(hundredth_row)
返回结果:
PassengerId                  100
Survived                       0
Pclass                         2
Name           Kantor, Mr. Sinai
Sex                         male
Age                           34
SibSp                          1
Parch                          0
Ticket                    244367
Fare                          26
Cabin                        NaN
Embarked                       S
dtype: object

##统计所有的缺失值
def not_null_count(column):
    column_null = pd.isnull(column) 
    null = column[column_null]  
    return len(null)
column_null_count = titanic_survival.apply(not_null_count)
print(column_null_count)
输出结果:
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

#对船舱等级进行转换
def which_class(row):
    pclass = row['Pclass']
    if pd.isnull(pclass):
        return "Unknown"
    elif pclass == 1:
        return "First Class"
    elif pclass == 2:
        return "Second Class"
    elif pclass == 3:
        return "Third Class"
classes = titanic_survival.apply(which_class, axis=1)  #通过axis = 1参数,使用DataFrame.apply()方法来迭代行而不是列。
print(classes)

#使用两个自定义函数,统计不同年龄标签对应的存活率
def generate_age_label(row):
    age = row["Age"]
    if pd.isnull(age):
        return "unknown"
    elif age < 18:
        return "minor"
    else:
        return "adult"

age_labels = titanic_survival.apply(generate_age_label, axis=1)

titanic_survival['age_labels'] = age_labels
age_group_survival = titanic_survival.pivot_table(index="age_labels", values="Survived" ,aggfunc=np.mean)
print(age_group_survival)
运算结果:
 
age_labels  Survived         
adult       0.381032
minor       0.539823
unknown     0.293785

Series结构

Series (collection of values) DataFrame中的一行或者一列就是Series结构
DataFrame (collection of Series objects)是读取文件read_csv()方法获得的矩阵
Panel (collection of DataFrame objects)

import pandas as pd
fandango = pd.read_csv('fandango_score_comparison.csv')  #读取电影信息,DataFrame结构 
series_film = fandango['FILM']  #定位到“FILM”这一列
print(type(series_film))   #<class 'pandas.core.series.Series'>结构
print(series_film[0:5])    #通过索引切片
series_rt = fandango['RottenTomatoes']
print (series_rt[0:5])

from pandas import Series # Import the Series object from pandas
film_names = series_film.values  #把Series结构中的每一个值拿出来
print(type(film_names))  #<class 'numpy.ndarray'>说明series结构中每一个值的结构是ndarray
rt_scores = series_rt.values
series_custom = Series(rt_scores , index=film_names) #设置以film_names为索引的film结构,创建一个Series
series_custom[['Minions (2015)', 'Leviathan (2014)']]  #确实可以使用名字索引
fiveten = series_custom[5:10] #也可以使用数字索引
print(fiveten)

Series中的排序

original_index = series_custom.index.tolist() #将index值放入一个list结构中
sorted_index = sorted(original_index) 
sorted_by_index = series_custom.reindex(sorted_index) #reset index操作
print(sorted_by_index)

sc2 = series_custom.sort_index()  #根据index值进行排序
sc3 = series_custom.sort_values()   #根据value值进行排序
print(sc3)

在Series中的每一个值的类型是ndarray,即NumPy中核心数据类型

import numpy as np
print(np.add(series_custom, series_custom))  #将两列值相加
np.sin(series_custom) #对每个值使用sin函数
np.max(series_custom) #获取某一列的最大值

取出series_custom列中数值在50到70之间的数值
对某一列中的所有值进行比较运算,返回boolean值

criteria_one = series_custom > 50
criteria_two = series_custom < 75
both_criteria = series_custom[criteria_one & criteria_two] #返回boolean值的Series对象
print(both_criteria)

对index相同的两列运算

#data alignment same index
rt_critics = Series(fandango['RottenTomatoes'].values, index=fandango['FILM'])
rt_users = Series(fandango['RottenTomatoes_User'].values, index=fandango['FILM'])
rt_mean = (rt_critics + rt_users)/2
print(rt_mean)

对DataFrame结构进行操作
设置‘FILM’为索引

fandango = pd.read_csv('fandango_score_comparison.csv')
print(type(fandango))  #<class 'pandas.core.frame.DataFrame'>
fandango_films = fandango.set_index('FILM', drop=False) 
#以‘FILM’为索引返回一个新的DataFrame ,drop=False不丢弃原来的FILM列

对DataFrame切片

#可以使用[]或者loc[]来切片
fandango_films["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]  #用string值做的索引也可以切片
fandango_films.loc["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]
fandango_films[0:3] #数值索引依然存在,可以用来切片
#选择特定的列
#movies = ['Kumiko, The Treasure Hunter (2015)', 'Do You Believe? (2015)', 'Ant-Man (2015)']  

可视化库matplotlib

Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表。

2D图表之折线图

Matplotlib中最基础的模块是pyplot,先从最简单的点图和线图开始。
更多属性可以参考官网:http://matplotlib.org/api/pyplot_api.html

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

unrate = pd.read_csv('unrate.csv')
unrate['DATE'] = pd.to_datetime(unrate['DATE']) #pd.to_datetime方法标准化日期格式

first_twelve = unrate[0:12]  #取0到12行数据
plt.plot(first_twelve['DATE'], first_twelve['VALUE']) #plot(x轴,y轴)方法画图
plt.xticks(rotation=45)  #设置x轴上横坐标旋转角度
plt.xlabel('Month') #x轴含义
plt.ylabel('Unemployment Rate')  #y轴含义
plt.title('Monthly Unemployment Trends, 1948') #图标题
plt.show()  #show方法显示图
子图操作

添加子图:add_subplot(first,second,index)
first 表示行数,second 列数.

import matplotlib.pyplot as plt
fig = plt.figure() #Creates a new figure.
ax1 = fig.add_subplot(3,2,1) #一个3*2子图中的第一个模块
ax2 = fig.add_subplot(3,2,2) #一个3*2子图中的第二个模块
ax2 = fig.add_subplot(3,2,6) #一个3*2子图中的第六个模块
plt.show()
import numpy as np
#fig = plt.figure()
fig = plt.figure(figsize=(3, 6))  #指定画图区大小(长,宽)
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)

ax1.plot(np.random.randint(1,5,5), np.arange(5)) #第一个子图画图
ax2.plot(np.arange(10)*3, np.arange(10)) #第二个子图画图
plt.show()

在同一个图中画两条折线(plot两次)

fig = plt.figure(figsize=(6,3))
plt.plot(unrate[0:12]['MONTH'], unrate[0:12]['VALUE'], c='red')
plt.plot(unrate[12:24]['MONTH'], unrate[12:24]['VALUE'], c='blue')
plt.show()

为所画曲线作标记

fig = plt.figure(figsize=(10,6))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
    start_index = I*12
    end_index = (i+1)*12
    subset = unrate[start_index:end_index]
    label = str(1948 + i) #label值
    plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i], label=label) #x轴指标,y轴指标,颜色,label值
plt.legend(loc='upper left') #loc指定legend方框的位置,loc = 'best'/'upper right'/'lower left'等,print(help(plt.legend))查看用法
plt.xlabel('Month, Integer')
plt.ylabel('Unemployment Rate, Percent')
plt.title('Monthly Unemployment Trends, 1948-1952')

plt.show()

2D图标之条形图与散点图

bar条形图

import pandas as pd
reviews = pd.read_csv('fandango_scores.csv') #读取电影评分表
cols = ['FILM', 'RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
norm_reviews = reviews[cols]
num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
bar_heights = norm_reviews.ix[0, num_cols].values  #柱高度
bar_positions = arange(5) + 0.75 #设定每一个柱到左边的距离
tick_positions = range(1,6) #设置x轴刻度标签为[1,2,3,4,5]
fig, ax = plt.subplots()

ax.bar(bar_positions, bar_heights, 0.5) #bar型图。柱到左边距离,柱高度,柱宽度
ax.set_xticks(tick_positions) #x轴刻度标签
ax.set_xticklabels(num_cols, rotation=45) 

ax.set_xlabel('Rating Source')
ax.set_ylabel('Average Rating')
ax.set_title('Average User Rating For Avengers: Age of Ultron (2015)')
plt.show()

散点图

fig, ax = plt.subplots() #fig控制图的整体情况,如大小,用ax实际来画图
ax.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm']) #scatter方法,画散点图的x轴,y轴
ax.set_xlabel('Fandango')
ax.set_ylabel('Rotten Tomatoes')
plt.show()

散点图子图

fig = plt.figure(figsize=(8,3))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
ax1.scatter(norm_reviews['Fandango_Ratingvalue'], norm_reviews['RT_user_norm'])
ax1.set_xlabel('Fandango')
ax1.set_ylabel('Rotten Tomatoes')
ax2.scatter(norm_reviews['RT_user_norm'], norm_reviews['Fandango_Ratingvalue'])
ax2.set_xlabel('Rotten Tomatoes')
ax2.set_ylabel('Fandango')
plt.show()
屏幕快照 2017-11-05 上午11.42.10.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容