数据分析学习

聊一聊数据分析

什么是数据分析

数据分析指用适当的统计分析方法对收集来的的大量数据进行分析,提取有用的信息形成结论,

并对数据加以详细研究和概括总结的过程。

使用python做数据分析的常用库

1.numpy 处理基础数值算法

2.scipy 处理科学计算

3.matplotlib 实现数据可视化

4.pandas 提供了序列高级函数

Numpy概述

​ 1.Numerical Python(数值的python),补充了python语言欠缺的数值运算能力

​ 2.是其他数据分析和机器学的底层库

​ 3.完全标准c语言实现,运行效率从分优化(全局解释器锁进行改进,需要的)

Numpy的历史

1.1995年,Numeric,用于完成python语言数值运算的扩充。

2.2001年,Scipy->Numarray,用于完成多维数组运算。

3.2005年,Numeric+Numarray->Numpy

4.2006年,Numpy脱离了Scipy成为一个独立项目

Numpy基础

Numpy的核心:ndarray对象

使用numpy.ndarray对象表示一个数组

import numpy as np 

ary = np.array([1,2,3,4,5])
print(ary)
ary = ary * 10
print(ary)

内存中的ndarray对象

元数据(metadata)

存储对目标数组的描述信息,如dim count(维数),dimensions(维度),dtype(类型),data()等

实际数据

完整的数组数据。(Ndarray数组是同质数组,所有元素类型相同)

将实际数据与元素数据分开存放非,一方面提高了内存空间的使用效率,另一方面减少了对实际数据的访问频率,提高性能。

ndarray数组对象的创建

np.array(可以被解释为Numpy数组的序列)

np.arange(起始值(0),终止值,步长(1))

np.zeros(数组元素的个数,dtype=‘数组元素类型’)

