Python使用numpy和Pandas来做数据分析

目录

Numpy、Pandas模块包简介

数据操作分析实例操作:

环境准备

写代码实操部分

总结体会



Python语言自然不用多说了,专门做数据分析和数据挖掘、数据解刨的语言,模块很多使用方便。

Numpy、Pandas模块包简介

Numpy

NumPy 是 Python 中科学计算的基础包。它是一个 Python 库,提供多维数组对象、各种派生对象

(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种例程,包括数学、逻辑、形状操作、

排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

Pandas

Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。

Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)。

Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。

Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

numpy和pandas的两个官网链接,API和文档信息都在官网内查询。注意版本的不同带来的影响。

https://numpy.org/doc/stable/https://numpy.org/doc/stable/pandas - Python Data Analysis Libraryhttps://pandas.pydata.org/

数据操作分析实例操作:

环境准备

准备numpy、pandas、python3.6版本

Python使用numpy和Pandas来做数据分析_第1张图片

准备清洗的数据:

Python使用numpy和Pandas来做数据分析_第2张图片

 数据文档放置在Data文件夹:

 Python使用numpy和Pandas来做数据分析_第3张图片

写代码实操部分

 导入依赖包进行打包处理

#导入依赖包
#-*-coding:utf-8-*-
from __future__ import division  #"/"执行的才是精确算法
from scipy import stats #Scipy的stats模块包含了多种概率分布的随机变量,随机变量分为连续的和离散的两种
import pandas as pd #导入pandas包,命名为pd
import numpy as np #导入numpy包,命名为np

执行结果呈现:(下面的文章,代码在上部分,执行结果在下部分)

Python使用numpy和Pandas来做数据分析_第4张图片

 数据预处理,处理缺失值和清除不要的列数据。

#Read Data##读取数据
df = pd.read_csv("./data/train.csv") #读取本地的train.csv数据
label = df['Alley']#给含有‘Alley’的标签赋值变量
df = df.drop(['Id','Alley'], axis=1)#代表沿着列水平方向删除(跨列)(沿着列标签横向执行Drop方法)删除掉第一行中参数为Id和Alley的数值

#统计指标示例-技术类
#Basic Analysis##
#(1)Missing Value定义缺失值,nan用法,找到缺省值.np.nan.是缺失标识符;(什么时候numpy中出现nan,当我们读取本地文件为float时,如果有缺失,或者做了不合适的计算。)
missSet = [np.nan,9999999999,-999999]

执行结果:

去重统计数值代码:

#(2)Count distinct#
#功能:纯整数位置索引的位置选择,主要是基于整数位置,但也可以与布尔数组一起使用。使用: 使用有点复杂 API 写的很清楚.iloc[行:列]冒号表示从*到 *逗号表示 * 和 *
len(df.iloc[:,0].unique())#.iloc是取第一列上所有行的所有数据,做unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表处理
count_un = df.iloc[:,0:3].apply(lambda x:len(x.unique()))#是取二维数据中前3列的所有行数据,应用到lambda函数中X中取唯一值。

 执行结果:Python使用numpy和Pandas来做数据分析_第5张图片

 求和代码:

#(3)Zero Value#统计所有行第一列的参数合集
np.sum(df.iloc[:,0] == 0)#np中对第一列所有行数据等于0的值进行求和
count_zero = df.iloc[:,0:3].apply(lambda x:np.sum(x == 0))#df对象中对前3列的所有行数据等于0的值进行求和

执行结果:

Python使用numpy和Pandas来做数据分析_第6张图片

 统计平均数的代码:

#统计指标示例-平均值/中位数
#(4)Mean Values#统计指标示例-均值/中位数
np.mean(df.iloc[:,0])#求第一列中所有行的全部数据的平均值
df.iloc[0:,0][~np.isin(df.iloc[:,0],missSet)]#去除缺失值
np.mean(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])#去除缺失值后计算均值
df_mean = df.iloc[:,0:3].apply(lambda x:np.mean(x[~np.isin(x,missSet)]))#利用~取前3列的所有行元素的缺失值的反值是正常值,进行均值计算。

