第 8 课 数据分析初步

讲的是利用Python进行数据控制、处理、整理、分析等方面的具体细节和基本要点。

  • 为什么是 Python 用于数据分析?

    1. Python 成功的部分原因是其能轻松地集成和调用 C、C++、Fortran 代码。大部分现代计算软件利用了一些 Fortran和 C 库来实现线性代数、积分、快速傅里叶变换等算法。许多企业和国家实验室也利用 Python 粘合来已经用了30多年的遗留软件系统。
    2. Python 和自然语言相似,很多科研人员和程序员非常喜欢,因此产生了第3点👇。
    3. Python 有很多高效、实用的类库,并可以方便地建立网站、爬取数据、数据分析、进行机器学习。
  • 库以及 pip 软件管理

    • library (类、库)是什么
    import time
    from time import sleep
    • pip 类库管理

    • pip 文档地址:https://pypi.org/project/pip/

    • 更换数据源:清华源地址

      • 升级 pip 到最新的版本 (>=10.0.0) 后进行配置:
      pip install pip -U
      pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple/
      pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
      # 阿里源
      pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
      # 腾讯源
      pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
      # 豆瓣源
      pip config set global.index-url http://pypi.douban.com/simple/
    • 如果您到 pip 默认源的网络连接较差,临时使用本镜像站来升级 pip:

      pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
    • 安装

      python -m pip install SomePackage            # latest version
      python -m pip install SomePackage==1.0.4     # specific version
      python -m pip install 'SomePackage>=1.0.4'     # minimum version
      # -m 的含义表示将库当作脚本来执行。
      pip install SomePackage            # latest version
      pip install SomePackage==1.0.4     # specific version
      pip install 'SomePackage>=1.0.4'     # minimum version
      pip freeze > requirements.txt
      pip install -r requirements.txt
      pip list  #   list installed packages
    • 卸载

      python -m pip uninstall SomePackage
    • 更新

      pip install package_name --upgrade
    • 科学计算的常用类库:

    • NumPy 是以矩阵为基础的数值计算模块,提供高性能的数组对象。文档地址:http://www.numpy.org/

    • Pandas 是基于 NumPy 的一种工具,纳入了一些标准的数据模型,提供了处理数字图表和时序数据的数据结构和操作功能,常用于金融数据分析。文档地址:https://pandas.pydata.org/

    • Scipy 是基于 NumPy 的一种高级数据处理工具,提供最优化、回归、插值、线性代数模块、傅里叶变换、信号和图像处理,常微分方程求解器等功能。文档地址:http://www.scipy.org/

    • Matplotlib 是2D绘图工具,常用于可视化展示数据。文档地址:http://matplotlib.org/

    • 其他类库

    • seaborn 是基于 Matplotlib 的更加美观的绘图工具。文档地址:https://seaborn.pydata.org/

    • anaconda 是科学计算常用的环境管理工具,什么是环境?

  • NumPy 初步

    • Python 自带的数据类型性能低。

    • jupyter 文档地址 pip install jupyterlab

    • 数据类型:ndarray

    • 特点:数组里面每一个元素是相同类型。

    • 手动创建数组

      import numpy as np    # 推荐如此导入Numpy
      vec = np.array([0, 1, 2, 3])
      mat = np.array([[0, 1, 2], [3, 4, 5]])
      mat.ndim
      mat.shape
      mat.dtype
      len(mat)    
    • 函数创建数组

      a = np.arange(9)
      b = np.arange(2, 2, 2)
  • 指定长度的数组

      c = np.linspace(1, 6, 6) 
  • 特殊的数组

      np.ones((2, 2)) # tuple
      np.eye(3) #   单位矩阵
      np.diag(np.array([1, 2, 3, 4]))   #   对角阵
      np.random.rand(4) #   随机数组
    
      np.random.seed(0)  # 设定随机种子,保证实验的可重现
      x1 = np.random.randint(10, size=6)  # 一维数组
      x2 = np.random.randint(10, size=(3, 4))  # 二维数组
      x3 = np.random.randint(10, size=(3, 4, 5))  # 三维数组
  • 内置数据类型

    • 明确定义数组数据类型:(默认数据类型是浮点型)
        tmp = np.array([1, 2, 3], dtype=float)
    • 所有内置类型
        f = np.array([1+2j, 3+4j, 5+6*1j])  #   j为虚部
        f.dtype
        b = np.array([True, False, False, True])
        s = np.array(['Bonjour', 'Hello', 'Hallo',])
        # int32
        # int64
        # uint32
        # uint64
    • 更多内容在下节

课后作业

  • 安装 pip 环境,和那几个数据分析库并且运行上述代码。

如何把自己送上火星

早在2014年,美国航天局(NASA)发起活动,邀请全世界的人提交他们的名字,乘客们将获得一张电子版的登机牌。当然,活动的名字是「把你的名字送上火星」,登记的名字将被存储到一个芯片里。

这是我去年拿到的太空登机牌。

BoardingPass_MyNameOnMars_Mars2020

