Python数据分析:数据读取、预处理

Python数据分析:数据读取、预处理

标准数据集

https://blog.csdn.net/csc_1/article/details/68070174

  • 瑞典汽车保险数据集 https://www.math.muni.cz/~kolacek/docs/frvs/M7222/data/AutoInsurSweden.txt
  • 墨尔本最低日常温度 daily-minimum-temperatures.csv
    该数据集描述了澳大利亚墨尔本市10年(1981-1990)的最低日常温度。单位为摄氏度,有3,650个观测值。数据来源被称为澳大利亚气象局。https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv
  • UCI 机器学习库
    http://mlr.cs.umass.edu/ml/

1. 数据读入、保存

查询当前的工作路径
import os
os.getcwd() #获取当前工作路径
%pwd #获取当前工作路径
Excel 数据读入
  • 打开 Try JupyterLab / 上传.csv文件 / 复制已有的Untitled.ipynb文件进行编辑
  • 打开 Try Classic Notebook / File / Open /上传.csv文件/ 编辑代码然后运行
import pandas as pd   #导入pandas包
data = pd.read_csv("myexcel.csv")   # pd.read_csv读取
#data = pd.read_excel("myexcel.xlsx")   # pd.read_excel读取
print(data) 
数据保存
import pandas as pd   #导入pandas包
data = pd.read_csv("myexcel.csv")   # pd.read_csv读取myexcel.csv
data.to_csv("myexcel2.csv")   # 导出数据到CSV文件myexcel2.csv
数据复制 浅拷贝、深拷贝

copy.copy 是将父对象的值复制了一份,但是子对象指向同一内存地址
copy.deepcopy 将父子对象的值全部复制一份,和原对象已没有任何关系

import copy
a = [1,2,3,4,['a','b']]  #原始对象
b = a  #赋值,传对象的引用
c = copy.copy(a)  #浅拷贝
d = copy.deepcopy(a)  #深拷贝
a.append(5)
a[4].append('c')
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
------------------------------------------------------------
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b']]
读入 .csv文件时的编码问题 utf-8' codec can't decode
  • 直接在读取时声明csv的编码方式为‘gbk’
    data=pd.read_csv(‘data.csv’,encoding=‘gbk’)
  • 将数据源的编码方式改为‘utf-8’
    找到csv文件–》右键–》打开方式–》记事本
    打开记事本,“文件–》另存为”,可以看到文件的默认编码格式为ANSI
    选择编码下拉框,选择需要的编码格式UTF8,重新保存即可

2. 数据预处理

数据质量分析的任务是检测原始数据中是否存在脏数据,脏数据一般是指不符合要求,不能直接进行相应分析的数据,脏数据一般包括:缺失值异常值(离群点)不一致的值内容未知的值

缺失值的四种处理方法:删除记录数据填补和不处理

缺失值处理: 删除缺失值所在行
#缺失值处理: 删除缺失值所在行
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(3,5),columns = list('abcde'))
df.iloc[0,2] = np.nan #iloc是选择行和列
df.loc[2] = np.nan #loc是选择行
print(df)

nan_all=df.isnull() #找出缺失值
print(nan_all)
drop = df.dropna() #丢弃包含缺失值的行记录
print(drop)
------------------------------------------------------------
          a         b         c         d         e
0  0.563419 -0.058732       NaN -0.036233 -0.431621
1 -0.219255  0.767613 -0.683556 -2.222446  0.443755
2       NaN       NaN       NaN       NaN       NaN
       a      b      c      d      e
0  False  False   True  False  False
1  False  False  False  False  False
2   True   True   True   True   True
          a         b         c         d         e
1 -0.219255  0.767613 -0.683556 -2.222446  0.443755
重复值处理: 判断并删除重复值所在行
#重复值处理: 判断并删除重复值所在行
import pandas as pd
import numpy as np
data = pd.DataFrame([[1,2,3],['a','b','c'],[1,2,3]],columns=list('abc'))
print("原始数据:\n",data)
print(data.duplicated()) #判断是否有重复行
data = data.drop_duplicates() #去掉重复行
print(data.shape) #查看数据的行列大小:(25375,8)
print("去重数据:\n",data)
------------------------------------------------------------
原始数据:
    a  b  c
0  1  2  3
1  a  b  c
2  1  2  3
0    False
1    False
2     True
dtype: bool
(2, 3)
去重数据:
    a  b  c
0  1  2  3
1  a  b  c
异常值的处理方法:统计法3σ 法箱型图

异常值的测量标准有很多,比较常见的是描述性统计法3σ 法箱型图
在这里插入图片描述
统计法

#异常值处理:描述性统计
import pandas as pd
import numpy as np
data = pd.read_csv('myexcel2.csv', header=0)

print(data.shape) #查看行列数
print(data.head(5)) #查看前5行数据 
print(data.describe()) 

neg_list = ['数量','单价','总额']
#统计数据中每列小于0的数的个数
for item in neg_list:
    neg_item = data[item]<0
    print(item + '小于0的有' + str(neg_item.sum()) + '个')

#此处将小于0的数据删除
yichangList = []
for item in neg_list:
    for i in range(0, len(data)):
        if data[item][i]<0:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)
