竞赛题竞赛练习

#1.导入数据分析是需要使用的第三方库
import requests  # 用于发送网页请求
import pandas as pd  # 用于数据处理和保存
from lxml import etree  # 用于解析HTML
import matplotlib.pyplot as plt#用于绘制matplotlib图形
# 2. 爬取数据
# 请求网页、获取网页内容并解析
# 定义目标网址
url = 'https://pydemo.xinchanjiao.com/crawler/jingyingfenxi/goodsPerformance'
# 发送请求,获取返回结果,并将网页内容进行解码,以便解析
html = requests.get(url).content.decode()

# 使用lxml库的etree模块来解析HTML内容
element = etree.HTML(html)

# 使用XPath来提取表格中的数据
# 通过XPath选择器定位表格中的每一行(<tr>元素)
aa = element.xpath('//tbody/tr')

# 创建一个空列表,用于存储提取的数据
good_lists = []
for a in aa:
    good_list = []
    # 使用XPath选择器提取每一列的数据,并添加到good_list列表中
    good_list.append(a.xpath('.//td[1]/text()')[0] if a.xpath('.//td[1]/text()') else 0)
    good_list.append(a.xpath('.//td[2]/text()')[0] if a.xpath('.//td[2]/text()') else 0)
    good_list.append(a.xpath('.//td[3]/text()')[0] if a.xpath('.//td[3]/text()') else 0)
    good_list.append(a.xpath('.//td[4]/text()')[0] if a.xpath('.//td[4]/text()') else 0)
    good_list.append(a.xpath('.//td[5]/text()')[0] if a.xpath('.//td[5]/text()') else 0)
    good_list.append(a.xpath('.//td[6]/text()')[0] if a.xpath('.//td[6]/text()') else 0)
    good_list.append(a.xpath('.//td[7]/text()')[0] if a.xpath('.//td[7]/text()') else 0)
    good_list.append(a.xpath('.//td[8]/text()')[0] if a.xpath('.//td[8]/text()') else 0)
    good_list.append(a.xpath('.//td[9]/text()')[0] if a.xpath('.//td[9]/text()') else 0)
    # 将提取的一行数据添加到good_lists列表中
    good_lists.append(good_list)

# 创建一个DataFrame,将提取的数据存储在其中,并指定列名
df = pd.DataFrame(good_lists,
             columns=['月份','商品名称','商品编号','品种','原产地','销售价格','销售量','销售额','商品绩效'])
# 打印爬取的数据行列数和前几行数据
print('爬取的数据行列数为:', df.shape)
# 将数据保存到’商品绩效信息数据表.xlsx‘
df.to_csv('./商品绩效信息数据表.xlsx',index=None)
df.head()
#3.绘制商品名称文字数量直方图
# 3.1使用匿名函数和 map 方法,计算每个商品名称的文字数量,并创建一个新的列 '商品名称文字数量'
df['商品名称文字数量'] = df['商品名称'].map(lambda x: str(x))

# 3.2绘制商品名称文字数量的直方图
# 将数据分成20个区间,形成直方图
# 设置直方图边缘线颜色为红色
# 设置直方图的填充图案为斜线
# 设置直方图的透明度为0.6
# 设置图表大小为15x6
df['商品名称文字数量'].hist(bins=20, edgecolor='red', hatch='/', alpha=0.6, figsize=(15, 6))
# 设置图表标题
plt.title('商品名称文字数量直方图')
# 设置X轴标签
plt.xlabel('文字数量')
# 设置Y轴标签
plt.ylabel('出现次数')
# 显示图表
plt.show()
#4.各价格分区--数量、销售额情况、平均绩效情况组合图形绘制。
#4.1 将'销售价格', '销售量', '销售额', '商品绩效'四列数据类型修改为float类型,
df[['销售价格', '销售量', '销售额', '商品绩效']] = df[['销售价格', '销售量', '销售额', '商品绩效']].astype(float)

#4.2 使用 pd.cut 函数将销售价格分成不同的价格区间,并将结果存储在新列 '价格区间' 中
df['价格区间'] = pd.cut(df['销售价格'], bins=[0, 20, 50, 100, 500], labels=['低价格', '中等价格', '高价格', '奢侈价格'])

#4.3设置整体图形的大小和背景颜色
plt.figure(figsize=(25, 6), facecolor='lightskyblue')
# 创建子图1,绘制各价格区间数量占比的饼图
plt.subplot(131, facecolor='red')
df['价格区间'].value_counts().plot.pie(autopct='%.2f%%', fontsize=18, cmap=plt.get_cmap('Accent'), ylabel='各价格区间数量')
plt.title('各价格区间数量占比饼图')  # 设置子图标题
# 创建子图2,绘制不同价格区间的销售额占比饼图
plt.subplot(132)
df.groupby(['价格区间'])['销售额'].mean().sort_values(ascending=False).plot.pie(autopct='%.2f%%', fontsize=18, cmap=plt.get_cmap('Accent'))
plt.title('各价格区间销售额占比饼图')  # 设置子图标题
# 创建子图3,绘制不同价格区间的商品绩效平均值柱状图
plt.subplot(133, facecolor='lightskyblue')
df.groupby(['价格区间'])['商品绩效'].mean().round(2).plot.bar(fontsize=18, rot=0, width=0.9)
plt.title('不同商品价格的商品绩效平均值柱状图')  # 设置子图标题
# 显示图形
plt.show()
#5.不同品种不同价格区间的销售额透视表,并绘制堆叠柱状图

#5.1使用 pivot_table 函数创建透视表
# 使用 pivot_table 函数创建透视表
df_pivot = pd.pivot_table(data=df,  # 数据源DataFrame
                         index='品种',  # 设置行索引为 '品种' 列
                         columns='价格区间',  # 设置列索引为 '价格区间' 列
                         values='销售额',  # 求和的值为 '销售额' 列
                         aggfunc='sum',  # 求和的聚合函数
                         margins=True,  # 包括总和行
                         margins_name='合计'  # 总和行的名称
                        ).round(2)  # 四舍五入保留两位小数
# 显示透视表
df_pivot

#5.2 绘制不同品种各价格区间销售额堆叠柱状图
df_pivot.loc[:-1, :].sort_values('合计', ascending=False).drop('合计', axis=1).plot.bar(figsize=(15, 7), stacked=True, rot=0)
# 选择透视表中除了最后一行(合计行)之外的所有行
# 按照合计列的值降序排序,以确保堆叠柱状图按销售额从高到低排列
# 删除合计列,因为堆叠柱状图不需要显示总和数据
# 设置堆叠属性为 True,使柱状图堆叠显示不同价格区间的销售额
plt.title('不同品种各价格区间销售额堆叠柱状图')
plt.xlabel('品种')
plt.ylabel('销售额(元)')
plt.show()# 显示堆叠柱状图
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值