上面写着,发射点是佛罗里达州卡纳维拉尔角,终点站是火星的耶泽罗撞击坑,运载火箭型号是擎天神5号。在三十天后,也就是2021年2月18日,毅力号火星车和机智号无人直升机将在火星着陆。机智号也是第一架在火星登陆的飞机。

截止到我写这篇文章的时候,中国共有41982人参与。打开网站,最好用电脑,目前还能参与:

https://mars.nasa.gov/mars2020/

你只需要填写你的名字、国家、邮箱,就可以获得你的登机牌,你的名字也将在30天后到达另一个6000万公里外的星星。

那个星球,遍布氧化铁构成的沙砾,因此呈现一片橘红。它没有大气层,如果我们在那,就可以清晰看见夜空中的星星。世界各地的名字以电子的形式,在元器件上构成一种独特的排列。毅力号带着它们,在红色大陆上,踽踽独行。多么凄美啊。

{31E04BAD-713F-40C5-B2BC-503DC94B3FEF}
mar4C8}
martests

「好奇号」传回的照片

第 7 课 面向对象的类设计

课程代码链接

  • 类设计

    • 参数传递

    • 作用域的实质

    • 内存绑定 : 如何编写带输出参数的函数(通过引用调用)?

    • 不可更改的类型 可以修改的类型
      string list
      tuple dict
      float
      int
      float
    • 保护数据

    • 私有属性 self.__name

    • 私有方法 self.__function_name()

    • 继承与多态

    • 理解为子承父业。

    • 父类(基类)和子类(派生类)

    • 覆盖方法

    • 多态:不同类型调用不同的实现。

  • dict 字典 {key: value}

    • dict_name [key] = value
    • del dict_name[key] dict_name.get()
    • dict_name[key] = value
    • dict_name[key]

第 6 课 类与数据结构

课程提纲

面向对象的类

  • 类(类型),是特殊的数据结构
  • 为什么要有类和对象?封装,把代码实现的细节覆盖。类就像一条生产线,就像一个完美模具。柏拉图的理型论认为:先有了这个理型世界,然后这个世界会按照这个完美的模子发展着。
  • 类设计:数据与行为(鸭子的模具,数据:声音、形状、颜色,行为:叫、游泳)
    • 方法:类中定义的函数。(鸭子的行为)
    • 对象:通过类定义的数据结构实例。(用模具创造一个鸭子)
    • 定义一个类(设计一个鸭子的模具)
    • class
    • def __init__
    • self 代表类的实例,而非类
    • 创建和使用
    • instance.method_name() instance.member
    • class_name.method_name() class_name.member

计算机领域的数据结构(了解即可):集合、数组、队列、栈、树、图等

  • 集合关系 set
    • 结构:元素无序地组织
    • 操作:{交、并、补 | 集合与集合之间}、{ 存、取、查找 | 集合内元素 }
    • 例子:是否有人迟到?
  • 线性结构,一对一,前驱后继关系
    • 列表
    • 队列(可用list实现),先进先出 queue
      • 结构:像排队一样
      • 操作:增add() 、删pop()
    • 栈(可用list实现),先进后出
      • 结构:像桶一样
      • 操作:增、删
  • 树状结构,一对多
    • 二叉树
      • 结构:像族谱图
      • 110511_WqcR_2348884
    • m叉树
  • 图状结构,多对多
      • 结构:像地图一样
      • 操作:增、删
  • 特殊的数据结构
    • 字典 dict

Python 中的数据结构

集合关系 set

  • 结构:元素无序地组织 \ 无重复元素
  • 操作:初始化 set() {}
    • 逻辑运算 not ==
    • add()
    • remove(key) clear() pop()
    • 改 不可改!
    • in
    • setA & setBsetA | setB 差集setA - setB 对等差分 setA ^ setB

课后作业

注:那个爬虫作业取消,感觉还是太难,爬虫代码在这:https://github.com/xrandx/Dating-with-python-this-winter/blob/master/douban_book.py (存在 bug:定位的逻辑不对,只能爬页数大于1且小于11的读书页面)

队列(queue)是一种先进先出(FIFO, First-In-First-Out)的、操作受限的线性表。在具体应用中通常用链表或者数组来实现。

队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行取出操作。队列的容量是它能容纳元素的多少,队列的大小是元素已经占用的空间多少。

请定义一个 Queue 类,基于 list 实现如下的方法:

    queue = Queue()
    queue.enqueue()  # 将任意对象从队尾入队
    queue.dequeue()  #  使队头对象出队
    queue.size()  # 返回队列的长度(int)
    queue.capcity() #   返回队列的容量(int)
    queue.is_full() #   队列是否已满(bool)
    queue.is_empty()    #   队列是否为空 (bool)

第 5 课 函数、作用域与递归

第 5 课 函数、作用域与递归

注意标准库文档入门教程

课程纲要

