【愚公系列】《Python網絡爬蟲從入門到精通》063-項目實戰電商數據偵探(主窗體的數據展示)

🌟【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】🌟

📣開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主!

👉 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"挖山不止"的毅力為開發者們搬開知識道路上的重重阻礙!

💎【行業認證·權威頭銜】
? 華為云天團核心成員:特約編輯/云享專家/開發者專家/產品云測專家
? 開發者社區全滿貫:CSDN博客&商業化雙料專家/阿里云簽約作者/騰訊云內容共創官/掘金&亞馬遜&51CTO頂級博主
? 技術生態共建先鋒:橫跨鴻蒙、云計算、AI等前沿領域的技術布道者

🏆【榮譽殿堂】
🎖 連續三年蟬聯"華為云十佳博主"(2022-2024)
🎖 雙冠加冕CSDN"年度博客之星TOP2"(2022&2023)
🎖 十余個技術社區年度杰出貢獻獎得主

📚【知識寶庫】
覆蓋全棧技術矩陣:
? 編程語言:.NET/Java/Python/Go/Node…
? 移動生態:HarmonyOS/iOS/Android/小程序
? 前沿領域:物聯網/網絡安全/大數據/AI/元宇宙
? 游戲開發:Unity3D引擎深度解析
每日更新硬核教程+實戰案例,助你打通技術任督二脈!

💌【特別邀請】
正在構建技術人脈圈的你:
👍 如果這篇推文讓你收獲滿滿,點擊"在看"傳遞技術火炬
💬 在評論區留下你最想學習的技術方向
? 點擊"收藏"建立你的私人知識庫
🔔 關注公眾號獲取獨家技術內參
?與其仰望大神,不如成為大神!關注"愚公搬代碼",讓堅持的力量帶你穿越技術迷霧,見證從量變到質變的奇跡!? |

文章目錄

  • 🚀前言
  • 🚀一、主窗體的數據展示
    • 🔎1.顯示前10名熱賣榜圖文信息
      • 🦋1.1 步驟概述
      • 🦋1.2 具體步驟
        • ??(1) 導入自定義模塊并創建對象
        • ??(2) 獲取熱賣排行榜信息并插入數據庫
        • ??(3) 創建 `show_top10()` 方法顯示圖文信息
        • ??(4) 創建用于顯示商品圖片的 `QLabel` 控件
        • ??(5) 創建用于顯示好評率的 `QLabel` 控件
        • ??(6) 創建用于顯示商品名稱的 `QLabel` 控件
        • ??(7) 創建用于顯示商品價格的 `QLabel` 控件
        • ??(8) 創建關注商品按鈕 `QPushButton`
        • ??(9) 將動態創建的布局添加到網格布局
        • ??(10) 在主程序入口調用 `show_top10()` 方法
      • 🦋1.3 運行效果
    • 🔎2.顯示關注商品列表
      • 🦋2.1 確認關注
      • 🦋2.2 取消關注
    • 🔎3.顯示商品分類比例餅圖
      • 🦋3.1 創建 `chart.py` 文件
      • 🦋3.2 創建 `pie_chart()` 方法顯示餅圖
      • 🦋3.3 在 `show_window.py` 中導入自定義餅圖類
      • 🦋3.4 排除重復商品名稱并計算分類比例
      • 🦋3.5 計算其他商品分類的占比
      • 🦋3.6 創建餅圖并顯示
      • 🦋3.7 調用 `show_classification()` 方法顯示餅圖
      • 🦋3.8 運行并顯示餅圖


🚀前言

在之前的內容中,我們已經完成了電商數據偵探項目的多個環節,包括需求分析、系統設計、UI設計以及數據的爬取與存儲。現在,我們進入了項目的下一階段——主窗體的數據展示

數據展示是爬蟲項目中至關重要的一步,因為它直接影響到用戶如何理解和利用爬取到的數據。一個清晰、直觀的數據展示界面不僅能提升用戶體驗,還能幫助用戶更有效地分析和決策。在本篇文章中,我們將重點討論如何將爬取到的電商數據呈現給用戶,并為后續的數據分析提供方便。

