【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案

1.数据集来源:https://search.jd.com

2.实现思路:

(1)数据爬取

首先,我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性,需要设置合理的爬虫策略,并处理可能出现的反爬机制。

(2)数据清洗与整合

采集到的原始数据可能存在格式不统一、缺失值、异常值等问题,需要进行数据清洗和整合。清洗过程中需要处理缺失值、异常值,并对数据进行标准化处理。此外,还需要将不同来源的数据进行整合,形成一个统一的数据集。

(3)数据分析

在数据清洗和整合的基础上,我们进行深入的数据分析。首先,可以通过描述性统计方法对手机品牌的基本情况进行统计分析,如品牌数量、市场份额等。其次,利用关联规则挖掘、聚类分析等数据挖掘方法对品牌之间的关联和分类进行分析。此外,还可以结合时间序列分析方法,对市场趋势进行预测。为了更加直观地展示数据分析结果,我们可以借助数据可视化技术将结果进行可视化展示。可以使用Python中的Matplotlib、Seaborn等可视化库进行图表绘制,如饼图、柱状图、散点图等。同时,可以利用数据可视化工具进行交互式的数据展示,提高可视化效果的可读性和易用性。

3.技术难点:

(1)数据获取

在数据获取阶段,需要从京东平台爬取手机品牌的相关数据。由于京东的反爬机制较为严格,可能会遇到诸如IP被封、需要登录等挑战。此外,如何有效地从网页中提取所需的数据也是一大难点。

(2)数据清洗与整合

原始数据可能存在缺失值、异常值等问题,需要进行数据清洗和整合。对于缺失值,需要根据业务实际情况进行处理,如填充缺失值、删除含有缺失值的记录等。对于异常值,需要结合业务逻辑和数据分布情况进行分析和处理。此外,如何将不同来源的数据进行有效整合也是一大难点。

(3)数据分析与可视化

在数据分析阶段,需要利用合适的分析方法对数据进行深入挖掘。这需要具备一定的数据挖掘和统计学知识,选择合适的方法对数据进行处理和分析。在可视化阶段,如何将数据分析结果以直观、易懂的方式展示出来是一大难点。此外,如何选择合适的可视化工具和图表类型也是需要考虑的问题。

三、数据分析步骤

(1)数据api接口获取

获取京东手机品牌信息数据api接口并保存为“京东手机.csv”文件

def save\_data(data\_list):  global lock  lock.acquire()  try:  with open("京东手机.csv", "a+", encoding='utf-8-sig', newline='') as csvfile:  writer = csv.writer(csvfile)  # 以读的方式打开csv 用csv.reader方式判断是否存在标题。  with open("京东手机.csv", "r", encoding='utf8', newline='') as f:  reader = csv.reader(f)  if not \[row for row in reader\]:  # 先写入每一列的标题  writer.writerow(  \["商品编号", "商品标题", "价格", "品牌", "商品名称", "商品毛重",  "商品产地", "CPU型号", "运行内存", "机身颜色", "三防标准", "屏幕分辨率", "充电功率",  "机身色系", "屏幕材质", "后摄主像素", '机身内存',"风格", "店铺名称",'商品图片',  "详情链接"\])  # 再写入每一列的内容  writer.writerows(\[data\_list\])  csvfile.flush()  else:  writer.writerows(\[data\_list\])  csvfile.flush()  finally:  lock.release()  def get\_index(url):  print(f'抓取  {url}')  response = requests.get(url,headers).text  # 调用请求数据方法  soup = BeautifulSoup(response, 'lxml')  # 实例化BeautifulSoup对象  J\_goodsList = soup.find('div', id='J\_goodsList').find\_all('li')  # 匹配商品信息  for j\_good in J\_goodsList:  # 循环遍历  try:  sku\_id = j\_good\['data-sku'\] + '\\t'  # 商品编号  ad\_title = j\_good.find('div', class\_='p-name').find('em').text.replace('<font class="skcolor\_ljg">',  '').replace('</font>', '').replace(  '\\n', '')  # 商品标题  pc\_price = j\_good.find('div', class\_='p-price').find('i').text  # 商品价格  shop\_name = j\_good.find('div', class\_='p-shop').find('a')\['title'\]  # 商家名称  p\_img = 'https:' + j\_good.find('div', class\_='p-img').find('img')\['data-lazy-img'\]  # 商品图片  link\_url = 'https:' + j\_good.find('a')\['href'\]  # 商品链接  print(sku\_id, ad\_title, pc\_price, shop\_name, link\_url)  pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = get\_detail\_info(link\_url)  data\_list = \[sku\_id, ad\_title, pc\_price,pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge, shop\_name,p\_img, link\_url\]  #print(data\_list)  save\_data(data\_list)  time.sleep(random.random() + 5)  except:  continue

