开发工具:python3.8、pycharm2020.3.3
开发过程
总共三列数据,分别是年份,月份及对应的客流量,如果将数据可视化,我们可以将年份作为横坐标,可以将客流量总和作为纵坐标,也可以将客流量的平均值作为纵坐标,体现每年客流量总量的变化,等等
首先我们的目的是获取xls文件并作图,那么就要引入相关的模块
import xlrd
import matplotlib.pyplot as plt
若当前项目文件中还没有这两个模块就需要先下载,具体操作过程
点击file -> Settings 或 ctrl+alt+s
进入设置页面后,找到Project:项目名中的Python Interpreter,点击下方加号
在搜索框中搜索需要的模块,点击Install Package,之后等待下载即可
成功引入相关模块之后,我们就要开始获取xls文件中的数据了
Python 疫情数据分析
Python 商场销售数据分析
利用xlrd中的方法获取指定文件指定工作表中的全部数据,其数据是一个列表形式,注意这里flights.xls文件与当前写的xx.py文件需要在同一文件夹内才能获取到数据
可以通过 open in Explorer打开所在文件夹
也可以直接在电脑里查找这个文件夹
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)
参数如下
可以通过修改这些参数得到各种自己需要的图形
1949-1960每年乘客总量
1949-1960每年乘客平均值
# -*- 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()
# -*- 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()