《使用python进行数据分析》

时间:2022-06-28 09:01:20

第一

环境搭建

1. 使用pip安装pandas, numpy, scipy, matplotlib, ipython

注意:首先需要安装venv(不然在下面的安装过程中会提示很多的错误,使用pycharm开发ide默认会安装好venv)

sudo pip install pandas

sudo pip install numpy

sudo pip install scipy

sudo pip install matplotlib

sudo pip install ipython

2. 使用easy_install安装pandas,numpy, scipy,matplotlib,ipython

sudo easy_install pandas

sudo easy_install numpy

sudo easy_install scipy

sudo easy_install matplotlib

sudo easy_install ipython

3. 使用源代码安装pandas,numpy,scipy,matplotlib,ipython(安装最新版本时推荐使用该方法)

git clone git://github.com/pydata/pandas.git

cd pandas

python setup.py install

git clone git://github.com/numpy/numpy.git numpy

cd numpy

python setup.py install

git clone http://github.com/scipy/scipy.git scipy

cd scipy

python setup.py install

git clone git://gtihub.com/matplotlib/matplotlib.git

cd matplotlib

python setup.py install

git clone --recursive https://github.com/ipython/ipython.git

cd ipython

python setup.py install

例:分别使用python和numpy进行相同的矩阵加法运算,比较两者的代码运行的时间长度

代码如下:

#!/usr/bin/env/python

from datetime import datetime
import numpy as np

def square_sum_python(n):

    a = range(n)
    b = range(n)
    c = []

    for i in range(len(a)):
        a[i] = i ** 2
        b[i] = i ** 3
        c.append(a[i] + b[i])
    return c

def square_sum_numpy(n):

    a = np.arange(n) ** 2
    b = np.arange(n) ** 3
    c = a + b
    return c

n = 10000

begin_at = datetime.now()
result = square_sum_python(n)
end_at = datetime.now()
time_len = end_at - begin_at
print 'running python code', time_len.microseconds
print 'sum of running python code', result[-3:]

begin_at = datetime.now()
result = square_sum_numpy(n)
end_at = datetime.now()
time_len = end_at - begin_at
print 'running numpy code', time_len.microseconds
print 'sum of running numpy code', result[-3:]

当计算的矩阵的长度为100时,两者代码运行花费的时间复杂度基本一致;当矩阵的长度为1000,10000时,numpy的运行的时间是python的十分之一甚至百分之一

4. ipython的作用

a.保存会话

%logstart

%hist -g thedate

%logoff

b. 执行系统shell命令

thedate = !date

thedate

c.显示历史命令

%hist

%hist -g thedate

d.作为学习手册

首先要安装readline,使用pip install readline或者easy_install readline安装即可

安装完成之后使用ipython -pylab打开ipython,输入help+空格+函数的一部分+Tab键;或者输入函数全名+问号+回车

第二

numpy的基本用法

1.numpy创建矩阵并选择元素

例如:

a = array(array(1,2), array(3,4))

print a

print a[0][0]

print a[0][1]

print a[1][0]

print a[1][1]

a.dtype

a.shape

2. numpy的数值类型

bool

int8/int16/int32/int64/inti/uint8/uint16/uint32/uint64

float32/float64/float

complex64/complex128

3.numpy处理数组的形状

一维数组转化为多维数组

multi_arr = np.arange(24).reshape(2,3,4)

多维数组转化为一维数组

one_arr = multi_arr.ravel()

one_arr = multi_arr.flatten()

调整数组的形状

multi_arr.shape = (6,4)         //使用属性的方式更改shape

multi_arr.resize(6,4)             //返回值为void,不生成新的数组

other_multi_arr = multi_arr.reshape(4,6)       //改变shape,并返回新的数组

other_multi_arr = multi_arr.transpose()         //返回转置

4. 堆叠数组

水平堆叠(x堆叠/列堆叠)hstack((a, b))   column_stack((a, b))

垂直堆叠(y堆叠/行堆叠)vstack((a, b)).  row_stack((a, b))

纵向堆叠(z堆叠/深度堆叠)dstack((a, b))

例如:

import numpy as np

A = np.arange(9).reshape(3,3)

B = A * 2

H = np.hstack((A,B))

C = np.column_stack((A,B))

V = np.vstack((A,B))

R = np.row_stack((A,B))

D = np.dstack((A,B))

5.拆分数组

水平拆分(横向拆分)(沿着x轴进行拆分)hstack(a, 3)

垂直拆分(纵向拆分)(沿着y轴进行拆分)vstack(a,3)

沿着z轴进行拆分  dstack(a,3)

例如:

import numpy as np

A = np.arange(9).reshape(3,3)

H = np.hsplit(A,3)

V = np.vsplit(A,3)

6.numpy数组的属性

返回维度的数量  ndim

返回元素的数量   size

返回单个元素占用字节数    itemsize

返回所有元素占用字节数    nbytes

返回转置矩阵     T 或者transpose()

返回实部           real

返回虚部           imag

设置某个元素的值      A.flat[[m,n]] = value

获取某个元素的值      A.flat[[m,n]]

设置所有元素的值  A.flat = value

获取所有元素的值      A.flat

7.numpy数组的转换

将numpy数组转换为python列表

例如:

import numpy as np

A = np.arange(9).reshape(3,3);

a_list = A.tolist()

转换numpy数组元素的类型

例如:

import numpy as np

A = np.arange(9).reshape(3,3)

B = A.astype(complex)

8.创建数组的视图和副本

注意:对本源的修改,视图也会跟着修改,而副本不会被修改

例如:

import scipy.misc

import matplotlib.pyplot as plt

lena = scipy.misc.lena()