具體內容包括:

  1. 數據展示的設計原則:如何設計一個直觀的界面,確保用戶可以清晰地看到爬取的數據,避免信息過載。
  2. 商品信息展示:將商品的關鍵信息(如名稱、價格、評分、銷量等)通過表格、列表或圖形化的方式展示,確保用戶能夠輕松瀏覽。
  3. 價格走勢圖展示:通過圖表的方式展示商品的價格波動情況,幫助用戶分析商品價格的走勢和規律。
  4. 用戶評價展示:展示商品的用戶評論,包括評分、評論內容等,便于用戶了解其他消費者的購買體驗。
  5. 交互與更新:實現動態數據展示,支持用戶刷新、篩選或排序數據,以便于用戶根據不同需求查看信息。
  6. 數據的可視化展示:使用圖表或圖形方式進一步呈現數據趨勢,例如價格變化趨勢圖、熱銷商品排名圖等,提升數據分析的可視化效果。

通過本篇文章的學習,你將學會如何將爬取到的電商數據通過精心設計的主窗體展現給用戶,使數據不僅僅是冷冰冰的數字,而是充滿價值的信息和見解。這將大大提升你爬蟲項目的實用性和商業價值。

🚀一、主窗體的數據展示

在實現主窗體數據展示時,需要考慮到主窗體中有三個區域:

  1. 顯示前10名熱賣榜圖文信息
  2. 顯示關注商品列表
  3. 顯示商品分類餅圖

首先,我們需要動態創建“顯示前10名熱賣榜圖文信息”的布局,并實現商品的關注功能。接著,我們將單獨創建一個圖表文件來顯示商品分類比例的餅圖。最后,使用數據庫操作文件將所有數據顯示在主窗體中。

🔎1.顯示前10名熱賣榜圖文信息

🦋1.1 步驟概述

  1. 導入相關自定義模塊:首先,需要導入自定義數據庫操作類和爬蟲類。
  2. 獲取熱賣榜信息并插入數據庫:爬取熱賣榜信息并將其保存至數據庫中。
  3. 從數據庫中提取數據:從數據庫中提取前10名熱賣榜信息。
  4. 動態創建布局:根據提取的數據顯示圖文信息。
  5. 顯示熱賣榜圖文信息:將圖文信息展示在主窗體上。

🦋1.2 具體步驟

??(1) 導入自定義模塊并創建對象

首先,在 show_window.py 文件中導入數據庫操作類和爬蟲類,并創建相應的對象。代碼如下:

from mysql import MySQL
from crawl import Crawlmycrawl = Crawl()  # 創建爬蟲類對象
mysql = MySQL()    # 創建數據庫對象# 連接數據庫
sql = mysql.connection_sql()# 創建數據庫游標
cur = sql.cursor()
??(2) 獲取熱賣排行榜信息并插入數據庫

Main 類的 __init__() 方法中,獲取熱賣排行榜信息與商品價格,并將數據保存到數據庫中。代碼如下:

# 獲取熱賣排行榜信息
id_str = mycrawl.get_rankings_json('https://ch.jd.com/hotsale2?cateid=686')
rankings_list = mycrawl.get_price(id_str)  # 獲取價格,然后在該方法中將所有數據保存至列表并返回
mysql.insert_ranking(cur, rankings_list, 'jd_ranking')  # 將數據插入數據庫
??(3) 創建 show_top10() 方法顯示圖文信息

Main 類中,創建 show_top10() 方法來顯示前10名熱賣榜圖文信息。在該方法中,首先創建外層布局 QWidget 控件。代碼如下:

def show_top10(self):top_10_info = mysql.query_top10_info(cur)  # 查詢排行數據表前10名商品名稱,價格,好評率# 行數標記i = -1for n in range(10):# x 確定每行顯示的個數 0,1,2 每行2個x = n % 2# 當x為0的時候設置換行 行數+1if x == 0:i += 1# 創建布局self.widget = QtWidgets.QWidget()# 給布局命名self.widget.setObjectName("widget" + str(n))# 設置布局樣式self.widget.setStyleSheet('QWidget#' + "widget" + str(n) + "{border:2px solid rgb(175, 175, 175);background-color: rgb(255, 255, 255);}")
??(4) 創建用于顯示商品圖片的 QLabel 控件

依次添加代碼,在 QWidget 控件中創建用于顯示商品圖片的 QLabel 控件。代碼如下:

# 創建個Qlabel控件用于顯示圖片 設置控件在QWidget中
self.label = QtWidgets.QLabel(self.widget)
# 設置大小
self.label.setGeometry(QtCore.QRect(15, 15, 160, 160))
# 設置要顯示的圖片
self.label.setPixmap(QtGui.QPixmap('img_download/' + str(n) + '.jpg'))
# 圖片顯示方式 讓圖片適應QLabel的大小
self.label.setScaledContents(True)
# 給顯示圖片的label控件命名
self.label.setObjectName("img_download" + str(n))
# 設置控件樣式
self.label.setStyleSheet('border:2px solid rgb(175, 175, 175);')
??(5) 創建用于顯示好評率的 QLabel 控件

添加代碼,在 QWidget 控件中創建用于顯示好評率的 QLabel 控件。代碼如下:

# 顯示好評的Label控件
self.label_good = QtWidgets.QLabel(self.widget)
# 給好評率控件命名
self.label_good.setObjectName("good" + str(n))
self.label_good.setGeometry(QtCore.QRect(24, 180, 141, 40))  # 設置控件位置及大小
# 設置控件樣式,邊框與顏色
self.label_good.setStyleSheet("border: 2px solid rgb(255, 148, 61);color: rgb(255, 148, 61);")
self.label_good.setAlignment(QtCore.Qt.AlignCenter)  # 控件內文字居中顯示
self.label_good.setText('好評率' + top_10_info[n][2])  # 顯示好評率的文字
font = QtGui.QFont()    # 創建字體對象
font.setPointSize(18)   # 設置字體大小
font.setBold(True)     # 開啟粗體屬性
font.setWeight(75)     # 設置文字粗細
self.label_good.setFont(font) # 設置字體
??(6) 創建用于顯示商品名稱的 QLabel 控件

依次添加代碼,在 QWidget 控件中創建用于顯示商品名稱的 QLabel 控件。代碼如下:

# 顯示名稱的Label控件
self.label_name = QtWidgets.QLabel(self.widget)
# 給顯示名稱控件命名
self.label_name.setObjectName("good" + str(n))
# 設置控件位置及大小
self.label_name.setGeometry(QtCore.QRect(185, 30, 228, 80))
self.label_name.setText(top_10_info[n][0])  # 設置顯示名稱的文字
# 左上角為主顯示文字
self.label_name.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
self.label_name.setWordWrap(True)  # 設置文字自動換行
font = QtGui.QFont()  # 創建字體對象
font.setPointSize(9)  # 設置字體大小
font.setBold(True)    # 開啟粗體屬性
font.setWeight(75)    # 設置文字粗細
self.label_name.setFont(font)   # 設置字體
??(7) 創建用于顯示商品價格的 QLabel 控件

依次添加代碼,在 QWidget 控件中創建用于顯示商品價格的 QLabel 控件。代碼如下:

# 顯示價格的Label控件
self.label_price = QtWidgets.QLabel(self.widget)
# 給顯示價格控件命名
self.label_price.setObjectName("price" + str(n))
# 設置控件位置及大小
self.label_price.setGeometry(QtCore.QRect(200, 80, 228, 80))
# 設置控件樣式
self.label_price.setStyleSheet("color: rgb(255, 0, 0);")
self.label_price.setText('¥' + top_10_info[n][1])  # 設置顯示的價格文字
font = QtGui.QFont()    # 創建字體對象
font.setPointSize(20)   # 設置字體大小
font.setBold(True)     # 開啟粗體屬性
font.setWeight(75)     # 設置文字粗細
self.label_price.setFont(font)   # 設置字體
??(8) 創建關注商品按鈕 QPushButton

依次添加代碼,在 QWidget 控件中創建用于顯示關注商品的 QPushButton 控件。代碼如下:

# 顯示關注按鈕控件
self.pushButton = QtWidgets.QPushButton(self.widget)
# 給顯示價格控件命名
self.pushButton.setObjectName(str(n))
# 設置控件位置及大小
self.pushButton.setGeometry(QtCore.QRect(300, 160, 100, 50))
font = QtGui.QFont()     # 創建字體對象
font.setFamily("楷體")   # 設置字體
font.setPointSize(18)    # 設置字體大小
font.setBold(True)      # 開啟粗體屬性
font.setWeight(75)      # 設置文字粗細
self.pushButton.setFont(font)   # 設置字體
# 設置關注按鈕控件樣式
self.pushButton.setStyleSheet("background-color: rgb(223, 48, 51);color: rgb(255, 255, 255);")
self.pushButton.setText('關注')   # 設置關注按鈕顯示的文字
# 注冊關注按鈕信號槽
self.pushButton.clicked.connect(self.attention_btn)
??(9) 將動態創建的布局添加到網格布局