结果:

(2)数据清洗与整合

1、导入数据集

1 import pandas as pd
2 import os
3 
4 # 读取csv文件
5 file\_path = r"京东手机.csv"
6 df = pd.read\_csv(file\_path)

2、删除重复行

1 pd.drop_duplicates(df.duplicated())

3、将编号改为字符类型

1 df[“商品编号”] = df[“商品编号”].astype(“str”)

4、填充缺失值

1 df[“机身内存”].fillna(“未知”, inplace = True)

5、将清洗后的数据整合并保存至“京东手机_清洗后.csv”文件

(3)数据可视化分析

**1、折线图 - 京东售卖手机屏幕材质分布**
 1 # 1、折线图 - 京东售卖手机屏幕材质分布2         df = data\['屏幕材质'\].value\_counts()3         x = df.index 4         y = df.values 5         # 设置画布的尺寸6         plt.figure(figsize=(12, 10))7         # 创建折线图8         plt.plot(x, y)9         # 添加标题
10         plt.title('京东售卖手机屏幕材质分布')
11         # 设置横坐标字体倾斜
12         plt.xticks(rotation=-80)
13         # 图上显示数字
14         for i in range(len(x)):
15             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
16         plt.ylabel('数量')
17         plt.show()

结果:

由此折线图可以看出,大多数手机都采取直屏的材质分布。

  **2、条形图 - 出售手机排名前十的店铺分布**  
 1   # 2、条形图 - 出售手机排名前十的店铺分布2         df = data\['店铺名称'\].value\_counts().sort\_values(ascending=False)\[:10\]3         x = df.index 4         y = df.values 5         plt.figure(figsize=(12, 10))  # 设置画布的尺寸6         # 创建条形图7         plt.bar(x, y)8         # 添加标题9         plt.title('出售手机排名前十的店铺')
10         # 设置横坐标字体倾斜
11         plt.xticks(rotation=-80)
12         # 图上显示数字
13         for i in range(len(x)):
14             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
15         plt.ylabel('数量')
16         plt.show()

结果:

由此条形图可以通过对销量较好的店铺作为参考,发现哪些商品最受消费者欢迎,从而为手机品牌和商家提供有价值的参考信息,帮助他们更好地制定产品策略。

**3、饼图 - 手机机身内存占比  
**
1 # 3、饼图 - 手机机身内存占比
2         memory = data\['机身内存'\].value\_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
5         # 添加标题
6         plt.title('手机机身内存占比')
7         plt.show()

结果:

**4、箱线图 - CPU型号箱线图**
1 # 4、箱线图 - CPU型号箱线图
2         memory = data\['CPU型号'\].value\_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4 plt.boxplot(memory.values.tolist())
5         # 添加标题
6         plt.title('CPU型号箱线图')
7         plt.ylabel('数量')
8         plt.show()

结果:

**5、饼图 - 手机屏幕分辨率占比  
**
1 # 5、饼图 - 手机屏幕分辨率占比
2         memory = data\['屏幕分辨率'\].value\_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
5         # 添加标题
6         plt.title('手机屏幕分辨率占比')
7         plt.show()

