当前位置:   article > 正文

PyQt5快速开发与实战 9.3 Pandas在PyQt中的应用_qtpandas

qtpandas

PyQt5快速开发与实战

9. 第9章 PyQt5 扩展应用

9.3 Pandas在PyQt中的应用

Pandas是 Python的一个数据分析包,是由AQR Capital Management在2008年4月开发的,并于2009年年底开源,目前由专注于Python数据包开发的PyData开发组继续开发和维护,属于PyData项目的一部分。Pandas最初是被作为金融数据分析工具而开发的,并为时间序列分析提供了很好的支持。从 Pandas 这个名称就可以看出,它是面板数据(Panel Data)和 Python数据分析(Data Analysis)的结合
在Pandas出现之前,Python数据分析的主力军只有NumPy比较好用;在 Pandas出现之后,它基本上占据了Python数据分析的霸主地位,它在处理基础数据尤其是金融时间序列数据方面非常高效。

使Pandas与 PyQt结合,最方便的方法就是安装qtpandas模块库。这个模块库帮助我们把Pandas 的数据显示在 QTableWidget上,并自动实现各种QTableWidget的功能,如增加、删除、修改、保存、排序等。这些功能实现起来比较麻烦,但是利用qtpandas,我们就可以无须费力地手动重新实现。

9.3.1 qtpandas的安装
  1. 安装pandas

    pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1

    在这里插入图片描述

  2. 安装qtpandas

    pip install qtpandas -i https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    可以看到安装失败了,啊这,开始谷歌…

    https://github.com/draperjames/qtpandas
    
    • 1

    在这里插入图片描述

    下载到本地

    解压

    从虚拟环境切到该目录进行安装

    安装时会卡在一个包,叫

    在这里插入图片描述

    这个时候,请出清华源,先把这个包装了,

    在这里插入图片描述

    再次尝试

    在这里插入图片描述

    没有报错,走下来了

  3. 查看是否安装成功

    在这里插入图片描述

9.3.2 官方示例

在这里插入图片描述

跑一下

在这里插入图片描述

报错了

大佬说原因应该是pandas版本升高了,

跟着错误找过去

在这里插入图片描述

改成这样

在这里插入图片描述

再次运行官方示例

在这里插入图片描述

很好,又报错了

改成import *

在这里插入图片描述

再次运行

在这里插入图片描述

窗口出来了

又出现了野生的错误

开始谷歌…

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

再次执行

在这里插入图片描述

完美运行

9.3.3 设置提升的窗口控件

【解决Qt Designer中没有DataTableWidget和DataFrameModel两个类对应的窗口控件】

所谓提升的窗口控件,就是指有些窗口控件是用户自己基于PyQt定义的衍生窗口控件,这些窗口控件在Qt Designer中没有直接提供,但是可以通过提升的窗口控件这个功能来实现。具体方法如下:

在这里插入图片描述

在这里插入图片描述

点击添加

在这里插入图片描述

提升

在这里插入图片描述

在这里插入图片描述

导出ui转为py

在这里插入图片描述

提升的窗口控件是PyQt中非常简单、实用而又强大的功能,利用该功能可以通过Qt Designer来实现PyQt与Python 的一些强大的模块之间的交互功能,可以充分利用PyQt和 Python两者的优点来快速开发程序。

9.3.4 qtpandas的使用

UI: Ui_pandas_pyqt.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pandas_pyqt.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        self.centralWidget.setObjectName("centralWidget")
        self.pushButton = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton.setGeometry(QtCore.QRect(680, 60, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralWidget)
        self.pushButton_2.setGeometry(QtCore.QRect(680, 170, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pandastablewidget = DataTableWidget(self.centralWidget)
        self.pandastablewidget.setGeometry(QtCore.QRect(10, 30, 591, 331))
        self.pandastablewidget.setStyleSheet("")
        self.pandastablewidget.setObjectName("pandastablewidget")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "数据初始化"))
        self.pushButton_2.setText(_translate("MainWindow", "保存数据"))

from qtpandas.views.DataTableView import DataTableWidget
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

pandas_pyqt.py

# -*- coding: utf-8 -*-

"""
Module implementing MainWindow.
"""

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QApplication

from Ui_pandas_pyqt import Ui_MainWindow

from qtpandas.models.DataFrameModel import DataFrameModel
import pandas as pd

class MainWindow(QMainWindow, Ui_MainWindow):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor
        
        @param parent reference to the parent widget
        @type QWidget
        """
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        
        '''初始化pandasqt'''
        widget = self.pandastablewidget
        widget.resize(600, 500) # 如果对部件尺寸大小不满意可以在这里设置
        
        
        self.model = DataFrameModel() # 设置新的模型
        widget.setViewModel(self.model)
    
        self.df = pd.read_excel(r'data/fund_data.xlsx')
        self.df_original = self.df.copy() # 备份原始数据
        self.model.setDataFrame(self.df)


    
    @pyqtSlot()
    def on_pushButton_clicked(self):
        """
        初始化pandas
        """
        self.model.setDataFrame(self.df_original)
    
    @pyqtSlot()
    def on_pushButton_2_clicked(self):
        """
        保存数据
        """
        self.df.to_excel(r'data/fund_data_new.xlsx')
       

if __name__ == "__main__":
    import sys
    from pyqt5_plugins.examples.exampleqmlitem import QtCore
    QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    ui = MainWindow()
    ui.show()
    sys.exit(app.exec_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

运行

在这里插入图片描述

通过窗口更改数据,查看原来的Excel表格数据,即“new”中的。

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号