执行代码结果:

Python使用numpy和Pandas来做数据分析_第7张图片

  求矩阵的中位数:

#(5)Median Values median的作用:求矩阵的中位数。
np.median(df.iloc[:,0])#没有去除缺失值之前。
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#取第一列的所有行的缺失值的反值,形成矩阵。
np.median(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])#去除缺失值进行计算。取第一列的所有行的缺失值的反值,形成矩阵。
df_median = df.iloc[:,0:3].apply(lambda x:np.median(x[~np.isin(x,missSet)]))#用对象进行赋值,取去除缺失值进行计算。取3列的所有行的缺失值的反值,形成矩阵

执行代码结果:

Python使用numpy和Pandas来做数据分析_第8张图片

求众数的代码:

#统计指标示例-众数
#(6)Mode Values
# #stats.mode函数寻找数组或者矩阵每行/每列中最常出现成员以及出现的次数。
df_mode = df.iloc[:,0:3].apply(lambda x:stats.mode(x[~np.isin(x,missSet)])[0][0])#用对象赋值,取去除缺失值的前三列特征值的所有行数据进行计算,结果是数组矩阵,用【0】取第一行统计的数值【0】取首列名称。

 执行代码结果查询:Python使用numpy和Pandas来做数据分析_第9张图片

求众数的值计算:

#(7)Mode Percentage#求众数统计值
df_mode_count = df.iloc[:,0:3].apply(lambda x: stats.mode(x[~np.isin(x,missSet)])[1][0])#用对象赋值,取去除缺失值的前三列特征值的所有行数据进行计算,结果是数组矩阵,用【1】取第二行统计的数值【0】取首列名称。

#众数的百分比#shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度。
df_mode_perct = df_mode_count/df.shape[0]#统计众数的值的百分比。

代码执行结果:

Python使用numpy和Pandas来做数据分析_第10张图片

  求最大最小值的代码:

#统计指标示例-最大值、最小值
#(8)Min Values#
np.min(df.iloc[:,0])#

df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#
np.min(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])#去除缺失值后取正常值进行最小值计算

df_min = df.iloc[:,0:3].apply(lambda x:np.min(x[~np.isin(x,missSet)]))#用对象赋值取去除缺失值后取正常值进行最小值计算

执行结果:

Python使用numpy和Pandas来做数据分析_第11张图片

 Python使用numpy和Pandas来做数据分析_第12张图片

求最大值的代码:

#(9)Max Values#
np.max(df.iloc[:,0])

df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#去除缺失值
np.max(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)])#用取去除缺失值后取正常值进行最大值计算

df_max = df.iloc[:,0:3].apply(lambda x:np.max(x[~np.isin(x,missSet)]))#用对象赋值取去除缺失值后取正常值进行最大值计算

执行结果:

Python使用numpy和Pandas来做数据分析_第13张图片

 

分为点的代码:

#统计指标示例-分位点
#(10)quantile values  作用:找到一组数的分位数值,如四分位数等(具体什么位置根据自己定义)
np.percentile(df.iloc[:,0],(1,5,25,50,75,95,99))

df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#去除缺失值
np.percentile(df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)],(1,5,25,50,75,95,99)) #去除缺失值后进行分位点的计算。

执行结果:

Python使用numpy和Pandas来做数据分析_第14张图片


#特殊值的计算。enumerate参数为可遍历的变量,如字符串,列表等, 返回值为enumerate类
#DataFrame是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame既有行索引(index)也有列索引(column)。行索引和列索引是标签。
#DataFrame的创建有多种方式,不过最重要的还是根据dict进行创建,以及读取csv或者txt文件来创建。
#https://blog.csdn.net/leilei7407/article/details/104424642?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164203439616780264012048%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164203439616780264012048&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-104424642.first_rank_v2_pc_rank_v29&utm_term=DataFrame&spm=1018.2226.3001.4187
json_quantile = {}
for i,name in enumerate(df.iloc[:,0:3].columns):#取第一行前三列的数值
    print('the {} columns:{}'.format(i, name))#打印出格式化的数值
    json_quantile[name] = np.percentile(df[name][~np.isin(df[name],missSet)],(1,5,25,50,75,95,99))#去除缺失值后进行分位点的计算。