lena_view = lena.view()

lena_copy = lena.copy()

9.numpy数组的广播

例如:一个wav音频文件进行放大处理,这时相当于矩阵与常数的乘法

#!/usr/bin/env/python

import numpy as np
import urllib2
import scipy.io.wavfile
import matplotlib.pyplot as plt

response = urllib2.urlopen("http://www.thesoundarchive.com/austinpowers/smashingbaby.wav")
print response.info()

WAV_FILE = 'smashingbaby.wav'
file_handler = open(WAV_FILE, 'w')
file_handler.write(response.read())
file_handler.close()

sample_rate,data = scipy.io.wavfile.read(WAV_FILE)
print data.dtype
print data.shape
print data.size
print data

plt.subplot(2,1,1)
plt.title("The First")
plt.plot(data)

new_data = data * 2
new_data = new_data.astype(np.uint8)
print new_data.dtype
print new_data.shape
print new_data.size
print new_data

plt.subplot(2,1,2)
plt.title("The second")
plt.plot(new_data)
plt.show()

9.使用numpy对图片进行处理(实战)

例如:使用numpy对图片画对角线

#!/usr/bin/env/python

import scipy.misc
import matplotlib.pyplot as plt

lena = scipy.misc.lena()
shape = lena.shape
x_max = shape[0]
y_max = shape[1]

lena[range(x_max), range(y_max)] = 0
lena[range(x_max-1, -1, -1), range(y_max)] = 0
plt.imshow(lena)
plt.show()

例如:使用numpy打乱图片

#!/usr/bin/env/python

import scipy.misc
import matplotlib.pyplot as plt
import numpy as np

def shuffle_arr(size):
	arr = np.arange(size)
	np.random.shuffle(arr)
	return arr

lena = scipy.misc.lena()
x_max = lena.shape[0]
y_max = lena.shape[1]

x_arr = shuffle_arr(x_max)
y_arr = shuffle_arr(y_max)

plt.imshow(lena[np.ix_(x_arr, y_arr)])
plt.show()

第三

numpy与线性代数

获取程序包的版本号使用__version__属性

获取程序包的路径使用__path__属性

#!/usr/bin/env/python

import numpy as np
import scipy as sp
import matplotlib as mpl

def get_version():
    print "version of numpy is", np.__version__
    print "version of scipy is", sp.__version__
    print "version of matplotlib is", mpl.__version__

def get_path():
    print "path of numpy is", np.__path__
    print "path of scipy is", sp.__path__
    print "path of matplotlib is", mpl.__path__

get_version()
get_path()

2.使用numpy进行统计计算

例如:使用numpy计算最大值,最小值,平均值,中位数,标准差

#!/usr/bin/env/python

import numpy as np

data = np.arange(24).reshape(3,8)

print "max is", data.max()
print "max is", np.max(data)
print "min is", data.min()
print "min is", np.min(data)
print "averge is", data.mean()
print "averge is", np.mean(data)

print "median is", np.median(data)
print "sta is ", data.std()
print "sta is", np.std(data)

3.运用numpy求解矩阵的逆

注意,numpy数组和矩阵是两个不同的概念;

首先使用np.mat()函数定义一个矩阵;再使用np.linalg.inv(A)计算A的逆;最后检验两者的乘是不是单位矩阵

#!/usr/bin/env /python

import numpy as np

A = np.mat("1 -2 1; 0 2 -8; -4 5 9")

print A

A_inv = np.linalg.inv(A)

print A_inv

check_result = A * A_inv
check_diff = A * A_inv - np.eye(3)

print check_result
print check_diff

5.计算矩阵的特征值和特征向量

#!/usr/bin/env/python

import  numpy as np

A = np.mat("3 -2; 1 0")

eig_value = np.linalg.eigvals(A)

eig_value, eig_vector = np.linalg.eig(A)

print eig_value
print eig_vector

第四

使用pandas进行数据分析

1. 安装pandas

pandas的最小依赖集合为:

numpy,python-dateutil, pytz(专门处理时区问题的程序库)

使用pip安装pandas:

pip install pandas

使用easy_install安装pandas:

easy_install pandas

使用源代码安装pandas:

git clone git://github.com/pydata/pandas.git

cd pandas

python setup.py install

2.初步使用pandas的数组结构DataFrame(相当于numpy的数组)

创建DataFrame的方法有:

使用CSV来创建DataFrame

使用numpy数组来创建DataFrame

使用DataFrame来创建DataFrame

使用Series来创建DataFrame

首先下载案例csv文件,下载地址为http://www.exploredata.net/Downloads/WHO-Data-Set

代码如下:

#!/usr/bin/env/python

from  pandas.io.parsers import read_csv

df = read_csv("WHO.csv")

print df

print "shape of dataframe:"
print df.shape

print "len of dataframe:"
print len(df)

print "columns of dataframe:"
print df.columns

print "dtypes of dataframe:"
print df.dtypes

print "index of dataframe:"
print df.index

print "values of dataframe:"
print df.values

3.使用pandas的数据结构Series

可以使用以下几种方式来创建Series:

使用python的dict来创建Series

使用numpy数组来创建Series

使用单个标量值来创建Series

案例代码如下所示:

#!/usr/bin/env/python

from pandas.io.parsers import read_csv

df = read_csv("WHO.csv")
print df

col_series_data = df["Country"]

print "one column of DataFrame:"
print col_series_data

print "type of one column of DataFrame:"
print type(col_series_data)

print "shepe of column of DataFrame:"
print col_series_data.shape

print "index of column of DataFrame:"
print col_series_data.index

print "value of column of DataFrame:"
print col_series_data.values

print "name of column of DataFrame:"
print col_series_data.name