前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据科学Python基础(附示例代码和练习题目)

数据科学Python基础(附示例代码和练习题目)

作者头像
AI科技大本营
发布2018-04-26 16:46:50
1.4K0
发布2018-04-26 16:46:50
举报

翻译 | AI科技大本营

参与 | 王珂凝

审校 | reason_W

【AI科技大本营导读】Python的强大和灵活相信已经毋庸置疑了。那么数据科学中,我们又需要掌握哪些基础知识点才能满足使用需求呢?本文是国外一名数据科学博主的文章,文章不仅对Python中和数据科学有关的概念进行了解释,还配上了相应的示例代码和练习题目,非常适合想要入门数据科学的朋友。

▌Python中常见的数据类型

Python中有很多种数据类型。常见的数据类型有浮点型(float),整型(int),字符串型(str),布尔型(bool),列表(list)。

  • 浮点型-用于定义实数。
  • 整型-用于定义整数。
  • 字符串型-用于定义文本。可以使用单引号('value')、双引号("value")或三引号("""value""")定义字符串,其中使用三引号定义的字符串可以出现在多行上,新行中的字符串也包含在变量的值中。这些字符串都可以用在函数文档中。
  • 布尔型-用于定义真值,对数据执行过滤操作。
  • 列表-用于存储变量值的集合。

我们可以使用函数type(variable_name)来检查特定变量的数据类型。Python中运算符产生的结果会随着数据变量类型的变化而变化,每种运算符内部实现的方法都不同。

▌Python Lists

list是一个基本的序列类型,我们可以使用list存储一组包含任何数据类型的值,list虽然并不常用,但一个list可以包含各种数据类型。我们可以用“[]”创建:

代码语言:javascript
复制
fruits =["pineapple", "apple", "lemon","strawberry", "orange", "kiwi"]

list中的子集

我们可以使用索引从列表中获取元素。Python的列表索引从0开始,因此,列表中第一个元素的索引值为0。我们也可以使用负索引访问列表中的元素,若列表中最后一个元素的索引为-1,那么其前一个元素的索引为-2,依此类推。我们也可以用“list slicing” 获取这个list的子list:sliceable[start_index:end_index:step]

  • start_index是子list的开始索引,该索引指向的元素会是所得到的子list的第0个元素。
  • end_index是子list的结束索引,该索引指向的元素不会被包含在子list中。end_index的默认值是列表长度。step为步长值,代表索引每次增加的值,默认值为1。如果step为负,则end_index默认值为-列表长度-1。如果不设置step,则返回结果将是从start_index开始至list末尾的所有元素。

示例代码:

代码语言:javascript
复制
fruits = ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[1]  # apple
fruits[0]  # "pineapple"
fruits[-1] # "kiwi"
fruits[5]  # "kiwi"
fruits[-3] # "strawberry"


# List slicing
fruits[::]    # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[0:2]   # ["pineapple", "apple"]
fruits[-2:-1] # ["orange"]
fruits[3:]    # ["strawberry", "orange", "kiwi"]
fruits[:4]    # ["pineapple", "apple", "lemon", "strawberry"]
fruits[:]     # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi"]
fruits[::-1]  # ["kiwi", "orange", "strawberry", "lemon", "apple", "pineapple"]
fruits[::-2]  # ["kiwi", "strawberry", "apple"]
fruits[::2]   # ["pineapple", "lemon", "orange"]


# Understanding some default values
fruits[0:6:1]    # the same result as the result from fruits[::]
fruits[-1:-7:-1] # the same result as the result from fruits[::-1]

list的具体操作

  • 添加元素:我们可以使用附加方法或“+”号运算符把元素添加到list中。在Python中,如果对两个list使用“+”运算符,则将产生一个新的list,它会包含这两个list中所有的元素。
  • 将元素转变为list类型:我们可以使用前面在索引和list slicing部分提到的“[]”把元素转变成list类型。
  • 删除元素:我们可以使用remove(value)从list中进行元素删除操作。该方法将删除list中value处的第一个元素。

