Python中的数据分析详解
数据分析概述
python在数据分析方面有哪些优势
- Python不受数据规模的约束,能够处理大规模数据。
- Python的sklearn库提供了丰富的数据挖掘和人工智能方法,为使用者分析各种场景提供方法支持。
- Python的自动数据分析能够显著提升工作效率。
- Python能够绘制各种前沿的数据图表。
- Python在海量数据采集方面也有独特的优势。
数据分析的流程是什么?
- 数据采集
- 数据整理和存储
- 数据分析和可视化
- 数据报表和总结
数据的导入和导出
导入数据
Excel格式
#excel有xls,xlsx两种格式,都可以使用read_excel #read_excel方法返回的结果是DataFrame,DataFrame的一列对应着Excel的一列。 import pandas as pd data = pd.read_excel(path) """ 参数含义: (1)sheet_name参数:该参数用于指定导入Excel文件中的哪一个sheet,如果不填写这个参数,则默认导入第一个sheet。 (2) index_col参数:该参数用于指定表格的哪一列作为DataFrame的行索引,从0开始计数。 (3)nrows参数:该参数可以控制导入的行数,该参数在导入文件体积较大时比较有用。 (4)skipfooter参数:该参数可以在导入数据时,跳过表格底部的若干行。 (5)header参数:当使用Pandas的read_excel方法导入Excel文件时,默认表格的第一行为字段名。如果表格的第一段不是字段名,则需要使用该参数设置字段名。 (6)usecols参数:该参数可以控制导入Excel表格中的哪些列。 (7)names参数:该参数可以对导入数据的列名进行重命名。 """
csv格式
#CSV是一种用分隔符分割的文件格式。由于Excel文件在存放巨量数据时会占用极大空间,且导入时也存在占用极大内存的缺点,因此,巨量数据常采用CSV格式。 import pandas as pd data = pd.read_csv(path,encoding="utf-8") #sep参数表示要导入的csv文件的分隔符,默认值是半角逗号 data = pd.read_csv(path,sep=',',encoding="utf-8")
json格式
#用Pandas模块的read_json方法导入JSON数据,其中的参数为JSON文件的路径。 import pandas as pd data = pd.read_json(path)
txt格式
#需要导入存在于txt文件中的数据时,可以使用pandas模块中的read_table方法。它的参数和用法与read_csv方法类似。 import pandas as pd data = pd.read_table(path)
导出数据
CSV格式数据输出
import pandas as pd data = pd.read_csv(path,sep=",",encoding="utf-8",nrows=10) data.to_csv("test.csv",nrows=10) """ 1、CSV格式数据输出 对于pandas库的to_csv方法,有下列参数说明: path_or_buf:要保存的路径及文件名。 sep:分割符,默认为“,”。 columns:指定要输出的列,用列名,列表表示,默认值为None。 header:是否输出列名,默认值为True。 index:是否输出索引,默认值为True。 encoding:编码方式,默认值为“utf-8”。 """
xlsx格式数据输出
import pandas as pd data = pd.read_excel(path) data.to_excel(path,encoding='gbk') """ sheet_name:字符串,默认值为“Sheet1”,指包含DataFrame数据的表的名称。 np_rep:字符串,默认值为 ‘ '。指缺失数据的表示方式 columes:序列,可选参数,要编辑的列 header:布尔型或字符串列表,默认值为True。如果给定字符串列表,则表示它是列名称的别名。 index:布尔型,默认值为True,行名(索引) index_label:字符串或序列,默认值为None。如果文件数据使用多索引,则需使用序列。 encoding:指定Excel文件的编码方式,默认值为None。 """ data2 = pd.read_excel(path) work = pd.ExcelWriter('path') data.to_excel(work,sheet_name='data') data2.to_excel(work,sheet_name="data2")
数据预处理
熟悉数据
import pandas as pd data = pd.read_csv(path) #使用info()方法查看数据基本类型 data.info() #查看数据表的大小 d = data.shape[0] w = data.shape[1] #数据格式的查看 type(data) #series的查看 data.dtype #dataframe的查看 data.dtypes #查看具体的数据分布在进行数据分析时,常常需要对对数据的分布进行初步分析,包括统计数据中各元素的个数,均值、方差、最小值、最大值和分位数 data.describe()
缺失值处理
import pandas as pd data = pd.read_csv(path) #缺失值检查 #isnull()方法。isnull()函数返回值为布尔值,如果数据存在缺失值,返回True;否则,返回False。 data.isnull() #缺失值删除 #dropna()方法用于删除含有缺失值的行。 data.dropna() #当某行或某列值都为NaN时,才删除整行或整列。这种情况该如何处理? data.dropna(how='all',axis=0)#当整行都是None时,删除整行 #当某行有一个数据为NaN时,就删除整行和当某列有一个数据为NaN时, data.dropna(how='any',axis=0) data.dropna(how='any',axis=1) #缺失值替换/填充 #在data数据中,利用各列值的均值填补缺失数据,该如何用Python实现? data.fillna(data.mean()) #使用近邻填补法,即利用缺失值最近邻居的值来填补数据,对df数据中的缺失值进行填补,这种情况该如何实现? data.fillna(method='bfill')#在本案例中,可以将fillna()方法的method参数设置为bfill,来使用缺失值后面的数据进行填充。 #若使用缺失值前面的值进行填充来填补数据,这种情况又该如何实现? data.fillna(method='ffill') #请利用二次多项式插值法对df数据中A列的缺失值进行填充。 data['A'].fillna(method='polynomial',order=2) #请使用Python完成对df数据中A列的三次样条插值填充。 data['A'].fillna(method='spline',order=3)
重复值处理
""" 利用duplicated()方法检测冗余的行或列,默认是判断全部列中的值是否全部重复,并返回布尔类型的结果。对于完全没有重复的行,返回值为False。对于有重复值的行,第一次出现重复的那一行返回False,其余的返回True。 """ import pandas as pd data = pd.read_csv(path) data.duplicated() #drop_duplicates()方法。,利用duplicates()方法去除冗余数据,即删除冗余的所有行,默认是判断全部列 data.drop_duplicates()
检测异常值
#query方法和boxplot方法。首先使用pandas库中的query方法查询数据中是否有异常值。然后通过boxplot方法检测异常值。 import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv(path) #假设B列大于1000 data.query('B<1000') #画图 plt.boxplot(df['B']) """ 处理异常值的方法 (1)最常用的方式是删除。 (2)将异常值当缺失值处理,以某个值填充。 (3)将异常值当特殊情况进行分析,研究异常值出现的原因。 """
数据类型检查
#利用numpy库的arange函数创建一维整数数组,并查看数据类型。 import numpy as np arr = np.arange(0,10) arr.dtype #利用numpy库的arange函数创建一维浮点数数组arr1,然后将arr1数组的数据类型转换为整型。 arr1 = np.arange(1,5,0.5) arr1.astype(np.int)
索引设置
""" pandas中索引的作用 (1)更方便地查询数据。 (2)使用索引可以提升查询性能。 """ #1、添加索引 import pandas as pd import numpy as np data = pd.Series([i for i in range(1,6)],['a','b','c','d','e']) #某公司销售数据集“work.csv”内容如下,请设定日期为索引,并用Python实现。 #set_index()函数,可以指定某一字段为索引 data = pd.read_csv("work.csv") data1 = data.set_index('date') #更改索引在该案例中,除了可以用set_index方法重置索引外,还可以在导入csv文件的过程中,设置index_col参数重置索引,代码及结果如下: data2 = pd.read_csv("work.csv",sep=",",encoding="gbk",index_col="日期") #重建索引 data3 = data.reindex([....]) #重建行和列 data4 = data.reindex(index=new_index,columns=new_columns)
其他
#大小写转换 lower()#大变小 upper()#小变大 #按列增加数据 import pandas as pd import numpy as np data = pd.read_csv(path) data.insert(num,'name',value)#num是第几列,name是列名,value是值 data.loc[:,'name'] = value #按行增加数据 data.append(new_data) data.loc['index'] = value data.iloc[num,:] = value#num是第几行 #数据删除 """ 关键技术:该案例中,使用DataFrame的drop()方法,删除数据中某一列。drop()方法的参数说明如下: labels:表示行标签或列标签。 axis:axis=0,表示按行删除,axis=1,表示按列删除。默认值为0。 index:删除行,默认为None。 columns:删除列,默认为None。 inplace:可选参数,对原数组作出修改并返回一个新数组。默认是False,如果为True,那么原数组直接被替换。 """
数据的选择和运算
数据的索引和切片
a[m:n:p],m开始,n结束,p步长 a[:,0]#第一列 #布尔索引 import numpy as np arr = np.arange(3) bool1 = np.array(True,False,True) arr[bool1]#arr([0,1]) #花式索引 arr[arr>value] arr[arr<=value]=0 #series可以用索引数值来选取 #切片 #[下界 :上界 :步长] #loc中横向索引是确定的 #loc中可以加条件条件使用法语法为df.loc[进行筛选的条件],如果条件为真,则选出符合条件的结果。复合条件包括: &(且 = 与), |(或), ~(取反 = 非),通过筛选函数进行筛选,常见的函数式有 isin(), where() 等。 #iloc 的使用与 loc 完全类似,只不过是针对“位置( = 第几个 )”进行筛选。函数语法为:.iloc[整数、整数列表、整数切片、布尔列表以及函数] #①函数 = 自定义函数 (函数的返回值需要是合法对象 (= 整数、整数列表、整数切片、布尔列表)) #②匿名函数 lambda :使用方法 #语法:lambda 自变量: slice(start = 下界, stop = 上界, step = 步长)。
多表合并
import pandas as pd import numpy as np pd.merage(data1,data2,on=index)#index可以是一个键,也可以是一个列表 #参数how,left用data1的键,right用data2的,outer使用并集,inner使用交集 #使用join()方法合并数据集 #DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False) #使用concat()方法合并数据集 pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False) #可以利用count()方法进行计算非空个数,并利用参数axis来控制行列的计算 #quantile() data.quantile(0.35)#淘汰35%的人 data.sort_values()#sort_values()方法可以根据指定行/列进行排序。 #参数 #by:要排序的名称列表 #axis:轴,0代表行,1代表列,默认是0 #按照数据进行排序,首先按照C列进行降序排序,在C列相同的情况下,按照B列进行升序排序。 data.sort_values(by=['c','b'],ascending=[False,True])
数据分类汇总和统计
Groupby分类统计
Hadley Wickham创造了一个用于表示分组运算的术语“split-apply-combine”(拆分-应用-合并)。第一个阶段,pandas对象中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后,将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中。结果对象的形式一般取决于数据上所执行的操作。下图大致说明了一个简单的分组聚合过程。
按列分组
按列分组分为以下三种模式:
第一种:df.groupby(col),返回一个按列进行分组的groupby对象;
第二种:df.groupby([col1,col2]),返回一个按多列进行分组的groupby对象;
第三种:df.groupby(col1)[col2] 或者 df[col2].groupby(col1),两者含义相同,返回按列col1进行分组后,col2的值;
时间序列
Datetime 模块
Python标准库中包含了datetime模块,该模块提供了非常强大的功能来处理日期和时间。
datatime模块是在time模块的基础上做了封装,提供了更多更好用的类,常用的类有date、time、datetime、timedelta、tzinfo。
""" 请利用Python获取当前日期。 关键技术:可以利用datetime模块date类的today()方法将当前日期保存在变量中。 通过使用date.today(),可以创建一个date类对象,其中包含了日期元素,如年、月、日,但不包含时间元素,比如时、分、秒。最后,可以使用year、month和day来捕获具体的日期元素 """ import datetime date = datetime.date.today() print(date) print(date.year) print(date.month) print(date.day) """ 利用Python获取当前日期和时间。 关键技术:可以利用datetime模块datetime类的today()方法将当前日期和时间保存在变量中。 """ import datetime date = datetime.datetime.today() print(date) print(date.year) print(date.month) print(date.day) """ 请利用Python获取当前时间。 关键技术:可以利用datetime模块datetime类的now()方法将当前日期和时间保存在变量中 date = datetime.datetime.now() date """ """ 时间戳与time模块 时间戳是以格林威治时间1970年01月01日00时00分00秒为基准计算所经过时间的秒数,是一个浮点数。Python的内置模块time和datetime都可以对时间格式数据进行转换,如时间戳和时间字符串的相互转换。 """ import time time.mktime(time.localtime()) """ 请利用Python将时间戳数据转换成系统时间。 关键技术:可以利用time模块的strftime()函数可以将时间戳转换成系统时间。 """ import pandas as pd import time time = time.strftime(("%Y-%m-%d %H:%M:%S"),time.localtime(time.mktime(time.localtime()))) """ 请利用Python将字符串'2022-01-15'转换成时间类型的数据格式。 关键技术:在可以用strptime函数将日期字符串转换为datetime数据类型,可以用Pandas的to_datetime()函数将日期字符串转换为datetime数据类型。to_datetime()函数转化后的时间是精准到时分秒精度的。 """ import datetime datestr = "2022-01-15" datetime.datetime.strptime(datestr,"%Y-%m-%d") #字符串和时间转换 import pnadas as pd datestrs = "2022/01/15" pd.to_datetime(datestrs) """ 给定两个时间类型的数据,计算两个时间的不同之处。 关键技术:利用datetime将时间类型数据进行转换,然后利用减法运算计算时间的不同之处,默认输出结果转换为用(“天”,“秒”)表达。 """ import datetime delta = datetime.datetime(2022,1,16) - datetime.datetime(2022,1,11,1,12) """ 如果要将输出结果转换以“天”为单位,此时应该如何处理? 关键技术:针对上例中的delta变量,利用delta.days可以将输出结果转换以“天”为单位。 """ delta.days """ 【例】如果要将输出结果转换以“秒”为单位,此时应该如何处理? 关键技术:针对上例中的delta变量,利用delta.seconds可以将输出结果转换以“秒”为单位 """ delta.seconds
数据可视化
例1 绘制带有中文标题、标签和图例的正弦和余弦图像。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.font_manager as fm t = np.arange(0.0,2.0*np.pi,0.01) s = np.sin(t) c = np.cos(t) plt.plot(t,s,label='正弦',color='red') plt.plot(t,c,label='余弦',color='blue') plt.xlabel("x-变量") plt.ylabel("y") plt.xlabel('x-变量', #标签文本 fontproperties='STKAITI', #字体 fontsize=18) #字号 plt.ylabel('y-正弦余弦函数值', fontproperties='simhei', fontsize=18) plt.title('sin-cos函数图像', #标题文本 fontproperties='STLITI', #字体 fontsize=24) #字号
例2 绘制余弦曲线散点图。
import numpy as np from matplotlib import * t = np.arange(0.0,np.pi*2,0.01) c = np.cos(t) plt.scatter(t,c)
到此这篇关于Python中的数据分析详解的文章就介绍到这了,更多相关Python数据分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
2020年10款优秀的Python第三方库,看看有你中意的吗?
2020已经过去,在过去的一年里,又有非常多优秀的Python库涌现出来。相对于numpy、TensorFlow、pandas这些已经经过多年维护、迭代,对于大多数Python开发者耳熟能详的库不同。2021-01-01
最新评论