將動態創建的 widget 布局添加到網格布局中,并設置滾動條的高度為動態高度。代碼如下:

    # 把動態創建的widegt布局添加到gridLayout中 i,x分別代表:行數以及每行的個數self.gridLayout.addWidget(self.widget, i, x)# 設置高度為動態高度根據 行數確定高度 每行300
self.scrollAreaWidgetContents.setMinimumHeight((i+1) * 240)
# 設置網格布局控件動態高度
self.gridLayoutWidget.setGeometry(QtCore.QRect(0, 0, 850, ((i+1) * 240)))
??(10) 在主程序入口調用 show_top10() 方法

最后,在主程序入口顯示主窗體時,調用 show_top10() 方法。代碼如下:

main.show_top10()

🦋1.3 運行效果

運行 show_window.py 文件后,主窗體會顯示熱賣商品前10名的圖文信息,如圖所示。由于熱賣商品排行榜數據會自動更新,主窗體每次顯示的信息可能會有所變化。
在這里插入圖片描述

🔎2.顯示關注商品列表

在實現顯示關注商品列表時,需要首先實現熱賣商品的關注功能。關注按鈕需要設置關注事件,單擊商品的關注按鈕時會彈出一個確認關注的小窗體,以避免誤操作。確認關注后,需要將商品信息保存至數據庫,并將關注的商品名稱顯示在關注商品列表中。同時,取消關注功能也需要實現,單擊關注商品列表中的商品名稱時,會彈出確認取消關注的小窗體進行確認。