#属性 DataFrame.T 即为对数据 行列进行转置
df_quantile = pd.DataFrame(json_quantile)[df.iloc[:,0:3].columns].T

Python使用numpy和Pandas来做数据分析_第15张图片

频数的代码:

#统计指示示例-频数
#(11)Frequent Values统计
df.iloc[:,0].value_counts().iloc[0:5,]#频数的统计

df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)]#去除缺失值
df.iloc[:,0][~np.isin(df.iloc[:,0],missSet)].value_counts()#去除缺失值后频数的统计

代码运行结果:

Python使用numpy和Pandas来做数据分析_第16张图片

扩展小训练代码部分:

#扩展训练
#设置两个空字表
json_fre_name = {}
json_fre_count = {}

#设置一个函数
#取函数取值,返回一个矩阵
def fill_fre_top_5(x):
    if(len(x)) <= 5:
        new_array = np.full(5,np.nan)
        new_array[0:len(x)] = x
        return new_array

#取表内序列数值
df['MSSubClass'].value_counts()
df['LotFrontage'].value_counts()
#1. enumerate参数为可遍历的变量,如字符串,列表等, 返回值为enumerate类、2. enumerate经常使用在for循环遍历的过程中,可以枚举对应的下标以及对应的数据(下标默认从0开始),这个函数结合for循环使用会非常方便、3. 在遍历的时候可以规定下标的起始索引
for i,name in enumerate (df[['MSSubClass','LotFrontage']].columns):
    ##1.Index Name
    index_name = df[name][~np.isin(df[name],missSet)].value_counts().iloc[0:5,].index.values
    index_name = fill_fre_top_5(index_name)

    json_fre_name[name] = index_name
    ##2.value Count
    values_count = df[name][~np.isin(df[name],missSet)].value_counts().iloc[0:5].values
    ##2.If the Length of array is less than 5
    values_count = fill_fre_top_5(values_count)

    json_fre_count[name] = values_count

 代码运行结果:Python使用numpy和Pandas来做数据分析_第17张图片

 #对矩阵进行转置取值

df_fre_name = pd.DataFrame(json_fre_name)[df[['MSSubClass','LotFrontage']].columns].T
df_fre_count = pd.DataFrame(json_fre_count)[df[['MSSubClass','LotFrontage']].columns].T

df_fre = pd.concat([df_fre_name,df_fre_count],axis=1)

Python使用numpy和Pandas来做数据分析_第18张图片

 缺失值的统计的代码:

#统计指标示例-缺失值
#(12)Miss Values
np.sum(np.isin(df.iloc[:,0],missSet))#统计缺失值
df_miss = df.iloc[:,0:3].apply(lambda x:np.sum(np.isin(x,missSet)))#遍历每一遍历的缺失情况

执行结果:

Python使用numpy和Pandas来做数据分析_第19张图片

 制作一个脚本,将所有工具进行整合。

# -*-coding:utf-8-*-
from __future__ import division
import pandas as pd
import numpy as np
from scipy import stats

from datetime import datetime

def fill_fre_top5(x):
    if (len(x)) <= 5:
        new_array = np.full(5,np.nan)
        new_array[0:len(x)] = x
        return new_array

