加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

python工具之pandas、numpy、scipy使用

(2017-03-14 22:47:29)
标签:

pandas

cut

concat

dataframe

loc

分类: 大数据处理
三者区别:
1、pandas:提供了数据结构和数据分析的工具
2、numpy:主要用于数值计算,包括sin、cos、exp等,同时提供N维数据对象
3、scipy:基于numpy,提供了一个在python中做科学计算的工具集,也就是说它是更上一个层次的库

-----------------------------------pandas篇-------------------------------------------------
1、数据填充
df.Age = df.Age.fillna(-0.5)
当df的Age出现Nan时用-0.5进行填充

2、数据快速分组
test_data = [3,30,30,56,54,78]
bins = (0,20,40,60,80)
group_names = ['青少年','壮年','中年','老年']
categories = pd.cut(test_data,bins,labels=group_names)
print(categories)
结果为:[青少年, 壮年, 壮年, 中年, 中年, 老年]

3、数据融合
train_data = pd.read_csv('D:\\workspace\\kaggle\\titanic\\data\\train.csv')
test_data = pd.read_csv('D:\\workspace\\kaggle\\titanic\\data\\test.csv')
train_data_new = train_data[['Age','Pclass']].head(5)
print(train_data_new)
print("----------------------------")
test_data_new = test_data[['Age','Pclass']].head(5)
print(test_data_new)
print("----------------------------")
data_concat = pd.concat([train_data_new, test_data_new])
print(data_concat)
结果为:
 Age  Pclass
0  22.0       3
1  38.0       1
2  26.0       3
3  35.0       1
4  35.0       3
----------------------------
    Age  Pclass
0  34.5       3
1  47.0       3
2  62.0       2
3  27.0       3
4  22.0       3
----------------------------
    Age  Pclass
0  22.0       3
1  38.0       1
2  26.0       3
3  35.0       1
4  35.0       3
0  34.5       3
1  47.0       3
2  62.0       2
3  27.0       3
4  22.0       3

4、数据组织方式
aa = {'one':[1,2,3],'two':[2,3,4],'three':[3,4,5]}
bb = pd.DataFrame(aa)
print(bb)
结果为:
   one  three  two
0    1      3    2
1    2      4    3
2    3      5    4
记忆方法:在dict中指定column_name和column_value,然后展示excel一样的效果。注意:column_value的个数需要一致,否则会报错

5、使用标签选取数据
df.loc[行标签,列标签]
df.loc['a':'b']#选取ab两行数据
df.loc[:,'one']#选取one列的数据

6、获取每一列的数据类型
df.dtypes可得到如下图:
python工具之pandas、numpy、scipy使用


-----------------------------------numpy篇-------------------------------------------------
1、数组对象及创建函数
python工具之pandas、numpy、scipy使用

1.1 shape,dtype:对象属性,分别表示维度信息以及元素类型
matrix = np.array([[1,2,3],[4,5.,6]])
print(matrix.shape,matrix.dtype)
结果为:
(2, 3) float64
1.2 array:转化为数组
1.3 zeros/ones/empty/eye:分别创建全零的/全1的/空的/单位矩阵
matrix1 = np.zeros(10)
print(matrix1)
结果为:
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]

matrix2 = np.zeros((2,4))
print(matrix2)
结果为:
[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]

