社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

AI科技大本营 • 6 年前 • 569 次点击  

翻译 | 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可以包含各种数据类型。我们可以用“[]”创建:


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末尾的所有元素。


示例代码:


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处的第一个元素。


示例代码:


# 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 [:]。


示例代码:


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关键字来编写函数:


示例代码:





    

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中的字符串型,浮点型,整型和布尔型等,每个数据结构都是一个对象。而函数则是根据对象类型用于特定对象的方法,因此,每个对象都有一个特定的类型和一组对应于该类型的函数。


示例代码:


# 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]


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


示例代码:


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文件中。我们可以从中导入整个软件包、子模块或特定的函数。另外,我们还可以给软件包添加一个别名。导入语句的方式如下:


简单的导入语句:


import numpy
numbers = numpy.array([3, 4, 20, 15, 7, 19, 0])


使用别名导入语句:


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


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


# import the "pyplot" submodule from the "matplotlib" package with alias "plt"
import matplotlib.pyplot as plt


从包中只导入一个函数:


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数组-类型转换:


np.array([False, 42, "Data Science"])       # array(["False", "42", "Data Science"], dtype="
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数组上的运算符:


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维数组子集:


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进行一些基本的统计操作:


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


招聘

新一年,AI科技大本营的目标更加明确,有更多的想法需要落地,不过目前对于营长来说是“现实跟不上灵魂的脚步”,因为缺人~~


所以,AI科技大本营要壮大队伍了,现招聘AI记者和资深编译,有意者请将简历投至:gulei@csdn.net,期待你的加入!


如果你暂时不能加入营长的队伍,也欢迎与营长分享你的精彩文章,投稿邮箱:suiling@csdn.net


AI科技大本营读者群(计算机视觉、NLP、Python、AI+金融方向)正在招募中,后台回复:读者群,联系营长,添加营长请备注姓名,研究方向。




☟☟☟点击 | 阅读原文 | 查看更多精彩内容


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/XApjdVTENF
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/7289
 
569 次点击