def eda_analysis(missSet = [np.nan,9999999999,-999999],df=None):
    ##1.Count
    count_un = df.apply(lambda x:len(x.unique()))
    count_un = count_un.to_frame('count')

    ##2.Count Zero
    count_zero = df.apply(lambda x: np.sum(x == 0))
    count_zero = count_zero.to_frame('count_zero')

    ##3.menu

    df_mean = df.apply(lambda x: np.mean(x[~np.isin(x, missSet)]))
    df_mean = df_mean.to_frame('mean')

    ##4.Median
    df_median = df.apply(lambda x:np.median(x[~np.isin(x,missSet)]))
    df_median = df_median.to_frame('median')

    ##5.Mode
    df_mode = df.apply(lambda x: stats.mode(x[~np.isin(x,missSet)])[0][0])
    df_mode = df_mode.to_frame('mode')

    ##6.Mode Percentage
    df_mode_count = df.apply(lambda x: stats.mode(x[~np.isin(x,missSet)])[1][0])
    df_mode_count = df_mode_count.to_frame('mode_count')

    df_mode_perct = df_mode_count / df.shape[0]
    df_mode_perct.columns = ['mode_perct']

    ##7.Min
    df_min = df.apply(lambda x: np.min(x[~np.isin(x,missSet)]))
    df_min = df_min.to_frame('min')

    ##8.Max
    df_max = df.apply(lambda x: np.max(x[~np.isin(x,missSet)]))
    df_max = df_max.to_frame('max')

    ##9.Quantile
    json_quantile = {}

    for i, name in enumerate(df.columns):
        json_quantile[name]=np.percentile(df[name][~np.isin(df[name],missSet)],(1,5,25,50,75,95,99))

    df_quantile = pd.DataFrame(json_quantile)[df.columns].T
    df_quantile.columns = ['quan01','quan05','quan25','quan50','quan75','quan95','quan99']

    ##10.Frequence
    json_fre_name = {}
    json_fre_count = {}

    for i,name in enumerate(df.columns):
        ##1.Index Name
        index_name = df[name][~np.isin(df[name],missSet)].value_counts().iloc[0:5, ].index.values
        ##1: 1 If the length of array is less than 5
        index_name = fill_fre_top5(index_name)

        json_fre_name[name] = index_name

        ##2.Value Count
        values_count = df[name][~np.isin(df[name],missSet)].value_counts().iloc[0:5, ].values
        values_count = fill_fre_top5(values_count)

        json_fre_count[name] = values_count

    df_fre_name = pd.DataFrame(json_fre_name)[df.columns].T
    df_fre_count = pd.DataFrame(json_fre_count)[df.columns].T

    df_fre = pd.concat([df_fre_name,df_fre_count],axis=1)
    df_fre.columns = ['value1','value2','value3','value4','value5','freq1','freq2','freq3','freq4','freq5']

    ##11.Miss value Count
    df_miss = df.apply(lambda x : np.sum(np.isin(x, missSet)))
    df_miss = df_miss.to_frame('freq_miss')

    ###12。Combine ALL Informations####
    def_eda_summary = pd.concat([count_un,count_zero,df_mean,df_median,df_mode,df_mode_count,df_mode_perct,
                                 df_min,df_max,df_fre,df_miss],axis=1)

    return def_eda_summary

Python使用numpy和Pandas来做数据分析_第20张图片

 Python使用numpy和Pandas来做数据分析_第21张图片

 测试脚本,将制作好的Wrap_up导入进去进行测试,使用eda_analysis测试函数进行测试。

#-*-coding:utf-8-*-
from __future__ import division
from wrap_up import *

##0.Read Data##

#Read Data##
df = pd.read_csv("./data/train.csv")
label = df['Alley']
df = df.drop(['Id','Alley'], axis=1)#删除掉第一行中参数为Id和Alley的数值

#1.EDA##
df_eda_summary = eda_analysis(missSet = [np.nan,9999999999,-999999],df=df.iloc[:,0:3])

Python使用numpy和Pandas来做数据分析_第22张图片

Python使用numpy和Pandas来做数据分析_第23张图片

总结体会

   Numpy的使用有求和统计、有分位统计、有频数、最大最小值统计等,Pandas是对数据进行抓取,对word、Excel、PDF的数据进行抓取。结合两者之所长,对数据进行筛选和清洗,达到对数据的要求。

感谢慕课网、CSDN不计其数的网友技术支持。

你可能感兴趣的