用数据分析库 Pandas 导入数据
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 13 11:12:40 2022
@author:Laney_Midory
csdn:Laney_Midory
"""
import pandas as pd
'''
#创建一维数据组
a=pd.Series(['a','b','c','d','e'])#索引+数据
print(a)
#创建二维数据
b=pd.DataFrame({'客户名称':['张三','李四','王五'],'车':['1','3','4'],'吨数':['40','100','200'],
'总价':['80000','240000','320000'] })
print(b)
'''
#倒入excel里的数据 pandas读取excel
e_file=pd.ExcelFile('C:/Users/Administrator/Desktop/excelcode/7月下旬入库表.xlsx')
#整理成需要的数据
data=e_file.parse('7月下旬入库表')
print(data)
用数据分析库 Pandas 做数据透视表
需要引入一个新库numpy
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 13 11:12:40 2022
@author:Laney_Midory
csdn:Laney_Midory
"""
import pandas as pd
import numpy as np
'''
#创建一维数据组
a=pd.Series(['a','b','c','d','e'])#索引+数据
print(a)
#创建二维数据
b=pd.DataFrame({'客户名称':['张三','李四','王五'],'车':['1','3','4'],'吨数':['40','100','200'],
'总价':['80000','240000','320000'] })
print(b)
'''
#倒入excel里的数据 pandas读取excel
e_file=pd.ExcelFile('C:/Users/Administrator/Desktop/excelcode/7月下旬入库表.xlsx')
#整理成需要的数据
data=e_file.parse('7月下旬入库表')
#print(data)
#数据透视表 数据求和需要用numpy库
pt1=pd.pivot_table(data,index=['销售商'],columns=['来源省份'],values=['入库量(吨)'],aggfunc=np.sum,margins=True)#index为行,column为列,values设定值,aggfunc为添加函数进行数据相加,margins为添加总和
#由于数据量过大,数据在显示过程中由小数点简略,需要显示全
pd.set_option('display.max_columns',None)
#打印有几个
pt2=pd.pivot_table(data,index=['销售商'],columns=['来源省份'],values=['入库量(吨)'],aggfunc=np.size,margins=True)#index为行,column为列,values设定值,aggfunc为添加函数进行数据相加,margins为添加总和
#由于数据量过大,数据在显示过程中由小数点简略,需要显示全
print(pt1)
#若想取其中某一个值
print(pt1.iat[0,0])
print(pt2.iat[0,0]
用 matplotlib 画折线图、柱状图、饼图
进行数据可视化 基础功能介绍
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 13 11:12:40 2022
@author:Laney_Midory
csdn:Laney_Midory
"""
import matplotlib.pyplot as plt
#该库用于绘图,但有一个缺点,对于中文的支持不太好,需要添加下面的内容
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
data=['1/1','1/2','1/3']
hebei=[12,23,6]
#折线图
plt.plot(data,hebei,color='red',label='河北')
plt.title('每日入库量对比')
plt.xlabel('日期')
plt.ylabel('车次')
#刻印 表示在图上
plt.legend()
plt.show()
#柱状图
plt.bar(data,hebei,color='red',label='河北')
#水平柱状图
#plt.barh(data,hebei,color='red',label='河北')
plt.legend()
plt.show()
#饼图
number=[666,354]
province=['河北','山西']
colors=['#999fff','#fff999']
plt.pie(x=number,labels=province,colors=colors)
plt.legend()
plt.show()
结合excel数据进行绘图——前几个步骤结合
直接是把前面我们读取的excel数据利用plot可视化出来
# -*- coding: utf-8 -*-
"""
Created on Fri Aug 13 11:12:40 2022
@author:Laney_Midory
csdn:Laney_Midory
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
'''
#创建一维数据组
a=pd.Series(['a','b','c','d','e'])#索引+数据
print(a)
#创建二维数据
b=pd.DataFrame({'客户名称':['张三','李四','王五'],'车':['1','3','4'],'吨数':['40','100','200'],
'总价':['80000','240000','320000'] })
print(b)
'''
#倒入excel里的数据 pandas读取excel
e_file=pd.ExcelFile('C:/Users/Administrator/Desktop/excelcode/7月下旬入库表.xlsx')
#整理成需要的数据
data=e_file.parse('7月下旬入库表')
#print(data)
#数据透视表 数据求和需要用numpy库
pt1=pd.pivot_table(data,index=['销售商'],columns=['来源省份'],values=['入库量(吨)'],aggfunc=np.sum,margins=True)#index为行,column为列,values设定值,aggfunc为添加函数进行数据相加,margins为添加总和
#由于数据量过大,数据在显示过程中由小数点简略,需要显示全
pd.set_option('display.max_columns',None)
#打印有几个
pt2=pd.pivot_table(data,index=['销售商'],columns=['来源省份'],values=['入库量(吨)'],aggfunc=np.size,margins=True)#index为行,column为列,values设定值,aggfunc为添加函数进行数据相加,margins为添加总和
#由于数据量过大,数据在显示过程中由小数点简略,需要显示全
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
# pt2.plot()#折线图
# plt.show()
#柱状图
pt2.plot(kind='bar')
#若要旋转label
plt.xticks(rotation=0 )
plt.title('各省入库量对比')
plt.xlabel('客户')
plt.ylabel('入库量')
plt.legend()
plt.show()
# print(pt1)
# #若想取其中某一个值
# print(pt1.iat[0,0])
# print(pt2.iat[0,0])
制作酷炫数据动图
这种图怎么生成呢
首先需要先安装一个库imageio
其实他就是制作了很多张不同时间的图片,按照一定时间的间隔播放做出来的gif
需要把生成的图片放进列表frames中
因此这里这个库
可以将该列表播放
imageio.mimsave(‘data_gif.gif’, frames, ‘GIF’, duration=round(duration, 2))
简单版本:
import xlrd
import datetime
import matplotlib.pyplot as plt
import imageio
def data_gif(cols, xlim_num, duration):#cols 展示前几列的数据,xlim_num x轴刻度值,duration 两张图片间的间隔,建议写0.2-0.5
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
frames = []
xlsx = xlrd.open_workbook('C:/Users/Administrator/Desktop/excelcode/excel-useful/gifpicture/data_source.xlsx')
sheet = xlsx.sheet_by_index(0)
name_list = []
for j in range(1, int(cols)):#获取第一排的名称
name_list.append(sheet.cell_value(0, j))
for i in range(1, sheet.nrows):
row_data_list = []
for j in range(1, int(cols)):
title = sheet.cell_value(i, 0)#每一行的第一个
row_data = sheet.cell_value(i, j)
row_data_list.append(float(row_data))
plt.xlim((0, int(xlim_num)))
plt.barh(name_list, row_data_list, color='blue')
plt.savefig("%s.png" % str(title))
plt.close('all')
im = imageio.imread("%s.png" % str(title))
frames.append(im)
imageio.mimsave('data_gif.gif', frames, 'GIF', duration=round(duration, 2))
data_gif(7,1000,0.5)
此方法做出来,柱状图上没有数字
其中一张图片如下
进阶版本:
代码相对比较复杂
import xlrd
import matplotlib.pyplot as plt
import imageio
import numpy as np
def data_gif(cols, xlim_num, xlim_interval, duration,
title_attach=''): # cols 展示前几列的数据,xlim_num x轴刻度值,duration 两张图片间的间隔,建议写0.2-0.5,title_attach 标题后附加部分,可不写
frames = []
xlsx = xlrd.open_workbook('C:/Users/Administrator/Desktop/excelcode/excel-useful/gifpicture/data_source.xlsx')
sheet = xlsx.sheet_by_index(0)
name_list = []
for j in range(1, int(cols)):
name_list.append(sheet.cell_value(0, j))
for i in range(1, sheet.nrows):
row_data_list = []
for j in range(1, int(cols)):
title = sheet.cell_value(i, 0)
row_data = sheet.cell_value(i, j)
row_data_list.append(float(row_data))
font = {'family': 'SimHei',
'style': 'normal',
'weight': 'normal',
'color': '#FFFFFF',
'size': 20,
}
plt.rcParams['figure.figsize'] = (16.0, 9.0)
plt.rcParams['axes.facecolor'] = '#0D0434'
plt.rcParams['savefig.facecolor'] = '#0D0434'
plt.rcParams['xtick.color'] = '#FFFFFF'
plt.rcParams['ytick.color'] = '#FFFFFF'
plt.rcParams['axes.edgecolor'] = '#FFFFFF'
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.tick_params(labelsize=20)
plt.xlim((0, int(xlim_num)))
plt.xticks(range(0, xlim_num, xlim_interval))
# fig = plt.figure()
# ax = fig.add_subplot(111)
# ax.xaxis.label.set_color('red')
# ax.tick_params(axis='x', colors='red')
# ax.yaxis.label.set_color('red')
# ax.tick_params(axis='y', colors='red')
m = 0
for n in row_data_list:
plt.text(int(xlim_num) / 10, m, str(n), ha='left', va='center', fontdict=font)
m += 1
plt.barh(name_list, row_data_list, height=0.35, facecolor='#2C43C2', edgecolor='white')
plt.title(str(title) + str(title_attach), fontdict=font)
plt.savefig('%s.png' % str(title))
plt.close('all')
im = imageio.imread('%s.png' % str(title))
frames.append(im)
imageio.mimsave('data_gif.gif', frames, 'GIF', duration=round(duration, 2))
data_gif(7, 800, 200, 0.5, '价格指数')
其中颜色代码
matplotlib库的pyplot模块中的xlim()函数用于获取或设置当前轴的x-limits
详情阅读这篇博文
plt.rcParams的一系列设置
plt.xlim() 和 plt.xticks()
plt.xlim() 显示的是x轴的作图范围,同时plt.ylim() 显示的是y轴的作图范围,而 plt.xticks() 表达的是x轴的刻度内容的范围
plt.xticks(range(0, xlim_num, xlim_interval))# 以xlim_interval为间隔,x轴从0到xlim_num均分
其中柱体上的文字说明是用 plt.text()函数来设置的
m = 0
for n in row_data_list:
plt.text(int(xlim_num) / 10, m, str(n), ha='left', va='center', fontdict=font)
m += 1
详细用法参考这篇博文