结果:

  **6、散点图-充电功率散点**
1  # 6、散点图-充电功率散点
2         df = data\['充电功率'\].value\_counts()
3         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
4         plt.scatter(df.index, df.values, s=10)
5         plt.title('充电功率散点')
6         plt.ylabel('数量')
7         plt.show()

结果:

  **7、饼图 - 手机价格占比**  
 1 # 7、饼图 - 手机价格占比2         money\_list = data\['价格'\]3         current\_list = \[\] 4         for money in money\_list: 5             money = int(money) 6             if money < 1000:7                 current\_list.append('1000元以下')8             elif money >= 1000 and money < 2000:9                 current\_list.append('1000-2000元')
10             elif money >= 2000 and money < 3000:
11                 current\_list.append('2000-3000元')
12             elif money >= 3000 and money < 4500:
13                 current\_list.append('3000-4500元')
14             elif money >= 4500 and money < 6000:
15                 current\_list.append('4500-6000元')
16             elif money >= 6000 and money < 7500:
17                 current\_list.append('6000-7500元')
18             elif money >= 7500 and money < 9000:
19                 current\_list.append('7500-9000元')
20             else:
21                 current\_list.append('10000元以上')
22 
23         money\_list = pd.DataFrame(current\_list, columns=\['价格'\])
24         money\_list = money\_list\['价格'\].value\_counts()
25         l1 = money\_list.index.tolist()
26         l2 = money\_list.values.tolist()
27         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
28         plt.pie(l2, labels=l1, autopct='%1.1f%%', shadow=True, startangle=140)
29         # 添加标题
30         plt.title('手机价格占比')
31         plt.show()

结果:

**8、条形图 - 排名前十的品牌分布**
 1 df = data\['品牌'\].value\_counts().sort\_values(ascending=False)\[:10\]2         x = df.index 3         y = df.values 4         plt.figure(figsize=(12, 10))  # 设置画布的尺寸5         # 创建条形图6         plt.bar(x, y)7         # 添加标题8         plt.title('排名前十的品牌分布')9         # 设置横坐标字体倾斜
10         plt.xticks(rotation=-80)
11         # 图上显示数字
12         for i in range(len(x)):
13             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
14         plt.ylabel('数量')
15         plt.show()

结果:

  **9、折线图 - 三防标准分布**  
 1 # 9、折线图 - 三防标准分布2         df = data\['三防标准'\].value\_counts()3         x = df.index 4         y = df.values 5         # 设置画布的尺寸6         plt.figure(figsize=(12, 10))7         # 创建折线图8         plt.plot(x, y)9         # 添加标题
10         plt.title('三防标准分布')
11         # 设置横坐标字体倾斜
12         plt.xticks(rotation=-80)
13         # 图上显示数字
14         for i in range(len(x)):
15             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
16         plt.ylabel('数量')
17         plt.show()

结果:

  **10、词云-手机风格词云**
 1 #10、词云-手机风格词云2         words\_= \[\]   #创建列表,用来装风格列数据3         for word in data\['风格'\].values.tolist():4             for w in str(word).split(','):5                 if w!='nan':6                     if '未上市' not in w: 7                         words\_.append(w)8 9         df = pd.DataFrame(words\_).value\_counts()   #统计
10         # 创建词频字典
11         word\_list = \[\]
12         for x in df.index.tolist():
13 word\_list.append(x\[0\])
14         word\_freq = dict(zip(word\_list,df.values.tolist()))
15         wordcloud = WordCloud(font\_path="simfang.ttf",background\_color='white', height=400, width=800,  scale=20, prefer\_horizontal=0.9999).generate\_from\_frequencies(word\_freq)
16         plt.imshow(wordcloud, interpolation="bilinear")
17         plt.title('京东售卖手机风格词云图')
18         plt.axis("off")
19         plt.show()

