利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)

学习样例

开发工具:python3.8、pycharm2020.3.3
开发过程

分析数据

利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第1张图片
总共三列数据,分别是年份,月份及对应的客流量,如果将数据可视化,我们可以将年份作为横坐标,可以将客流量总和作为纵坐标,也可以将客流量的平均值作为纵坐标,体现每年客流量总量的变化,等等

引入模块

首先我们的目的是获取xls文件并作图,那么就要引入相关的模块

import xlrd
import matplotlib.pyplot as plt

若当前项目文件中还没有这两个模块就需要先下载,具体操作过程
点击file -> Settings 或 ctrl+alt+s
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第2张图片
进入设置页面后,找到Project:项目名中的Python Interpreter,点击下方加号
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第3张图片
在搜索框中搜索需要的模块,点击Install Package,之后等待下载即可
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第4张图片
成功引入相关模块之后,我们就要开始获取xls文件中的数据了
Python 疫情数据分析
Python 商场销售数据分析

获取数据

利用xlrd中的方法获取指定文件指定工作表中的全部数据,其数据是一个列表形式,注意这里flights.xls文件与当前写的xx.py文件需要在同一文件夹内才能获取到数据
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第5张图片
可以通过 open in Explorer打开所在文件夹
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第6张图片
也可以直接在电脑里查找这个文件夹
在这里插入图片描述

data = xlrd.open_workbook("flights.xls")  # 打开excel文件
table1 = data.sheet_by_name('flights')  # 通过excel里面的表名获取工作表

接下来对得到的数据进行操作

处理数据

先要获得各表头所在列号

row1 = table1.row_values(0)  # 根据索引读取一行的数据,即表头
    for i in range(len(row1)):  # 获取各表头所在列号
        if row1[i] == 'year':
            oneindex1 = i
        elif row1[i] == 'month':
            oneindex2 = i
        elif row1[i] == 'passengers':
            oneindex3 = i

得到各表头所在列号后,我们将所有数据按列存储到列表中

# 获取year、month、passengers三列的数据
year = table1.col_values(oneindex1, 1)
month = table1.col_values(oneindex2, 1)
passengers = table1.col_values(oneindex3, 1)

因为我们直方图的横坐标为年份,所以我们需要对year这一列数据进行去除处理

# 剔除year列表中重复元素,并重新排列
Year = list(sorted(set(year)))

因为我们直方图的纵坐标为乘流量的总和,所以我们需要对每一年12个月的乘流量求和

# Passenger_Number存放各year的Passenger的总和
Passenger_Number=[]
for i in range(len(Year)):
    sum=0
    for j in range(len(passengers)):
        if(year[j]==Year[i]):
            sum+=passengers[j]
    Passenger_Number.append(int(sum))

如果需要的是该年每个月的平均客流量,只需要求和后做个除法,需要注意的是:结果不一定为整数,需要以浮点型数据输出

# Passenger_Avg存放各year的Passenger的平均值
Passenger_Avg = []
for i in range(len(Passenger_Number)):
    avg=Passenger_Number[i]/12
    Passenger_Avg.append(float('%.3f' % avg))

得到横坐标数据及其对应的纵坐标数据后,就可以开始画图了

作图

plt.xlabel('Date') #设置横坐标
plt.ylabel('Number of Passenger') #设置纵坐标
plt.bar(Year, Passenger_Number) #生成条形图
# 在直方图中各柱的头上标注其值
for a, b in zip(left, height):
    plt.text(a, b + 1, b, ha='center', va='bottom')
plt.show() 

bar(x, height, width=0.8, bottom=None, ***, align=‘center’, data=None, *kwargs)
参数如下
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第7张图片
可以通过修改这些参数得到各种自己需要的图形

成果图

1949-1960每年乘客总量
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第8张图片
1949-1960每年乘客平均值
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第9张图片

完整代码

# -*- coding:utf-8 -*-
"""
作者:95345
日期:2021年05月31日
"""
import xlrd
import numpy as np
import matplotlib.pyplot as plt


