前言
前面某篇博客已经有了初步分析A股财务报表,这里作为我们工作室答辩作业进一步分析了数据。废话不多说上图。
代码已上传到github上:https://github.com/1qweasdzxc/python
- 搜索页面
2. 主页面
3. 公司评分排名
4.公司筛选页面
虽然页面有点简陋,但是功能还算完整,也算是画了将近5天的成果,帮助自己对于PyQt5库有个简单的了解。
实验过程
- 系统开发环境
1) 集成开发环境:Anaconda
2) 编程语言:python3.6.2
3) 数据库:sqlite3
4) UI图形库:pyqt5
5) 其他库:matplotlib,numpy - 相关技术介绍
本系统后台数据库采用轻量型数据库sqlite,前端UI采用pyqt5图像库,首先通过qtdesigner工具设计初步UI界面,后根据需要精细设计。 - 建立数据库
数据库我们使用sqlite,轻量,方便,无需安装。这里我们使用前面计算好的各个公司的财务比例csv表导入数据库中。
import os
import csv
import sqlite3
import redef load_data():all_companies = []all_stack_name = []path_root = r'C:\\Users\\user\\Desktop\\finally'dirs = os.listdir(path_root)conn = sqlite3.connect(r'C:\Users\user\Desktop\A股数据预测\database.db3')#连接数据库c = conn.cursor()i=0for dir in dirs:i+=1file_name = dir.split('.')file_path =os.path.join(path_root,dir)input_filename=file_pathfile = open(input_filename,encoding="utf-8",errors="ignore")file.readline() #读入第一行,后面的读取将从第二行开始reader=csv.reader(file)#打开每一张表for row in reader:str = re.sub("[A-Za-z0-9\!\%\[\]\,\。\_\ ]", "",file_name[0])#去掉表名中不符合规范的字符sql_1="create table if not exists %s"%(str)+"(id varchar(128), \Yeas_2017 varchar(128),Yeas_2016 varchar(128),Yeas_2015 varchar(128),\Yeas_2014 varchar(128),Yeas_2013 varchar(128))"sql_2="INSERT INTO %s"%(str)+" (id,Yeas_2013,Yeas_2014,Yeas_2015,\Yeas_2016,Yeas_2017) VALUES (:d1,:d2,:d3,:d4,:d5,:d6)"c.execute(sql_1)c.execute(sql_2,{'d1':row[0],'d2':row[1],'d3':row[2],'d4':row[3],'d5':row[4],'d6':row[5]})conn.commit()if (i%10==0):print(i)c.close()
def main():load_data()
main()
后用qtdesigner初步设计搜索页面,再进一步细化页面后得到start.py
start.py
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtCore import QCoreApplication
from main import Ui_MainWindow1
import startphoto
import os
path_root = r'./finally'
dirs = os.listdir(path_root)
name=[]
firmname=""class Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.setFixedSize(500, 277)
# Form.resize(500, 277)font = QtGui.QFont()font.setFamily("微软雅黑")Form.setFont(font)Form.setStyleSheet("")self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setGeometry(QtCore.QRect(80, 190, 231, 31))sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)sizePolicy.setHorizontalStretch(0)sizePolicy.setVerticalStretch(0)sizePolicy.setHeightForWidth(self.lineEdit.sizePolicy().hasHeightForWidth())self.lineEdit.setSizePolicy(sizePolicy)font = QtGui.QFont()font.setFamily("微软雅黑")self.lineEdit.setFont(font)self.lineEdit.setText("")self.lineEdit.setReadOnly(False)self.lineEdit.setObjectName("lineEdit")self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(310, 190, 61, 31))font = QtGui.QFont()font.setFamily("微软雅黑")self.pushButton.setFont(font)self.pushButton.setStyleSheet("background-color: rgb(125, 125, 125);\n"
"border-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(0, 0, 0, 255), stop:1 rgba(255, 255, 255, 255));\n"
"border-radius: 4px;")self.pushButton.setObjectName("pushButton")self.label = QtWidgets.QLabel(Form)self.label.setGeometry(QtCore.QRect(80, 110, 281, 21))font = QtGui.QFont()font.setFamily("微软雅黑")font.setPointSize(12)self.label.setFont(font)self.label.setObjectName("label")self.label_2 = QtWidgets.QLabel(Form)self.label_2.setGeometry(QtCore.QRect(130, 60, 211, 31))font = QtGui.QFont()font.setFamily("微软雅黑")font.setPointSize(18)font.setBold(True)font.setWeight(75)self.label_2.setFont(font)self.label_2.setObjectName("label_2")self.graphicsView = QtWidgets.QGraphicsView(Form)self.graphicsView.setGeometry(QtCore.QRect(0, 0, 500, 277))self.graphicsView.setStyleSheet("background-image: url(:/1/start.jpg);")self.graphicsView.setObjectName("graphicsView")self.label_3 = QtWidgets.QLabel(Form)self.label_3.setGeometry(QtCore.QRect(90, 190, 121, 31))self.label_3.setStyleSheet("color: rgb(202, 202, 202);")self.label_3.setObjectName("label_3")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(470, 0, 31, 20))self.pushButton_2.setStyleSheet("background-image: url(:/2/exit.png);")self.pushButton_2.setText("")self.pushButton_2.setObjectName("pushButton_2")self.pushButton_2.clicked.connect(QCoreApplication.instance().quit)self.pushButton.clicked.connect(self.searchButton)self.graphicsView.raise_()self.pushButton.raise_()self.lineEdit.raise_()self.lineEdit.textChanged.connect(self.masklabel3)self.label.raise_()self.label_2.raise_()self.label_3.raise_()self.pushButton_2.raise_()self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowFlags(Qt.FramelessWindowHint)Form.setWindowTitle(_translate("Form", "小财报"))self.pushButton.setText(_translate("Form", "搜索"))self.label.setText(_translate("Form", "快速锁定财富洼地, 你的价值投资军火库"))self.label_2.setText(_translate("Form", "一眼看懂公司财报"))self.label_3.setText(_translate("Form", "输入公司名/股票代码"))def masklabel3(self,Form):self.label_3.setText(None)def searchButton(self): global firmnameif(self.lineEdit.text!=""):firmname=self.lineEdit.text()for dir in dirs:file_name = dir.split('.')file_name=file_name[0].split('_')name.append(file_name)namebool=Falsefor i in range(len(name)):if firmname in name[i]:name1=name[i][1]namebool=Trueif namebool==False:name1=name[0][1]self.mainpage = QtWidgets.QMainWindow()self.ui = Ui_MainWindow1(name1)self.ui.setupUi(self.mainpage)self.mainpage.show()if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv) Dialog = QtWidgets.QDialog()ui=Ui_Form()ui.setupUi(Dialog)Dialog.show()sys.exit(app.exec_())
其他文件main.py,rank.py,selectfirm.py等分别对应着各个页面,里面各项数据参考《财报说》这个网站。
比如这家公司状况功能:
是由各项数据机器自动判断生成的评价(这个功能判断写的我累死了0.0)
又如如何在表格中插入数据变化趋势图例呢?
这些在我的main.py里面有,大概是用matplotlib生成图片,然后做成控件插入到表格中。
其他的细节我就不讲了,大家有兴趣可以去看看代码。