Python數據庫軟件:查詢與預測功能集成系統
概述
本文將詳細介紹一個具備查詢和模型預測功能的Python數據庫軟件的設計與實現。該系統基于Python開發,使用Excel作為數據存儲格式,包含約15個功能頁面,支持數據管理、查詢分析、模型預測等核心功能。
系統架構
技術棧
- 核心語言: Python 3.9+
- 數據處理: Pandas, NumPy
- 數據庫: SQLite (用于元數據存儲)
- 模型預測: Scikit-learn, TensorFlow
- GUI框架: PyQt5
- 數據可視化: Matplotlib, Seaborn
- Excel處理: openpyxl
系統架構圖
+---------------------+
| 用戶界面層 |
| (15個功能頁面) |
+----------+----------+|
+----------v----------+
| 應用邏輯層 |
| (控制器模塊) |
+----------+----------+|
+----------v----------+
| 數據處理層 |
| (Pandas數據處理) |
+----------+----------+|
+----------v----------+
| 數據存儲層 |
| (Excel + SQLite) |
+---------------------+
系統功能模塊
1. 數據管理模塊
- 數據導入/導出
- 數據清洗
- 數據轉換
- 數據備份
2. 查詢分析模塊
- 簡單查詢
- 高級查詢
- 可視化分析
- 報表生成
3. 模型預測模塊
- 模型訓練
- 預測分析
- 模型評估
- 預測結果導出
4. 系統管理模塊
- 用戶管理
- 日志管理
- 系統設置
- 幫助文檔
實現代碼
主程序入口 (main.py)
import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget
from data_management import DataManagementPage
from query_analysis import QueryAnalysisPage
from model_prediction import ModelPredictionPage
from system_admin import SystemAdminPage
from config import APP_VERSION, DATA_DIRclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(f"智能數據系統 v{APP_VERSION}")self.setGeometry(100, 100, 1200, 800)# 創建堆疊窗口self.stacked_widget = QStackedWidget()self.setCentralWidget(self.stacked_widget)# 初始化頁面self.pages = {}self.init_pages()# 初始化菜單self.init_menu()# 顯示首頁self.show_page("DataManagement")def init_pages(self):"""初始化所有功能頁面"""self.pages["DataManagement"] = DataManagementPage(self)self.pages["QueryAnalysis"] = QueryAnalysisPage(self)self.pages["ModelPrediction"] = ModelPredictionPage(self)self.pages["SystemAdmin"] = SystemAdminPage(self)for name, page in self.pages.items():self.stacked_widget.addWidget(page)def init_menu(self):"""創建主菜單"""menu_bar = self.menuBar()# 數據管理菜單data_menu = menu_bar.addMenu("數據管理")data_menu.addAction("數據導入", lambda: self.show_page("DataManagement"))data_menu.addAction("數據清洗", lambda: self.show_page("DataManagement"))# 查詢分析菜單query_menu = menu_bar.addMenu("查詢分析")query_menu.addAction("簡單查詢", lambda: self.show_page("QueryAnalysis"))query_menu.addAction("高級查詢", lambda: self.show_page("QueryAnalysis"))# 模型預測菜單model_menu = menu_bar.addMenu("模型預測")model_menu.addAction("模型訓練", lambda: self.show_page("ModelPrediction"))model_menu.addAction("預測分析", lambda: self.show_page("ModelPrediction"))# 系統管理菜單sys_menu = menu_bar.addMenu("系統管理")sys_menu.addAction("用戶管理", lambda: self.show_page("SystemAdmin"))sys_menu.addAction("系統設置", lambda: self.show_page("SystemAdmin"))# 幫助菜單help_menu = menu_bar.addMenu("幫助")help_menu.addAction("使用手冊")help_menu.addAction("關于系統")def show_page(self, page_name):"""顯示指定頁面"""if page_name in self.pages:self.stacked_widget.setCurrentWidget(self.pages[page_name])self.setWindowTitle(f"智能數據系統 v{APP_VERSION} - {self.pages[page_name].title}")if __name__ == "__main__":# 創建數據目錄if not os.path.exists(DATA_DIR):os.makedirs(DATA_DIR)app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
數據管理頁面 (data_management.py)
import os
import pandas as pd
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog, QLabel, QTableWidget, QTableWidgetItem, QTabWidget, QMessageBox
)
from PyQt5.QtCore import Qt
from data_processor import DataProcessor
from config import DATA_DIRclass DataManagementPage(QWidget):def __init__(self, parent):super().__init__(parent)self.title = "數據管理"self.parent = parentself.data_processor = DataProcessor()self.current_file = Noneself.df = Noneself.init_ui()def init_ui(self):# 主布局main_layout = QVBoxLayout()# 頂部按鈕布局button_layout = QHBoxLayout()self.btn_import = QPushButton("導入數據")self.btn_import.clicked.connect(self.import_data)button_layout.addWidget(self.btn_import)self.btn_export = QPushButton("導出數據")self.btn_export.clicked.connect(self.export_data)self.btn_export.setEnabled(False)button_layout.addWidget(self.btn_export)self.btn_clean = QPushButton("數據清洗")self.btn_clean.clicked.connect(self.clean_data)self.btn_clean.setEnabled(False)button_layout.addWidget(self.btn_clean)self.btn_transform = QPushButton("數據轉換")self.btn_transform.clicked.connect(self.transform_data)self.btn_transform.setEnabled(False)button_layout.addWidget(self.btn_transform)button_layout.addStretch()self.lbl_status = QLabel("未加載數據")button_layout.addWidget(self.lbl_status)main_layout.addLayout(button_layout)# 標簽頁self.tab_widget = QTabWidget()# 數據預覽標簽頁self.tab_preview = QWidget()self.tab_preview_layout = QVBoxLayout()self.table_preview = QTableWidget()self.table_preview.setEditTriggers(QTableWidget.NoEditTriggers)self.tab_preview_layout.addWidget(self.table_preview)self.tab_preview.setLayout(self.tab_preview_layout)self.tab_widget.addTab(self.tab_preview, "數據預覽")# 數據統計標簽頁self.tab_stats = QWidget()self.tab_stats_layout = QVBoxLayout()self.table_stats = QTableWidget()self.table_stats.setEditTriggers(QTableWidget.NoEditTriggers)self.tab_stats_layout.addWidget(self.table_stats)self.tab_stats.setLayout(self.tab_stats_layout)self.tab_widget.addTab(self.tab_stats, "數據統計")main_layout.addWidget(self.tab_widget)self.setLayout(main_layout)def import_data(self):"""導入Excel數據文件"""file_path, _ = QFileDialog.getOpenFileName(self, "選擇Excel文件", "", "Excel Files (*.xlsx *.xls)")if file_path:try:self.df = self.data_processor.load_excel(file_path)self.current_file = os.path.basename(file_path)self.lbl_status.setText(f"已加載: {self.current_file} | 行數: {len(self.df)} | 列數: {len(self.df.columns)}")self.update_preview_table()self.update_stats_table()self.btn_export.setEnabled(True)self.btn_clean.setEnabled(True)self.btn_transform.setEnabled(True)except Exception as e:QMessageBox.critical(self, "導入錯誤", f"導入數據時出錯:\n{str(e)}")def export_data(self):"""導出數據到Excel"""if self.df is None:returnfile_path, _ = QFileDialog.getSaveFileName(self, "保存Excel文件", "", "Excel Files (*.xlsx)")if file_path:try:self.data_processor.save_excel