结果:

(4)完整代码

  1 #获取商品手机api2 import csv  3 import random  4 import threading  5 import time  6 import requests  7 from bs4 import BeautifulSoup  8 from concurrent.futures import ThreadPoolExecutor  9 10 #需要添加cookie11 headers = { 12     'Origin': 'https://search.jd.com',13     'Referer': 'https://search.jd.com/',14     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36',15     'X-Referer-Page': 'https://search.jd.com/Search',16     'Cookie':''17 }18 19 lock = threading.Lock() 20 def save\_data(data\_list): 21     global lock 22     lock.acquire()23     try:24         with open("京东手机.csv", "a+", encoding='utf-8-sig', newline='') as csvfile:25             writer = csv.writer(csvfile) 26             # 以读的方式打开csv 用csv.reader方式判断是否存在标题。27             with open("京东手机.csv", "r", encoding='utf8', newline='') as f:28                 reader = csv.reader(f) 29                 if not \[row for row in reader\]: 30                     # 先写入每一列的标题31                     writer.writerow(32                         \["商品编号", "商品标题", "价格", "品牌", "商品名称", "商品毛重",33                          "商品产地", "CPU型号", "运行内存", "机身颜色", "三防标准", "屏幕分辨率", "充电功率",34                          "机身色系", "屏幕材质", "后摄主像素", '机身内存',"风格", "店铺名称",'商品图片',35                          "详情链接"\])36                     # 再写入每一列的内容37                     writer.writerows(\[data\_list\])38                     csvfile.flush()39                 else:40                     writer.writerows(\[data\_list\])41                     csvfile.flush()42     finally:43         lock.release()44 45 def get\_index(url): 46     print(f'抓取  {url}')47     response = requests.get(url,headers).text  # 调用请求数据方法48     soup = BeautifulSoup(response, 'lxml')  # 实例化BeautifulSoup对象49     J\_goodsList = soup.find('div', id='J\_goodsList').find\_all('li')  # 匹配商品信息50     for j\_good in J\_goodsList:  # 循环遍历51         try:52             sku\_id = j\_good\['data-sku'\] + '\\t'  # 商品编号53             ad\_title = j\_good.find('div', class\_='p-name').find('em').text.replace('<font class="skcolor\_ljg">',54                                                                                  '').replace('</font>', '').replace(55                 '\\n', '')  # 商品标题56             pc\_price = j\_good.find('div', class\_='p-price').find('i').text  # 商品价格57             shop\_name = j\_good.find('div', class\_='p-shop').find('a')\['title'\]  # 商家名称58             p\_img = 'https:' + j\_good.find('div', class\_='p-img').find('img')\['data-lazy-img'\]  # 商品图片59             link\_url = 'https:' + j\_good.find('a')\['href'\]  # 商品链接60 61             print(sku\_id, ad\_title, pc\_price, shop\_name, link\_url)62             pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = get\_detail\_info(link\_url) 63             data\_list = \[sku\_id, ad\_title, pc\_price,pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge, shop\_name,p\_img, link\_url\] 64             #print(data\_list)65             save\_data(data\_list)66             time.sleep(random.random() + 5)67         except:68             continue69 70 def get\_detail\_info(url): 71     detail\_html = requests.get(url, headers=headers).text  # 通过链接向服务器发送请求72     soup = BeautifulSoup(detail\_html, 'lxml')  # 实例化BeautifulSoup对象73     p\_parameter = soup.find('div', class\_='p-parameter').find\_all(74         'li')  # 查找标签为div,class为p-parameter的节点,并查找该节点下所有标签为li的节点75     pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge = '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''76     for parameter in p\_parameter:  # 循环遍历获取节点信息77         item = parameter.text.split(':')  # 获取文本内容78         #print(item)79         if '品牌' == item\[0\]: 80             pinpai = str(item\[1\]).replace('\\n', '')81         elif '商品名称' == item\[0\]: 82             shangpinmincheng = item\[1\]83         elif '商品毛重' == item\[0\]: 84             shangpinmaozhong = item\[1\]85         elif '商品产地' == item\[0\]: 86             shangpinchandi = item\[1\]87         elif 'CPU型号' == item\[0\]: 88             CPUxinghao = item\[1\]89         elif '运行内存' == item\[0\]: 90             yunxingneicun = item\[1\]91         elif '机身颜色' == item\[0\]: 92             jishenyanse = item\[1\]93         elif '三防标准' == item\[0\]: 94             sanfangbiaozhun = item\[1\]95         elif '屏幕分辨率' == item\[0\]: 96             pingmufenbianlv = item\[1\]97         elif '充电功率' == item\[0\]: 98             chongdiangoglv = item\[1\]99         elif '机身色系' == item\[0\]:
100             jishensexi = item\[1\]
101         elif '屏幕材质' == item\[0\]:
102             pingmucaizhi = item\[1\]
103         elif '后摄主像素' == item\[0\]:
104             houshezhuxiangsu = item\[1\]
105         elif '机身内存' == item\[0\] :
106             jisheneicun = item\[1\]
107         elif '风格' == item\[0\]:
108             fenge = item\[1\]
109 
110     return pinpai, shangpinmincheng, shangpinmaozhong,shangpinchandi, CPUxinghao, yunxingneicun,jishenyanse, sanfangbiaozhun, pingmufenbianlv, chongdiangoglv, jishensexi, pingmucaizhi, houshezhuxiangsu, jisheneicun, fenge
111 
112 
113 if \_\_name\_\_ == '\_\_main\_\_':
114     phone\_keyword\_list = \['华为手机','荣耀手机','小米手机','vivo手机','三星手机','苹果手机','努比亚手机','中兴手机','联想手机','红米手机','诺基亚手机','索尼手机','菲利普手机'\]
115     '''for keyword in phone\_keyword\_list:
116 for pn in range(1,101):
117 try:
118 get\_index(keyword,pn)
119 time.sleep(random.random()+5)
120 except:
121                 break'''
122     url\_list = \[\]
123     for keyword in phone\_keyword\_list:
124         for pn in range(1, 101):
125             url = f'https://search.jd.com/Search?keyword={keyword}&page={pn}'
126 url\_list.append(url)
127 
128     with ThreadPoolExecutor(max\_workers=3) as executor:
129         for url in url\_list:
130 executor.submit(get\_index, url)
131 #数据清洗
132 import pandas as pd
133 import os
134 
135 # 读取csv文件
136 file\_path = r"京东手机.csv"
137 df = pd.read\_csv(file\_path)
138 
139 # 删除重复行
140 pd.drop\_duplicates(df.duplicated())
141 # 将编号改为字符类型
142 df\["商品编号"\] = df\["商品编号"\].astype("str")
143 # 填充缺失值
144 df\["机身内存"\].fillna("未知", inplace = True)
145 #数据可视化分析
146 import os
147 import pandas as pd
148 import matplotlib.pyplot as plt
149 from wordcloud import WordCloud
150 plt.rcParams\['font.family'\] = 'Microsoft YaHei'   #设置字体
151 
152 def visual\_analytics():
153     file = f'京东手机\_清洗后.csv'
154     if not os.path.exists(file):   #判断文件是否存在
155         print(f'{file}文件不存在')
156     else:
157         file = f'京东手机\_清洗后.csv'
158         data = pd.read\_csv(file, encoding='utf-8')  # 读取csv文件
159 
160         # 1、折线图 - 京东售卖手机屏幕材质分布
161         df = data\['屏幕材质'\].value\_counts()
162         x = df.index
163         y = df.values
164         # 设置画布的尺寸
165         plt.figure(figsize=(12, 10))
166         # 创建折线图
167 plt.plot(x, y)
168         # 添加标题
169         plt.title('京东售卖手机屏幕材质分布')
170         # 设置横坐标字体倾斜
171         plt.xticks(rotation=-80)
172         # 图上显示数字
173         for i in range(len(x)):
174             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
175         plt.ylabel('数量')
176 plt.show()
177 
178         # 2、条形图 - 出售手机排名前十的店铺分布
179         df = data\['店铺名称'\].value\_counts().sort\_values(ascending=False)\[:10\]
180         x = df.index
181         y = df.values
182         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
183         # 创建条形图
184 plt.bar(x, y)
185         # 添加标题
186         plt.title('出售手机排名前十的店铺')
187         # 设置横坐标字体倾斜
188         plt.xticks(rotation=-80)
189         # 图上显示数字
190         for i in range(len(x)):
191             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
192         plt.ylabel('数量')
193 plt.show()
194 
195         # 3、饼图 - 手机机身内存占比
196         memory = data\['机身内存'\].value\_counts()
197         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
198         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
199         # 添加标题
200         plt.title('手机机身内存占比')
201 plt.show()
202 
203         # 4、箱线图 - CPU型号箱线图
204         memory = data\['CPU型号'\].value\_counts()
205         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
206 plt.boxplot(memory.values.tolist())
207         # 添加标题
208         plt.title('CPU型号箱线图')
209         plt.ylabel('数量')
210 plt.show()
211 
212         # 5、饼图 - 手机屏幕分辨率占比
213         memory = data\['屏幕分辨率'\].value\_counts()
214         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
215         plt.pie(memory.values.tolist(), labels=memory.index.tolist(), autopct='%1.1f%%', shadow=True, startangle=140)
216         # 添加标题
217         plt.title('手机屏幕分辨率占比')
218 plt.show()
219 
220         # 6、散点图-充电功率散点
221         df = data\['充电功率'\].value\_counts()
222         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
223         plt.scatter(df.index, df.values, s=10)
224         plt.title('充电功率散点')
225         plt.ylabel('数量')
226 plt.show()
227 
228         # 7、饼图 - 手机价格占比
229         money\_list = data\['价格'\]
230         current\_list = \[\]
231         for money in money\_list:
232             money = int(money)
233             if money < 1000:
234                 current\_list.append('1000元以下')
235             elif money >= 1000 and money < 2000:
236                 current\_list.append('1000-2000元')
237             elif money >= 2000 and money < 3000:
238                 current\_list.append('2000-3000元')
239             elif money >= 3000 and money < 4500:
240                 current\_list.append('3000-4500元')
241             elif money >= 4500 and money < 6000:
242                 current\_list.append('4500-6000元')
243             elif money >= 6000 and money < 7500:
244                 current\_list.append('6000-7500元')
245             elif money >= 7500 and money < 9000:
246                 current\_list.append('7500-9000元')
247             else:
248                 current\_list.append('10000元以上')
249 
250         money\_list = pd.DataFrame(current\_list, columns=\['价格'\])
251         money\_list = money\_list\['价格'\].value\_counts()
252         l1 = money\_list.index.tolist()
253         l2 = money\_list.values.tolist()
254         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
255         plt.pie(l2, labels=l1, autopct='%1.1f%%', shadow=True, startangle=140)
256         # 添加标题
257         plt.title('手机价格占比')
258 plt.show()
259 
260         # 8、条形图 - 排名前十的品牌分布
261         df = data\['品牌'\].value\_counts().sort\_values(ascending=False)\[:10\]
262         x = df.index
263         y = df.values
264         plt.figure(figsize=(12, 10))  # 设置画布的尺寸
265         # 创建条形图
266 plt.bar(x, y)
267         # 添加标题
268         plt.title('排名前十的品牌分布')
269         # 设置横坐标字体倾斜
270         plt.xticks(rotation=-80)
271         # 图上显示数字
272         for i in range(len(x)):
273             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
274         plt.ylabel('数量')
275 plt.show()
276 
277         # 9、折线图 - 三防标准分布
278         df = data\['三防标准'\].value\_counts()
279         x = df.index
280         y = df.values
281         # 设置画布的尺寸
282         plt.figure(figsize=(12, 10))
283         # 创建折线图
284 plt.plot(x, y)
285         # 添加标题
286         plt.title('三防标准分布')
287         # 设置横坐标字体倾斜
288         plt.xticks(rotation=-80)
289         # 图上显示数字
290         for i in range(len(x)):
291             plt.text(x\[i\], y\[i\], y\[i\], ha='center', va='bottom')
292         plt.ylabel('数量')
293 plt.show()
294 
295         #10、词云-手机风格词云
296         words\_= \[\]   #创建列表,用来装风格列数据
297         for word in data\['风格'\].values.tolist():
298             for w in str(word).split(','):
299                 if w!='nan':
300                     if '未上市' not in w:
301 words\_.append(w)
302 
303         df = pd.DataFrame(words\_).value\_counts()   #统计
304         # 创建词频字典
305         word\_list = \[\]
306         for x in df.index.tolist():
307 word\_list.append(x\[0\])
308         word\_freq = dict(zip(word\_list,df.values.tolist()))
309         wordcloud = WordCloud(font\_path="simfang.ttf",background\_color='white', height=400, width=800,  scale=20, prefer\_horizontal=0.9999).generate\_from\_frequencies(word\_freq)
310         plt.imshow(wordcloud, interpolation="bilinear")
311         plt.title('京东售卖手机风格词云图')
312         plt.axis("off")
313 plt.show()
314 
315 if \_\_name\_\_ == '\_\_main\_\_':
316     visual\_analytics()