np.ones((数组元素的个数,dtype='数组元素类型)

案例:测试ndarray对象的创建
import numpy as np 
a = np.array([[1,2,3,4],[5,6,7,8]])
print(a)
# b = np.arange(起始,结束值,步长)
b = np.arange(1,10,1)
print(b)
#np.zeros(数组元素个数,dtype='')
c = np.zeros(10)
print(c,':c.dtype',c.dtype)
#np.ones(数组元素个数,dtype='')
d = np.ones(10)
print(d,':d.dtype',d.dtype)

ndarray对象属性的基本操作

数组的维度:array.shape

元素的类型:array.dtype

数组元素的个数:array.size

数组的索引(下标):array[0]

案例:测试数组的基本属性

# 测试数组的基本属性
import numpy as np

a =  np.array([[1,2,3,],[4,5,6]])
print(a)
#测试数组的基本属性
print('a.shape:',a.shape)
# a.shape = (6,)
# a.shape = (3,2)
# print(a,'a.shape:',a.shape)
print('a.size',a.size)
print('len(a)',len(a))
#数组元素的索引
ary = np.arange(1,28)
ary.shape=(3,3,3)
print(ary,';ary.shape:',ary.shape)
print('ary[0]:',ary[0])
print('ary[0][0]:',ary[0][0])
print('ary[0][0][0]:',ary[0][0][0])
print('ary[0,0,0]:',ary[0,0,0])
#遍历三维数组
for i in range(ary.shape[0]):
    for j in range(ary.shape[1]):
        for k in range(ary.shape[2]):
            print(ary[i,j,k],end=' ')
            

ndarray对象属性操作详解

Numpy内置的基本数据类型

类型类型表示符
布尔型bool
有符号整形int8(-128~127)/int16/int32/int64
无符号整型uint8(0~255)/uint16/uint32/uint64
浮点型float16/float32/float64
复数型complex64/complex128
字符串型str_ 每个字符串用32位的Unicode编码表示

numpy自定义复合类型

案例:在ndarray数组中存储3位学生信息

#测试自定义复合类型
import numpy as np 

data = [('zs',[10,15,2],3),
        ('ls',[12,12,92],43),
        ('ww',[14,35,82],13)]

# 第一种设置dtype的方式
a = np.array(data,dtype='U2,3int32,int32')
print(a,';zs.age:',a[0]['f2'])
print(a,';zs.scores:',a[0]['f1'][0])
print(a,';zs.scores:',a[0]['f1'])
print("*"*80)

# 第二种设置方式
b = np.array(data,dtype=[
    ('name','str_',2),
    ('scores','int32',3),
    ('age','int32',1)    
])
print(b,';ww.age:',b[2]['age'])
print("*"*80)
#第三种设置方式
c = np.array(data,dtype={
    'names':['name','scores','age'],
    'formats':['U2','3int32','int32']})
print(c,';ls.name:',c[1]['name'])
print("*"*80)
#第四种
#例如scores字段在存储式将会从第16个字节开始输出分数列表数据,
#3个int32将会占用12个字节,那么age字节将会从第28个字节开始
#向后输出
#U2占用8个自己,与scores字段中间将会空出8个字节,虽然浪费空间,
#但是这种数据存储对齐的做法在数据访问时将会提高效率吧。
d = np.array(data,dtype={
    'name':('U2',0),
    'scores':('3int32',16),
    'age':('int32',28)})
print(d)
print("*"*80)

# 第五种设置dtype的方式
# 4位二进制最大描述15个数 0001 0010 0011 .... 1111
# 
e = np.array([0x1234,0x5678],dtype=('u2',{'lowc':('u1',0),'highc':('u1',1)}))
print('%x'%e[0])
print('%x'%e['lowc'][0])    #34
print('%x'%e['highc'][0])   #12

# ndarray对象处理日期类型元素
f = np.array(['2018','2019-01-01',
              '2019-02-01',
              '2019-01-02 01:01:01'])
# 把f数组的元素类型改为日期类型
g=f.astype('M8[Y]')
print(g,';g.dtype:',g.dtype)
print('='*50)
g=f.astype('M8[M]')
print(g,';g.dtype:',g.dtype)
print('='*50)
g=f.astype('M8[D]')
print(g,';g.dtype:',g.dtype)
print('='*50)
g=f.astype('M8[s]')
print(g,';g.dtype:',g.dtype)
print('='*50)
h = g.astype('int32') #输出自计算机元年1970到现在过了多少秒
print(h)
print(h[2]-h[1])

类型的简写字符码

类型字符码
bool?
int8/int16/int32/int64i1/i2/i4/i8 (字节)
uint8/uint16/uint32/uint64u1/u2/u4/u8 (字节)
float16/float32/float64f2/f4/f8
complex64/complex128c8/c16
str_U<字符数>
datetime64M8[Y]/M8[M]/M8[D]/M8[h]/M8[m]/M8[s]

ndarray数组对象的维度操作

视图变维:array.reshape() array.ravel()

# ndarray数组的维度操作
import numpy as np 

a = np.arange(1,9)
# 视图变维使用的还是原始数组中的数据,如果修改了原始数组中的数据,
#那么新数组独到的数据也会发生变化
b = a.reshape((2,4))
print(a,b)
c = b.ravel()
print(c)

复制变维(数据独立):flatten()

#测试flatten方法
d = b.flatten()
d[0] = 110
print(b)
print(d)

就地变维:直接使用shape属性修改数组难度,不返回新数组.a.shape a.resize()

#就地变维
d.shape = (2,4)
print(d) 
d.resize(2,2,2)
print(d)

ndarray数组的切片操作

#数组的切片与列表切片参数类似
#步长+:默认从前往后切
#步长-:默认从后往前切
array[起始位置:终止位置:步长]
import numpy as np 
a = np.arange(1,10)
print(a)
print(a[:3])
print(a[3:6])
print(a[6:])
print(a[::-1])
print(a[:-4:-1])
print(a[-4:-7:-1])
print(a[-7::-1])
print(a[::])
print(a[::3])
print(a[1::3])
print(a[2::3])
# a 变维3维数组
a.resize(3,3)
#切出1/2行与1/2/3列
print(a[1:,:])
#切出1/2行与1/2列
print(a[1:,1:])

ndarray数组的掩码操作

# 演示ndarray对象的掩码操作
import numpy as np 
a = np.array([1,2,3,4,5,6,7,8])
f = np.array([True,False,True,False,True,False,True,False])
print(a[f])
print(a[a > 3])
# 把1~100中3的倍数或7的倍数都打印出来
b = np.arange(1,101)
flag_a = b % 3 == 0
flag_b = b % 7 == 0
print(flag_a)
print(flag_b)
flag = np.any([flag_a,flag_b],axis=0) 
print(b[flag])

多维数组的组合与拆分

垂直方向的操作:vstack() vsplit()

# 多维数组的组合与拆分
import numpy as np 
a = np.arange(1,7).reshape(2,3)
b = np.arange(7,13).reshape(2,3)

# 垂直方向操作
c = np.vstack((a, b))
print(c)
a, b = np.vsplit(c, 2)
print(a,'\n', b)
print('='*50)

水平方向的操作:hstack() hsplit()

#水平方向操作
d = np.hstack((a,b))
print(d)
a,b = np.hsplit(d,2)
print(a,'\n',b)
print('='*50)

深度方向的操作:dstack() dsplit()

#深度方向
e = np.dstack((a,b))
print(e)
a,b = np.dsplit(e,2)
print(a,'\n',b)
print('='*50)

多维数组组合与拆分的相关函数

#根据axis所指定的的轴向(0,1,2)进行多维数组的组合
#如果贷组合的两个数组都是二维数组
#axis=0 : 垂直方向
#axis=1 : 水平方向
#如果贷组合的两个数组都是三维数组
#axis=0 : 垂直方向
#axis=1 : 水平方向
#axis=2 : 深度方向
np.concatenate((a,b),axis=0)
#通过给定的axis轴向与拆分的份数对c数组进行拆分
np.split(c,2,axis=0)

长度不等的两个数组的组合操作

np.pad(ary,				  #原始数组
       pad_width=(0,1),    #补全方式(头部补0个,尾部补1个)
       mode='constant',    #设置补全模式为constant
       constant_values=-1) #设置补全值为-1
#测试不同长度的数组组合
a = np.arange(1,7)
b = np.arange(10,16)
c = np.pad(b,pad_width=(0,1),mode='constant',constant_values=-1)
print(a)
print(b)
print(c)

简单的一维数组的组合方案

a = np.arange(1,10)
b = np.arange(11,20)
#把a与b摞在一起成为两行
np.row_stack((a,b))
#把a与b并在一起成两列
np.column_stack((a,b))

numpy数组的其他属性

1.shape 维度

2.dtype 元素类型

3.size 数组元素个数

4.ndim 维数

5.itemsize 元素字节数

6.nbytes 数组总字节数

7.real 复数数组的实部

8.imag 复数数组的虚部

9.T 数组对象的转置试图

10.flat 返回数组的扁平迭代器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值