示例代码:

代码语言:javascript
复制
# Add values to a list
fruits.append("peach")
fruits # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach"]
fruits = fruits + ["fig", "melon"]

fruits # ["pineapple", "apple", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
# Change values from a list
fruits[0:2] = ["grape", "mango"]

fruits # ["grape", "mango", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]
# Delete values from a list
fruits.remove("mango")
fruits # ["grape", "lemon", "strawberry", "orange", "kiwi", "peach", "fig", "melon"]

了解Python中list在计算机中的工作机制也很有必要。当我们创建一个新的列表my_list时,这个list将被存储在计算机内存中,list的地址存储在my_list变量中。变量my_list并不包含列表中的元素,只是一个对列表的引用。如果我们用“=”复制一个列表,如:my_list_copy = my_list,那么我们在my_list_copy变量中复制的是其引用而不是列表中的值。如果想要复制列表中真实的值,则可使用list(my_list) 或slicing [:]。

示例代码:

代码语言:javascript
复制
numbers = [10, 42, 28, 420]
numbers_copy = numbers
numbers_copy[2] = 100
numbers      # [10, 42, 100, 420]
numbers_copy # [10, 42, 100, 420]


ratings = [4.5, 5.0, 3.5, 4.75, 4.00]
ratings_copy = ratings[:]
ratings_copy[0] = 2.0
ratings      # [4.5, 5.0, 3.5, 4.75, 4.0]
ratings_copy # [2.0, 5.0, 3.5, 4.75, 4.0]


characters = ["A", "B", "C"]
characters_copy = list(characters)
characters_copy[-1] = "D"
characters      # ["A", "B", "C"]
characters_copy # ["A", "B", "D"]

▌函数

函数是用来解决特定任务的一段可重用代码,我们可以使用def关键字来编写函数:

示例代码:

代码语言:javascript
复制
def is_prime(n):
    if n <= 1:
        return False
    elif n <= 3:
        return True
    elif n % 2 == 0 or n % 3 == 0:
        return False
    current_number = 5
    while current_number * current_number <= n:
        if n % current_number == 0 or n % (current_number + 2) == 0:
            return False
        current_number = current_number + 6
    return True

当然,Python中也有很多内置函数,如max(iterable [, key]), min(iterable [, key]), type(object), round(number[, ndigits])等。在很多情况下,当我们需要用到函数来解决特定任务时,可以通过查找内置函数或使用一个Python包来解决。

大部分函数都需要一些输入并返回输出,这些函数都有参数,Python将函数的输入和参数进行匹配,“[]”内的参数则是可选的。

我们可以使用函数help([object]) 或?function_name来查看所有函数的帮助文档。如果你是在Jupyter Notebook中使用help([object])函数的话,帮助文档将会在当前的单元格中显示,?function_name则会在分页器中显示帮助文档。

▌方法

我们已经知道Python中的字符串型,浮点型,整型和布尔型等,每个数据结构都是一个对象。而函数则是根据对象类型用于特定对象的方法,因此,每个对象都有一个特定的类型和一组对应于该类型的函数。

示例代码:

代码语言:javascript
复制
# String methods
text = "Data Science" 
text.upper() # "DATA SCIENCE"
text.lower() # "data science"
text.capitalize() # "Data science"


# Lists methods
numbers = [1, 4, 0, 2, 9, 9, 10]
numbers.reverse()
numbers # [10, 9, 9, 2, 0, 4, 1]
numbers.sort()
numbers # [0, 1, 2, 4, 9, 9, 10]

不同类型的对象可以对应相同名称的函数,根据不同的对象类型,函数会有对应的不同的行为。

示例代码:

代码语言:javascript
复制
numbers = [10, 30, 55, 40, 8, 30]
text = "Data Science"
numbers.index(8)  # 4
text.index("a")   # 1
numbers.count(30) # 2
text.count("i")   # 1