如有侵权,请联系删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/17572.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet&#xff08;ZF-Net&#xff09;是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构&#xff0c;它在图像分类任务中取得了显著的效果。它在标准卷积神经网络&#xff08;CNN&#xff09;的基础上做了一些创新&#xff0c;例如优化了卷积核大小和池化策略&#xf…

11.15 HTML

传统路线 HTML、CSS、JS AjaxJQueryMySQLJDBCServletJSPEL&JSTLCookieSessionFilterServlet案例MybatisSpringSpringMVCSpringBoot 全新路线 HTM、CSS、JSAjax、AxiosVue、Element前端工程化 vue脚手架MavenSpringBoot基础 基于SpringBoot进行讲解Spring的IOC&#xff…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起&#xff0c;旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验&#xff0c;构建一套高效且标准化的操作流程&#xff08;SOP&#xff09;变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架&#xff0c;并介绍如何利用智能知识库技术…

Java 简单家居开关系统

1.需求&#xff1a; 面向对象编程实现智能家居控制系统&#xff08;简单的开关&#xff09; 2.实现思路 1.定义设备类&#xff1a;创建设备对象代表家里的设备 JD类&#xff1a; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

3D Gaussian Splatting的全面理解

1.概述 高斯展开是一种表示 3D 场景和渲染新视图的方法,在“用于实时辐射场渲染的 3D 高斯展开” 中介绍。它可以被认为是类似 NeRF 的模型的替代品,就像过去的 NeRF 一样,高斯飞溅导致了许多新的研究工作,他们选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别…

