当前位置:   article > 正文

Python数据分析详解

python数据分析

Python数据分析详解

数据分析概述

python在数据分析方面有哪些优势

  1. Python不受数据规模的约束,能够处理大规模数据。
  2. Python的sklearn库提供了丰富的数据挖掘和人工智能方法,为使用者分析各种场景提供方法支持。
  3. Python的自动数据分析能够显著提升工作效率。
  4. Python能够绘制各种前沿的数据图表。
  5. Python在海量数据采集方面也有独特的优势。

数据分析的流程是什么?

  1. 数据采集
  2. 数据整理和存储
  3. 数据分析和可视化
  4. 数据报表和总结

数据的导入和导出

导入数据

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参数:该参数可以对导入数据的列名进行重命名。 
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

json格式

#用Pandas模块的read_json方法导入JSON数据,其中的参数为JSON文件的路径。 
import pandas as pd
data  = pd.read_json(path)
  • 1
  • 2
  • 3

txt格式

#需要导入存在于txt文件中的数据时,可以使用pandas模块中的read_table方法。它的参数和用法与read_csv方法类似。
import pandas as pd
data = pd.read_table(path)
  • 1
  • 2
  • 3
导出数据

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”。

"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

数据预处理

熟悉数据
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
缺失值处理
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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
重复值处理
"""
利用duplicated()方法检测冗余的行或列,默认是判断全部列中的值是否全部重复,并返回布尔类型的结果。对于完全没有重复的行,返回值为False。对于有重复值的行,第一次出现重复的那一行返回False,其余的返回True。
"""
import pandas as pd
data = pd.read_csv(path)

data.duplicated()

#drop_duplicates()方法。,利用duplicates()方法去除冗余数据,即删除冗余的所有行,默认是判断全部列
data.drop_duplicates()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
检测异常值
#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)将异常值当特殊情况进行分析,研究异常值出现的原因。

"""


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
数据类型检查
#利用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
索引设置
"""
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)




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
其他
#大小写转换
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,那么原数组直接被替换。

"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

数据的选择和运算

数据的索引和切片
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 = 步长)。
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
多表合并
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])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

数据分类汇总和统计

"""
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的值;

"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
'
运行

时间序列

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

数据可视化

例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)                 #字号


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/897712
推荐阅读
相关标签
  

闽ICP备14008679号