Python数据处理学习过程

文章目录

    • 第一步:基础IO操作
      • 文本对象读写
      • 图像读写
      • 读写csv文件
    • 第二步:掌握更高效的数据处理方法
      • numpy这个利器你值得拥有
        • 基本数据格式和操作
        • numpy数组
          • numpy数组方便在何处?
          • 创建np数组:
      • pandas让你提取数据从此不犯难
        • 基础处理
          • pandas核心数据结构
          • 基本操作
          • 运算
          • 画图
          • IO操作
        • 高级处理
    • 第三步:游走数据之间,用统计的方法探索数据之间的规律
      • 线性回归
      • 过拟合、欠拟合
      • 岭回归
      • 逻辑回归
      • K-means聚类
    • 第四步:深度学习之旅

第一步:基础IO操作

文本对象读写

需要掌握文件的读写的各种基础方法:

基本文件的打开方式:

fp = open('file_name', 'mode')  #其实就是生成一个文件对象
...
...
fp.close()

mode可选,会有不同的效果:

    'r'       open for reading (default)
    'w'       open for writing, truncating the file first
    'x'       create a new file and open it for writing
    'a'       open for writing, appending to the end of the file if it exists
    'b'       binary mode
    't'       text mode (default)
    '+'       open a disk file for updating (reading and writing)

也可以用此方法更方便的创造一个文件对象:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

打开文件对象之后,就可以进行读/写了:

f.read() #一次性读取整个文件
f.read(4) #读取四个字节

f.write(astr)

迭代文件内容:

>>> for line in f.readlines():
...     print(line, end='')
...
文件内容第一行显示
文件内容第二行显示
等等

或者可以这样迭代,更加方便:

>>> for line in f:
...     print(line, end='')
...
文件内容第一行显示
文件内容第二行显示
等等

python对象的序列化:
如果是基础的数据结构,其中的内容也都是可用文本看到的,用json序列化。如果是复杂的python对象,用pickle序列化。

例如:

#对象序列化到本地
with open('a_list.txt', 'w') as f:
	a_list = [1,2,3,4]
	json.dump(a_list, f)
#这样就将a_list这个对象存储到了本地的一个文本文件中
#下次直接从这个文本文件中加载,就能获得a_list这个对象
#json.dump(ensure_ascii=True)默认为ensure_ascii=True,这样会让存储到本地文件中的中文显示‘乱码’。改成True就好了。
#从本地加载一个对象
with open('a_list.txt') as f:
	the_list = json.load(f)

json还有.loads()dumps()的方法,可以将信息从字符串python对象之间来回转换。

一个复杂的对象,比如一个function对象,存储到本地也看不出是什么东西,是不能用json存储的,因为json的存在就是为了方便各种编程语言交换数据。如果不能用文本交换数据的话,就违反了json存在的原则了。所以我们需要pickle这个库。

pickle的使用方法和json类似,不再赘述。

图像读写

处理图像数据需要PIL.Image这个库。可以用这个库读取、修改、甚至创造图像。
安装这个库pip install Image

#打开图像,获取图像的一些数据:
from PIL import Image
#获取图像对象
img = Image.open('test.png')
#获取图片高度、宽度
h, w = img.size
#用默认图片查看软件查看图片:
img.show()
#查看图片文件名:
img.filename
#获取图片的像素:
img.getpixel((heighth, weighth))
#如果图片是RGB三维的,那么就会得到如下格式的数据:(62, 131, 200)
#如果图片是灰度图,会得到一个数值
#如果是黑白图,会得到0或者1

#将RGB图片转换为二值图像
img_gray = img.convert('L') #先转化为灰白图
tab = [0 if i < 160 else 1 for i in range(256)]
black_white_img = img_gray.point(tab) #灰白图转化为黑白图

#图片的保存:
img.save('file_name.png')

读写csv文件

需要使用python内置的csv模块

csv.reader(iterable, delimiter=',')
csv.writer(fileobj, delimiter=',')
#打开了读、写器之后,就可以方便的读写csv文件了。

csv模块只适合简单读取、遍历.csv文件,不适合做复杂的筛选、修改工作。后者这样的工作要交给pandas这个神器。所以这里暂时先一笔带过。

第二步:掌握更高效的数据处理方法

numpy这个利器你值得拥有

总览Numpy框架:

基本数据格式和操作

  • 基本整形:np.int8、np.int16、np.int32、np.int64等
  • 基本浮点型:np.float16、np.float32、np.float64等
  • 加减乘除:np.add()、np.subtract()、np.multiply()、np.divide()。或者直接用+ - * /这些符号也可以。