Arcgis地图实战三:自定义导航功能的实现

文章目录 1.最终效果预览2.计算两点之间的距离3.将点线画到地图上4.动态展示点线的变化5.动态画线6.动态画点 1.最终效果预览 2.计算两点之间的距离 let dis this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")当距离小于我们在配置文件中预设置的…

【Mysql】Mysql的多表查询---多表联合查询(中)

1、外连接查询 外连接 查询分为左外连接&#xff08;left outer join&#xff09;, 右外连接查询&#xff08;right outer join&#xff09; &#xff0c;满外连接查询&#xff08;full outer join&#xff09;. 注意&#xff1a;oracle 里面有full join &#xf…

Linux:进程状态

文章目录 前言一、初识fork1.1 fork函数的介绍1.2 fork出的子进程存在形式1.3 写时拷贝 二、进程的状态2.1 Linux内核源代码2.2 理解内核链表(重要)2.3 运行状态2.4 阻塞状态2.5 挂起状态 三、Z&#xff08;zombie&#xff09;状态 &#xff0c;僵尸进程四、 孤儿进程总结 前言…

qml显示加载嵌入QWidget窗口

本篇博客介绍如何在qml界面里显示QWidget窗口,开发环境Qt6.5.3 qml. 视频讲解:https://edu.csdn.net/learn/40003/654001?spm=3001.4143 qml和QWidget是两套独立的开发方式,二者的窗口可以相互嵌套显示,本篇博客介绍把QWidget窗口封装为动态库,然后在QML的窗口里显示出来…

