什么是数据分析?
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。
使用python做数据分析的常用库
numpy 基础数值算法scipy 科学计算matplotlib 数据可视化pandas 序列高级函数用np.ndarray类的对象表示n维数组
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary))元数据(metadata)
存储对目标数组的描述信息,如:dim count、dimensions、dtype、data等。
实际数据
完整的数组数据
将实际数据与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少对实际数据的访问频率,提高性能。
数组的维度: np.ndarray.shape
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary), ary, ary.shape) #二维数组 ary = np.array([ [1,2,3,4], [5,6,7,8] ]) print(type(ary), ary, ary.shape)元素的类型: np.ndarray.dtype
import numpy as np ary = np.array([1, 2, 3, 4, 5, 6]) print(type(ary), ary, ary.dtype) #转换ary元素的类型 b = ary.astype(float) print(type(b), b, b.dtype) #转换ary元素的类型 c = ary.astype(str) print(type(c), c, c.dtype)数组元素的个数: np.ndarray.size
import numpy as np ary = np.array([ [1,2,3,4], [5,6,7,8] ]) #观察维度,size,len的区别 print(ary.shape, ary.size, len(ary))数组元素索引(下标)
数组对象[…, 页号, 行号, 列号]
下标从0开始,到数组len-1结束。
import numpy as np a = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(a, a.shape) print(a[0]) print(a[0][0]) print(a[0][0][0]) print(a[0, 0, 0]) for i in range(a.shape[0]): for j in range(a.shape[1]): for k in range(a.shape[2]): print(a[i, j, k])Numpy的内部基本数据类型
类型名类型表示符布尔型bool_有符号整数型int8(-128~127)/int16/int32/int64无符号整数型uint8(0~255)/uint16/uint32/uint64浮点型float16/float32/float64复数型complex64/complex128字串型str_,每个字符用32位Unicode编码表示自定义复合类型
# 自定义复合类型 import numpy as np data=[ ('zs', [90, 80, 85], 15), ('ls', [92, 81, 83], 16), ('ww', [95, 85, 95], 15) ] #第一种设置dtype的方式 a = np.array(data, dtype='U3, 3int32, int32') print(a) print(a[0]['f0'], ":", a[1]['f1']) print("=====================================") #第二种设置dtype的方式 b = np.array(data, dtype=[('name', 'str_', 2), ('scores', 'int32', 3), ('ages', 'int32', 1)]) print(b[0]['name'], ":", b[0]['scores']) print("=====================================") #第三种设置dtype的方式 c = np.array(data, dtype={'names': ['name', 'scores', 'ages'], 'formats': ['U3', '3int32', 'int32']}) print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize) print("=====================================") #第四种设置dtype的方式 d = np.array(data, dtype={'name': ('U3', 0), 'scores': ('3int32', 16), 'age': ('int32', 28)}) print(d[0]['name'], d[0]['scores'], d.itemsize) print("=====================================") #第五种设置dtype的方式 e = np.array([0x1234, 0x5667], dtype=('u2', {'lowc': ('u1', 0), 'hignc': ('u1', 1)})) print('%x' % e[0]) print('%x %x' % (e['lowc'][0], e['hignc'][0])) print("=====================================") #测试日期类型数组 f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01']) f = f.astype('M8[D]')#转换日期数据类型 f = f.astype('int32') print(f[3]-f[0]) print("=====================================") a = np.array([[1 + 1j, 2 + 4j, 3 + 7j], [4 + 2j, 5 + 5j, 6 + 8j], [7 + 3j, 8 + 6j, 9 + 9j]]) print(a.T) for x in a.flat: print(x.imag)类型字符码
类型字符码np.bool_?np.int8/16/32/64i1/i2/i4/i8np.uint8/16/32/64u1/u2/u4/u8np.float/16/32/64f2/f4/f8np.complex64/128c8/c16np.str_U<字符数>np.datetime64M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]字节序前缀,用于多字节整数和字符串: </>/[=]分别表示小端/大端/硬件字节序。
类型字符码格式
<字节序前缀><维度><类型><字节数或字符数>
3i4释义3i4大端字节序,3个元素的一维数组,每个元素都是整型,每个整型元素占4个字节。<(2,3)u8小端字节序,6个元素2行3列的二维数组,每个元素都是无符号整型,每个无符号整型元素占8个字节。U7包含7个字符的Unicode字符串,每个字符占4个字节,采用默认字节序。视图变维(数据共享): reshape() 与 ravel()
import numpy as np a = np.arange(1, 9) print(a) # [1 2 3 4 5 6 7 8] b = a.reshape(2, 4) #视图变维 : 变为2行4列的二维数组 print(b) c = b.reshape(2, 2, 2) #视图变维 变为2页2行2列的三维数组 print(c) d = c.ravel() #视图变维 变为1维数组 print(d)复制变维(数据独立): flatten()
e = c.flatten() print(e) a += 10 print(a, e, sep='\n')就地变维:直接改变原数组对象的维度,不返回新数组
a.shape = (2, 4) print(a) a.resize(2, 2, 2) print(a)ndarray数组的掩码操作
import numpy as np a = np.arange(0, 10) mask = [True, False,True, False,True, False,True, False,True, False] print(a[mask])多维数组的切片操作
import numpy as np a = np.arange(1, 28) a.resize(3,3,3) print(a) #切出1页 print(a[1, :, :]) #切出所有页的1行 print(a[:, 1, :]) #切出0页的1行1列 print(a[0, :, 1])