变量

  • 函数(必须掌握):接收输入、提供输出的东西

    • 关键字def 与参数:定义一个 echo()(回声),参数、默认参数和关键字参数

    • 返回值和 return 语句:

    • def function_name:
      do_something()
        return something 
    • None 值:NoneType数据类型,如果你不返回任何值。(type)

    • 诀窍:一个函数最好不要超过40行。

  • 作用域(掌握思想):

    • 起因:公用私用问题,保护数据。尽量不要使用全局变量。
    • 规则(不应该背下来):
    • 局部变量不能在全局作用域内使用
    • 局部作用域不能使用其他局部作用域内的变量
    • 全局变量可以在局部作用域中读取
    • global 关键字
  • 递归(掌握如何写递归函数):函数自己调用自己

    • 例子:

    • 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?「从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?『从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……』」

    • 直播例子

    • 数学归纳法:

      • 证明 「第一张骨牌会倒。」
      • 证明 「只要任意一张骨牌倒了,其下一张骨牌也会因為前面的骨牌倒而跟著倒。」
      • 则可下结论:所有的骨牌都会倒下。
    • 如何写递归函数:

    • 确定初始条件和函数的作用

    • 由"情况 n" 变化到"情况 n+1"

    • 确定递归结束的条件

    • 题目:

    • 斐波那契数列 用递归做太慢,只借鉴思路。

    • 递归乘法

课后作业

  • 定义一个gcd(m, n)函数,该函数可以求出m与n的最大公约数,用辗转相除法递归实现。
  • 用递归实现阶乘函数factorial(n),对于任意的整数n都能返回其对应的阶乘。
  • 跳水板

第 4 课 计算的本质

第 4 课 计算的本质

上次的课后作业

:如果你不理解视频里的内容,不要反复观看试图理解,不懂的先去群里问,或者去看答案,重要的是去练习,我们不能从概念到概念,而是应该从实践(解决问题),然后再结合理论知识。

只有实践的经验才会转换为你的编程能力。

  1. 程序要满足:输入分数 x (0 < x < 100),程序输出分数对应的等级:x < 60 不及格,60 < x < 80 及格,80 < x < 90 良好,90 < x < 100 优秀。

    scope = float(input("the scope euquals to "))
    if scope < 60:
       print("不及格")
    elif 60 <= scope < 80:
       print("及格")
    elif 80 <= scope < 90:
       print("良好")
    elif 90 <= scope <= 100:
       print("优秀")
  2. 程序要满足:首先输入一个整数 n ,然后程序连续接受输入 n 个数字,最终程序输出 n 个数字的平均值。

    n = int(input("n = "))
    total = 0.0
    for i in range(n):
       total += float(input())
    print("the average value is {0}".format(total / n))
  3. 左旋转字符串

    class Solution(object):
       def reverseLeftWords(self, s, n):
           """
           :type s: str
           :type n: int
           :rtype: str
           """
           # s n
           return s[n:] + s[0:n]
  4. 一维数组的动态和

    class Solution:
       def runningSum(self, nums):
           """
           :type nums: List[int]
           :rtype: List[int]
           """
           if nums is None:
               return []
           for i in range(1, len(nums)):
               nums[i] = nums[i] + nums[i-1]
           return nums

课程纲要

计算的本质:符号、模型、数黄瓜的故事。

  • 现实:左边4根黄瓜,右边2根黄瓜

  • 符号:

    • 4 + 2
    • 四 加 二
    • 肆 加 贰
    • 叽里 哼哈 呱啦
  • 模型:10 根手指、画“正”字、算盘…… (可操作模型)

  • 计算图模型:更加本质的模型。加法器:具体怎么计算我们并不关心。函数1

  • 表达式:(2 + 4) * 3 函数2

    • 数字是表达式;递归

    • 表达式 + 表达式。两个表达式相加是表达式;

    • 表达式 - 表达式。两个表达式相减是表达式;

    • 表达式 * 表达式。两个表达式相乘是表达式;

    • 表达式 / 表达式。两个表达式相除是表达式;

    (即构成表达式 运算符 表达式 的顺序的式子是表达式)

    • 图示 表达式

    • 验证 (2 + 4) * 3 是表达式

    • 变量与赋值

    • 表达式 (2 + 4) * 7 + ((12 - 3) * 6) / 2 过于复杂;

    • 用名字代表中间的过程,例如:爸爸的妹妹的老公,叫做「姑丈」;

    • a = (2 + 4) 原式 = a * 3

  • 函数:t -> 2*t

    function1

    function2 (1)

  • 参数和变量

    变量

  • 函数:有名字的运算过程

    a = 2 + 4

    f = t -> t * 2

    f(t) = t * 2

  • 函数调用 f(2)

  • 分支

    branch

    t -> if (t < 22) 
       {
         "hotpot"
       }
       else 
       {
         "ice cream"
       }
  • 变量的类型,不同的符号有不同的用途

    • 4 + 2 ( 数字 )
    • 四 加 二 、肆 加 贰 、兔子、鸡、abc、21411 (字符串)
    • 是,否 (布尔型)
  • 抽象:屏蔽具体的细节和步骤,只考虑输入和输出。例如:出租车司机的案例、圆的面积公式 pi*r^2

  • 注:本篇文章的内容大部分来源于 https://www.yinwang.org/blog-cn/2018/04/13/computer-science