对比分析
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('car.xlsx')
df1 = df.head(10) #只读取了前10条
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x = df1['车型']
y = df1['1月销量']
#plt.grid(axis='y')
#调整图表距左的空白
plt.subplots_adjust(left=0.2)
#4个方向的坐标轴上的刻度线是否显示
plt.tick_params(bottom=False,left=False)
# 添加刻度标签
plt.yticks(range(10)) #要多于当前标签数量
#图表标题
plt.title('2020年1月国产品牌汽车销量TOP10')
plt.barh(x, y,color='Turquoise') #barh是横向的柱状图(可以理解为正常柱状图旋转了90度),柱子蓝绿色
plt.show()
同比、定比和环比分析
-
同比:本期数据与历史数据进行比较(去年这个裙子能穿,今年穿不了)
-
定比:本期数据与特定时期数据比较(年龄36岁是18岁的两倍)
-
环比:本期数据与上期数据进行比较(这个月好像比上个月胖了20斤)
-
同比的好处是可以排除一部分季节因素;
-
环比的好处是可以更直观地表明阶段性的变化,但是会受季节性因素影响;
-
定比常用于财务数据分析
案例1:京东电商单品销量同比增长情况分析
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
mpl.use('TkAgg')
df=pd.read_excel('JD2019.xlsx')
#数据处理,提取2019年2月和2020年2月的数据
df= df.set_index('日期') # 将日期设置为索引
df1=df[df['商品名称']=='零基础学Python(全彩版)']
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安']]
# print(df1)
df2=df1.T #行列转置
# print(df2)
x=np.array([0,1,2,3,4,5,6])
y1=df2['2019-02-01']
y2=df2['2020-02-01']
print(y1)
print(y2)
#同比增长率
df2['rate']=((y2-y1)/y1)*100
y=df2['rate']
print(y)
width =0.25 #柱子宽度
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.title('全国各地区销量及同比增长情况') #图表标题
plt.ylabel('销售数量(册)') #y轴标签
# x轴标签
plt.xticks(x,['北京','上海','广州','成都','武汉','沈阳','西安'])
# 双柱形图
plt.bar(x,y1,width=width,color = 'orange',label='2019年2月')
plt.bar(x+width,y2,width=width,color = 'deepskyblue',label='2020年2月')
# 增长率标签
for a, b in zip(x,y):
plt.text(a,b,('%.1f%%' % b), ha='center', va='bottom', fontsize=11)
plt.legend()
plt.show()
案例2: 单品销量定比分析
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df=pd.read_excel('JD2019.xlsx')
#数据处理
df1=df[df['商品名称']=='零基础学Python(全彩版)'].sort_values('日期') #根据日期重新排序
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安','日期']]
df1= df1.set_index('日期') #将日期设置为索引
df1['全国销量']=df1.sum(axis=1) #求和运算,axis=1是行
#选取2019年数据
df1=df1['2019-01-01':'2019-12-01'] #包头包尾
print(df1)
df1['January']=df1.iloc[0,7] #iloc[0,7]选取第一行第第8列
#定比分析(以2019年1月为基期,基点为1)
df1['base']=df1['全国销量']/df1['January']
x=[0,1,2,3,4,5,6,7,8,9,10,11]
y1=df1['全国销量']
y2=df1['base']
fig = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
ax1 = fig.add_subplot(111) #添加子图
plt.title('2019年全国销量定比分析') #图表标题
#图表x轴标题
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax1.bar(x,y1,color = 'blue',label='left',alpha=0.5)
ax1.set_ylabel('全国销量(册)') #y轴标签
ax2 = ax1.twinx() #添加一条y轴坐标轴
ax2.plot(x,y2,color='r',linestyle='-',marker='D',linewidth=2)
for a,b in zip(x,y2):
plt.text(a, b+0.02, '%.3f' %b, ha='center', va= 'bottom',fontsize=9)
plt.show()
案例3: 单品销量环比增长情况分析
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.ticker as mtick
df=pd.read_excel('JD2019.xlsx')
#数据处理
df1=df[df['商品名称']=='零基础学Python(全彩版)'].sort_values('日期')
df1=df1[['北京','上海','广州','成都','武汉','沈阳','西安','日期']]
df1= df1.set_index('日期') #将日期设置为索引
df1['全国销量']=df1.sum(axis=1) #求和运算
#环比增长率
df1['rate']=((df1['全国销量']-df1['全国销量'].shift())/df1['全国销量'])*100
#选取2019年数据
df1=df1['2019-01-01':'2019-12-01']
print(df1)
df1.to_excel('aa.xlsx')
x=[0,1,2,3,4,5,6,7,8,9,10,11]
y1=df1['全国销量']
y2=df1['rate']
fig = plt.figure()
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
ax1 = fig.add_subplot(111) #添加子图
plt.title('2019年全国销量及环比增长情况') #图表标题
#图表x轴标题
plt.xticks(x,['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'])
ax1.bar(x,y1,color = 'pink',label='left')
ax1.set_ylabel('全国销量(册)') #y轴标签
ax2 = ax1.twinx() #添加一条y轴坐标轴
ax2.plot(x,y2,color='r',linestyle='-',marker='o',mfc='w',label=u"增长率")
# 设置右侧y轴格式
fmt = '%.1f%%'
yticks = mtick.FormatStrFormatter(fmt)
ax2.yaxis.set_major_formatter(yticks)
ax2.set_ylim(-100,100)
ax2.set_ylabel(u"增长率")
for a,b in zip(x,y2):
plt.text(a, b+0.02, '%.1f%%' % b, ha='center', va= 'bottom',fontsize=8)
#调整图表距右的空白
plt.subplots_adjust(right=0.8)
plt.show()