在本教程中,我们将介绍使用Python编程语言在数据科学中使用的各种技术。
本教程面向计算机科学专业的毕业生以及愿意使用Python作为编程语言以简单易行的步骤学习数据科学的软件专业人员。
数据科学是通过组织,处理和分析数据从大量不同的数据中获取知识和洞察力的过程。它涉及许多不同的学科,如数学和统计建模,从数据源提取数据和应用数据可视化技术。通常还涉及处理大数据技术以收集结构化和非结构化数据。下面我们将看到一些使用数据科学的示例场景。
推荐系统随着网上购物越来越普遍,电子商务平台能够捕捉用户购物偏好以及市场上各种产品的表现。这可以通过创建推荐系统实现,该系统创建预测购物者需求的模型并显示购物者最有可能购买的产品。
改善保健服务医疗保健行业处理各种数据,这些数据可以分为技术数据,财务数据,患者信息,药物信息和法律规则。所有这些数据需要以协调一致的方式进行分析,以产生见解,同时保持医疗服务提供者和受护理者的成本,同时保持合法合规。
计算机视觉计算机识别图像的进步涉及处理来自同一类别的多个对象的大量图像数据集。例如,脸部识别。对这些数据集进行建模,并创建算法将模型应用于较新的图像以获得令人满意的结果。处理这些庞大的数据集和创建模型需要数据科学中使用的各种工具。
数据科学的编程需要非常灵活而灵活的语言,编写代码很简单,但可以处理高度复杂的数学处理。Python最适合这样的需求,因为它已经将自己建立为一般计算和科学计算的语言。更重要的是,它正在不断升级,以针对不同编程要求的其众多库的新增加形式。下面我们将讨论python的这些特性,使其成为数据科学的首选语言。
在随后的章节中,我们将学习如何利用python的这些功能来完成数据科学不同领域所需的所有任务。
要在本教程中成功创建并运行示例代码,我们需要一个正确环境设置,它将包含通用Python以及数据科学所需的特殊包。我们先看看如何安装python3(这里推荐使用)。但Python2的成熟度和对外部软件包的更广泛的支持。
Python发行版适用于各种平台。只需下载适用于您的操作系统平台的二进制代码并安装Python。
如果您的平台的二进制代码不可用,则需要使用C编译器手动编译源代码。编译源代码为您选择安装时需要的功能提供了更多的灵活性。
有三种不同的方法来启动Python-
互动式解释器
$python#Unix/Linuxorpython%#Unix/LinuxorC:>python#Windows/DOS
Windows命令提示符
打开命令提示符,输入-
C:\Users\Administrator>python
得到以下结果-
以下是Pandas的一些重要功能,专门用于数据处理和数据分析工作。
Pandas的主要特点是-
Pandas处理以下三种数据结构-
这些数据结构建立在Numpy数组之上,使其快速高效。
考虑处理这些数据结构的最佳方式是:将高维数据结构化为较低维数据结构的容器。例如,DataFrame是Series的容器,Panel是DataFrame的容器。
数据结构
维数
描述说明
Series
1
1D标记的同质阵列,大小不可变。
DataFrame
2
一般的二维标签,大小可变的表格结构,具有潜在的非均匀类型列。
DataFrame被广泛使用,它是最重要的数据结构。
系列
系列(Series)是一种具有同质数据结构的一维数组。例如,以下系列是整数:10,23,56...的集合。
例如,
10235617526173902672
系列的要点
数据帧(DataFrame)是一个具有异构数据的二维数组。例如,
名字
年龄
性别
得分
Steve
32
男
3.45
Lia
28
女
4.6
Vin
45
3.9
Katie
38
2.78
该表格表示一个组织的销售团队的总体绩效评级数据。数据以行和列表示。每列代表一个属性,每行代表一个人。
数据类型的列
四列的数据类型如下-
列名
数据类型
字符串
数字
浮点数
数据帧的要点-
在接下来的章节中,我们将看到很多关于在数据科学工作中使用python的pandas库的例子。
NumPy是代表“NumericalPython”的Python包。它是一个由多维数组对象和一组处理数组的例程组成的库。
使用NumPy,开发人员可以执行以下操作-
NumPy通常与SciPy(ScientificPython)和Mat-plotlib(绘图库)等软件包一起使用。这种组合广泛用于替代技术计算的流行平台MatLab。然而,MatLab的Python替代品现在被视为更现代和完整的编程语言。
NumPy中定义的最重要的对象是名为ndarray的N维数组类型。它描述了相同类型的项目的集合。可以使用从零开始的索引来访问集合中的项目。ndarray中的每个项目在内存中占用相同的块大小。ndarray中的每个元素都是数据类型对象(称为dtype)的对象。从ndarray对象中提取的任何项目(通过切片)由数组标量类型之一的Python对象表示。
在接下来的章节中,我们将看到很多关于在数据科学工作中使用Python的NumPy库的例子。
SciPy被组织成覆盖不同科学计算领域的子包。这些总结在下表中-
包名
描述
物理和数学常数
傅里叶变换
集成例程
插值
数据输入和输出
线性代数例程
优化
信号处理
稀疏矩阵
空间数据结构和算法
任何特殊的数学函数
统计
SciPy使用的基本数据结构是由NumPy模块提供的多维数组。NumPy为线性代数,傅立叶变换和随机数生成提供了一些功能,但与SciPy中等效函数的一般性不同。
在接下来的章节中,我们将看到很多关于在数据科学工作中使用Python的SciPy库的例子。
Matplotlib是一个Python库,用于通过使用python脚本创建二维图形和图表。它有一个名为pyplot的模块,通过提供控制线条样式,字体属性,格式化轴等功能,使得绘图变得容易。它支持各种各样的图形和图形-即直方图,条形图,功率谱,误差图等它与NumPy一起使用,为MatLab提供了一个有效的开源替代方案。它也可以用于像PyQt和wxPython这样的图形工具包。
通常,通过添加以下语句将包导入到Python脚本中-
frommatplotlibimportpyplotasplt
以下脚本是使用matplotlib生成正弦波图。
importnumpyasnpimportmatplotlib.pyplotasplt#Computethexandycoordinatesforpointsonasinecurvex=np.arange(0,3*np.pi,0.1)y=np.sin(x)plt.title("sinewaveform")#Plotthepointsusingmatplotlibplt.plot(x,y)plt.show()
在接下来的章节中,我们将看到很多关于在数据科学工作中使用Python的Matplotlib库的例子。
NumPy中定义的最重要的对象是名为ndarray的N维数组类型。它描述了相同类型的项目的集合。可以使用从零开始的索引来访问集合中的项目。ndarray类的一个实例可以通过本教程稍后介绍的不同阵列创建例程来构建。基本的ndarray是使用NumPy中的数组函数创建的,如下所示-
numpy.array
以下是关于Numpy数据处理的一些示例。
示例1
#morethanonedimensionsimportnumpyasnpa=np.array([[1,2],[3,4]])print(a)
输出如下-
[[1,2][3,4]]
示例2
#minimumdimensionsimportnumpyasnpa=np.array([1,2,3,4,5],ndmin=2)print(a)
[[1,2,3,4,5]]
示例3
#dtypeparameterimportnumpyasnpa=np.array([1,2,3],dtype=complex)print(a)
[1.+0.j,2.+0.j,3.+0.j]
Pandas通过数列(Series),数据框和面板处理数据。我们将看到一些例子。
Pandas数列Series是一维标签数组,能够容纳任何类型的数据(整数,字符串,浮点数,python对象等)。轴标签统称为索引。Pandas系列可以使用以下构造函数创建-
pandas.Series(data,index,dtype,copy)
示例这里从NumpyArray创建一个系列。
#importthepandaslibraryandaliasingaspdimportpandasaspdimportnumpyasnpdata=np.array(['a','b','c','d'])s=pd.Series(data)print(s)
它将输出如下结果-
0a1b2c3ddtype:object
Pandas数据帧
数据帧(DataFrame)是一个二维数据结构,即数据按行和列的表格方式排列。可以使用以下构造函数创建一个pandasDataFrame-
pandas.DataFrame(data,index,columns,dtype,copy)
现在使用数组来创建索引的DataFrame。
importpandasaspddata={'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}df=pd.DataFrame(data,index=['rank1','rank2','rank3','rank4'])printdf
AgeNamerank128Tomrank234Jackrank329Steverank442Ricky
Pandas面板
面板是数据的3D容器。术语面板数据来自计量经济学,部分负责名称pandas-pan(el)-da(ta)-s。
面板可以使用以下构造函数创建-
pandas.Panel(data,items,major_axis,minor_axis,dtype,copy)
在下面的例子中,从DataFrame对象的字典创建一个面板-
#creatinganemptypanelimportpandasaspdimportnumpyasnpdata={'Item1':pd.DataFrame(np.random.randn(4,3)),'Item2':pd.DataFrame(np.random.randn(4,2))}p=pd.Panel(data)print(p)
数据丢失在现实生活中是一个问题。机器学习和数据挖掘等领域由于数据缺失导致数据质量差,因此在模型预测的准确性方面面临严峻的问题。在这些领域,缺失值处理是使模型更加准确和有效的关键。
现在来看看如何处理使用Pandas的缺失值(如NA或NaN)。
#importthepandaslibraryimportpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])df=df.reindex(['a','b','c','d','e','f','g','h'])print(df)
onetwothreea0.0779880.4761490.965836bNaNNaNNaNc-0.390208-0.551605-2.301950dNaNNaNNaNe-2.000303-0.7882011.510072f-0.930230-0.6704731.146615gNaNNaNNaNh0.0851000.5327910.887415
使用reindexing,创建了一个缺失值的DataFrame。在输出中,NaN表示不是数字。
检查缺失值
为了更容易地检测缺失值(以及跨越不同的数组dtype),Pandas提供了isnull()和notnull()函数,它们也是Series和DataFrame对象的方法-
示例
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])df=df.reindex(['a','b','c','d','e','f','g','h'])print(df['one'].isnull())
aFalsebTruecFalsedTrueeFalsefFalsegTruehFalseName:one,dtype:bool
Pandas提供了各种方法来清除缺失值。fillna函数可以通过几种方式用非空数据“填充”NA值,我们在后面的章节中将解释说明。
以下程序显示了如何将“NaN”替换为“0”。
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(3,3),index=['a','c','e'],columns=['one','two','three'])df=df.reindex(['a','b','c'])print(df)print("NaNreplacedwith'0':")print(df.fillna(0))
onetwothreea-0.576991-0.7416950.553172bNaNNaNNaNc0.744328-1.7351661.749580NaNreplacedwith'0':onetwothreea-0.576991-0.7416950.553172b0.0000000.0000000.000000c0.744328-1.7351661.749580
在这里,填充零值;相反,我们也可以填写任何其他值。
使用ReIndexing章节讨论的填充概念,这里将学习如何填补缺失的值。
方法
操作
pad/fill
向前填充方法
bfill/backfill
向后填充方法
示例代码
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])df=df.reindex(['a','b','c','d','e','f','g','h'])print(df.fillna(method='pad'))
执行上面示例代码,得到以下输出结果-
onetwothreea0.0779880.4761490.965836b0.0779880.4761490.965836c-0.390208-0.551605-2.301950d-0.390208-0.551605-2.301950e-2.000303-0.7882011.510072f-0.930230-0.6704731.146615g-0.930230-0.6704731.146615h0.0851000.5327910.887415
如果只想排除缺少的值,则使用dropna函数和axis参数。默认情况下,axis=0,即沿着一行行查找,这意味着如果行内的任何值是NA,那么排除整行。
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(5,3),index=['a','c','e','f','h'],columns=['one','two','three'])df=df.reindex(['a','b','c','d','e','f','g','h'])print(df.dropna())
onetwothreea0.0779880.4761490.965836c-0.390208-0.551605-2.301950e-2.000303-0.7882011.510072f-0.930230-0.6704731.146615h0.0851000.5327910.887415
很多时候,我们必须用一些特定的值替换一个通用值。可以通过应用替换方法来实现这一点。
用标量值替换NA是fillna()函数的等效行为。
importpandasaspdimportnumpyasnpdf=pd.DataFrame({'one':[10,20,30,40,50,2000],'two':[1000,0,30,40,50,60]})print(df.replace({1000:10,2000:60}))
执行上面示例代码,得到以下结果-
onetwo01010120023030340404505056060
csv文件是一个文本文件,其中列中的值由逗号分隔。假设有一个名称为input.csv的文件中的具有以下数据。
可以通过复制并粘贴这些数据,使用Windows记事本创建该文件。使用记事本中的另存为全部文件(.)选项,并将该文件保存为:input.csv。
id,name,salary,start_date,dept1,Rick,623.3,2012-01-01,IT2,Dan,515.2,2013-09-23,Operations3,Tusar,611,2014-11-15,IT4,Ryan,729,2014-05-11,HR5,Gary,843.25,2015-03-27,Finance6,Rasmi,578,2013-05-21,IT7,Pranab,632.8,2013-07-30,Operations8,Guru,722.5,2014-06-17,Finance
使用pandas库的read_csv函数将CSV文件的内容作为pandasDataFrame读入python环境。该功能可以通过使用适当的文件路径从操作系统中读取文件。如下实现代码-
importpandasaspddata=pd.read_csv('path/input.csv')print(data)
当我们执行上面的代码时,它会产生以下结果。请注意函数如何创建以零开头的附加列作为索引。
idnamesalarystart_datedept01Rick623.302012-01-01IT12Dan515.202013-09-23Operations23Tusar611.002014-11-15IT34Ryan729.002014-05-11HR45Gary843.252015-03-27Finance56Rasmi578.002013-05-21IT67Pranab632.802013-07-30Operations78Guru722.502014-06-17Finance
熊猫库的read_csv函数也可用于读取给定列的某些特定行。我们使用下面显示的代码对read_csv函数的结果进行分割,例如:salary列的前5行。
importpandasaspddata=pd.read_csv('path/input.csv')#Slicetheresultforfirst5rowsprint(data[0:5]['salary'])
0623.301515.202611.003729.004843.25Name:salary,dtype:float64
Pandas库的read_csv函数也可以用来读取一些特定的列。为此,我们使用称为.loc()的多轴索引方法。选择显示salary和nama列的所有行。
importpandasaspddata=pd.read_csv('path/input.csv')#Usethemulti-axesindexingfuntionprint(data.loc[:,['salary','name']])
当我们执行上面的代码时,它会产生以下结果。
salaryname0623.30Rick1515.20Dan2611.00Tusar3729.00Ryan4843.25Gary5578.00Rasmi6632.80Pranab7722.50Guru
Pandas库的read_csv函数也可以用来读取一些特定的列和特定的行。为此,我们使用称为.loc()的多轴索引方法。选择显示salary和name列的某些行。
importpandasaspddata=pd.read_csv('path/input.csv')#Usethemulti-axesindexingfuntionprint(data.loc[[1,3,5],['salary','name']])
salaryname1515.2Dan3729.0Ryan5578.0Rasmi
Pandas库的read_csv函数也可以用来读取一些特定的列和一系列的行。使用名称为.loc()的多轴索引方法。选择显示sarlay和name列的某些行。
importpandasaspddata=pd.read_csv('path/input.csv')#Usethemulti-axesindexingfuntionprint(data.loc[2:6,['salary','name']])
salaryname2611.00Tusar3729.00Ryan4843.25Gary5578.00Rasmi6632.80Pranab
JSON文件以可读的格式将数据存储为文本。JSON代表JavaScriptObjectNotation。使用read_json函数,Pandas可以读取JSON文件。
通过将以下数据复制到文本编辑器(如记事本)来创建JSON文件。选择文件类型作为所有文件(.),使用.json扩展名保存文件,假设保存的文件名称为:input.json。
{"ID":["1","2","3","4","5","6","7","8"],"Name":["Rick","Dan","Michelle","Ryan","Gary","Nina","Simon","Guru"]"Salary":["623.3","515.2","611","729","843.25","578","632.8","722.5"],"StartDate":["1/1/2012","9/23/2013","11/15/2014","5/11/2014","3/27/2015","5/21/2013","7/30/2013","6/17/2014"],"Dept":["IT","Operations","IT","HR","Finance","IT","Operations","Finance"]}
Pandas库的read_json函数可用于将JSON文件读入为pandasDataFrame数据结构类型。
importpandasaspddata=pd.read_json('path/input.json')print(data)
DeptIDNameSalaryStartDate0IT1Rick623.301/1/20121Operations2Dan515.209/23/20132IT3Tusar611.0011/15/20143HR4Ryan729.005/11/20144Finance5Gary843.253/27/20155IT6Rasmi578.005/21/20136Operations7Pranab632.807/30/20137Finance8Guru722.506/17/2014
与在前一章中已经看到的读取CSV文件类似,读取JSON文件到DataFrame后,pandas库的read_json函数也可用于读取一些特定列和特定行。使用.loc()的多轴索引方法。选择显示salary和name列的某些行。
importpandasaspddata=pd.read_json('path/input.xlsx')#Usethemulti-axesindexingfuntionprint(data.loc[[1,3,5],['salary','name']])
还可以将to_json函数与参数一起应用于将JSON文件内容读入单个记录。
importpandasaspddata=pd.read_json('path/input.xlsx')print(data.to_json(orient='records',lines=True))
{"Dept":"IT","ID":1,"Name":"Rick","Salary":623.3,"StartDate":"1\/1\/2012"}{"Dept":"Operations","ID":2,"Name":"Dan","Salary":515.2,"StartDate":"9\/23\/2013"}{"Dept":"IT","ID":3,"Name":"Tusar","Salary":611.0,"StartDate":"11\/15\/2014"}{"Dept":"HR","ID":4,"Name":"Ryan","Salary":729.0,"StartDate":"5\/11\/2014"}{"Dept":"Finance","ID":5,"Name":"Gary","Salary":843.25,"StartDate":"3\/27\/2015"}{"Dept":"IT","ID":6,"Name":"Rasmi","Salary":578.0,"StartDate":"5\/21\/2013"}{"Dept":"Operations","ID":7,"Name":"Pranab","Salary":632.8,"StartDate":"7\/30\/2013"}{"Dept":"Finance","ID":8,"Name":"Guru","Salary":722.5,"StartDate":"6\/17\/2014"}
MicrosoftExcel是一个使用非常广泛的电子表格程序。它的用户友好性和吸引人的功能使其成为数据科学中常用的工具。Panadas库提供了一些功能,我们可以使用该功能完整地读取Excel文件,也可以只读取选定的一组数据。还可以读取其中包含多个工作表的Excel文件。这里主要使用read_excel函数从中读取数据。
我们在windows操作系统中创建一个包含多个工作表的excel文件。不同工作表中的数据如下所示。
可以使用WindowsOS中的Excel程序创建此文件。将该文件保存为:input.xlsx。
#DatainSheet1id,name,salary,start_date,dept1,Rick,623.3,2012-01-01,IT2,Dan,515.2,2013-09-23,Operations3,Tusar,611,2014-11-15,IT4,Ryan,729,2014-05-11,HR5,Gary,843.25,2015-03-27,Finance6,Rasmi,578,2013-05-21,IT7,Pranab,632.8,2013-07-30,Operations8,Guru,722.5,2014-06-17,Finance#DatainSheet2idnamezipcode1Rick3012242Dan3412553Tusar2977044Ryan2166505Gary4387006Rasmi6651007Pranab3412118Guru347480
类似于我们在前一章中已经看到的读取CSV文件,pandas库的read_excel函数也可以用来读取一些特定的列和特定的行。使用称.loc()多轴索引方法。选择显示某些行的salary和name列。
importpandasaspddata=pd.read_excel('path/input.xlsx')#Usethemulti-axesindexingfuntionprint(data.loc[[1,3,5],['salary','name']])
具有不同数据格式的多个工作表也可以通过使用名为ExcelFile的包装类的帮助下的read_excel函数来读取。它只会将多张纸张读入内存一次。在下面的例子中,我们将sheet1和sheet2读入两个数据框并单独打印出来。
importpandasaspdwithpd.ExcelFile('C:/Users/Rasmi/Documents/pydatasci/input.xlsx')asxls:df1=pd.read_excel(xls,'Sheet1')df2=pd.read_excel(xls,'Sheet2')print("****ResultSheet1****")print(df1[0:5]['salary'])print("")print("***ResultSheet2****")print(df2[0:5]['zipcode'])
当执行上面示例代码,得到以下结果-
****ResultSheet1****0623.301515.202611.003729.004843.25Name:salary,dtype:float64***ResultSheet2****03012241341255229770432166504438700Name:zipcode,dtype:int64
我们可以连接到关系数据库以使用Pandas库分析数据,以及另一个用于实现数据库连接的额外库。这个软件包被命名为sqlalchemy,它提供了在python中使用的完整的SQL语言功能。
condainstallsqlalchemy
我们将使用Sqlite3作为关系数据库,因为它非常轻便且易于使用。尽管SQLAlchemy库可以连接到各种关系源,包括MySql,Oracle和Postgresql以及Mssql。我们首先创建一个数据库引擎,然后使用SQLAlchemy库的to_sql函数连接到数据库引擎。
在下面的例子中,我们通过使用已经通过读取csv文件创建的数据帧中的to_sql函数来创建关系表。然后使用Pandas的read_sql_query函数来执行和捕获来自各种SQL查询的结果。
fromsqlalchemyimportcreate_engineimportpandasaspddata=pd.read_csv('/path/input.csv')#Createthedbengineengine=create_engine('sqlite:///:memory:')#Storethedataframeasatabledata.to_sql('data_table',engine)#Query1ontherelationaltableres1=pd.read_sql_query('SELECT*FROMdata_table',engine)print('Result1')print(res1)print('')#Query2ontherelationaltableres2=pd.read_sql_query('SELECTdept,sum(salary)FROMdata_tablegroupbydept',engine)print('Result2')print(res2)
Result1indexidnamesalarystart_datedept001Rick623.302012-01-01IT112Dan515.202013-09-23Operations223Tusar611.002014-11-15IT334Ryan729.002014-05-11HR445Gary843.252015-03-27Finance556Rasmi578.002013-05-21IT667Pranab632.802013-07-30Operations778Guru722.502014-06-17FinanceResult2deptsum(salary)0Finance1565.751HR729.002IT1812.303Operations1148.00
还可以使用pandas中提供的sql.execute函数将数据插入到关系表中。在下面的代码中,我们将先前的csv文件作为输入数据集,将其存储在关系表中,然后使用sql.execute插入另一条记录。
fromsqlalchemyimportcreate_enginefrompandas.ioimportsqlimportpandasaspddata=pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')engine=create_engine('sqlite:///:memory:')#StoretheDatainarelationaltabledata.to_sql('data_table',engine)#Insertanotherrowsql.execute('INSERTINTOdata_tableVALUES(,,,,,)',engine,params=[('id',9,'Ruby',711.20,'2015-03-27','IT')])#Readfromtherelationaltableres=pd.read_sql_query('SELECTID,Dept,Name,Salary,start_dateFROMdata_table',engine)print(res)
执行上面示例代码,得到以下代码-
iddeptnamesalarystart_date01ITRick623.302012-01-0112OperationsDan515.202013-09-2323ITTusar611.002014-11-1534HRRyan729.002014-05-1145FinanceGary843.252015-03-2756ITRasmi578.002013-05-2167OperationsPranab632.802013-07-3078FinanceGuru722.502014-06-1789ITRuby711.202015-03-27
还可以使用pandas中的sql.execute函数将数据删除到关系表中。下面的代码根据给定的输入条件删除一行。
fromsqlalchemyimportcreate_enginefrompandas.ioimportsqlimportpandasaspddata=pd.read_csv('C:/Users/Rasmi/Documents/pydatasci/input.csv')engine=create_engine('sqlite:///:memory:')data.to_sql('data_table',engine)sql.execute('Deletefromdata_tablewherename=()',engine,params=[('Gary')])res=pd.read_sql_query('SELECTID,Dept,Name,Salary,start_dateFROMdata_table',engine)print(res)
iddeptnamesalarystart_date01ITRick623.32012-01-0112OperationsDan515.22013-09-2323ITTusar611.02014-11-1534HRRyan729.02014-05-1146ITRasmi578.02013-05-2157OperationsPranab632.82013-07-3068FinanceGuru722.52014-06-17
要连接到MongoDB,python使用一个名为pymongo的库。可以使用Anaconda环境中的以下命令将此库添加到您的python环境。
condainstallpymongo
这个库允许python使用数据库客户端连接到MOngoDB。一旦连接,我们选择要用于各种操作的数据库名称。
要将数据插入到MongoDB中,使用数据库环境中可用的insert()方法。首先使用下面显示的Python代码连接到数据库,然后以一系列键值对的形式提供文档详细信息。
#ImportthepythonlibrariesfrompymongoimportMongoClientfrompprintimportpprint#Choosetheappropriateclientclient=MongoClient()#Connecttothetestdbdb=client.test#Usetheemployeecollectionemployee=db.employeeemployee_details={'Name':'RajKumar','Address':'SearsStreer,NZ','Age':'42'}#Usetheinsertmethodresult=employee.insert_one(employee_details)#Queryfortheinserteddocument.Queryresult=employee.find_one({'Age':'42'})print(Queryresult)
{u'Address':u'SearsStreer,NZ',u'Age':u'42',u'Name':u'RajKumar',u'_id':ObjectId('5adc5a9f84e7cd3940399f93')}
更新现有的MongoDB数据与插入类似。使用mongoDB原生的update()方法。在下面的代码中,使用新的键值对替换了现有的记录。请注意:这里可通过使用条件标准来决定更新哪条记录。
#ImportthepythonlibrariesfrompymongoimportMongoClientfrompprintimportpprint#Choosetheappropriateclientclient=MongoClient()#Connecttodbdb=client.testemployee=db.employee#Usetheconditiontochoosetherecord#andusetheupdatemethoddb.employee.update_one({"Age":'42'},{"$set":{"Name":"Srinidhi","Age":'35',"Address":"NewOmsk,WC"}})Queryresult=employee.find_one({'Age':'35'})print(Queryresult)
当执行上面的代码时,它会产生以下结果。
{u'Address':u'NewOmsk,WC',u'Age':u'35',u'Name':u'Srinidhi',u'_id':ObjectId('5adc5a9f84e7cd3940399f93')}
使用delete方法的地方删除记录也很简单。这里还提到用于选择要删除的记录的条件。
#ImportthepythonlibrariesfrompymongoimportMongoClientfrompprintimportpprint#Choosetheappropriateclientclient=MongoClient()#Connecttodbdb=client.testemployee=db.employee#Usetheconditiontochoosetherecord#andusethedeletemethoddb.employee.delete_one({"Age":'35'})Queryresult=employee.find_one({'Age':'35'})print(Queryresult)
None
所以看到特定的记录不再存在于db中。
接下来,我们将会逐个学习。
importdatetimeprint'TheDateTodayis:',datetime.datetime.today()date_today=datetime.date.today()print(date_today)print('ThisYear:',date_today.year)print('ThisMonth:',date_today.month(print('MonthName:',date_today.strftime('%B'))print('ThisWeekDay:',date_today.day))print('WeekDayName:',date_today.strftime('%A'))
TheDateTodayis:2018-05-2215:38:35.8350002018-05-22ThisYear:2018ThisMonth:4MonthName:MayThisWeekDay:22WeekDayName:Sunday
importdatetime#CapturetheFirstDateday1=datetime.date(2018,2,12)print('day1:',day1.ctime())#CapturetheSecondDateday2=datetime.date(2017,8,18)print('day2:',day2.ctime())#Findthedifferencebetweenthedatesprint('NumberofDays:',day1-day2)date_today=datetime.date.today()#CreateadeltaofFourDaysno_of_days=datetime.timedelta(days=4)#UseDeltaforPastDatebefore_four_days=date_today-no_of_daysprint('BeforeFourDays:',before_four_days)#UseDeltaforfutureDateafter_four_days=date_today+no_of_daysprint'AfterFourDays:',after_four_days
day1:MonFeb1200:00:002018day2:FriAug1800:00:002017NumberofDays:178days,0:00:00BeforeFourDays:2018-04-18AfterFourDays:2018-04-26
importdatetimedate_today=datetime.date.today()print('Todayis:',date_today)#CreateadeltaofFourDaysno_of_days=datetime.timedelta(days=4)#UseDeltaforPastDatebefore_four_days=date_today-no_of_daysprint('BeforeFourDays:',before_four_days)after_four_days=date_today+no_of_daysdate1=datetime.date(2018,4,4)print('date1:',date1)ifdate1==before_four_days:print('SameDates')ifdate_today>date1:print('PastDate')ifdate1 Todayis:2018-04-22BeforeFourDays:2018-04-18date1:2018-04-04PastDateFutureDate 数据处理涉及以各种格式处理数据,例如合并,分组,连接等,以便分析或准备将其与另一组数据一起使用。Python具有内置函数功能,可将这些争议方法应用于各种数据集以实现分析目标。在本章中,我们将看几个基于这些方法的例子。 Python中的Pandas库提供了一个函数merge,作为DataFrame对象之间所有标准数据库连接操作的入口- pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=True) 现在创建两个不同的DataFrame并对其执行合并操作。 #importthepandaslibraryimportpandasaspdleft=pd.DataFrame({'id':[1,2,3,4,5],'Name':['Alex','Amy','Allen','Alice','Ayoung'],'subject_id':['sub1','sub2','sub4','sub6','sub5']})right=pd.DataFrame({'id':[1,2,3,4,5],'Name':['Billy','Brian','Bran','Bryce','Betty'],'subject_id':['sub2','sub4','sub3','sub6','sub5']})print(left)print(right) Nameidsubject_id0Alex1sub11Amy2sub22Allen3sub43Alice4sub64Ayoung5sub5Nameidsubject_id0Billy1sub21Brian2sub42Bran3sub33Bryce4sub64Betty5sub5 数据分析中经常需要对数据集进行分组,因为我们需要根据数据集中存在的各个组的结果进行分析。Panadas具有内置的方法,可以将数据转换为各种分组。 在下面的示例中,我们按年分组数据,然后获得特定年份的结果。 #importthepandaslibraryimportpandasaspdipl_data={'Team':['Riders','Riders','Devils','Devils','Kings','kings','Kings','Kings','Riders','Royals','Royals','Riders'],'Rank':[1,2,2,3,3,4,1,1,2,4,1,2],'Year':[2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],'Points':[876,789,863,673,741,812,756,788,694,701,804,690]}df=pd.DataFrame(ipl_data)grouped=df.groupby('Year')print(grouped.get_group(2014)) PointsRankTeamYear08761Riders201428632Devils201447413Kings201497014Royals2014 Pandas提供了各种功能,可以轻松地将Series,DataFrame和Panel对象组合在一起。在下面的例子中,concat函数沿轴执行串联操作。创建不同的对象并进行连接。 importpandasaspdone=pd.DataFrame({'Name':['Alex','Amy','Allen','Alice','Ayoung'],'subject_id':['sub1','sub2','sub4','sub6','sub5'],'Marks_scored':[98,90,87,69,78]},index=[1,2,3,4,5])two=pd.DataFrame({'Name':['Billy','Brian','Bran','Bryce','Betty'],'subject_id':['sub2','sub4','sub3','sub6','sub5'],'Marks_scored':[89,80,79,97,88]},index=[1,2,3,4,5])print(pd.concat([one,two])) Marks_scoredNamesubject_id198Alexsub1290Amysub2387Allensub4469Alicesub6578Ayoungsub5189Billysub2280Briansub4379Bransub3497Brycesub6588Bettysub5 Python有几种方法可用于对数据执行聚合。它使用Pandas和numpy库完成。数据必须可用或转换为数据框才能应用聚合功能。 创建一个DataFrame并在其上应用聚合。 importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',periods=10),columns=['A','B','C','D'])printdfr=df.rolling(window=3,min_periods=1)print(r) ABCD2000-01-011.088512-0.650942-2.547450-0.5668582000-01-020.790670-0.387854-0.6681320.2672832000-01-03-0.575523-0.9650250.060427-2.1797802000-01-041.6696531.211759-0.2546951.4291662000-01-050.100568-0.2361840.491646-0.4660812000-01-060.1551720.992975-1.2051340.3209582000-01-070.309468-0.724053-1.4124460.6279192000-01-080.099489-1.0280400.163206-1.2743312000-01-091.639500-0.0684430.714008-0.5659692000-01-100.3267611.4798410.664282-1.361169Rolling[window=3,min_periods=1,center=False,axis=0] 可以通过将函数传递给整个DataFrame进行聚合,或者通过标准的getitem方法选择一个列。 在整个数据框上应用聚合- importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',periods=10),columns=['A','B','C','D'])printdfr=df.rolling(window=3,min_periods=1)print(r.aggregate(np.sum)) 在整个数据帧上应用聚合 importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',periods=10),columns=['A','B','C','D'])print(df)r=df.rolling(window=3,min_periods=1)print(r.aggregate(np.sum)) ABCD2000-01-011.088512-0.650942-2.547450-0.5668582000-01-021.879182-1.038796-3.215581-0.2995752000-01-031.303660-2.003821-3.155154-2.4793552000-01-041.884801-0.141119-0.862400-0.4833312000-01-051.1946990.0105510.297378-1.2166952000-01-061.9253931.968551-0.9681831.2840442000-01-070.5652080.032738-2.1259340.4827972000-01-080.564129-0.759118-2.454374-0.3254542000-01-092.048458-1.820537-0.535232-1.2123812000-01-102.0657500.3833571.541496-3.201469ABCD2000-01-011.088512-0.650942-2.547450-0.5668582000-01-021.879182-1.038796-3.215581-0.2995752000-01-031.303660-2.003821-3.155154-2.4793552000-01-041.884801-0.141119-0.862400-0.4833312000-01-051.1946990.0105510.297378-1.2166952000-01-061.9253931.968551-0.9681831.2840442000-01-070.5652080.032738-2.1259340.4827972000-01-080.564129-0.759118-2.454374-0.3254542000-01-092.048458-1.820537-0.535232-1.2123812000-01-102.0657500.3833571.541496-3.201469 在数据帧的单个列上应用聚合 importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',periods=10),columns=['A','B','C','D'])print(df)r=df.rolling(window=3,min_periods=1)print(r['A'].aggregate(np.sum)) ABCD2000-01-011.088512-0.650942-2.547450-0.5668582000-01-021.879182-1.038796-3.215581-0.2995752000-01-031.303660-2.003821-3.155154-2.4793552000-01-041.884801-0.141119-0.862400-0.4833312000-01-051.1946990.0105510.297378-1.2166952000-01-061.9253931.968551-0.9681831.2840442000-01-070.5652080.032738-2.1259340.4827972000-01-080.564129-0.759118-2.454374-0.3254542000-01-092.048458-1.820537-0.535232-1.2123812000-01-102.0657500.3833571.541496-3.2014692000-01-011.0885122000-01-021.8791822000-01-031.3036602000-01-041.8848012000-01-051.1946992000-01-061.9253932000-01-070.5652082000-01-080.5641292000-01-092.0484582000-01-102.065750Freq:D,Name:A,dtype:float64 在DataFrame的多列上应用聚合 importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.randn(10,4),index=pd.date_range('1/1/2000',periods=10),columns=['A','B','C','D'])print(df)r=df.rolling(window=3,min_periods=1)print(r[['A','B']].aggregate(np.sum)) ABCD2000-01-011.088512-0.650942-2.547450-0.5668582000-01-021.879182-1.038796-3.215581-0.2995752000-01-031.303660-2.003821-3.155154-2.4793552000-01-041.884801-0.141119-0.862400-0.4833312000-01-051.1946990.0105510.297378-1.2166952000-01-061.9253931.968551-0.9681831.2840442000-01-070.5652080.032738-2.1259340.4827972000-01-080.564129-0.759118-2.454374-0.3254542000-01-092.048458-1.820537-0.535232-1.2123812000-01-102.0657500.3833571.541496-3.201469AB2000-01-011.088512-0.6509422000-01-021.879182-1.0387962000-01-031.303660-2.0038212000-01-041.884801-0.1411192000-01-051.1946990.0105512000-01-061.9253931.9685512000-01-070.5652080.0327382000-01-080.564129-0.7591182000-01-092.048458-1.8205372000-01-102.0657500.383357 有一个类库叫作beautifulsoup。使用这个库,可以搜索html标签的值,并获取页面标题和页面标题列表等特定数据。 condainstallBeaustifulsoap 读取HTML文件 在下面的例子中,我们请求一个url被加载到python环境中。然后使用htmlparser参数来读取整个html文件。接下来,打印html页面的前几行。 当执行上面示例代码,得到以下输出结果-
提取标记值
可以使用以下代码从标签的第一个实例中提取标签值。
提取所有标签
可以使用以下代码从标签的所有实例中提取标签值。
NonePython功能特点
已经以行和列格式存在的数据或者可以很容易地转换为行和列的数据,以便之后它可以很好地适合数据库,这被称为结构化数据。例如CSV,TXT,XLS文件等。这些文件有一个分隔符,固定宽度或可变宽度,其中缺失值在分隔符之间表示为空白。但有时候我们会得到一些行不是固定宽度的数据,或者它们只是HTML,图像或pdf文件。这些数据被称为非结构化数据。尽管可以通过处理HTML标签来处理HTML文件,但是来自Twitter的提要或来自新闻提要的纯文本文档可以在不具有分隔符的情况下不具有要处理的标签。在这种情况下,我们使用来自各种python库的不同内置函数来处理文件。
在下面的例子中,我们获取一个文本文件并读取文件,将文件中的每一行分隔开来。接下来可以将输出分成更多的行和单词。原始文件是一个包含描述Python语言的段落的文本文件。
filename='path\input.txt'withopen(filename)asfn:#Readeachlineln=fn.readline()#Keepcountoflineslncnt=1whileln:print("Line{}:{}".format(lncnt,ln.strip()))ln=fn.readline()lncnt+=1
Line1:Pythonisaninterpretedhigh-levelprogramminglanguageforgeneral-purposeprogramming.CreatedbyGuidovanRossumandfirstreleasedin1991,Pythonhasadesignphilosophythatemphasizescodereadability,notablyusingsignificantwhitespace.Itprovidesconstructsthatenableclearprogrammingonbothsmallandlargescales.Line2:Pythonfeaturesadynamictypesystemandautomaticmemorymanagement.Itsupportsmultipleprogrammingparadigms,includingobject-oriented,imperative,functionalandprocedural,andhasalargeandcomprehensivestandardlibrary.Line3:Pythoninterpretersareavailableformanyoperatingsystems.CPython,thereferenceimplementationofPython,isopensourcesoftwareandhasacommunity-baseddevelopmentmodel,asdonearlyallofitsvariantimplementations.CPythonismanagedbythenon-profitPythonSoftwareFoundation.
可以使用计数器函数来计算文件单词的频率,如下所示。
fromcollectionsimportCounterwithopen(r'pathinput2.txt')asf:p=Counter(f.read().split())print(p)
Counter({'and':3,'Python':3,'that':2,'a':2,'programming':2,'code':1,'1991,':1,'is':1,'programming.':1,'dynamic':1,'an':1,'design':1,'in':1,'high-level':1,'management.':1,'features':1,'readability,':1,'van':1,'both':1,'for':1,'Rossum':1,'system':1,'provides':1,'memory':1,'has':1,'type':1,'enable':1,'Created':1,'philosophy':1,'constructs':1,'emphasizes':1,'general-purpose':1,'notably':1,'released':1,'significant':1,'Guido':1,'using':1,'interpreted':1,'by':1,'on':1,'language':1,'whitespace.':1,'clear':1,'It':1,'large':1,'small':1,'automatic':1,'scales.':1,'first':1})
单词标记是将大量文本样本分解为单词的过程。这是自然语言处理任务中的一项要求,每个单词需要被捕获并进行进一步的分析,如对特定情感进行分类和计数等。自然语言工具包(NLTK)是用于实现这一目的的库。在继续使用python程序进行字词标记之前,先安装NLTK。
condainstall-canacondanltk
接下来,使用word_tokenize方法将段落拆分为单个单词。
importnltkword_data="Itoriginatedfromtheideathattherearereaderswhopreferlearningnewskillsfromthecomfortsoftheirdrawingrooms"nltk_tokens=nltk.word_tokenize(word_data)print(nltk_tokens)
['It','originated','from','the','idea','that','there','are','readers','who','prefer','learning','new','skills','from','the','comforts','of','their','drawing','rooms']
还可以在段落中标记句子,就像标记单词一样。使用send_tokenize方法来实现这一点。下面是一个例子。
importnltksentence_data="Sunrisesintheeast.Sunsetsinthewest."nltk_tokens=nltk.sent_tokenize(sentence_data)print(nltk_tokens)
['Sunrisesintheeast.','Sunsetsinthewest.']
在自然语言处理领域,我们遇到了两个或两个以上单词具有共同根源的情况。例如,agreed,agreeing和agreeable这三个词具有相同的词根。涉及任何这些词的搜索应该把它们当作是根词的同一个词。因此将所有单词链接到它们的词根变得非常重要。NLTK库有一些方法来完成这个链接,并给出显示根词的输出。
以下程序使用PorterStemming算法进行词干分析。
importnltkfromnltk.stem.porterimportPorterStemmerporter_stemmer=PorterStemmer()word_data="Itoriginatedfromtheideathattherearereaderswhopreferlearningnewskillsfromthecomfortsoftheirdrawingrooms"#FirstWordtokenizationnltk_tokens=nltk.word_tokenize(word_data)#Nextfindtherootsofthewordforwinnltk_tokens:print("Actual:%sStem:%s"%(w,porter_stemmer.stem(w)))
Actual:ItStem:ItActual:originatedStem:originActual:fromStem:fromActual:theStem:theActual:ideaStem:ideaActual:thatStem:thatActual:thereStem:thereActual:areStem:areActual:readersStem:readerActual:whoStem:whoActual:preferStem:preferActual:learningStem:learnActual:newStem:newActual:skillsStem:skillActual:fromStem:fromActual:theStem:theActual:comfortsStem:comfortActual:ofStem:ofActual:theirStem:theirActual:drawingStem:drawActual:roomsStem:room
词形化是类似的词干,但是它为词语带来了上下文。所以它进一步将具有相似含义的词链接到一个词。例如,如果一个段落有像汽车,火车和汽车这样的词,那么它将把它们全部连接到汽车。在下面的程序中,使用WordNet词法数据库进行词式化。
importnltkfromnltk.stemimportWordNetLemmatizerwordnet_lemmatizer=WordNetLemmatizer()word_data="Itoriginatedfromtheideathattherearereaderswhopreferlearningnewskillsfromthecomfortsoftheirdrawingrooms"nltk_tokens=nltk.word_tokenize(word_data)forwinnltk_tokens:print("Actual:%sLemma:%s"%(w,wordnet_lemmatizer.lemmatize(w)))
Actual:ItLemma:ItActual:originatedLemma:originatedActual:fromLemma:fromActual:theLemma:theActual:ideaLemma:ideaActual:thatLemma:thatActual:thereLemma:thereActual:areLemma:areActual:readersLemma:readerActual:whoLemma:whoActual:preferLemma:preferActual:learningLemma:learningActual:newLemma:newActual:skillsLemma:skillActual:fromLemma:fromActual:theLemma:theActual:comfortsLemma:comfortActual:ofLemma:ofActual:theirLemma:theirActual:drawingLemma:drawingActual:roomsLemma:room
Python具有用于数据可视化的一些很不错的类库。Pandas,numpy和matplotlib的组合可以帮助创建几乎所有类型的可视化图表。在本章中,我们将开始查看一些简单的图表和图表的各种属性。
这里使用numpy库创建要创建图表所需的数字,并使用matplotlib中的pyplot方法绘制实际图表。
importnumpyasnpimportmatplotlib.pyplotaspltx=np.arange(0,10)y=x^2#SimplePlotplt.plot(x,y)print('yes,alljobsdone')
执行上面示例代码,得到输出的图形如下-
可以使用库中的适当方法将标签应用于轴以及图表的标题,如下所示。
importnumpyasnpimportmatplotlib.pyplotaspltx=np.arange(0,10)y=x^2#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")#SimplePlotplt.plot(x,y)
图表中线条的样式和颜色可以使用库中适当的方法指定,如下所示。
importnumpyasnpimportmatplotlib.pyplotaspltx=np.arange(0,10)y=x^2#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")#Formattingthelinecolorsplt.plot(x,y,'r')#Formattingthelinetypeplt.plot(x,y,'>')
如下所示,可以使用库中的适当方法将图表保存为不同的图像文件格式。
importnumpyasnpimportmatplotlib.pyplotaspltx=np.arange(0,10)y=x^2#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")#Formattingthelinecolorsplt.plot(x,y,'r')#Formattingthelinetypeplt.plot(x,y,'>')#saveinpdfformatsplt.savefig('timevsdist.pdf',format='pdf')
上面的代码在python环境的默认路径中创建pdf文件。
在python中创建的图表可以通过使用用于制图的库中的某些适当方法进一步设置样式。在本课中,我们将看到注释,图例和图表背景的实现。我们将继续使用上一章中的代码并对其进行修改以将这些样式添加到图表中。
很多时候,我们需要通过突出显示图表的特定位置来对图表进行注释。在下面的示例中,我们通过在这些点上添加注释来指示图表中值的急剧变化。
importnumpyasnpfrommatplotlibimportpyplotaspltx=np.arange(0,10)y=x^2z=x^3t=x^4#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")plt.plot(x,y)#Annotateplt.annotate(xy=[2,1],s='SecondEntry')plt.annotate(xy=[4,6],s='ThirdEntry')
importnumpyasnpfrommatplotlibimportpyplotaspltx=np.arange(0,10)y=x^2z=x^3t=x^4#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")plt.plot(x,y)#Annotateplt.annotate(xy=[2,1],s='SecondEntry')plt.annotate(xy=[4,6],s='ThirdEntry')#AddingLegendsplt.plot(x,z)plt.plot(x,t)plt.legend(['Race1','Race2','Race3'],loc=4)
可以使用style包中的不同方法修改图表的表现风格。
importnumpyasnpfrommatplotlibimportpyplotaspltx=np.arange(0,10)y=x^2z=x^3t=x^4#LabelingtheAxesandTitleplt.title("GraphDrawing")plt.xlabel("Time")plt.ylabel("Distance")plt.plot(x,y)#Annotateplt.annotate(xy=[2,1],s='SecondEntry')plt.annotate(xy=[4,6],s='ThirdEntry')#AddingLegendsplt.plot(x,z)plt.plot(x,t)plt.legend(['Race1','Race2','Race3'],loc=4)#Stylethebackgroundplt.style.use('fast')plt.plot(x,z)
箱线图是数据集中数据分布情况的一种度量。它将数据集划分为三个四分位数。该图表示数据集中的最小值,最大值,中位数,第一四分位数和第三四分位数。通过为每个数据集绘制箱形图来比较跨数据集的数据分布也很有用。
Boxplot可以绘制调用Series.box.plot()和DataFrame.box.plot()或DataFrame.boxplot()以可视化每列中值的分布。
例如,这里是一个箱形图,表示对[0,1)上的统一随机变量的10次观察的五次试验。
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.rand(10,5),columns=['A','B','C','D','E'])df.plot.box(grid='True')
热图包含代表要绘制的每个值的相同颜色的各种阴影的值。通常图表的较暗阴影表示比较浅的阴影更高的值。对于非常不同的值,也可以使用完全不同的颜色。
以下示例是映射到图表的索引和列的值的二维图。
frompandasimportDataFrameimportmatplotlib.pyplotaspltdata=[{2,3,4,1},{6,3,5,2},{6,3,5,4},{3,7,5,4},{2,8,1,5}]Index=['I1','I2','I3','I4','I5']Cols=['C1','C2','C3','C4']df=DataFrame(data,index=Index,columns=Cols)plt.pcolor(df)plt.show()
散点图显示在笛卡尔平面的多个点。每个点代表两个变量的值。一个变量在水平轴上选择,另一个在垂直轴上选择。
可以使用DataFrame.plot.scatter()方法创建散点图。
importpandasaspdimportnumpyasnpdf=pd.DataFrame(np.random.rand(50,4),columns=['a','b','c','d'])df.plot.scatter(x='a',y='b')
气泡图将数据显示为一组圆圈。创建气泡图所需的数据需要具有xy坐标,气泡大小和气泡颜色。颜色可以由库自己提供。
气泡图可以使用DataFrame.plot.scatter()方法来创建。
importmatplotlib.pyplotaspltimportnumpyasnp#createdatax=np.random.rand(40)y=np.random.rand(40)z=np.random.rand(40)colors=np.random.rand(40)#usethescatterfunctionplt.scatter(x,y,s=z*1000,c=colors)plt.show()
Python也能够创建三维图表。它涉及将一个子图添加到现有的二维图并将投影参数指定为3d。
3dPlot由mpl_toolkits.mplot3d绘制,以便将子图添加到现有的2d图。
frommpl_toolkits.mplot3dimportaxes3dimportmatplotlib.pyplotaspltchart=plt.figure()chart3d=chart.add_subplot(111,projection='3d')#Createsometestdata.X,Y,Z=axes3d.get_test_data(0.08)#Plotawireframe.chart3d.plot_wireframe(X,Y,Z,color='r',rstride=15,cstride=10)plt.show()
在下面的例子中,我们将特定股票代码的每个季度的股票价格的值作为一个季度。将这些值作为csv文件捕获,然后使用pandas库将它们组织为数据框。然后,通过重新创建附加的Valuedate列作为索引并删除旧的值列来将日期字段设置为数据帧的索引。
样本数据
以下是特定季度不同日期股票价格的样本数据。数据保存在名为stock.csv的文件中。
ValueDatePrice01-01-2018,1042.0502-01-2018,1033.5503-01-2018,1029.704-01-2018,1021.305-01-2018,1015.4............23-03-2018,1161.326-03-2018,1167.627-03-2018,1155.2528-03-2018,1154
fromdatetimeimportdatetimeimportpandasaspdimportmatplotlib.pyplotaspltdata=pd.read_csv('path_to_file/stock.csv')df=pd.DataFrame(data,columns=['ValueDate','Price'])#SettheDateasIndexdf['ValueDate']=pd.to_datetime(df['ValueDate'])df.index=df['ValueDate']deldf['ValueDate']df.plot(figsize=(15,6))plt.show()
在下面的例子中,我们展示了部分亚洲和澳大利亚的世界地图。可以调整方法set_extent中的参数值以查找世界地图的不同区域。
importmatplotlib.pyplotaspltimportcartopy.crsasccrsfig=plt.figure(figsize=(15,10))ax=fig.add_subplot(1,1,1,projection=ccrs.PlateCarree())#makethemapglobalratherthanhaveitzoominto#theextentsofanyplotteddataax.set_extent((60,150,55,-25))ax.stock_img()ax.coastlines()ax.tissot(facecolor='purple',alpha=0.8)plt.show()
CSGraph代表压缩稀疏图,它着重于基于稀疏矩阵表示的快速图算法。
首先,让我们了解一个稀疏图是什么以及它在图表示中的作用。
图形只是节点的集合,它们之间有链接。图表几乎可以代表任何事物-社交网络连接,每个节点都是一个人,并且与熟人相连;图像,其中每个节点是像素并连接到相邻像素;指向高维分布,其中每个节点都连接到最近的邻居,并且几乎可以想象其他任何事物。
一个具体的例子,假设想要表示无向图,如下所示-
该图有三个节点,其中节点0和1通过权重2的边连接,节点0和2通过权重1的边连接。可以构造如下例所示的稠密,掩码和稀疏表示请记住,无向图由对称矩阵表示。
G_dense=np.array([[0,2,1],[2,0,0],[1,0,0]])G_masked=np.ma.masked_values(G_dense,0)fromscipy.sparseimportcsr_matrixG_sparse=csr_matrix(G_dense)print(G_sparse.data)
上述程序将生成以下输出。
array([2,1,2,1])
这与前面的图相同,只是节点0和2通过零权重的边连接。在这种情况下,上面的密集表示会导致含糊不清-如果零是一个有意义的值,那么如何表示非边缘。在这种情况下,必须使用蒙版或稀疏表示来消除歧义。
看看下面的例子。
fromscipy.sparse.csgraphimportcsgraph_from_denseG2_data=np.array([[np.inf,2,0],[2,np.inf,np.inf],[0,np.inf,np.inf]])G2_sparse=csgraph_from_dense(G2_data,null_value=np.inf)print(G2_sparse.data)
array([2.,0.,2.,0.])
数学中心趋势意味着测量数据集中值或位置的分布。它给出了数据集中数据的平均值的一个概念,也表明数据集中数值的扩展程度。这反过来有助于评估新的输入符合现有数据集的可能性,从而有助于评估成功的可能性。
有三种主要的集中趋势度量可以使用pandaspython库中的方法来计算。
pandas函数可以直接用来计算这些值。
importpandasaspd#CreateaDictionaryofseriesd={'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack','Lee','Chanchal','Gasper','Naviya','Andres']),'Age':pd.Series([25,26,25,23,30,29,23,34,40,30,51,46]),'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}#CreateaDataFramedf=pd.DataFrame(d)print("MeanValuesintheDistribution")print(df.mean())print("*******************************")print("MedianValuesintheDistribution")print(df.median())
MeanValuesintheDistributionAge31.833333Rating3.743333dtype:float64*******************************MedianValuesintheDistributionAge29.50Rating3.79dtype:float64
根据数据是否连续或者是否存在具有最大频率的值,模式可能会或可能不会在分布中可用。我们通过下面的简单分布来找出模式。这里有一个在分布中具有最大频率的值。
importpandasaspd#CreateaDictionaryofseriesd={'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack','Lee','Chanchal','Gasper','Naviya','Andres']),'Age':pd.Series([25,26,25,23,30,25,23,34,40,30,25,46])}#CreateaDataFramedf=pd.DataFrame(d)print(df.mode())
AgeName025.0Andres1NaNChanchal2NaNGasper3NaNJack4NaNJames5NaNLee6NaNNaviya7NaNRicky8NaNSmith9NaNSteve10NaNTom11NaNVin
在统计中,方差是衡量数据集中的值与平均值相差多少的指标。换句话说,它表示值的分散程度。它通过使用标准偏差来衡量。另一种常用的方法是偏斜。
这两个都是通过使用pandas库中可用的函数来计算的。
标准偏差是方差的平方根。方差是数据集中平均值与平均值的平方差。在python中,我们使用pandas库中的函数std()来计算这个值。
importpandasaspd#CreateaDictionaryofseriesd={'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack','Lee','Chanchal','Gasper','Naviya','Andres']),'Age':pd.Series([25,26,25,23,30,25,23,34,40,30,25,46]),'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}#CreateaDataFramedf=pd.DataFrame(d)#Calculatethestandarddeviationprint(df.std())
Age7.265527Rating0.661628dtype:float64
它用于确定数据是对称的还是倾斜的。如果索引在-1和1之间,则分布是对称的。如果指数不超过-1,那么它向左倾斜,如果它至少为1,那么它向右偏斜
importpandasaspd#CreateaDictionaryofseriesd={'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Smith','Jack','Lee','Chanchal','Gasper','Naviya','Andres']),'Age':pd.Series([25,26,25,23,30,25,23,34,40,30,25,46]),'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8,3.78,2.98,4.80,4.10,3.65])}#CreateaDataFramedf=pd.DataFrame(d)print(df.skew())
Age1.443490Rating-0.153629dtype:float64
因此,年龄分布是对称的,而年龄分布则偏向右侧。
正态分布是通过排列数据中每个值的概率分布来呈现数据的形式。大多数值保持在平均值附近,使得排列对称。
可使用numpy库中各种函数来数学计算正态分布的值。通过绘制概率分布曲线来创建直方图。
importmatplotlib.pyplotaspltimportnumpyasnpmu,sigma=0.5,0.1s=np.random.normal(mu,sigma,1000)#Createthebinsandhistogramcount,bins,ignored=plt.hist(s,20,normed=True)#Plotthedistributioncurveplt.plot(bins,1/(sigma*np.sqrt(2*np.pi))*np.exp(-(bins-mu)**2/(2*sigma**2)),linewidth=3,color='y')plt.show()
二项分布模型处理的是在一系列实验中只发现两种可能结果的事件成功概率。例如,投掷硬币总是会产生正面或背面。在二项分布期间估计重复抛掷硬币10次获得3个正面的概率。
我们使用具有内置函数的seabornpython库来创建这样的概率分布图。此外,scipy软件包有助于创建二项分布。
fromscipy.statsimportbinomimportseabornassbbinom.rvs(size=10,n=20,p=0.8)data_binom=binom.rvs(n=20,p=0.8,loc=0,size=1000)ax=sb.distplot(data_binom,kde=True,color='blue',hist_kws={"linewidth":25,'alpha':1})ax.set(xlabel='Binomial',ylabel='Frequency')
我们使用具有内置函数的seaborn的python库来创建这样的概率分布图。此外,scipy软件包有助于创建二项分布。
fromscipy.statsimportpoissonimportseabornassbdata_binom=poisson.rvs(mu=4,size=10000)ax=sb.distplot(data_binom,kde=True,color='green',hist_kws={"linewidth":25,'alpha':1})ax.set(xlabel='Poisson',ylabel='Frequency')
伯努利分布是二项分布的特例,其中进行了单个实验,因此观察次数为1。因此,伯努利分布因此描述了具有两个结果的事件。
在numpy库中使用各种函数来数学计算伯努利分布的值。通过绘制概率分布曲线来创建直方图。
fromscipy.statsimportbernoulliimportseabornassbdata_bern=bernoulli.rvs(size=1000,p=0.6)ax=sb.distplot(data_bern,kde=True,color='crimson',hist_kws={"linewidth":25,'alpha':1})ax.set(xlabel='Bernouli',ylabel='Frequency')
p值是关于假设的强度。我们基于一些统计模型建立假设,并使用p值比较模型的有效性。获得p值的一种方法是使用T检验。
这是对零假设的双侧检验,即独立观察值'a'的样本的期望值(平均值)等于给定的总体均值popmean。看看下面的一个例子。
fromscipyimportstatsrvs=stats.norm.rvs(loc=5,scale=10,size=(50,2))print(stats.ttest_1samp(rvs,5.0))
Ttest_1sampResult(statistic=array([-1.40184894,2.70158009]),pvalue=array([0.16726344,0.00945234]))
比较两个样本
在下面的例子中,有两个样本可以来自相同或不同的分布,想要测试这些样本是否具有相同的统计特性。
ttest_ind-计算两个独立样本得分的T检验。对于两个独立样本具有相同平均(预期)值的零假设,这是一个双侧检验。该测试假设人口默认具有相同的差异。
如果观察到来自相同或不同人群的两个独立样本,那么可以使用这个测试。让我们来看下面的一个例子。
fromscipyimportstatsrvs1=stats.norm.rvs(loc=5,scale=10,size=500)rvs2=stats.norm.rvs(loc=5,scale=10,size=500)print(stats.ttest_ind(rvs1,rvs2))
Ttest_indResult(statistic=-0.67406312233650278,pvalue=0.50042727502272966)
可以使用相同长度的新数组进行测试,但具有不同的含义。在loc中使用不同的值并测试相同的值。
importmatplotlib.pyplotaspltimportseabornassnsdf=sns.load_dataset('iris')#withoutregressionsns.pairplot(df,kind="scatter")plt.show()
在numpy库中使用各种功能来执行卡方检验。
fromscipyimportstatsimportnumpyasnpimportmatplotlib.pyplotaspltx=np.linspace(0,10,100)fig,ax=plt.subplots(1,1)linestyles=[':','--','-.','-']deg_of_freedom=[1,4,7,6]fordf,lsinzip(deg_of_freedom,linestyles):ax.plot(x,stats.chi2.pdf(x,df),linestyle=ls)plt.xlim(0,10)plt.ylim(0,0.4)plt.xlabel('Value')plt.ylabel('Frequency')plt.title('Chi-SquareDistribution')plt.legend()plt.show()
Seaborn找到线性回归关系的函数是regplot。下面的例子显示了它的用法。
importseabornassbfrommatplotlibimportpyplotaspltdf=sb.load_dataset('tips')sb.regplot(x="total_bill",y="tip",data=df)plt.show()