def main():
    data = xlrd.open_workbook("flights.xls")  # 打开excel文件
    table1 = data.sheet_by_name('flights')  # 通过excel里面的表名获取工作表

    row1 = table1.row_values(0)  # 根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
    for i in range(len(row1)):  # 获取表头
        if row1[i] == 'year':
            oneindex1 = i
        elif row1[i] == 'month':
            oneindex2 = i
        elif row1[i] == 'passengers':
            oneindex3 = i

    # 获取year、month、passengers三列的数据
    year = table1.col_values(oneindex1, 1)
    month = table1.col_values(oneindex2, 1)
    passengers = table1.col_values(oneindex3, 1)

    # 剔除year列表中重复元素,并重新排列
    Year = list(sorted(set(year)))

    # Passenger_Number存放各year的Passenger的总和
    Passenger_Number=[]
    for i in range(len(Year)):
        sum=0
        for j in range(len(passengers)):
            if(year[j]==Year[i]):
                sum+=passengers[j]
        Passenger_Number.append(int(sum))

    # Passenger_Avg存放各year的Passenger的平均值
    Passenger_Avg = []
    for i in range(len(Passenger_Number)):
        avg=Passenger_Number[i]/12
        Passenger_Avg.append(float('%.3f' % avg))
    Show(Year,Passenger_Avg)

def Show(left,height):
    print("**************************开始绘图**************************")
    plt.xlabel('Date') #设置横坐标
    plt.ylabel('Number of Passenger') #设置纵坐标
    plt.bar(left, height)
    # 在直方图中各柱的头上标注其值
    for a, b in zip(left, height):
        plt.text(a, b + 1, b, ha='center', va='bottom')
    plt.show()

if __name__ == '__main__':
    main()

Python 疫情数据分析
Python 商场销售数据分析

其他样例

# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
"""
作者:95345
日期:2021年05月31日
"""
import xlrd
import numpy as np
import matplotlib.pyplot as plt


def main():
    data = xlrd.open_workbook("exercise.xls")  # 打开excel文件
    table1 = data.sheet_by_name('exercise')  # 通过excel里面的表名获取工作表

    row1 = table1.row_values(0)  # 根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
    for i in range(len(row1)):  # 获取表头
        if row1[i] == 'diet':
            oneindex1 = i
        elif row1[i] == 'pulse':
            oneindex2 = i
        elif row1[i] == 'time':
            oneindex3 = i
        elif row1[i] == 'kind':
            oneindex4 = i

    # 获取diet、pulse、time、kind四列的数据
    diet = table1.col_values(oneindex1, 1)
    pulse = table1.col_values(oneindex2, 1)
    time = table1.col_values(oneindex3, 1)
    kind = table1.col_values(oneindex4, 1)

    diet_kind=[]
    for i in range(len(diet)):
        str=diet[i]+' '+kind[i]+' '+time[i]
        diet_kind.append(str)

    # 剔除diet_kind列表中重复元素,并重新排列
    dk = list(sorted(set(diet_kind)))

    # Passenger_Number存放各year的Passenger的总和
    pulse_Avg=[]
    for i in range(len(dk)):
        sum=0
        for j in range(len(pulse)):
            if(diet_kind[j]==dk[i]):
                sum+=pulse[j]
                avg=sum/5
        pulse_Avg.append(float('%.3f' % avg))

    pulse_Avg_low=[]
    pulse_Avg_no=[]
    for i in range(len(dk)):
        if(i>=len(dk)/2):
            pulse_Avg_no.append(pulse_Avg[i])
        else:
            pulse_Avg_low.append(pulse_Avg[i])

    left=[]
    for i in range(len(diet)):
        str=kind[i]+' '+time[i]
        left.append(str)
    Left = list(sorted(set(left)))

    Show(Left,pulse_Avg_low)
    # Show(Left,pulse_Avg_no)

def Show(left,height):
    print("**************************开始绘图**************************")
    plt.xlabel('kind_time') #设置横坐标
    plt.ylabel('pulse of low fat') #设置纵坐标
    plt.bar(left, height)
    # 在直方图中各柱的头上标注其值
    for a, b in zip(left, height):
        plt.text(a, b + 1, b, ha='center', va='bottom')
    plt.show()