请注意!有些函数可以改变调用它们的对象,如:被list类型调用的append()函数。

▌Packages

一个模块是指一个包含Python定义和语句的文件。模块指定了解决特定问题的函数、方法和新的Python类型。

而软件包(package)则是目录中模块的集合。Python中有很多现成的软件包,它们覆盖了很多方面的问题,如:“NumPy”,“matplotlib”,“seaborn”和 “scikit-learn”都是非常著名的数据科学软件包。

  • NumPy用于高效的处理数组。
  • Matplotlib和seaborn是用于数据可视化的流行库。
  • scikit-learn是一个强大的机器学习库。

Python中默认有些软件包是预设的,但是也有很多Python中没有但是我们需要用到的软件包。如果我们想使用这些软件包,就必须先确认这个包已经安装过,或者使用pip命令(Python中预设的一个的软件包管理工具)进行安装。

当然我们也可以使用“Anaconda“。

Anaconda发行版是一个免费且易于安装的软件包管理器,环境管理器和Python发行版本,内置了1000多个免费社区支持的开源软件包。

如果你不想自己费事安装一些软件包的话,可以使用“Anaconda”,在这个发行版中内置了很多有用的软件包。

Import语句

一旦安装了所需要的软件包,就可以将它们导入我们的Python文件中。我们可以从中导入整个软件包、子模块或特定的函数。另外,我们还可以给软件包添加一个别名。导入语句的方式如下:

简单的导入语句:

代码语言:javascript
复制
import numpy
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])

使用别名导入语句:

代码语言:javascript
复制
import numpy as np # np is an alias for the numpy package
numbers = np.array([3, 4, 20, 15, 7, 19, 0]) # works fine
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # NameError: name 'numpy' is not defined

从具有别名的包中导入子模块:

代码语言:javascript
复制
# import the "pyplot" submodule from the "matplotlib" package with alias "plt"
import matplotlib.pyplot as plt

从包中只导入一个函数:

代码语言:javascript
复制
from numpy import array
numbers = array([3, 4, 20, 15, 7, 19, 0]) # works fine
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0]) # NameError: name 'numpy' is not defined
type(numbers) # numpy.ndarray

我们还可以使用from numpy import * 语句来进行导入,其中,*表示将该模块中所有的东西都导入到本文件中。该导入语句会在当前命名空间内创建一个面向所有用numpy模块定义的公共对象的引用。换句话说,我们可以使用numpy中所有的可用函数,并且只使用其名称而不需要带前缀。例如:你现在使用NumPy的绝对值函数可以直接这样用:absolute(),而不是:numpy.absolute()。

但是我不建议你这样使用,因为:

  • 如果你将一些模块中所有的函数都导入到文件中,那么当前的命名空间将会有太多的函数。以至于要是有人查看你的代码,很容易搞不清哪个函数对应哪个包。
  • 如果两个模块中的某个函数名称相同,那么第二个导入的模块将会覆盖第一个模块中相应的函数。

▌NumPy

Numpy是Python用于科学计算的一个基础软件包,它运行速度很快且易于使用。这个包帮助我们对元素进行逐元素的计算。

在Python中,常规的list不会逐元素进行计算。虽然也可以使用,但是list运行速度很慢,我们需要编写更多的代码才能达到自己想要的结果。在大多数情况下,Numpy是一个更好的选择。

与在Python中常规的list不同,Numpy数组中的元素只能有一个类型。如果将不同类型的数组传递给np.array(),则可以使用参数dtype表示不同的类型。若没有给出这个参数,那么数组类型将是保存对象所需的最小类型。

Numpy数组-类型转换:

代码语言:javascript
复制
np.array([False, 42, "Data Science"])       # array(["False", "42", "Data Science"], dtype="<U12")
np.array([False, 42], dtype = int)          # array([ 0, 42])
np.array([False, 42, 53.99], dtype = float) # array([  0.  ,  42.  ,  53.99])

# Invalid converting
np.array([False, 42, "Data Science"], dtype = float) # could not convert string to float: 'Data Science'