numpy数组

numpy的核心是ndarray对象,它是封装了python基本数据类型的n维数组。numpy数组有如下几个特点:

  • 无法修改一个已经创建好的numpy数组
  • 一个numpy数组所有数据类型相同
  • numpy数组包括大量的矩阵运算方法
numpy数组方便在何处?

比如计算两个数组对位相乘:

  1. python数组实现:
a = [1, 2, 3]
b = [4, 5, 6]
ans = [i*j for i, j in zip(a, b)]
  1. numpy数组实现:
a = np.array([1,2,3])
b = np.array([4,5,6])
ans = a*b

np数组让计算更接近数学符号!np的计算面向np的数组,而不是其中的一个一个元素。

np数组的属性:

  • ndarrary.dtype:元素类型
  • nparray.shape:数组的结构
  • nparray.size:元素个数
  • nparray.real:元素实部
  • nparray.imag:元素虚部
  • nparray.astype():修改元素类型
  • nparray.reshape():重新修改元素的结构,但是修改后元素的个数不能改变
创建np数组:
  1. 创建简单数组

    np.array([1,2,3,4]).reshape((2,2)).astype(np.float)
    np.zeros(shape, dtype=float) #纯零矩阵
    np.ones(shape, dtype=float) #纯幺矩阵
    np.eye(N, dtype=float) #单位矩阵
    np.empty(shape, dtype=float) #空阵
    
  2. 创建随机矩阵

  • np.random.rand(axis1, axis2, axis3, …, axisn)
    uniform distribution over [0, 1)
  • np.random.ranint(low, high=None, size=None, dtype=l)
    uniform distribution over [low, high) of size
  • np.random.randn(axis1, axis2, axis3, …, axisn)
    standard normal distribution. u=0, sigma=1
  • np.random.random(size=None)
    uniform distribution over [0, 1)
  • np.random.random_integers(low, high=None, size=None)
    discrete uniform distribution over [low, hgih] of type np.int
  1. 在指定范围创建数组

    np.arange(low, high, step=) #开区间,包括low,不包括high
    np.linsapce(low, high, num=) #闭区间,包括low, high
    
  2. 从已有数组创建新数组

    np.asarray(array, dtype=None) #获取一个数组array的副本,拥有和array相同的地址
    np.empty_like(a) #创建和a相同形状的一个空数组
    np.zeros_like(a) #创建和a相同形状的一个全零数组
    np.ones_like(a) #创建和a相同形状的一个全幺数组
    
  3. 构造复杂数组

    整个数组的重复

    np.tile(a, n) 
    #如果a=array([1, 2, 3]), 用此方法重复3次后,得到array([1, 2, 3, 1, 2, 3, 1, 2, 3])
    

    数组内各个元素的重复

    np.repeat(a, 3)
    或者
    a.repeat(3)
    #如果a=array([1, 2, 3]), 用此方法重复3次后,得到array([1, 1, 1, 2, 2, 2, 3, 3, 3])
    

    数组的合并
    append

    np.append([1,2,3],[[4,5,6],[7,8,9]])
    >>>array([1, 2, 3, 4, 5, 6, 7, 8, 9])
    np.append([[1,2,3]], [[4,5,6]], axis=0)
    >>>array([[1, 2, 3],
       [4, 5, 6]])
    np.append([[1,2,3]], [[4,5,6]], axis=1)
    >>>array([[1, 2, 3, 4, 5, 6]])
    

    concatenate与append基本相似,只不过是把两个合并对象合并到了一个元组内

    np.concatenate(([[1,2,3]], [[4,5,6]]), axis=0)
    >>>array([[1, 2, 3],
       [4, 5, 6]])
    

    数组拆分

pandas让你提取数据从此不犯难

何为pandas?:panel + data + analysis
panel:面板数据——计量经济学
基于matplotlib,能简便的画图
基于numpy,在计算上有较大优势
支持多种类型的文件的读写

基础处理

pandas核心数据结构

有三大数据结构:

  • DataFrame
    DataFrame相当于有行索引和列索引的二维表。
    常用属性:
  • Panel
  • Series
基本操作
运算
画图
IO操作

高级处理

第三步:游走数据之间,用统计的方法探索数据之间的规律

线性回归

过拟合、欠拟合

岭回归

逻辑回归

K-means聚类

第四步:深度学习之旅

你可能感兴趣的:(机器学习,python,数据处理)