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,我们就可以无须费力地手动重新实现。
安装pandas
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
安装qtpandas
pip install qtpandas -i https://pypi.tuna.tsinghua.edu.cn/simple
可以看到安装失败了,啊这,开始谷歌…
https://github.com/draperjames/qtpandas
下载到本地
解压
从虚拟环境切到该目录进行安装
安装时会卡在一个包,叫
这个时候,请出清华源,先把这个包装了,
再次尝试
没有报错,走下来了
查看是否安装成功
跑一下
报错了
大佬说原因应该是pandas版本升高了,
跟着错误找过去
改成这样
再次运行官方示例
很好,又报错了
改成import *
再次运行
窗口出来了
又出现了野生的错误
开始谷歌…
再次执行
完美运行
【解决Qt Designer中没有DataTableWidget和DataFrameModel两个类对应的窗口控件】
所谓提升的窗口控件,就是指有些窗口控件是用户自己基于PyQt定义的衍生窗口控件,这些窗口控件在Qt Designer中没有直接提供,但是可以通过提升的窗口控件这个功能来实现。具体方法如下:
点击添加
提升
导出ui转为py
提升的窗口控件是PyQt中非常简单、实用而又强大的功能,利用该功能可以通过Qt Designer来实现PyQt与Python 的一些强大的模块之间的交互功能,可以充分利用PyQt和 Python两者的优点来快速开发程序。
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
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_())
运行
通过窗口更改数据,查看原来的Excel表格数据,即“new”中的。