🦋2.1 確認關注

  1. 窗體設計

    • 打開Qt Designer工具,設置窗體的最大尺寸與最小尺寸為400x200,并移除默認的狀態欄和菜單欄。
    • 在窗體中拖入一個QLineEdit控件用于顯示需要關注商品的名稱,拖入兩個QPushButton控件分別用于確認關注與取消關注。
    • 窗體設計完成后,保存為attention_window.ui文件,使用pyuic工具將其轉換為attention_window.py文件。
      在這里插入圖片描述
  2. 代碼實現

    • attention_window.py文件中,將默認生成的Ui_MainWindow類修改為Attention_MainWindow
    • 打開show_window.py文件,導入關注窗體文件中的UI類,并定義顯示提示對話框的方法:
    from attention_window import Attention_MainWindow  # 導入關注窗體文件中的UI類
    attention_info = ''  # 關注商品信息
    def messageDialog(title, message):msg_box = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, title, message)msg_box.exec()
    
  3. 關注按鈕事件

    • 在Main類中,創建attention_btn()方法處理關注按鈕的事件:
    # 關注按鈕事件
    def attention_btn(self):# 獲取信號源 點擊的按鈕sender = self.gridLayout.sender()global attention_info# 因為創建關注按鈕對象名稱是以0為起始,最后一個關注按鈕為9,# 所以用單擊按鈕的對象名稱+1作為數據庫中的idattention_info = mysql.query_id_info(cur, int(sender.objectName()) + 1)# 將商品名稱顯示在關注窗體的編輯框內attention.lineEdit.setText(attention_info[0])attention.open()  # 顯示關注窗體
    
  4. 顯示關注商品名稱列表

    • 創建show_attention_name()方法來顯示已關注商品的名稱列表:
    def show_attention_name(self):self.name_list = []row, column, results = mysql.query_evaluate_info(cur, 'attention')if row != 0:for index, i in enumerate(results):self.name_list.append('關注商品' + str(index + 1) + ':\n' + i[1])font = QtGui.QFont()font.setPointSize(12)self.listView.setFont(font)self.listView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)self.listView.setWordWrap(True)model = QtCore.QStringListModel()model.setStringList(self.name_list)self.listView.setModel(model)else:model = QtCore.QStringListModel()model.setStringList(self.name_list)self.listView.setModel(model)
    
  5. 初始化關注窗體

    • 創建Attention類,并通過__init__()方法初始化關注窗體:
    class Attention(QMainWindow, Attention_MainWindow):def __init__(self):super(Attention, self).__init__()self.setupUi(self)# 開啟自動填充背景self.centralwidget.setAutoFillBackground(True)palette = QtGui.QPalette()  # 調色板類palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img_resources/attention_bg.png')))  # 設置背景圖片self.centralwidget.setPalette(palette)  # 為控件設置對應的調色板即可# 設置背景透明self.pushButton_yes.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_yes.setIcon(QtGui.QIcon('img_resources/yes_btn.png'))# 設置按鈕背景圖大小self.pushButton_yes.setIconSize(QtCore.QSize(100, 50))# 設置背景透明self.pushButton_no.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_no.setIcon(QtGui.QIcon('img_resources/no_btn.png'))# 設置按鈕背景圖大小self.pushButton_no.setIconSize(QtCore.QSize(100, 50))
    
  6. 插入關注商品信息到數據庫

    • 創建insert_attention_message()方法,將商品信息插入數據庫:
        # 打開關注窗體def open(self):self.show()def insert_attention_message(self, attention_info):is_identical = mysql.query_is_name(cur, attention_info[0])  # 判斷數據庫中是否已經關注了該商品if is_identical == 0:middle_time = mycrawl.get_evaluation(2, attention_info[2])poor_time = mycrawl.get_evaluation(1, attention_info[2])# 判斷信息狀態if middle_time != None and poor_time != None:attention_info = attention_info + (middle_time, poor_time)  # 將評價時間添加至商品數據中mysql.insert_attention(cur, [attention_info], 'attention')  # 插入關注信息messageDialog('提示!', '已關注' + attention_info[0])  # 提示attention.close()  # 關閉關注對話框main.show_attention_name() # 顯示關注商品的名稱else:print('無法獲取評價時間!')else:messageDialog('警告!', '不可以關注相同的商品!')attention.close()
    
  7. 設置按鈕事件

    • 在主程序的主入口處,創建關注窗體對象并設置按鈕事件:
    attention = Attention()
    attention.pushButton_yes.clicked.connect(lambda: attention.insert_attention_message(attention_info))
    attention.pushButton_no.clicked.connect(attention.close)
    main.show_attention_name()
    
  8. 注冊關注按鈕信號槽

    • show_top10()方法中,注冊關注按鈕的信號槽:
    self.pushButton.clicked.connect(self.attention_btn)
    
  9. 運行并測試

    • 運行show_window.py文件,單擊商品的“關注”按鈕后,將彈出確認關注窗體,確認后會顯示提示框并更新關注商品列表。

在這里插入圖片描述
在這里插入圖片描述

🦋2.2 取消關注

取消關注的小窗體與確認關注的小窗體相似,唯一不同的是背景圖片和文字。以下是實現步驟:

class Cancel_Attention(QMainWindow, Attention_MainWindow):def __init__(self):super(Cancel_Attention, self).__init__()self.setupUi(self)# 開啟自動填充背景self.centralwidget.setAutoFillBackground(True)palette = QtGui.QPalette()  # 調色板類palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(QtGui.QPixmap('img_resources/cancel_attention_bg.png')))  # 設置背景圖片self.centralwidget.setPalette(palette)  # 為控件設置對應的調色板即可# 設置背景透明self.pushButton_yes.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_yes.setIcon(QtGui.QIcon('img_resources/yes_btn.png'))# 設置按鈕背景圖大小self.pushButton_yes.setIconSize(QtCore.QSize(100, 50))# 設置背景透明self.pushButton_no.setStyleSheet("background-color:rgba(0,0,0,0)")# 設置確認關注按鈕的背景圖片self.pushButton_no.setIcon(QtGui.QIcon('img_resources/no_btn.png'))# 設置按鈕背景圖大小self.pushButton_no.setIconSize(QtCore.QSize(100, 50))# 顯示取消關注的窗體def open(self,qModeIndex):# 在關注商品名稱列表中,獲取單擊了哪一個商品的名稱name = main.name_list[qModeIndex.row()].lstrip('關注商品'+str(qModeIndex.row()+1)+':\n')# 將商品名稱顯示在關注窗體的編輯框內cancel_attention.lineEdit.setText(name)cancel_attention.show()  # 顯示關注窗體#  取消關注的方法def unfollow(self):# 獲取編輯框內的商品名稱name = cancel_attention.lineEdit.text()mysql.delete_attention(cur,name)main.show_attention_name()     # 顯示關注商品名稱列表cancel_attention.close()       # 關掉取消關注的窗體