Numpy数组有自己的属性和方法。还记得前面我们提到Python运算符在不同的数据类型上会有不同的表现吗?Numpy中,运算符的表现就是逐元素运算。

Numpy数组上的运算符:

代码语言:javascript
复制
np.array([37, 48, 50]) + 1 # array([38, 49, 51])
np.array([20, 30, 40]) * 2 # array([40, 60, 80])
np.array([42, 10, 60]) / 2 # array([ 21.,   5.,  30.])
np.array([1, 2, 3]) * np.array([10, 20, 30]) # array([10, 40, 90])
np.array([1, 2, 3]) - np.array([10, 20, 30]) # array([ -9, -18, -27])

Numpy数组的数据类型为:nump.ndarry,ndarray代表着n维数组。上述例子中使用的是一维数组,我们也可以创建2,3,4或更多维数组。我们也可以独立于数组的维度来获取数组的子集。下面将以2维数组为例,获取2维数组子集:

代码语言:javascript
复制
numbers = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
    [10, 11, 12]
])

numbers[2, 1]     # 8
numbers[-1, 0]    # 10
numbers[0]        # array([1, 2, 3])
numbers[:, 0]     # array([ 1,  4,  7, 10])
numbers[0:3, 2]   # array([3, 6, 9])
numbers[1:3, 1:3] # array([[5, 6],[8, 9]])

如果想查看数组的维度和每个维度有多少个元素,则可以使用shape属性。对于2维数组来说,第一个元素表示行数,第二个元素表示列数。

基本的统计操作

分析数据首先需要熟悉数据,Numpy中有很多种方法可以做到这一点。下面是统计数据的基本方法。

  • np.mean() –会返回数组内元素的算术平均值(元素的总和除以元素的长度)。
  • np.median() –会返回数组内元素的中位数(数组排完序后计算得到的中位数,如果数组长度为偶数,则返回数组两个中间值的平均值)
  • np.corrcoef() -返回相关系数矩阵。用于查看数据集中两个(数组长度相同的)变量之间是否存在相关性。
  • np.std() -返回标准差。

使用Numpy进行一些基本的统计操作:

代码语言:javascript
复制
learning_hours = [1, 2, 6, 4, 10]
grades = [3, 4, 6, 5, 6]
np.mean(learning_hours)   # 4.6
np.median(learning_hours) # 4.0
np.std(learning_hours)    # 3.2
np.corrcoef(learning_hours, grades) # [[ 1.          0.88964891][ 0.88964891  1.        ]]

从上面这个例子中我们可以看出,learning_hours和grades之间有很高的相关性。

另外,也可以发现:

  • learning_hours的平均值是4.6。
  • learning_hours的中间值是4.0。
  • learning_hours的标准差是3.2。

Numpy中的一些基本的函数在Python的列表中也存在,如 np.sort() 和np.sum() 。但是需要注意的是,Numpy在数组中会强制执行单一类型,这会加快程序的计算速度。

▌练习

我准备了一些练习如下,如子集,元素操作和一些基本统计操作。

  • 获取list的子集
  • 获取2维Numpy数组子集
  • Numpy元素操作
  • Numpy的基本统计操作

原文链接:https://towardsdatascience.com/Python-basics-for-data-science-6a6c987f2755

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 翻译 | AI科技大本营
  • 【AI科技大本营导读】Python的强大和灵活相信已经毋庸置疑了。那么数据科学中,我们又需要掌握哪些基础知识点才能满足使用需求呢?本文是国外一名数据科学博主的文章,文章不仅对Python中和数据科学有关的概念进行了解释,还配上了相应的示例代码和练习题目,非常适合想要入门数据科学的朋友。
    • ▌Python中常见的数据类型
      • ▌Python Lists
        • list中的子集
      • ▌函数
        • ▌方法
          • ▌Packages
            • Import语句
              • ▌NumPy
                • 基本的统计操作
              • ▌练习
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档