【MySQL】多表查询

5. 多表查询 5.1 多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#…

2024-11-16 串的存储结构

一、顺序存储。 1.首先定一个静态数组&#xff0c;然后定义i记录串的实际长度。&#xff08;缺点&#xff1a;长度不可变&#xff09; 2.使用malloc申请动态空间&#xff0c;定义指针指向串的地址。&#xff08;需手动ferr&#xff09; 方案一&#xff1a; 数组末尾记录长度 …

nodejs21: 快速构建自定义设计样式Tailwind CSS

Tailwind CSS 是一个功能强大的低级 CSS 框架&#xff0c;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS&#xff1a; 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…

Windows 安装Docker For Desktop概要

Windows 安装docker 下载部分的工作需要使用科学技术。如果没有可以联系博主发送已下载好的文件。 本文档不涉及技术的讲解&#xff0c;仅有安装的步骤。 准备工作 包含下载与环境准备&#xff0c;下载的文件仅下载&#xff0c;在后续步骤进行安装。 微软关于wsl的文档&…

对称加密算法DES的实现

一、实验目的 1、了解对称密码体制基本原理 2、掌握编程语言实现对称加密、解密 二、实验原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位&#xff0c;产生最大 64 位的分组大小。这是一个迭代的分组密码&#xff0c;使用称为 Feistel 的技术&#xff0c;其中将加密…

三十八、Python(pytest框架-上)

一、介绍 框架&#xff08;framework&#xff09;&#xff1a;框架是为解决一类事情的功能集合。 pytest框架&#xff1a;pytest框架是单元测试框架&#xff0c;这是第三方框架想要使用必须要安装&#xff0c;可以使用pytest来作为自动化测试执行框架&#xff0c;用来管理测试…

《Django 5 By Example》阅读笔记:p165-p210

《Django 5 By Example》学习第6天&#xff0c;p165-p210总结&#xff0c;总计46页。 一、技术总结 1.bookmarks项目 (1)登录认证 作者这里使用的是Django自带的auth。 (2)上传头像 图片处理&#xff0c;使用Pillow。 (3)扩展user 扩展user模型与自带的user使用外键进行…

shell基础(3)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…

JVM面试题总结

1.介绍一下JVM的内存结构 JDK1.8及以后&#xff0c;JVM主要分为元空间、堆、虚拟机栈、本地方法栈、程序计数器五个部分&#xff0c;另外还有一个直接内存部分&#xff0c;是直接属于操作系统的。 其中元空间、堆是线程共享的&#xff0c;虚拟机栈、本地方法栈、程序计数器是线…

小新Pro 14 AHP9 2024款(83D3)原装oem预装系统Win11恢复安装包下载

适用品牌机型 &#xff1a;LENOVO联想【83D3】 链接&#xff1a;https://pan.baidu.com/s/10RAxNdvYPWJ21b_4--Y7Xw?pwdo5ju 提取码&#xff1a;o5ju 联想原装出厂Windows11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office365办公软…