程序啟動文件如下:

cancel_attention = Cancel_Attention()
# 指定顯示關注商品名稱列表事件
main.listView.clicked.connect(cancel_attention.open)
# 指定取消關注窗體按鈕(是)單擊事件處理方法
cancel_attention.pushButton_yes.clicked.connect(cancel_attention.unfollow)
# 指定取消關注窗體按鈕(否)單擊事件處理方法
cancel_attention.pushButton_no.clicked.connect(cancel_attention.close)

這樣,整個關注與取消關注功能就完成了。
在這里插入圖片描述
在這里插入圖片描述

🔎3.顯示商品分類比例餅圖

在實現顯示商品分類比例餅圖時,首先需要創建一個圖表文件,接著在該文件中創建用于顯示餅圖的方法。然后,將計算出的商品分類比例作為參數傳遞給該方法,最終將餅圖顯示在主窗體中。具體步驟如下:

🦋3.1 創建 chart.py 文件

首先,在項目文件夾中創建 chart.py 文件,并導入圖表相關的模塊。接著,創建 PlotCanvas 類,并在該類中通過 __init__() 方法進行初始化工作。代碼如下:

# 圖形畫布
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib  # 導入圖表模塊
import matplotlib.pyplot as plt  # 導入繪圖模塊class PlotCanvas(FigureCanvas):def __init__(self, parent=None, width=0, height=0, dpi=100):# 避免中文亂碼matplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falsefig = plt.figure(figsize=(width, height), dpi=dpi)  # 創建圖形FigureCanvas.__init__(self, fig)self.setParent(parent)  # 設置父類

🦋3.2 創建 pie_chart() 方法顯示餅圖

PlotCanvas 類中,創建 pie_chart() 方法,用于顯示商品分類的餅圖。代碼如下:

# 顯示商品分類餅圖
def pie_chart(self, size):# 繪制餅圖explode = (0.1, 0, 0, 0, 0)  # 設置各部分突出label_list = ['鼠標', '鍵盤', 'U盤', '移動硬盤', '其他']  # 各部分標簽plt.pie(size, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=30, pctdistance=0.6)plt.axis("equal")  # 設置橫軸和縱軸大小相等,這樣餅才是圓的

🦋3.3 在 show_window.py 中導入自定義餅圖類

show_window.py 文件中導入 PlotCanvas 類,并在 Main 類中創建 show_classification() 方法。該方法的功能是獲取商品排名和數量,并統計商品分類比例。代碼如下:

# 導入自定義餅圖類
from chart import PlotCanvas# 顯示商品分類比例餅圖
def show_classification(self):name_all = mysql.query_rankings_name(cur, 'jd_ranking')  # 獲取排行榜中所有商品名稱name_number = len(name_all)  # 獲取商品總數量number = 0  # 定義統計分類數量的變量remove_list = []  # 保存需要移除的商品名稱class_list = []  # 保存所有分類比例數據的列表

🦋3.4 排除重復商品名稱并計算分類比例

為避免統計重復的商品名稱(如“鼠標墊”和“鼠標”相似),首先移除這些商品,然后計算不同分類的占比。代碼如下:

# 因為鼠標墊與鼠標名稱接近,所以先移除鼠標墊
for name in name_all:if '鼠標墊' in name:remove_list.append(name)# 循環移除鼠標墊相關商品
for r_name in remove_list:name_all.remove(r_name)# 獲取鼠標分類占有比例
for name in name_all:if '鼠標' in name:number += 1
mouse_ratio = float('%.1f' % ((number / name_number) * 100))  # 計算鼠標百分比
class_list.append(mouse_ratio)  # 向分類比例列表添加鼠標百分比數據

🦋3.5 計算其他商品分類的占比

依次計算鍵盤、U盤、移動硬盤和其他類別的占比。代碼如下:

# 獲取鍵盤占有比例
number = 0
for name in name_all:if '鍵盤' in name:number += 1
keyboard_ratio = float("%.1f" % ((number / name_number) * 100))
class_list.append(keyboard_ratio)# 獲取U盤占有比例
number = 0
for name in name_all:if 'U盤' in name or 'u盤' in name:number += 1
u_ratio = float('%.1f' % ((number / name_number) * 100))
class_list.append(u_ratio)# 獲取移動硬盤占有比例
number = 0
for name in name_all:if '移動硬盤' in name:number += 1
move_ratio = float('%.1f' % ((number / name_number) * 100))
class_list.append(move_ratio)# 計算其他百分比
other_ratio = float('%.1f' % (100 - (mouse_ratio + keyboard_ratio + u_ratio + move_ratio)))
class_list.append(other_ratio)

🦋3.6 創建餅圖并顯示

創建 PlotCanvas 類對象,并調用 pie_chart() 方法將餅圖添加到主窗體的布局中。代碼如下:

# 創建餅圖類對象
pie = PlotCanvas()# 調用顯示餅圖的方法
pie.pie_chart(class_list)# 將餅圖添加到主窗體的水平布局中
self.horizontalLayout.addWidget(pie)

🦋3.7 調用 show_classification() 方法顯示餅圖

在主程序入口中,調用 show_classification() 方法來顯示商品分類比例餅圖。代碼如下:

# 顯示商品分類比例餅圖
main.show_classification()

🦋3.8 運行并顯示餅圖

運行 show_window.py 文件時,主窗體的左上角將顯示商品分類比例的餅圖。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77763.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

日志分析工具快速統計電商系統單位時間內的請求總數

一、常用日志分析工具及操作步驟 ?ELK Stack(Elasticsearch + Logstash + Kibana)?核心操作? 日志收集?:通過Logstash配置日志輸入(如Nginx日志文件),使用grok插件解析日志格式。 數據存儲?:將解析后的日志存入Elasticsearch,利用其分布式搜索能力快速索引數據。…

Win10一體機(MES電腦設置上電自動開機)

找個鍵盤,帶線的那種,插到電腦上,電腦開機;連續點按F11;通過↑↓鍵選擇Enter Setup 然后回車; 選擇 smart settings ; 選擇 Restore AC Power Loss By IO 回車; 將prower off 改為…

crontab 定時備份 mysql 數據庫

1、使用 mysqldump 命令備份數據 1.1 備份全部數據庫的數據和結構 mysqldump -uroot -p123456 -A > /data/backup/db.sql1.2 備份全部數據庫的結構(加 -d 參數) mysqldump -uroot -p123456 -A -d > /data/backup/db.sql1.3 備份全部數據庫的數據…

【Git】branch合并分支

在 Git 中,將分支合并到 main 分支是一個常見的操作。以下是詳細的步驟和說明,幫助你完成這個過程。 1. 確保你在正確的分支上 首先,你需要確保當前所在的分支是 main 分支(或者你要合并到的目標分支)。 檢查當前分支…

基于Python+Pytest實現自動化測試(全棧實戰指南)

目錄 第一篇:基礎篇 第1章 自動化測試概述 1.1 什么是自動化測試 第2章 環境搭建與工具鏈配置 2.1 Python環境安裝(Windows/macOS/Linux) 2.2 虛擬環境管理 2.3 Pytest基礎配置(pytest.ini) 第3章 Pytest核心語…

什么是CRM系統,它的作用是什么?CRM全面指南

CRM(Customer Relationship Management,客戶關系管理)系統是一種專門用于集中管理客戶信息、優化銷售流程、提升客戶滿意度、支持精準營銷、驅動數據分析決策、加強跨部門協同、提升客戶生命周期價值的業務系統工具。其中,優化銷售…

紛析云開源財務軟件:助力企業實現數字化自主權

