本文首发在集智专栏python
本文较长,全是干货,建议收藏后做为长期的学习指南。web
前段时间咱们分享过如何一步步经过Python成为数据分析高手:戳这里算法
不过这篇指南只是从宏观上指引了你们的学习步骤以及经过哪些资源学习,咱们今天接着详细谈谈怎样依靠Python从零开始成为一名数据分析师,期间会以一个借贷数据集为例,分享利用Python进行数据分析所需的基础知识和工具,相信能为你借助Python迅速成为数据分析师提供一些帮助。express
1.用于数据分析的Python基本知识编程
2.Python库和数据结构数组
3.利用Python和Pandas进行探索性数据分析浏览器
4.用Python的Pandas进行数据再加工bash
5.用Python建立预测模型,根据数据作预测网络
集智注:本文原做者为数据科学家Kunal Jain,其毕业于印度最顶尖的IT院校印度理工学院,从事数据科学领域已逾10年,在英国和印度等多家大型跨国公司担任资深数据分析师。数据结构
大概几年前,在SAS领域工做了5年后,我(做者Kunal Jain——译者注)决定走出个人温馨区,励志成为一名数据科学家。在多方寻找能助我成为数据科学家的学习工具后,我最终决定选择Python。
我一直都很喜欢写代码,这是我心里的热爱。
我花了大概一周的时间学习了Python的基础知识,而后不只我本身深刻掌握了这门语言,还帮助了其余人也学习了Python。最初Python是一种通用语言,可是随着这些年的发展和强大的社区支持,Python涌现了不少用于数据分析和预测建模的程序库。
因为不少人尚不知道如何将Python用于数据科学以及缺乏相关的资源,我决定写这篇教程,帮更多人更快的学习Python。在教程中,我也会教你们如何用Python进行数据分析,最终熟练掌握,为己所用。
为什么学习Python用于数据分析?
近年来,Python被不少人选择用于数据分析,我将它和SAS、R语言作了一番比较,以为如下是你学习Python用于数据分析的好处:
固然也存在一些缺点:
它是一门解释性语言而非编译语言,所以会花费更多的CPU时间。不过考虑到咱们能大幅节约编程学习时间(由于很容易学),二者相抵,这算不上是什么大缺点。
安装Python有2种方法:
1.你能够从Python的项目网站(https://www.python.org/download/releases/2.7/)直接下载,安装你须要的各个组件和库。
2.你也能够下载和安装程序包,里面内置了预先安装的库。我建议下载Anaconda。另外一个选择是Enthought Canopy Express。第二种方法提供无忧安装,因此我建议初学者选这种方法。这种方法的缺点就是你必须等待整个包升级完毕,哪怕你只是对某个库的最新版感兴趣。
一旦安装好Python,选择开发环境时也有多种选项。这里是3个最多见的选项:
虽然应该根据本身的须要选择正确的环境,但我我的更喜欢iPython notebook一些。 它提供了不少很好的功能供你在写代码时写文档,你还能够选择以代码块的方式运行代码(而不是逐行运行)。
本文的整篇教程咱们都会使用iPython环境。
你能够首先用Python写一个简单的计算器:
须要注意的一些事情:
在咱们深刻解决问题前,前后退一步了解一下Python的基础知识。咱们知道数据结构、迭代和条件结构是任何编程语言的关键。在Python中,这些信息包括列表,字符串,元组,字典,for循环,while循环,if-else等等。咱们看看其中一些。
下面是Python中用到的一些数据结构。你应该对它们很是熟悉,以便后面能正确使用它们。
列表——列表是Python中最为通用的数据结构之一。在方括号内写一列常见的逗号分隔的值就能简单定义一个列表。列表可能包含不一样类型的数据项,但一般数据项都属相同的类型。 Python列表是可变的,列表中的单个元素能够改变。
下面是在Python中定义一个列表并获取列表的示例:
字符串——使用单引号(‘),双引号(“)或三引号(“ ‘)定义字符串。以三引号结尾的字符串能够横跨多个代码行,在docstrings(Python中注释函数的一种方法)中使用很是频繁。\被用做转义字符。注意Python字符串是不可变的,因此你不能更改字符串内容。
元组——元组由若干被逗号分隔的值表示。元组是不可变的,输出被圆括号括起,所以要正确处理嵌套元组。此外,虽然元素是不可变的,若是有须要,它们也能包含可变数据。而因为元组不可变的特色,它们在处理方面要快于列表。因此,若是你的列表没法改变,就应该使用元组而非列表。
字典——字典是一种可变容器模型,且可存储任意类型对象。 字典的每一个键值 key=>value 对用冒号 : 分割,每一个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。一对花括号就能建立一个空字典:{}。
和大多数语言同样,Python也有for循环,是Python迭代中应用最普遍的一种方法。它的语法比较简单:
for i in [Python Iterable]:
expression(i)
复制代码
这里的“Python iterable”能够是个列表,元组或其它高级的数据结构,咱们在下一部分会讲到。咱们先看一个简单的例子,肯定一个数字的阶乘。
fact=1
for i in range(1,N+1):
fact *= i
复制代码
至于条件语句,它们是用于根据必定条件来执行代码片断。最经常使用的结构是if-else,语法以下:
if [condition]:
__execution if true__
else:
__execution if false__
复制代码
例如,若是咱们想打印数字N是偶数仍是奇数,代码这样写就能够了:
if N%2 == 0:
print 'Even'
else:
print 'Odd'
复制代码
如今你已经熟悉了Python的基本知识点,下面咱们更近一步。若是你有如下一些任务,该怎么办:
若是你试图从头开始写代码完成它们,那这任务量简直是噩梦通常的大,确定没两天你就坚持不下去了。不过不用太担忧,幸亏有不少预约义的Python库,咱们在代码中能够直接导入它们,让咱们的任务更轻松容易。 例如,拿咱们上面所举的阶乘例子来讲,咱们只需一步便可:
math.factorial(N)
复制代码
固然咱们须要导入math库来解决这个问题。咱们在下部分就讲解一些程序库。
在这部分,咱们会认识一些实用的Python库。很显然第一步是学习怎么将它们导入到咱们的环境中,有好几种方法:
import math as m
复制代码
from math import *
复制代码
在第一种方法中,咱们为库math定义了一个别名m,咱们如今能够经过用alias m.factorial()来引用math库来使用它内部的多种函数(好比factorial)。
在第二种方法中,咱们导入了math中的整个名字空间,也就是说能够无需引用math直接使用factorial()。
小提示:谷歌建议你们使用第一种导入库的方法,由于这样你能知道函数来自哪里。
下面是一系列的程序库,无论是你作任何数据分析工做都会用到它们,因此务必熟练掌握:
还有其余一些可能会用到的库:
以上这些全部程序库在学习初期没必要所有掌握,视本身需求学习便可,可是像Numpy,Pandas这样的数据挖掘和分析工具,必须熟悉使用。
到了这里咱们已经学习了Python基础知识和一些程序库,下面咱们深刻了解一下如何用Python解决问题。没错,用Python建立预测模型!在这个过程当中,咱们会用到一些强大的程序库,也会涉及更高层次的Python数据结构。主要有3个阶段:
为了进一步挖掘咱们的数据,咱们要用到Pandas。
Pandas是Python中一款最实用的数据分析库。下面咱们会用Pandas从Analytic Vidhya大赛数据中读取数据集,对所得数据进行探索性分析,并建立简单的分类算法解决这个问题。
在咱们加载数据以前,先理解Pandas中两个关键的数据结构——Series和dataframes 。
Series能够理解为一个1维的标签或索引数组,你能够经过series中单个元素的标签获取它们。
Dataframe和Excel表很像,咱们有列名指代列,也有行,使用行号就能获取它。不过在dataframe中,列名和行号都是列和行索引。
Series和dataframe组成了Python库Pandas的核心数据模式。首先Pandas会将数据集读取为dataframe格式,而后就能很容易地应用各类各样的操做,好比分组、汇集等等。
若是你对Pandas不是很熟悉,能够查看这篇10分钟Pandas入门教程: https://jizhi.im/blog/post/10min2pandas01
咱们从这里下载数据,下面是变量描述:
咱们开始探索数据。
首先,在你的terminal或Windows命令行输入如下内容,启动Pylab模式下的iPython界面:
ipython notebook --pylab=inline
复制代码
这会在Pylab环境中打开ipython notebook,其中内置了一些颇有用的库。并且,你能在行内绘制数据,从而使其很是适合交互式数据分析。能够输入如下代码,检查环境是否正确加载:
plot(arange(5))
复制代码
我当前在Linux上工做,已将数据保存在以下位置: /home/kunal/Downloads/Loan_Prediction/train.csv
咱们本教程会用到以下程序库:
请注意,由于使用Pylab环境,你无需导入matplotlib和Numpy。我将它们保留在了代码中,以防你在其它环境下使用本代码。
导入库之后,咱们用函数read_csv()读取数据集。到这个阶段为止代码以下所示:
import pandas as pd
import numpy as np
import matplotlib as plt
df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the dataset in a dataframe using Pandas
复制代码
读取数据集后,咱们就能够用函数head()查看顶部几行。
df.head(10)
复制代码
应该会打印10行。你也能够经过打印数据集查看更多行。接着,你经过使用describe()函数查看数值字段的总结。
df.describe()
复制代码
describe()函数能够在其输出中展现计数、平均值、标准方差、最小值、最大值等。
经过查看describe()函数的输出,咱们能够发现以下信息:
LoanAmount有22个缺失值
Loan_Amount_Term有14个缺失值
Credit_History有50个缺失值
咱们还能够看到84%的客户有credit_history。
怎么来的?
Credit_History字段的平均值为0.84. Applicantlncome分布彷佛和预期一致,Coapplicantlncome也是如此。
注意咱们经过将平均值和中位数比较,也能看到数据中可能出现了误差。
对于非数字值(好比Property_Area,Credit_History等),咱们能够查看频率分布以理解它们是否合理。能够经过以下命令打印频率表:
df['Property_Area'].value_counts()
复制代码
一样,咱们也能查看Credit_History的特殊值。
注意dfname[‘column_name’]是一个基本的索引技巧用以获取dataframe的具体列。它也能够是列的列表。
如今咱们已经了解了基本的数据特征,接着来学习多种变量的分布。咱们先从数值变量开始,即Applicantlncome和LoanAmount。
咱们先用以下命令绘制Applicantlncome的直方图:
df['ApplicantIncome'].hist(bins=50)
复制代码
这里咱们观察到有少数极值,这也是为什么咱们须要用50个bins来清楚地描绘分布状况。
接着,咱们查看箱型图来理解数据的分布。用以下命令能够绘制箱型图:
df.boxplot(column='ApplicantIncome')
复制代码
这确认了数据中有不少异常值,从中也反映出社会上收入差距很大,这或许是由于人们的受教育水平不一样。咱们经过Education将他们进行分离:
df.boxplot(column='ApplicantIncome', by = 'Education')
复制代码
咱们能够看到受太高等教育的群体和未受太高等教育的群体的平均收入并未有显著差别。但受太高等教育的群体中高收入者更多,有些收入很是之高,成为数据中的异常值。
如今,咱们用如下命令查看LoanAmount的直方图和箱型图:
df['LoanAmount'].hist(bins=50)
复制代码
df.boxplot(column='LoanAmount')
复制代码
咱们再次发现了一些极端值。很明显,Applicantlncome和LoanAmount须要一些数据再加工。LoanAmount中包含缺失值和很多极值,而Applicantlncome中的极值要少一些,须要咱们更深刻的理解。咱们会在接下来的部分解决这个任务。
如今咱们理解了Applicantlncome和Loanlncome的数据分布,接着探索更详细的分类变量信息。咱们会用到Excel类型的数据透视表和交叉表,例如,咱们能够查看根据信用记录获取贷款的概率。使用透视表能够获取结果:
注意:这里咱们将借贷状态编写为1表示“是”,0表示“否”。因此平均值表示获取贷款的几率。
temp1 = df['Credit_History'].value_counts(ascending=True)
temp2 = df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean())
print 'Frequency Table for Credit History:'
print temp1
print '\nProbility of getting loan for each Credit History class:'
print temp2
复制代码
如今咱们看看用Python生成相同数据洞察所需的步骤,咱们能够观察获得的和Excel表同样的pivot_table。咱们能够用matplotlib库以以下代码绘制出条形图:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Credit_History')
ax1.set_ylabel('Count of Applicants')
ax1.set_title("Applicants by Credit_History")
temp1.plot(kind='bar')
ax2 = fig.add_subplot(122)
temp2.plot(kind = 'bar')
ax2.set_xlabel('Credit_History')
ax2.set_ylabel('Probability of getting loan')
ax2.set_title("Probability of getting loan by credit history")
复制代码
图表显示若是申请人具备正当有效的信用记录,获取贷款的概率会增长8倍。咱们也能够按照Married(婚否),Self-Employed(是否受雇于他人),Property_Area(财产情况)等绘制类似的图表。 另外,咱们也能够将这两个图叠加在一块儿:
temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)
复制代码
还能够将性别因素添加进来:
若是你看得不是很明白,其实咱们这里是建立了两个基本的分类算法。一个基于信用记录,另外一个基于两个分类变量(包括性别)。
刚刚咱们展现了如何用Python和Pandas进行探索性数据分析。接着咱们进一步探索Applicantlncome和LoanStatus变量,进行数据再加工,并建立一个数据集应用多种多样的建模技巧。强烈建议你应用另外一个数据集和相似问题,根据咱们刚才的教程实际练习一番。
到了这个进度,必定要认真学习了,准备好上手练习。
在咱们探索数据时,发现数据集中存在一些问题,须要加以解决以便后面用来搭建性能良好的模型。那么解决有问题数据的任务就被称为“数据再加工”(data munging)。下面是咱们已经注意到的问题:
某些变量中存在缺失值,咱们应根据缺失值数量和变量的预期重要性明智地预估这些值。
在查看数据的分布情况时,咱们发现ApplicantIncome和LoanAmount彷佛在两边都包含极值。虽然出现这些极端状况也能说得通,可是咱们必须恰当地处理这些异常数据。
除了数值字段存在的这些问题外,咱们还应该查看非数值字段,也就是Gender,Property_Area,Married,Education和Dependents等等,看看它们是否包含有用信息。 若是对Pandas不是很熟悉,能够看看这篇看法Pandas中一些技巧的文章: 戳这里
咱们查看全部变量中的缺失值,由于大部分模型没法应对缺失值,即使它们可以应对,也帮不上忙。因此咱们检查一下数据集中的空值。
df.apply(lambda x: sum(x.isnull()),axis=0)
复制代码
若是值为空,这行命令应该能告诉咱们每列中的缺失值数量。
虽然缺失值的数量并非不少,可是不少变量中存在缺失值,那么咱们应该将它们预估出来并进行相加。关于更多更详细的缺失值推定方法,能够查看这篇文章:戳这里
注意:记住缺失值并不是一直都是空值。好比,若是Loan_Amount_Term为0,你以为说得通吗?或者你会将它当作缺失值吗?假设你就是这么认为,并且答案正确,那么咱们应该检查那些不切实际的值。
填补缺失值有不少种方法,最简单的一种就是用平均值取代,用以下代码能够实现:
df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)
复制代码
另外一种方式就是建立一个监督学习模型,根据其它变量预测LoanAmount的数量,而后再结合其它变量来预测缺失值。
因为咱们这里的目标是数据再加工的操做步骤,因此我会采起一种介乎这二者之间的方法。咱们须要作个重要的假设:无论申请人是否受过良好教育,或者是否受雇于人,都能预期得到较大数额的贷款。
首先,咱们查看箱型图,看看是否存在必定的趋势:
咱们看到每组申请人的贷款额度的中位数出现了一些变化,能够用来推定缺失值。可是首先,咱们必须确保Self_Employed和Education特征中全都没有缺失值。
咱们以前说过,Self_Employed有一些缺失值,咱们看一下频率表格:
因为~86%的值为“否”,所以推定缺失值也为“否”要靠谱一些,用以下代码能够完成:
df['Self_Employed'].fillna('No',inplace=True)
复制代码
如今,咱们会建立一个数据透视表,获得Self_Employed和Education特征下全部惟一值的中位数。接着,咱们定义一个函数,返回这些单元格的值,而后用函数来填充LoanAmount的缺失值:
table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
# 定义函数以返回 pivot_table的值
def fage(x):
return table.loc[x['Self_Employed'],x['Education']]
# 替换缺失值
df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)
复制代码
以上就是咱们推定LoanAmount中缺失值的方法。
我们首先分析LoanAmount。因为极值在实际状况中是可能存在的,也就是说有些人可能会因为特定需求申请数额很是高的贷款,因此咱们不将它们看做异常值,而是尝试对数转换来抵消它们的影响:
df['LoanAmount_log'] = np.log(df['LoanAmount'])
df['LoanAmount_log'].hist(bins=20)
复制代码
咱们再次查看直方图:
如今数据的分布看起来更接近正常状况了,极值的影响力也被大幅减弱。
如今看Applicantlncome。直觉告诉咱们有些申请人会收入较低,但能做为很合格的共同申请人,也就是两个或两个以上的人共同申请一笔贷款。因此将共同申请人的收入合并为总收入,而后进行对数转换,会是个不错的方法。
df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
df['TotalIncome_log'] = np.log(df['TotalIncome'])
df['LoanAmount_log'].hist(bins=20)
复制代码
如今咱们看到数据的分布情况比以前好多了。你能够本身试着推定Gender,Married,Dependents,Loan_Amount_Term和Credit_History这些特征下的缺失值。另外我也建议你们多考虑一下从数据中能够挖掘出的其它一些信息。例如,能够为LoanAmount/Totallncome建立一个列,由于从中咱们能够知道申请人有多大程度会归还贷款。
下面咱们查看如何建立预测模型。
在通过一番努力,将数据预处理后,咱们如今用Python根据咱们的数据集建立一个预测模型。在Python中,Skicit-learn是最经常使用的建立预测模型的库。若是你对Sklearn不是很熟悉,集智建议查看这份入门教程:
因为Sklearn须要全部的输入必须为数值型,因此咱们应将所有分类变量转换为数值变量。用以下代码能够完成:
from sklearn.preprocessing import LabelEncoder
var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status']
le = LabelEncoder()
for i in var_mod:
df[i] = le.fit_transform(df[i])
df.dtypes
复制代码
接着,咱们导入所需的模块。而后咱们会定义一个通用分类函数,它会将模型做为输入,肯定准确率和交叉验证率。因为本文只是入门文章,这里再也不深刻讲解代码,关于如何用经过交叉验证来优化模型性能,能够参考这篇文章。
#Import models from scikit learn module:
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import KFold #For K-fold cross validation
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import metrics
#建立分类模型和获取重要性的通用函数:
def classification_model(model, data, predictors, outcome):
# 拟合模型:
model.fit(data[predictors],data[outcome])
# 用数据集作出预测:
predictions = model.predict(data[predictors])
# 打印准确度
accuracy = metrics.accuracy_score(predictions,data[outcome])
print "Accuracy : %s" % "{0:.3%}".format(accuracy)
# 以5折执行K折交叉验证
kf = KFold(data.shape[0], n_folds=5)
error = []
for train, test in kf:
# 过滤训练数据
train_predictors = (data[predictors].iloc[train,:])
# 咱们用于训练算法的目标值
train_target = data[outcome].iloc[train]
# 用目标值和预测因子训练算法
model.fit(train_predictors, train_target)
#记录每次运行交叉验证的偏差值
error.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))
print "Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error))
# 再次拟合模型,以便被外部函数引用
model.fit(data[predictors],data[outcome])
复制代码
咱们建立咱们的第一个逻辑回归模型。一种方法就是将全部变量输入模型中,但这样可能会形成过拟合,模型没法很好泛化。
咱们能够作出一些直观的假设解决问题,若是是如下状况,申请人获取贷款的概率会更高:
咱们根据“Credit_History”建立咱们的第一个预测模型。
outcome_var = 'Loan_Status'
model = LogisticRegression()
predictor_var = ['Credit_History']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:80.945% 交叉验证得分:80.946%
#We can try different combination of variables:
predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:80.945% 交叉验证得分:80.946%
一般咱们预期增长变量后准确度能增长,但这颇有挑战性。不够重要的变量对准确度和交叉验证得分影响并不大。Credit_History处于主导地位。如今咱们有两个选择:
决策树是另外一种建立预测模型的方法,并且众所周知它能获得比逻辑回归模型更高的准确度。
model = DecisionTreeClassifier()
predictor_var = ['Credit_History','Gender','Married','Education']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:81.930% 交叉验证得分:76.656%
这里模型基于分类变量没法产生影响,由于Credit_History处于主导地位。咱们尝试一些数值变量。
# 咱们能够尝试不一样的变量组合
predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:92.345% 交叉验证得分:71.009%
这里咱们观察到虽然随着变量增多准确度也增长了,但交叉验证偏差也降低了。这是由于模型出现了过拟合的结果。咱们尝试一种更复杂的算法,看看是否有帮助。
随机森林是另外一种解决分类问题的算法。详细了解随机森林能够参看集智的这篇文章。
随机森林的一个优势就是咱们可让它处理全部特征,它会返回一个特征重要性矩阵,可以用于选择特征。
model = RandomForestClassifier(n_estimators=100)
predictor_var = ['Gender', 'Married', 'Dependents', 'Education',
'Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area',
'LoanAmount_log','TotalIncome_log']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:100.00% 交叉验证得分:78.179%
这里咱们看到模型在训练集上的准确度达到了100%,这种属于过拟合的极端状况,能够经过如下两种方法解决:
这两种方式咱们都尝试一下。首先咱们看看特征重要性矩阵,选出最重要的特征。
用特征重要性建立一个series:
Featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print featimp
复制代码
咱们使用重要性最高的5个变量建立模型。一样,咱们也会略微调整随机森林模型的参数:
model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1)
predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area']
classification_model(model, df,predictor_var,outcome_var)
复制代码
准确度:82.899% 交叉验证得分:81.461%
注意,虽然准确度降低了,但交叉验证得分也获得了优化,显示模型可以很好的泛化。记住随机森林模型并不是可重复,因为随机性的缘故,每次运行获得的结果会略有不一样。可是输出大致保持稳定。
你可能也注意到,虽然调试了随机森林模型中的基本函数,但咱们获得的交叉验证得分只是略微好于第一个逻辑回归模型的结果。从中咱们也能够获得一些有趣的发现:
但愿本文能帮你入门如何借助从事数据科学工做,高效成长为一名数据分析师。经过学习以上内容,不只能让你了解基本的数据分析方法,也能学习如何应用其中一些复杂的方法。
Python真的是一种很棒的工具,由于易于学习,有大量的程序库支持,故而成为数据科学领域愈来愈受欢迎的编程语言。
因此建议学好Python,相信你最终能轻松应对任何数据科学项目,包括读取、分析和可视化数据,并根据数据作出预测。
0806期《人工智能-从零开始到精通》限时折扣中!
谈笑风生 在线编程 了解一下?
(前25位同窗还可领取¥200优惠券哦)