自动售货机数据分析:时间、城市、销售额环比分析
导入需要的库
import pandas as pd import numpy as np import matplotlib.pyplot as plt import re from pyecharts.charts import Geo, Map, Timeline import pyecharts.options as opts from pyecharts.globals import ChartType
读取数据
data = pd.read_excel('自动售货机.xlsx')
数据预处理
data.dropna(inplace=True) data['下单时间'] = pd.to_datetime(data['下单时间']) data2 = data.copy()
3.1 不同时间维度的销售情况
按小时统计销售情况
data_112 = data2.loc[data2['机器编号'] == '112', :] data_112['hour'] = data_112['下单时间'].dt.hour num = data_112[['hour', 'income', 'weekday']].groupby(['weekday', 'hour', ]).sum() num = num.unstack().fillna(0)
可视化:不同星期不同时段的销售情况
for i in num.index: plt.plot(range(24), num.loc[i, :]) plt.legend(num.index) plt.show()
不同日期的销售情况
data2['date'] = data2['下单时间'].dt.date data2['income'] = data2['总金额(元)'] - data2['退款金额(元)'] num = data2[['date', 'income']].groupby('date').sum().sort_index()
可视化:不同日期的销售情况
plt.plot(num.index, num) plt.xticks(num.index[::8], num.index[::8], rotation=90) plt.show()
不同星期的销售情况
data2['weekday'] = data2['下单时间'].dt.weekday num = data2[['weekday', 'income']].groupby('weekday').sum().sort_index() num = num.loc[[0,1,2,3,4,5,6],:]
可视化:不同星期的销售情况
plt.plot(num.index, num) plt.xticks(num.index, num.index, rotation=90) plt.show()
3.4 分析城市销售情况
num = data2[['city', 'income']].groupby('city').sum().sort_values('income')
可视化:不同城市的销售情况
plt.barh(num.index,num['income']) plt.show()
绘制地理图表展示城市之间的空间关系
(Geo() .add_schema(maptype='广东') .add('', [(i, int(j)) for i,j in zip(num.index, num['income'])], type_=ChartType.EFFECT_SCATTER) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title='各个城市销售量情况', subtitle='2018/4-2018/9'), visualmap_opts=opts.VisualMapOpts(max_=max(num.max()), is_piecewise=True) ) ).render('./各个城市销售量情况.html')
绘制地理图表展示不同月份不同城市之间的空间关系
data2['month'] = data2['下单时间'].dt.month num = data2[['month', 'income', 'city']].groupby(['month', 'city']).sum() num2 = num.unstack() num2 = num2.fillna(0)
tmp = {} for i in range(4, 10): num = num2.loc[i, :] tmp[i] = ( Geo() .add_schema(maptype='广东') .add('', [(i[1], int(j)) for i, j in zip(num.index, list(num.values))], type_=ChartType.EFFECT_SCATTER) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title='各个城市销售量情况', subtitle='2018/4-2018/9'), visualmap_opts=opts.VisualMapOpts(max_=max(num2.max()), is_piecewise=True) ) )
tl = Timeline() for i in range(4, 10): tl.add(tmp[i], str(i)+'月')
tl.render('./各个城市销售量情况(含时间轴).html')
3.5销售额环比
计算周的销售额环比
data2['week'] = data2['下单时间'].dt.week
1 计算每一周的销售额
tmp = data2[['week','income']].groupby('week').sum()
2 计算销售额环比: (本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :] #第一个数据是空,因为没得比 t2.index = tmp.index[:-1 ] num = t2/tmp #销售额的周环比
可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(111) # 添加子图 ax1.bar(tmp.index, tmp['income']) ax1.set_ylabel('收入') ax1.set_xlabel('周数') ax1.set_title('自动售货机收入趋势图')
ax2 = ax1.twinx() ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b') ax2.set_ylabel('环比增长率') plt.show()
计算月的销售额环比
1、计算每月的销售额
tmp = data2[['month', 'income']].groupby('month').sum()
2、计算销售额环比:(本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :] t2.index = tmp.index[:-1] num = t2/tmp # 销售额的月环比
可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(111) # 添加子图 ax1.bar(tmp.index, tmp['income']) ax1.set_ylabel('收入') ax1.set_xlabel('月份') ax1.set_title('自动售货机收入趋势图')
ax2 = ax1.twinx() ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b') ax2.set_ylabel('环比增长率') plt.show()
计算周的销售额环比
data_gz = data2.loc[data2['city'] == '广州市', :] data_gz['week'] = data_gz['下单时间'].dt.week
1、计算每一周的销售额
tmp = data_gz[['week', 'income']].groupby('week').sum()
2、计算销售额环比:(本期销售额-上期销售额)/上期销售额
t2 = tmp.diff().iloc[1:, :] t2.index = tmp.index[:-1] num = t2/tmp # 销售额的周环比 num
可视化:双Y轴图像
fig = plt.figure(figsize=(6, 4)) ax1 = fig.add_subplot(111) # 添加子图 ax1.bar(tmp.index, tmp['income']) ax1.set_ylabel('收入') ax1.set_xlabel('周数') ax1.set_title('自动售货机收入趋势图--广州地区')
ax2 = ax1.twinx() ax2.plot(tmp.index[1:], num.iloc[:-1, 0], 'b') ax2.set_ylabel('环比增长率') plt.show()
ind = data2['购买数量(个)'] == 1 data2['goods'] = data2['商品详情'].apply(lambda x: re.sub('[Xx]1[;,]?', '', x)) price_data = data2.loc[ind, ['goods', '总金额(元)']].drop_duplicates('goods')
new_data = pd.merge(new_goods_data, price_data, how='left', left_on='产品名称', right_on='goods') ind = new_data['goods'].isnull() tmp_sets = new_data.loc[ind, '产品名称'].unique() ind = data2['商品详情'].apply(lambda x: sum([i in x for i in tmp_sets])!=0) tmp = data2.loc[ind, :].apply(lambda x: ([i for i in tmp_sets if i in x['商品详情']], x['购买数量(个)'], x['总金额(元)']), axis=1) tmp = pd.DataFrame({'name':[i[0][0] for i in tmp], 'num':[i[1] for i in tmp], 'total_price': [i[2] for i in tmp]}) tmp['price'] = tmp['total_price']/tmp['num'] tmp2 = tmp.drop_duplicates('name')[['name', 'price']]
new_data = pd.merge(new_data, tmp2, how='left', left_on='产品名称', right_on='name') ind = new_data['总金额(元)'].isnull() new_data['单价'] = 0 new_data.loc[ind, '单价'] = new_data.loc[ind, 'price'].copy() new_data.loc[~ind, '单价'] = new_data.loc[~ind, '总金额(元)'].copy() ind = new_data['单价'].notnull() new_data = new_data.loc[ind, ['产品名称', '购买数量', '单价']] plt.hist(np.repeat(new_data['单价'], new_data['购买数量']), bins=50) plt.show()
指定单价区间
bins = pd.IntervalIndex.from_tuples([(0, 2), (2, 5), (5, 10), (10, 20), (20, 52)]) new_data['bins'] = pd.cut(new_data['单价'], bins) num = new_data[['bins', '购买数量']].groupby('bins').sum()
plt.bar(range(5), num['购买数量']) plt.title('不同价格区间的销售情况') plt.xlabel('价格区间') plt.ylabel('购买数量') plt.xticks(range(5), num.index) plt.show()
plt.pie(num['购买数量'], labels=num.index, autopct='%.2f %%') plt.title('不同价格区间的销售数量占比情况') plt.show()
原文地址: https://www.cveoy.top/t/topic/jjUe 著作权归作者所有。请勿转载和采集!