matrix3 = np.ones(10)
print(matrix3)
结果为:
[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

matrix4 = np.ones((2,3))
print(matrix4)
结果为:
[[ 1.  1.  1.]
 [ 1.  1.  1.]]

matrix5 = np.eye(3)
print(matrix5)
结果为:
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

matrix6 = np.empty(5)
print(matrix6, matrix6.shape)
结果为:
[ 0.  0.  0.  0.  0.] (5,)

matrix7 = np.empty((2,3))
print(matrix7, matrix7.shape)
结果为:
[[ 0.  0.  0.]
 [ 0.  0.  0.]] (2, 3)
1.4 arange:创建等差数组
arr1 = np.arange(10)
print(arr1)
结果为:[0 1 2 3 4 5 6 7 8 9]

arr2 = np.arange(1,9)
print(arr2)
结果为:[1 2 3 4 5 6 7 8]

arr3 = np.arange(1,2,0.1),第3个参数为步长
print(arr3)
结果为:[ 1.   1.1  1.2  1.3  1.4  1.5  1.6  1.7  1.8  1.9]
1.5 reshape:给予数组新的形状
arr = np.arange(9).reshape(3,3)
print(arr)
结果为:
[[0 1 2]
 [3 4 5]
 [6 7 8]]

2、数组操作
需要掌握的函数如下:
python工具之pandas、numpy、scipy使用

2.1 数组相乘(每个元素相乘)
arr1 = np.array([1,2,3])
arr2 = np.array([1,2,3])
arr3 = arr1 * arr2
print(arr3)
结果为:[1,4,9]
2.2 transpose/T属性:数组转置
arr1 = np.arange(9).reshape(3,3)
arr2 = np.transpose(arr1)
print(arr2)
print(arr1.T)
结果为:
[[0 3 6]
 [1 4 7]
 [2 5 8]]
[[0 3 6]
 [1 4 7]
 [2 5 8]]
2.3 np.where:条件逻辑表达式(对每个元素进行判断)
arr1 = np.arange(9).reshape(3,3)
arr2 = np.where(arr1<5, 0,arr1)
print(arr2)
结果为:
[[0 0 0]
 [0 0 5]
 [6 7 8]]
2.4 数组统计
2.4.1 sum:取和
arr1 = np.arange(9).reshape(3,3)
print(arr1)
print(arr1.sum())
print(arr1.sum(0))
print(arr1.sum(1))
结果为:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
36
[ 9 12 15]
[ 3 12 21]
2.4.2 mean:取平均数
arr1 = np.arange(9).reshape(3,3)
print(arr1)
print(arr1.mean())
print(arr1.mean(0))
print(arr1.mean(1))
结果为:
[[0 1 2]
 [3 4 5]
 [6 7 8]]
4.0
[ 3.  4.  5.]
[ 1.  4.  7.]

3、通用函数:
需要掌握的函数如下:
python工具之pandas、numpy、scipy使用

3.1 np.log1p
说明:log1p(x)计算log(1+x)的值。这是由于浮点数的精度有限,无法很精确地表示十分接近1的实数。例如无法用浮点数表示“1 + 1e-20”的值,因此“log(1+1e-20)”的值为0,而当使用log1p()时,则可以很精确地计算。

4、线性代数相关
一定要掌握的函数罗列如下:
python工具之pandas、numpy、scipy使用

4.1 diag:创建对角矩阵
matrix1 = np.diag((1,2,3))
print(matrix1)
结果为:
[[1 0 0]
 [0 2 0]
 [0 0 3]]
4.2 dot:矩阵相乘
matrix1 = np.diag((1,2,3))
matrix2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
matrix3 = np.dot(matrix1, matrix2)
print(matrix3)
结果为:
[[ 1  2  3]
 [ 8 10 12]
 [21 24 27]]
4.3 trace:矩阵的迹(该值等于对角线上元素之和,同时也是所有特征值相加之和
matrix = np.arange(1,10).reshape(3,3)
print(matrix)
print(np.trace(matrix))
结果为:
[[1 2 3]
 [4 5 6]
 [7 8 9]]
15
4.4 det:行列式值
matrix = np.array([[1,2],[3,4]])
print(np.linalg.det(matrix))
结果为:
-2.0
4.5 eig:矩阵的特征值和特征向量
matrix = np.array([[1,2],[3,4]])
w,v = np.linalg.eig(matrix)
print(w)
print(v)
结果为:
[-0.37228132  5.37228132]
[[-0.82456484 -0.41597356]
 [ 0.56576746 -0.90937671]]
4.6 inv:矩阵的逆
matrix = np.array([[1,2],[3,4]])
print(np.linalg.inv(matrix))
结果为:
[[-2.   1. ]
 [ 1.5 -0.5]]
4.7 qr:矩阵QR分解(A=QR,Q为正交矩阵,R为上三角矩阵)
matrix = np.array([[1,2],[3,4]])
w,v = np.linalg.qr(matrix)
print(w)
print(v)
结果为:
[[-0.31622777 -0.9486833 ]
 [-0.9486833   0.31622777]]
[[-3.16227766 -4.42718872]
 [ 0.         -0.63245553]]
4.8 svd:矩阵SVD分解
matrix = np.array([[1,2,3],[4,5,6]])
u,sigma,v = np.linalg.svd(matrix)
print(u)
print(sigma)
print(v)
结果为:
[[-0.3863177  -0.92236578]
 [-0.92236578  0.3863177 ]]
[ 9.508032    0.77286964]
[[-0.42866713 -0.56630692 -0.7039467 ]
 [ 0.80596391  0.11238241 -0.58119908]
 [ 0.40824829 -0.81649658  0.40824829]]
       有一点需要注意,sigma本来应该跟A矩阵的大小2*3一样,但linalg.svd()只返回了一个行向量的sigma,并且只有2个奇异值(本来应该有3个),这是因为第三个奇异值为0,舍弃掉了。之所以这样做,是因为当A是非常大的矩阵时,只返回奇异值可以节省很大的存储空间。当然,如果我们要重构A,就必须先将sigma转化为矩阵。
4.9 线性代数总结
python工具之pandas、numpy、scipy使用

python工具之pandas、numpy、scipy使用


5、随机数生成
python工具之pandas、numpy、scipy使用

5.1 shuffle:对一个序列就地随机排列
arr = np.arange(10)
np.random.shuffle(arr)
print(arr)
结果为:
[5 9 2 4 1 7 6 3 0 8]
5.2 rand:产生元素值为0-1的随机数的数组
arr = np.random.rand(5)
print(arr)
结果为:
[ 0.3390826   0.6166693   0.8745457   0.41493562  0.1104939 ]
5.3 randint:随机生成给定范围内的数
arr = np.random.randint(2,5)
print(arr)
arr2 = np.random.randint(2,10,4)    //第3个参数表示个数
print(arr2)
结果为:
2
[4 2 7 5]
5.4 randn:生成正态分布(平均值为0,标准差为1)的样本值
arr = np.random.randn(2,3)
print(arr)
结果为:
[[-0.50115011  0.9219796   0.22311155]
 [ 0.46097807 -0.60727445  0.67168839]]
5.5 normal:产生正态分布的样本值(randn只是normal其中的一种情况)
mu,sigma = 10, 1
var = np.random.normal(mu, sigma, 100)
print(var)
结果为:
[ 10.22221175   9.18561715  10.73016912  10.54514165  10.67503307
  10.36885777   9.89019431   9.85739467   9.7063991   10.46842874]
5.6 uniform:产生均匀分布的样本值
var = np.random.uniform(0,10,5)
print(var)
结果为:
[ 1.98785923  9.54337698  0.83408531  2.72365482  8.76923795]

-----------------------------------scipy篇-------------------------------------------------
1、偏度scipy.stats.skew
说明:表征概率分布密度曲线相对于平均值不对称程度的特征数,直观看来就是密度函数曲线尾部的相对长度。具体参考:http://baike.baidu.com/link?url=PA487jrIwKBkj7si92vwYzQD9tSfnbG6oDBWieocXcoGqJI2vce92z6uNiXletp6QivbZI1qzURlKS5vSYQ0pU_KkS6bjE5qKCkX_IJ-RIO
python工具之pandas、numpy、scipy使用
上面分别为正偏态、正态、负偏态。
from scipy.stats import skew
x = [1,2,4]
y = skew(x)
计算结果为:0.38




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有