#打印删除了小于0的数据
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
#再次统计数据中每列小于0的数的个数
for item in neg_list:
    neg_item = data[item]<0
    print(item + '小于0的有' + str(neg_item.sum()) + '个')
------------------------------------------------------------
(20, 5)
   ID 名称  数量  单价   总额
0   1  A   5  12   60
1   2  B   3  36  108
。。。。。。
             ID        数量           单价           总额
count  20.00000  20.00000    20.000000    20.000000
mean   10.50000   3.45000   102.050000   223.400000
std     5.91608   3.88621   248.219868   439.866295
min     1.00000  -9.00000     1.000000   -25.000000
25%     5.75000   2.00000    22.750000    56.500000
50%    10.50000   3.00000    25.500000   112.500000
75%    15.25000   6.25000    30.750000   161.250000
max    20.00000   8.00000  1000.000000  2000.000000
数量小于0的有2个
单价小于0的有0个
总额小于0的有2[10, 3]
    ID 名称  数量    单价    总额
0    1  A   5    12    60
1    2  B   3    36   108
。。。。。。
数量小于0的有0个
单价小于0的有0个
总额小于0的有0

3σ 法 当数据服从正态分布时,99%的数值应该位于距离均值3个标准差之内的距离,P(|x−μ|>3σ)≤0.003,当数值超出这个距离,可以认为它是异常值。

# 3σ 法则统计
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('myexcel2.csv', header=0)
data_c = copy.deepcopy(data)  #深拷贝数据
print(data.shape) #查看行列数
print(data.head(5)) #查看前5行数据 
print(data.describe()) 

neg_list = ['数量','单价','总额']
#统计数据中每列不符合 3σ 法则的数的个数 P(|x−μ|>3σ)≤0.003
for item in neg_list:
    data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
    z_abnormal = abs(data_c[item])>3
    print(item + '中有' + str(z_abnormal.sum()) + '个异常值')

#此处将不符合 3σ 法则的数据删除
yichangList = []
for item in neg_list:
    data_c[item] = (data_c[item] - data_c[item].mean())/data_c[item].std()
    for i in range(0, len(data_c)):
        if abs(data_c[item][i])>3:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)

#打印删除了不符合 3σ 法则的数据
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
(20, 5)
   ID 名称  数量  单价   总额
0   1  A   5  12   60
1   2  B   3  36  108
。。。。。。
             ID        数量           单价           总额
count  20.00000  20.00000    20.000000    20.000000
mean   10.50000   3.45000   102.050000   223.400000
std     5.91608   3.88621   248.219868   439.866295
min     1.00000  -9.00000     1.000000   -25.000000
25%     5.75000   2.00000    22.750000    56.500000
50%    10.50000   3.00000    25.500000   112.500000
75%    15.25000   6.25000    30.750000   161.250000
max    20.00000   8.00000  1000.000000  2000.000000
数量中有1个异常值
单价中有1个异常值
总额中有1个异常值
[11, 3]
    ID 名称  数量   单价   总额
0    1  A   5   12   60
1    2  B   3   36  108
2    3  D   8   25  200
。。。。。。

箱型图
在这里插入图片描述

#绘制箱型图 展示异常值
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data = pd.read_csv('iris2.csv')
# column参数表示要绘制成箱形图的数据,可以是一列或多列;    by参数表示分组依据
data.boxplot(column=['s_l','s_w'],by='specs',grid=True,rot=25,fontsize=15)
# data.boxplot(grid=True)  #全部列画出
print(data.head())
plt.show()

在这里插入图片描述
在这里插入图片描述

#箱型图 法则统计 并删除异常值
import pandas as pd
import numpy as np
import copy
data = pd.read_csv('iris2.csv', header=0)
data_c = copy.deepcopy(data)  #深拷贝数据
neg_list = ['s_l','s_w','p_l','p_w']
#箱型图 IQR(差值)=U(上四分位数)-L(下四分位数) #上界=U+1.5IQR,下界=L-1.5IQR
for item in neg_list:
    iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
    q_abnormal_L = data_c[item] < data_c[item].quantile(0.25)-1.5*iqr
    q_abnormal_U = data_c[item] > data_c[item].quantile(0.75)+1.5*iqr
    print(item+'中有'+str(q_abnormal_L.sum()+q_abnormal_U.sum())+'个异常值')
#此处将不符合 箱型图 法则的数据删除
yichangList = []
for item in neg_list:
    iqr = data_c[item].quantile(0.75) - data_c[item].quantile(0.25)
    q_L = data_c[item].quantile(0.25)-1.5*iqr
    q_U = data_c[item].quantile(0.75)+1.5*iqr
    for i in range(0, len(data)):
        if data_c[item][i]<q_L or data_c[item][i]>q_U:
            yichangList.append(i)
yichangList = list(set(yichangList))          
print(yichangList)
#打印删除了不符合 箱型图 法则的数据
for yichangHang in yichangList:
    data = data.drop(yichangHang)
print(data)
------------------------------------------------------------
s_l中有0个异常值
s_w中有4个异常值
p_l中有0个异常值
p_w中有0个异常值
[32, 33, 60, 15]
     s_l  s_w  p_l  p_w      specs
。。。。。。
14   5.8  4.0  1.2  0.2     setosa
16   5.4  3.9  1.3  0.4     setosa
。。。。。。

3. 撰写报告、结论分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值