在數字化轉型浪潮中,企業財務管理面臨高成本、低靈活性、數據孤島等痛點。紛析云開源財務軟件(項目地址:https://gitee.com/shenxji/fxy)憑借其開源基因與模塊化設計,為企業提供了一條“低成本、高可控”的數字化路徑。…

飛搭系列 | 組件增加標記,提升用戶體驗

前言 Preface 飛搭低代碼平臺(FeiDa,以下簡稱“飛搭”),為企業提供在線化、靈活的業務應用構建工具,支持高低代碼融合,助力企業低門檻、高效率和低成本地快速應對市場變化,加速復雜業務場景落地…

Docker 部署 Redis 緩存服務

Docker 部署 Redis 緩存服務 基于 Docker 部署 Redis 緩存服務一、拉取 Redis 鏡像二、運行 Redis 容器三、運行命令參數詳解四、查看容器運行狀態 基于 Docker 部署 Redis 緩存服務 一、拉取 Redis 鏡像 確保 Docker 環境已正確安裝并運行,打開終端執行以下命令拉…

yarn的介紹與操作,yarn和npm的選擇

🧶 一、Yarn 是什么? Yarn 是由 Facebook(Meta)開發的 JavaScript 包管理工具,用于替代 npm,解決它在早期版本中存在的一些問題。 ? Yarn 的優勢(v1.x): &#x1f4e…

vivado XMP使用

vivado XMP使用 文章目錄 vivado XMP使用前言一、xpm_cdc_async_rst二、XPM_CDC_ARRAY_SINGLE三、XPM_CDC_PULSE四、 XPM_CDC_SINGLE五、 xpm_cdc_sync_rst總結 前言 使用XMP做跨時鐘域,方便的是官方認證,好用且不會爆時序問題,懶得寫 set fl…

P3416-圖論-法1.BFS / 法2.Floyd

這道題雖然標簽有floyd但是直接bfs也能過 其實事實證明還是bfs快,因為bfs只需要遍歷特定的點,但是floyd需要考慮遍歷所有可能的中介點 法1.BFS 用字典存儲每個點所能普及的范圍,然后用對每個點bfs進行拓展 nint(input())temp[]#xmax0;yma…

科普動畫短視頻制作:角色塑造的魅力法則

寶子們,在科普動畫短視頻的世界里,角色塑造可是讓作品出彩的關鍵!今天就來和大家嘮嘮那些超實用的角色塑造法則,還會給大家推薦一款超好用的工具哦~ 一、獨特外形,吸睛第一步 在科普動畫短視頻制作中,角色…

代理模式(Proxy Pattern)詳解:以延遲加載圖片為例

在日常開發中,是否遇到過以下問題: “程序啟動時圖片太多,加載太慢!” “用戶還沒看到圖片就已經開始加載了,性能浪費!” 此時,代理模式(Proxy Pattern)便派上了用場。本…

C++學習筆記(三十六)——STL之排序算法

一、STL 算法 C的STL&#xff08;Standard Template Library&#xff09; 提供了一組高效、通用的算法&#xff0c;這些算法適用于各種容器&#xff08;如 vector、list、set、map&#xff09;。 這些算法主要位于 <algorithm> 和 <numeric> 頭文件中。 通用性&a…

Java基于SpringBoot的企業車輛管理系統,附源碼+文檔說明

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

el-date-picker時間范圍 賦值報錯問題

問題&#xff1a; 點擊時間范圍組件右邊清除圖標&#xff0c;點擊近6小時會把設置好的時間賦值給時間范圍組件 但是出現報錯 原因&#xff1a; 嘗試對null值進行屬性設置操作&#xff1a;修改一個數組的元素&#xff0c;但此時這個數組是null&#xff0c;而不是預期的數組類型…

STM32 中斷系統深度剖析

在嵌入式系統開發領域&#xff0c;STM32 系列微控制器憑借其強大的性能和豐富的資源被廣泛應用。中斷系統作為 STM32 的關鍵特性之一&#xff0c;能夠極大地提升系統的實時響應能力和多任務處理效率。本文將基于 STM32F4 系列芯片&#xff0c;深入剖析中斷與外設中斷的原理、配…

1.3 本書結構概覽:從理論基礎到實踐案例的系統闡述

本書采用由淺入深、理論聯系實踐的結構設計&#xff0c;旨在為讀者提供一個關于大模型與智能代理(Agent)技術的全面認知框架與實施路徑。全書共分為十章&#xff0c;系統性地覆蓋了從技術基礎到企業落地的完整知識鏈條&#xff0c;現概述如下&#xff1a; 首先&#xff0c;第一…

小白訓練日記——2025/4/22

實驗描述 將GobalM模塊加入到changerEx的stage2中。 下面展示一些內聯片段&#xff1a; model dict(backbonedict(interaction_cfg(None,dict(typeGlobalM, embed_dim128,num_heads32,axial_strategyrow),dict(typeChannelExchange, p1/2),dict(typeChannelExchange, p1/2))…