2.5 提取商品名称及数量

使用正则表达式从'商品详情'中提取商品名称及数量

t = data2['商品详情'].apply(lambda x: re.findall('([^,;xX]+) ?Xx', x))

将嵌套的列表展平并提取商品名称和数量

from tkinter import _flatten goods = t.apply(lambda x: list(_flatten(x))[::2]) numbers = t.apply(lambda x: list(_flatten(x))[1::2])

将商品名称和数量组成的两个Series合并成一个DataFrame

goods_data = pd.DataFrame({'goods': goods, 'numbers': numbers})

绘制销售量排行榜前20的商品条形图

plt.style.use('ggplot') plt.barh(range(20), num['购买数量'][:20]) plt.yticks(range(20), num.index[:20]) plt.ylabel('产品名称') plt.xlabel('销售量') plt.title('销售量排行榜(前二十)') plt.show()

3.1分析某一台设备不同时间的销售情况

选取设备编号为112866的数据

ind = data2['设备编号'] ==112866 data_112 = data2.loc[ind, :]

查看数据形状和列名

data_112.shape data_112.columns

某一台设备不同日期的销售情况

将'下单时间'转换为日期,并计算每日收入

data_112['date'] = data_112['下单时间'].dt.date data_112['income'] = data_112['总金额(元)'] - data_112['退款金额(元)']

按日期对收入进行分组求和,并按日期排序

num = data_112[['date', 'income']].groupby('date').sum().sort_index()

绘制每日收入折线图

plt.plot(num.index, num) plt.xticks(num.index[::8], num.index[::8], rotation=90) plt.show()

某一台设备不同星期的销售情况

将'下单时间'转换为星期,并计算每日收入

data_112['weekday'] = data_112['下单时间'].dt.weekday data_112['income'] = data_112['总金额(元)'] - data_112['退款金额(元)']

按星期对收入进行分组求和,并按星期排序

num = data_112[['weekday', 'income']].groupby('weekday').sum().sort_index()

绘制每星期收入折线图

plt.plot(num.index, num) plt.xticks(num.index, num.index, rotation=90) plt.show()

某一台设备不同月份不同星期的销售情况

将'下单时间'转换为月份和星期,并计算每日收入

data_112['month'] = data_112['下单时间'].dt.month num = data_112[['weekday', 'income', 'month']].groupby(['month', 'weekday']).sum()

将最内层的行索引还原成列索引

num = num.unstack()

筛选出需要绘制的月份数据

week = [0, 1, 2, 3, 4, 5, 6] num2 = num.loc[:, [('income', i) for i in week]]

绘制不同月份不同星期的收入折线图

for i in range(5, 10): plt.plot(week, num2.loc[i, :]) plt.legend([f'{i}月' for i in range(5, 10)]) plt.show()

3.3某一台设备不同时间的销售情况

将'下单时间'转换为小时,并计算每小时收入

data_112['hour'] = data_112['下单时间'].dt.hour num = data_112[['hour','income']].groupby('hour').sum().sort_index() plt.plot(num.index,num) plt.xticks(num.index,num.index,rotation=90) #rotation旋转角度下标 plt.show()

data_112['hour'] = data_112['下单时间'].dt.hour num = data_112[['hour','income','month']].groupby(['month','hour']).sum() num = num.unstack().fillna(0) #fillna 缺失值填为0

for i in range(5, 10): plt.plot(range(24), num.loc[i, :]) plt.legend([f'{i}月' for i in range(5, 10)]) plt.show()

#星期 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()

绘制地理图表展示城市之间的空间关系

from pyecharts.charts import Geo, Map import pyecharts.options as opts from pyecharts.globals import ChartType

(
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')

绘制地理图表展示不同月份不同城市之间的空间关系

from pyecharts.charts import Geo, Timeline import pyecharts.options as opts from pyecharts.globals import ChartType

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()

Python Pandas数据分析实战:自动售货机销售数据分析(附代码)

原文地址: https://www.cveoy.top/t/topic/gVHc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录