if __name__ == '__main__':
    main()

对于no fat 相应时间和状态对应的平均脉搏
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第10张图片

对于low fat 相应时间和状态对应的平均脉搏
利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第11张图片

# -*- coding:utf-8 -*-
"""
作者:95345
日期:2021年06月02日
"""
import xlrd
import matplotlib.pyplot as plt

def main():
    data = xlrd.open_workbook("penguins.xls")  # 打开excel文件
    table1 = data.sheet_by_name('penguins')  # 通过excel里面的表名获取工作表

    row1 = table1.row_values(0)  # 根据索引读取一行的数据,参数:行索引,开始列索引,结束列索引(不包含)
    for i in range(len(row1)):  # 获取表头
        if row1[i] == 'species':
            oneindex1 = i
        elif row1[i] == 'island':
            oneindex2 = i
        elif row1[i] == 'bill_length_mm':
            oneindex3 = i
        elif row1[i] == 'bill_depth_mm':
            oneindex4 = i
        elif row1[i] == 'flipper_length_mm':
            oneindex5 = i
        elif row1[i] == 'body_mass_g':
            oneindex6 = i
        elif row1[i] == 'sex':
            oneindex7 = i

    # 获取全部7列的数据
    species = table1.col_values(oneindex1, 1)
    island = table1.col_values(oneindex2, 1)
    bill_length = table1.col_values(oneindex3, 1)
    bill_depth = table1.col_values(oneindex4, 1)
    flipper_length = table1.col_values(oneindex5, 1)
    body_mass = table1.col_values(oneindex6, 1)
    sex = table1.col_values(oneindex7, 1)

    # 将species与island结合,并剔除其中中重复元素,重新排列
    species_island=[]
    for i in range(len(species)):
        if(sex[i]=='MALE'):
            sex[i]='M'
            species_island.append(species[i][0:3]+"_"+island[i][0:3]+"_"+sex[i])
        elif(sex[i]=='FEMALE'):
            sex[i] ='F'
            species_island.append(species[i][0:3]+"_"+island[i][0:3]+"_"+sex[i])
    S_I = list(sorted(set(species_island)))

    # 避免重复求平均 用一个函数实现
    def GetAvg(xx,xx_avg):
        for i in range(len(S_I)):
            sum=k=0
            for j in range(len(species_island)):
                if(species_island[j]==S_I[i] and xx[j]!=''):
                    sum+=xx[j]
                    k+=1
            avg=sum/k
            xx_avg.append(float('%.3f' % avg))

    # 计算喙长平均值 单位mm
    bill_length_avg=[]
    GetAvg(bill_length,bill_length_avg)

    # 计算喙深平均值 单位mm
    bill_depth_avg=[]
    GetAvg(bill_depth,bill_depth_avg)

    # 计算脚蹼长度平均值 单位mm
    flipper_length_avg = []
    GetAvg(flipper_length,flipper_length_avg)

    # 计算体重平均值 单位g
    body_mass_avg=[]
    GetAvg(body_mass,body_mass_avg)

    Show(S_I, bill_length_avg,'bill_length_avg(mm)')
    Show(S_I, bill_depth_avg,'bill_depth_avg(mm)')
    Show(S_I, flipper_length_avg,'flipper_length_avg(mm)')
    Show(S_I, body_mass_avg,'body_mass_avg(g)')

def Show(left,height,y):
    print("**************************开始绘图**************************")
    plt.xlabel('species_island_sex') #设置横坐标
    plt.ylabel(y) #设置纵坐标
    plt.bar(left, height)
    # 在直方图中各柱的头上标注其值
    for a, b in zip(left, height):
        plt.text(a, b + 1, b, ha='center', va='bottom')
    plt.show()

if __name__ == '__main__':
    main()

利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第12张图片

利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第13张图片

利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第14张图片

利用Python获取excel的数据并绘制直方图(保姆级教程,含多组样例)_第15张图片

你可能感兴趣的:(资源预览,python,开发语言,数据分析,大数据)