w2_fin,谢谢!

# -*- coding: utf-8 -*-
"""
Created on Tue Aug 25 10:29:02 2020

@author: 19749
"""
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from datetime import datetime
import pandas as pd
class data:
    def data11(self):
        a = pd.read_csv('指数股票型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '指数股票型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data12(self):
        a = pd.read_csv('主动股票开放型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '主动股票开放型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data21(self):
        a = pd.read_csv('主动混合封闭型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '主动混合封闭型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data22(self):
        a = pd.read_csv('主动混合开放型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '主动混合开放型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data31(self):
        a = pd.read_csv('指数债券型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '指数债券型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data32(self):
        a = pd.read_csv('主动债券封闭型.csv', encoding = "gb2312").T.reset_index(drop=False)
        a.insert(2, '类别', '主动债券封闭型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data33(self):
        a = pd.read_csv('主动债券开放型.csv', encoding = "gb18030").T.reset_index(drop=False)
        a.insert(2, '类别', '主动债券开放型')
        a.columns = ['基金代码', '基金简称', '类别']
        return a
    def data_all(self):
        a = pd.DataFrame({'基金代码': [], '基金简称': [], '类别': []})
        for i in range(1,4):
            for j in range(1,4):
                try:
                    exec('global b\nb = self.data' + str(i) + str(j) + '()')
                    a = pd.concat([a, b])
                except:
                    pass
        return a

from WindPy import w
w.start()
class dt:
    def __init__(self):
        self.d = {'A': [], 'B': [], 'C': [], 'D': [], 'E': [], 'F': [], 'G': [], 'H': [], 'I': [], 'J': [], 'K': [], 'L': [], 'M': [], 'N': [], 'O': [], 'P': [], 'Q': [], 'R': [], 'S': [], 'T': [],
                  '其他': []}
    def add(self, fund_list, date):
        for i in range(len(fund_list)):
            for k in self.d.keys():
                self.d[k].append(float(0))
            print(date, fund_list[i], self.d)
            a = w.wset("allfundhelddetail",
                       "rptdate="+ date +";windcode="+ fund_list[i] +";field=stock_code,proportiontonetvalue")
            a = a.Data
            print('data为',a)
            code_list = a[0]
            prop_list = a[1]
            for j in range(len(code_list)):
                try:
                    c = w.wsd(code_list[j], "industry_CSRCcode12", "2020-08-15", "2020-08-17", "industryType=1")
                    c = c.Data[0][0]
                    p = prop_list[j]
                    self.d[c][i] += p
                except:
                    p = prop_list[j]
                    self.d['其他'][i] += p
        return self.d
    
def getKey(dic,value):
    result = []
    for key in dic:
        if dic[key] == value:
            result.append(key)
    return result

class QtTable(QAbstractTableModel):
    def __init__(self, data):
        QAbstractTableModel.__init__(self)
        self._data = data

    def rowCount(self, parent=None):
        return self._data.shape[0]

    def columnCount(self, parent=None):
        return self._data.shape[1]

    def data(self, index, role=Qt.DisplayRole):
        if index.isValid():
            if role == Qt.DisplayRole:
                return str(self._data.iloc[index.row(), index.column()])
        return None

    def headerData(self, col, orientation, role):
        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[col]
        return None
    
list_add = []
dict_sel = {}
list_feature = []
dict_save = {}
df = None
dict_1 = {'指数股票型': data().data11(), 
          '主动股票开放型': data().data12()} 
dict_2 = {'主动混合封闭型': data().data21(), 
          '主动混合开放型': data().data22()} 
dict_3 = {'指数债券型': data().data31(), 
          '主动债券封闭型': data().data32(), 
          '主动债券开放型': data().data33()}
dict_0 = {'股票型基金': dict_1,
          '混合型基金': dict_2,
          '债券型基金': dict_3}
list_0 = [dict_1,
          dict_2,
          dict_3]

class window2(QWidget):
    def __init__(self):
        super(window2,self).__init__()
        self.setWindowTitle("同业分析")
        self.resize(1700, 900)
        self.vlt0 = QVBoxLayout(self)
        self.top()
        self.sub_top()
        self.main_ui()        
        self.cal()
    
    def top(self):
        self.hlt0 = QHBoxLayout()
        self.vlt0.addLayout(self.hlt0)
        self.top_left()
        self.top_right()
    def top_left(self):    
        self.btn01 = QPushButton('宏观经济指标')
        self.btn01.setStyleSheet("background-color: rgb(222,211,140)")
        self.btn01.setMaximumWidth(140)
        
        self.btn02 = QPushButton('同业分析')
        self.btn02.setStyleSheet("background-color: rgb(137,190,178)")
        self.btn02.setMaximumWidth(180)
        
        self.btn03 = QPushButton('第三页面')
        self.btn03.setStyleSheet("background-color: rgb(222,211,140)")
        self.btn03.setMaximumWidth(100)
        
        self.btn_op1 = QPushButton()
        op1 = QGraphicsOpacityEffect()
        op1.setOpacity(0)
        self.btn_op1.setGraphicsEffect(op1)
        
        self.hlt0.addWidget(self.btn01)
        self.hlt0.addWidget(self.btn02)
        self.hlt0.addWidget(self.btn03)
        self.hlt0.addWidget(self.btn_op1)
    def top_right(self):
        self.btn04 = QPushButton('收起基金类别选择栏')
        self.btn04.setStyleSheet("background-color: rgb(196,226,216)")
        self.btn04.setMaximumWidth(180)
        self.flag_sel = True
        
        self.btn05 = QPushButton('收起基金筛选栏')
        self.btn05.setStyleSheet("background-color: rgb(196,226,216)")
        self.btn05.setMaximumWidth(140)
        self.flag_flt = True
        
        self.btn06 = QPushButton('展开属性选择栏')
        self.btn06.setStyleSheet("background-color: rgb(196,226,216)")
        self.btn06.setMaximumWidth(140)
        self.flag_sub_top = True
    
        self.hlt0.addWidget(self.btn04)
        self.hlt0.addWidget(self.btn05)
        self.hlt0.addWidget(self.btn06)
        
        self.btn04.clicked.connect(self.sh_sel)
        self.btn05.clicked.connect(self.sh_fil)
        self.btn06.clicked.connect(self.sh_sub_top)
        
    def sub_top(self):
        self.hlt1 = QSplitter()
        self.vlt0.addWidget(self.hlt1)
        self.hlt1.setOrientation(Qt.Horizontal)
        self.hlt1.setVisible(False)
        
        self.btn11 = QPushButton('换手率')
        self.btn11.setStyleSheet("background-color: rgb(255,232,130)")
        self.btn11.setMaximumSize(80, 35)
        self.flag_turn = False
        
        self.btn12 = QPushButton('最大回撤')
        self.btn12.setStyleSheet("background-color: rgb(255,232,130)")
        self.btn12.setMaximumWidth(80)
        self.flag_dd = False
        
        self.btn13 = QPushButton('持股明细')
        self.btn13.setStyleSheet("background-color: rgb(255,232,130)")
        self.btn13.setMaximumWidth(80)
        self.flag_dt = False
        
        self.btn14 = QPushButton('收益率')
        self.btn14.setStyleSheet("background-color: rgb(255,232,130)")
        self.btn14.setMaximumSize(80, 35)
        self.flag_nav = False
        
        self.btn_op3 = QPushButton()
        op3 = QGraphicsOpacityEffect()
        op3.setOpacity(0)
        self.btn_op3.setGraphicsEffect(op3)
        
        self.hlt1.addWidget(self.btn_op3)
        self.hlt1.addWidget(self.btn14)
        self.hlt1.addWidget(self.btn11)
        self.hlt1.addWidget(self.btn12)
        self.hlt1.addWidget(self.btn13)
        
        self.btn11.clicked.connect(self.sh_turn)
        self.btn12.clicked.connect(self.sh_dd)
        self.btn13.clicked.connect(self.sh_dt)
        self.btn14.clicked.connect(self.sh_nav)
    
    def main_ui(self):
        self.spl0 = QSplitter()
        self.vlt0.addWidget(self.spl0)
        self.win_sel()
        self.win_flt()
        self.win_right()
        self.win_feature()
        
    def win_sel(self):
        self.spl_sel = QSplitter()
        self.spl_sel.setOrientation(Qt.Vertical)
        self.spl0.addWidget(self.spl_sel)
        
        self.tree1 = QTreeWidget()
        self.tree1.setHeaderLabel('备选基金类别')
        self.plot_tree1()
       
        self.btn_sel = QPushButton('选择')
        self.btn_sel.setMinimumHeight(40)
        self.btn_sel.setMaximumSize(280, 40)
        self.btn_sel.clicked.connect(self.add)
        
        self.spl_sel.addWidget(self.tree1)
        self.spl_sel.addWidget(self.btn_sel)
        
    def win_flt(self):
        self.spl_flt = QSplitter()
        self.spl0.addWidget(self.spl_flt)
        self.spl_flt.setOrientation(Qt.Vertical)
                
        self.tree2 = QTreeWidget()
        self.tree2.setColumnCount(2)
        self.tree2.setHeaderLabels(['已选基金类别','数量'])
        self.tree2.setColumnWidth(0,200)
        
        self.btn_flt = QPushButton('确认基金类别与单只基金选择')
        self.btn_flt.setMaximumHeight(40)
        self.btn_flt.clicked.connect(self.get_fund)
        
        self.btn_dl_show = QPushButton('展开单只基金选择栏')
        self.btn_dl_show.setMaximumHeight(40)
        self.btn_dl_show.clicked.connect(self.sh_dl)
        self.flag_dl = False
        
        self.spl_flt.addWidget(self.tree2)
        self.spl_flt.addWidget(self.btn_dl_show)
        self.win_dl()
        self.spl_flt.addWidget(self.btn_flt)
    def win_dl(self):
        self.spl_dl = QSplitter()
        self.spl_flt.addWidget(self.spl_dl)
        self.spl_dl.setOrientation(Qt.Vertical)
        self.spl_dl.setVisible(False)
        
        self.btn_dl = QPushButton('单只基金选择')
        self.btn_dl.setMaximumSize(330, 40)
        
        self.tree5 = QTreeWidget()
        self.tree5.setHeaderLabel('已选单只基金')
        
        self.spl_dl.addWidget(self.btn_dl)
        self.spl_dl.addWidget(self.tree5)
        
    def win_right(self):
        self.spl_right = QSplitter()
        self.spl_right.setOrientation(Qt.Vertical)
        self.spl0.addWidget(self.spl_right)
        
        self.nav()
        self.turn()
        self.drawdown()
        self.dt()
        self.gbx_show = QGroupBox()
        self.gbx_show.setMinimumWidth(800)
        self.spl_right.addWidget(self.gbx_show)
        
        self.view = QTableView()
        self.gridLayout = QGridLayout(self.gbx_show)
        self.gridLayout.addWidget(self.view, 0, 0)
    def nav(self):
        self.gbx_nav = QGroupBox()
        self.gbx_nav.setMaximumHeight(70)
        self.gbx_nav.setVisible(False)
        self.spl_right.addWidget(self.gbx_nav)
        self.hlt_nav = QHBoxLayout(self.gbx_nav)
        
        self.l_nav0 = QLabel('收益率: ')
        self.l_nav0.setMaximumWidth(100)
        
        self.btn_nav1 = QPushButton('选择起始日期')
        self.btn_nav1.setMaximumSize(140, 40)
        self.btn_nav1.clicked.connect(self.show_cal1)

        self.l_nav1 = QLabel()
        self.l_nav1.setMaximumSize(170 , 40)
        
        self.btn_nav2 = QPushButton('选择结束日期')
        self.btn_nav2.setMaximumSize(140, 40)
        self.btn_nav2.clicked.connect(self.show_cal2)

        self.l_nav2 = QLabel()
        self.l_nav2.setMaximumSize(170 , 40)
        
        self.btn_op2 = QPushButton()
        op2 = QGraphicsOpacityEffect()
        op2.setOpacity(0)
        self.btn_op2.setGraphicsEffect(op2)
        
        self.btn_nav3 = QPushButton('作为属性输出')
        self.btn_nav3.setMaximumWidth(120)
        self.btn_nav3.setObjectName('nav')
        self.btn_nav3.clicked.connect(self.sh_0)
        
        self.l_nav3 = QLabel(' 选择范围:') 
        self.l_nav3.setMaximumWidth(90)
        self.cb_nav = QComboBox()
        self.cb_nav.setMaximumWidth(80)
        self.cb_nav.addItems(['    ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
        
        self.btn_nav4 = QPushButton('选择>>')
        self.btn_nav4.setMaximumWidth(70)
        self.btn_nav4.setObjectName('nav')
        self.btn_nav4.clicked.connect(self.nav_add)
        
        self.hlt_nav.addWidget(self.l_nav0)
        self.hlt_nav.addWidget(self.btn_nav1)
        self.hlt_nav.addWidget(self.l_nav1)
        self.hlt_nav.addWidget(self.btn_nav2)
        self.hlt_nav.addWidget(self.l_nav2)
        self.hlt_nav.addWidget(self.btn_op2)
        self.hlt_nav.addWidget(self.btn_nav3)
        self.hlt_nav.addWidget(self.l_nav3)
        self.hlt_nav.addWidget(self.cb_nav)
        self.hlt_nav.addWidget(self.btn_nav4)
        
        self.l_nav3.setVisible(False)
        self.cb_nav.setVisible(False)
        self.flag_nav_sel = False
    def turn(self):
        self.gbx_turn = QGroupBox()
        self.gbx_turn.setMaximumHeight(70)
        self.gbx_turn.setVisible(False)
        self.spl_right.addWidget(self.gbx_turn)
        self.hlt_turn = QHBoxLayout(self.gbx_turn)
        
        self.l_turn = QLabel('换手率:  年份:')
        self.l_turn.setMaximumWidth(140)
        
        self.te_turn = QLineEdit('2020')
        self.te_turn.setMaximumSize(75, 31)
        
        self.l_turn2 = QLabel('   区间:')
        self.l_turn2.setMaximumWidth(70)
        
        self.cbx_turn = QComboBox()
        self.cbx_turn.addItems(['上半年', '下半年', '全年'])
        self.cbx_turn.setMaximumWidth(80)
        
        self.btn_op4 = QPushButton()
        op4 = QGraphicsOpacityEffect()
        op4.setOpacity(0)
        self.btn_op4.setGraphicsEffect(op4)
        
        self.btn_turn3 = QPushButton('作为属性输出')
        self.btn_turn3.setMaximumWidth(120)
        self.btn_turn3.setObjectName('turn')
        self.btn_turn3.clicked.connect(self.sh_0)
        
        self.l_turn3 = QLabel(' 选择范围:') 
        self.l_turn3.setMaximumWidth(90)
        self.cb_turn = QComboBox()
        self.cb_turn.setMaximumWidth(80)
        self.cb_turn.addItems(['    ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
        
        self.btn_turn2 = QPushButton('选择>>')
        self.btn_turn2.setMaximumWidth(70)
        self.btn_turn2.setObjectName('turn')
        self.btn_turn2.clicked.connect(self.turn_add)
        
        self.hlt_turn.addWidget(self.l_turn)
        self.hlt_turn.addWidget(self.te_turn)
        self.hlt_turn.addWidget(self.l_turn2)
        self.hlt_turn.addWidget(self.cbx_turn)
        self.hlt_turn.addWidget(self.btn_op4)
        self.hlt_turn.addWidget(self.btn_turn3)
        self.hlt_turn.addWidget(self.l_turn3)
        self.hlt_turn.addWidget(self.cb_turn)
        self.hlt_turn.addWidget(self.btn_turn2)
        
        self.l_turn3.setVisible(False)
        self.cb_turn.setVisible(False)
        self.flag_turn_sel = False
    def drawdown(self):
        self.gbx_dd = QGroupBox()
        self.gbx_dd.setMaximumHeight(70)
        self.gbx_dd.setVisible(False)
        self.spl_right.addWidget(self.gbx_dd)
        self.hlt_dd = QHBoxLayout(self.gbx_dd)
        
        self.l_dd0 = QLabel('最大回撤: ')
        self.l_dd0.setMaximumWidth(100)
        
        self.btn_dd1 = QPushButton('选择起始日期')
        self.btn_dd1.setMaximumSize(140, 40)
        self.btn_dd1.clicked.connect(self.show_cal3)
        
        self.l_dd1 = QLabel()
        self.l_dd1.setMaximumSize(170 , 40)
        
        self.btn_dd2 = QPushButton('选择结束日期')
        self.btn_dd2.setMaximumSize(140, 40)
        self.btn_dd2.clicked.connect(self.show_cal4)

        self.l_dd2 = QLabel()
        self.l_dd2.setMaximumSize(170 , 40)
        
        self.btn_op5 = QPushButton()
        op5 = QGraphicsOpacityEffect()
        op5.setOpacity(0)
        self.btn_op5.setGraphicsEffect(op5)
        
        self.btn_dd3 = QPushButton('作为属性输出')
        self.btn_dd3.setMaximumWidth(120)
        self.btn_dd3.setObjectName('dd')
        self.btn_dd3.clicked.connect(self.sh_0)
        
        self.l_dd3 = QLabel(' 选择范围:') 
        self.l_dd3.setMaximumWidth(90)
        self.cb_dd = QComboBox()
        self.cb_dd.setMaximumWidth(80)
        self.cb_dd.addItems(['    ', '前1%', '前5%', '前10%', '后1%', '后5%', '后10%'])
        
        self.btn_dd4 = QPushButton('选择>>')
        self.btn_dd4.setMaximumWidth(70)
        self.btn_dd4.setObjectName('dd')
        self.btn_dd4.clicked.connect(self.dd_add)
        
        self.hlt_dd.addWidget(self.l_dd0)
        self.hlt_dd.addWidget(self.btn_dd1)
        self.hlt_dd.addWidget(self.l_dd1)
        self.hlt_dd.addWidget(self.btn_dd2)
        self.hlt_dd.addWidget(self.l_dd2)
        self.hlt_dd.addWidget(self.btn_op5)
        self.hlt_dd.addWidget(self.btn_dd3)
        self.hlt_dd.addWidget(self.l_dd3)
        self.hlt_dd.addWidget(self.cb_dd)
        self.hlt_dd.addWidget(self.btn_dd4)
        
        self.l_dd3.setVisible(False)
        self.cb_dd.setVisible(False)
        self.flag_dd_sel = False
    def dt(self):
        self.gbx_dt = QGroupBox()
        self.gbx_dt.setMaximumHeight(70)
        self.gbx_dt.setVisible(False)
        self.spl_right.addWidget(self.gbx_dt)
        self.hlt_dt = QHBoxLayout(self.gbx_dt)
        
        self.l_dt = QLabel('持股明细:  年份:')
        self.l_dt.setMaximumWidth(150)
        
        self.te_dt = QLineEdit('2020')
        self.te_dt.setMaximumSize(75, 31)
        
        self.l_dt2 = QLabel('   季度:')
        self.l_dt2.setMaximumWidth(70)
        
        self.cbx_dt = QComboBox()
        self.cbx_dt.addItems(['第一季度', '第二季度', '第三季度', '第四季度'])
        self.cbx_dt.setMaximumWidth(100)
        
        self.btn_op6 = QPushButton()
        op6 = QGraphicsOpacityEffect()
        op6.setOpacity(0)
        self.btn_op6.setGraphicsEffect(op6)
        
        self.btn_dt = QPushButton('选择>>')
        self.btn_dt.setMaximumWidth(70)
        self.btn_dt.setObjectName('turn')
        self.btn_dt.clicked.connect(self.dt_add)
        
        self.hlt_dt.addWidget(self.l_dt)
        self.hlt_dt.addWidget(self.te_dt)
        self.hlt_dt.addWidget(self.l_dt2)
        self.hlt_dt.addWidget(self.cbx_dt)
        self.hlt_dt.addWidget(self.btn_op6)
        self.hlt_dt.addWidget(self.btn_dt)
        self.flag_dt_sel = False
    
    def win_feature(self):
        self.spl_feature = QSplitter()
        self.spl_feature.setOrientation(Qt.Vertical)
        self.spl0.addWidget(self.spl_feature)
        
        self.l_feature0 = QLabel('筛选标准(新选择将替换旧选择):')
        self.l_feature0.setMaximumHeight(28)
        self.l_feature1 = QLabel('')
        self.l_feature1.setMinimumHeight(64)
        self.l_feature1.setObjectName('')
        
        self.l_feature2 = QLabel('已选属性(点击删除): ')
        self.l_feature2.setMaximumHeight(28)
        self.tree4 = QListWidget()
        
        self.btn_feature1 = QPushButton('确认')
        self.btn_feature1.setMaximumHeight(45)
        self.btn_feature1.clicked.connect(self.calculate)
        self.btn_feature1.clicked.connect(self.plot_table)
        self.btn_feature2 = QPushButton('保存至基金类别栏')
        self.btn_feature2.setMaximumHeight(45)
        self.btn_feature3 = QPushButton('导出表格')
        self.btn_feature3.setMaximumHeight(45)
        self.btn_feature4 = QPushButton('清空已选属性栏')
        self.btn_feature4.setMaximumHeight(45)
        self.btn_feature4.clicked.connect(self.feature_clear)
        self.btn_feature5 = QPushButton('显示表格')
        self.btn_feature5.setMaximumHeight(45)
        self.btn_feature5.clicked.connect(self.plot_table)
        
        self.spl_feature.addWidget(self.l_feature0)
        self.spl_feature.addWidget(self.l_feature1)
        self.spl_feature.addWidget(self.l_feature2)
        self.spl_feature.addWidget(self.tree4)
        self.spl_feature.addWidget(self.btn_feature1)
        self.spl_feature.addWidget(self.btn_feature5)
        self.spl_feature.addWidget(self.btn_feature2)
        self.spl_feature.addWidget(self.btn_feature3)
        self.spl_feature.addWidget(self.btn_feature4)
        
    def cal(self):
        #日历控件 
        self.cal1 = QCalendarWidget(self)
        self.cal1.setMinimumSize(390, 280)
        self.cal1.setMaximumSize(390, 280)
        self.cal1.setVisible(False)
        date = self.cal1.selectedDate()
        self.l_nav1.setText(date.toString('yyyy-MM-dd dddd'))
 
        self.cal2 = QCalendarWidget(self)
        self.cal2.setMinimumSize(390, 280)
        self.cal2.setMaximumSize(390, 280)
        self.cal2.setVisible(False)
        date = self.cal2.selectedDate()
        self.l_nav2.setText(date.toString('yyyy-MM-dd dddd')) 
        
        self.cal3 = QCalendarWidget(self)
        self.cal3.setMinimumSize(390, 280)
        self.cal3.setMaximumSize(390, 280)
        self.cal3.setVisible(False)
        date = self.cal3.selectedDate()
        self.l_dd1.setText(date.toString('yyyy-MM-dd dddd'))
 
        self.cal4 = QCalendarWidget(self)
        self.cal4.setMinimumSize(390, 280)
        self.cal4.setMaximumSize(390, 280)
        self.cal4.setVisible(False)
        date = self.cal4.selectedDate()
        self.l_dd2.setText(date.toString('yyyy-MM-dd dddd'))
        
        self.cal1.clicked.connect(self.showDate1)
        self.cal2.clicked.connect(self.showDate1)
        self.cal3.clicked.connect(self.showDate2)
        self.cal4.clicked.connect(self.showDate2)
        
    def sh_sel(self):
        if self.flag_sel == True:
            self.spl_sel.setVisible(False)
            self.btn04.setText('展开基金类别选择栏')
            self.flag_sel = False
        else:
            self.spl_sel.setVisible(True)
            self.btn04.setText('收起基金类别选择栏')
            self.flag_sel = True
    def sh_fil(self):
        if self.flag_flt == True:
            self.spl_flt.setVisible(False)
            self.btn05.setText('展开已选基金栏')
            self.flag_flt = False
        else:
            self.spl_flt.setVisible(True)
            self.btn05.setText('收起已选基金栏')
            self.flag_flt = True
    def sh_sub_top(self):
        if self.flag_sub_top == True:
            self.hlt1.setVisible(True)
            self.btn06.setText('收起属性选择栏')
            self.flag_sub_top = False
        else:
            self.hlt1.setVisible(False)
            self.btn06.setText('展开属性选择栏')
            self.flag_sub_top = True
    def sh_turn(self):
        if self.flag_turn == False:
            self.gbx_turn.setVisible(True)
            self.btn11.setStyleSheet("background-color: rgb(249,205,173)")
            self.flag_turn = True
        else:
            self.gbx_turn.setVisible(False)
            self.btn11.setStyleSheet("background-color: rgb(255,232,130)")
            self.flag_turn = False
    def sh_dd(self):
        if self.flag_dd == False:
            self.gbx_dd.setVisible(True)
            self.btn12.setStyleSheet("background-color: rgb(249,205,173)")
            self.flag_dd = True
        else:
            self.gbx_dd.setVisible(False)
            self.btn12.setStyleSheet("background-color: rgb(255,232,130)")
            self.flag_dd = False
    def sh_dt(self):
        if self.flag_dt == False:
            self.gbx_dt.setVisible(True)
            self.btn13.setStyleSheet("background-color: rgb(249,205,173)")
            self.flag_dt = True
        else:
            self.gbx_dt.setVisible(False)
            self.btn13.setStyleSheet("background-color: rgb(255,232,130)")
            self.flag_dt = False
    def sh_nav(self):
        if self.flag_nav == False:
            self.gbx_nav.setVisible(True)
            self.btn14.setStyleSheet("background-color: rgb(249,205,173)")
            self.flag_nav = True
        else:
            self.gbx_nav.setVisible(False)
            self.btn14.setStyleSheet("background-color: rgb(255,232,130)")
            self.flag_nav = False
    def sh_dl(self):
        if self.flag_dl == True:
            self.spl_dl.setVisible(False)
            self.btn_dl_show.setText('展开单只基金选择栏')
            self.flag_dl = False
        else:
            self.spl_dl.setVisible(True)
            self.btn_dl_show.setText('收起单只基金选择栏')
            self.flag_dl = True
    def sh_0(self):
        name = self.sender().objectName()
        exec('if self.flag_' + name +'_sel == False:\n\t'
             +'self.flag_' + name +'_sel = True\n\t'
             +'print(self.flag_' + name +'_sel)\n\t'
             +'self.l_' + name +'3.setVisible(True)\n\t'
             +'self.cb_' + name +'.setVisible(True)\n\t'
             +'self.btn_' + name +'3.setText("作为筛选条件")\n'
             'else:\n\t'
             +'self.flag_' + name +'_sel = False\n\t'
             +'print(self.flag_' + name +'_sel)\n\t'
             +'self.l_' + name +'3.setVisible(False)\n\t'
             +'self.cb_' + name +'.setVisible(False)\n\t'
             +'self.btn_' + name +'3.setText("作为属性输出")')
    def showDate1(self):
        global list_date1
        a = self.cal1.selectedDate().toString('yyyy-MM-dd dddd')
        b = self.cal2.selectedDate().toString('yyyy-MM-dd dddd')
        self.l_nav1.setText(a)
        self.l_nav2.setText(b)
        list_date1 = [self.cal1.selectedDate().toString('yyyy-MM-dd'), 
                     self.cal2.selectedDate().toString('yyyy-MM-dd')]
        print(list_date1)
    def showDate2(self):
        global list_date2
        a = self.cal3.selectedDate().toString('yyyy-MM-dd dddd')
        b = self.cal4.selectedDate().toString('yyyy-MM-dd dddd')
        self.l_dd1.setText(a)
        self.l_dd2.setText(b)
        list_date2 = [self.cal3.selectedDate().toString('yyyy-MM-dd'), 
                     self.cal4.selectedDate().toString('yyyy-MM-dd')]
        print(list_date2)
    def show_cal1(self):
        if self.btn_nav1.text() == '选择起始日期':
            self.cal1.move(self.spl_right.x() + self.btn_nav1.x() + 25,
                           self.spl0.y() + self.gbx_nav.y() + 60)
            self.cal1.raise_()
            self.cal1.setVisible(True)
            self.btn_nav1.setText('确认')
        else:
            self.cal1.setVisible(False)
            self.btn_nav1.setText('选择起始日期')
    def show_cal2(self):
        if self.btn_nav2.text() == '选择结束日期':
            self.cal2.move(self.spl_right.x() + self.btn_nav2.x() + 25,
                           self.spl0.y() + self.gbx_nav.y() + 60)
            self.cal2.raise_()
            self.cal2.setVisible(True)
            self.btn_nav2.setText('确认')
        else:
            self.cal2.setVisible(False)
            self.btn_nav2.setText('选择结束日期')
    def show_cal3(self):
        if self.btn_dd1.text() == '选择起始日期':
            self.cal3.move(self.spl_right.x() + self.btn_dd1.x() + 25,
                           self.spl0.y() + self.gbx_dd.y() + 60)
            self.cal3.raise_()
            self.cal3.setVisible(True)
            self.btn_dd1.setText('确认')
        else:
            self.cal3.setVisible(False)
            self.btn_dd1.setText('选择起始日期')
    def show_cal4(self):
        if self.btn_dd2.text() == '选择结束日期':
            self.cal4.move(self.spl_right.x() + self.btn_dd2.x() + 25,
                           self.spl0.y() + self.gbx_dd.y() + 60)
            self.cal4.raise_()
            self.cal4.setVisible(True)
            self.btn_dd2.setText('确认')
        else:
            self.cal4.setVisible(False)
            self.btn_dd2.setText('选择结束日期')    
        
    def plot_tree1(self):
        global dict_save
        self.tree1.clear()
        self.root1 = QTreeWidgetItem(self.tree1)
        self.root1.setText(0,'海通基金分类')
        for i in dict_0.keys():
            child11 = QTreeWidgetItem(self.root1)
            child11.setText(0,i)
            child11.setCheckState(0, not Qt.CheckState) 
            for j in dict_0[i]:
                self.child12 = QTreeWidgetItem(child11)
                self.child12.setText(0,j)             
                self.child12.setCheckState(0, not Qt.CheckState) 
        self.root2 = QTreeWidgetItem(self.tree1)
        self.root2.setText(0,'自定义基金类别')
        for i in dict_save:
            self.child21 = QTreeWidgetItem(self.root2)
            self.child21.setText(0, i)
            self.child21.setCheckState(0, not Qt.CheckState)
        self.tree1.itemChanged.connect(self.onclick)
        self.onclick_flag = True
    def onclick(self,item,cloumn):
        global list_add
        if self.onclick_flag == True:
            if item.checkState(cloumn) == Qt.Checked:
                list_add.append(item.text(0))
                print("checked", item.text(0))
                list_add = list(set(list_add))
            if item.checkState(cloumn) == Qt.Unchecked:
                list_add.remove(item.text(0))
                print("unchecked", item.text(0))
                list_add = list(set(list_add))
        else:
            pass
        print(list_add)
    def add(self):
        global list_add, dict_sel, df
        list_temp = []
        dict_sel = {}
        for i in list_add:
            try:
                for j in dict_0[i]:
                    list_temp.append(j)
                dict_sel[i] = list_temp
                list_temp = []
            except:
                for j in list_0:
                    try:
                        print(j[i])
                        try:
                            dict_sel[getKey(dict_0, j)[0]].append(i)
                            dict_sel[getKey(dict_0, j)[0]] = list(set(dict_sel[getKey(dict_0, j)[0]]))
                        except:
                            dict_sel[getKey(dict_0, j)[0]] = [i]
                    except:
                        pass
        print(dict_sel)
        #构建树以及获取基金数据
        dict_df = {'基金代码': [], '基金简称': [], '类别': []}
        df = pd.DataFrame(dict_df)
        self.tree2.clear()
        #类别基金
        for i in dict_sel.keys():
            self.root1 = QTreeWidgetItem(self.tree2)
            self.root1.setText(0, i)
            for j in dict_sel[i]:
                self.child1 = QTreeWidgetItem(self.root1)
                self.child1.setText(0, j)
                a = dict_0[i][j]
                l = str(len(a))
                self.child1.setText(1, l)
                df = pd.concat([df, a])
        #自定义类别
        self.root2 = QTreeWidgetItem(self.tree2)
        self.root2.setText(0, '自定义基金类别')
        for i in list_add:
            try:
                a = dict_save[i]
                print(a)
                try:
                    a.insert(2, '类别', i)
                except:
                    pass
                self.child2 = QTreeWidgetItem(self.root2)
                self.child2.setText(0, i)
                self.child2.setText(1, str(len(a)))
                df = pd.concat([df, a])
            except:
                pass
        self.tree2.expandAll()
    def dl_add(self):
        self.tree5.clear()
        try:
            for i in range(len(dl_new_0.list_add1)):
                self.root = QTreeWidgetItem(self.tree5)
                self.root.setText(0, dl_new_0.list_add1[i] +'  '+ dl_new_0.list_add2[i])
        except:
            pass
    def get_fund(self):
        global df
        #单只基金
        if dl_new_0.list_add1 == []:
            pass
        else:
            dict_df = {'基金代码': dl_new_0.list_add1, '基金简称': dl_new_0.list_add2}
            a = pd.DataFrame(dict_df)
            a.insert(2, '类别', '单只基金')
            try:
                df = pd.concat([df, a])
            except:
                df = a
        #重排index
        l = []
        for i in range(len(df)):
            l.append(i)
        df.index = l
        print(df)
    def save_fund(self):
        global df, dict_save, list_add, dict_sel
        self.sf_flag = 0
        self.onclick_flag = False
        self.tree2.clear()
        df = df.drop_duplicates(['基金代码'])
        exec('df_'+ str(self.sf_flag) +" = df[['基金代码', '基金简称']]\n"+
             'dict_save[dl_new_0.s_text] = df_'+ str(self.sf_flag))
        list_add = []
        dict_sel = {}
        self.plot_tree1()
        self.sf_flag += 1
        print(dict_save)  
        
    def nav_add(self):
        global list_feature, list_date1
        if self.flag_nav_sel == False:
            feature = 'nav_'+ list_date1[0] +'_'+ list_date1[1]
            if feature in list_feature:
                pass
            else:
                list_feature.append(feature)
                item = QListWidgetItem()
                btn = QPushButton('收益率:' +'自' + self.l_nav1.text() 
                                  +'\n至' + self.l_nav2.text())
                btn.setObjectName(feature)
                btn.clicked.connect(self.btn_del)
                self.tree4.addItem(item)
                self.tree4.setItemWidget(item, btn)
                item.setSizeHint(QSize(60,60))
                print(list_feature)
        else:
            self.l_feature1.setText('收益率:' +'自' + self.l_nav1.text() 
                                    +'\n\t至' + self.l_nav2.text()
                                    +'\n\t选取' + self.cb_nav.currentText())
            self.l_feature1.setObjectName('nav_'+ list_date1[0] +'_'
                                          + list_date1[1] +'_'+ str(self.cb_nav.currentIndex()))
    def turn_add(self):
        global list_feature, list_date1
        if self.flag_turn_sel == False:
            feature = 'turn_'+ self.te_turn.text()  +'_'+ str(self.cbx_turn.currentIndex() + 1)
            if feature in list_feature:
                pass
            else:
                list_feature.append(feature)
                item = QListWidgetItem()
                btn = QPushButton('换手率:' + self.te_turn.text() 
                                  +'年 ' + self.cbx_turn.currentText())
                btn.setObjectName(feature)
                btn.clicked.connect(self.btn_del)
                self.tree4.addItem(item)
                self.tree4.setItemWidget(item, btn)
                item.setSizeHint(QSize(60,60))
                print(list_feature)
        else:
            self.l_feature1.setText('换手率:' + self.te_turn.text() 
                              +'年 ' + self.cbx_turn.currentText()
                              +'\n\t选取' + self.cb_turn.currentText())
            self.l_feature1.setObjectName('turn_'+ self.te_turn.text()  +'_'
                                          + str(self.cbx_turn.currentIndex() + 1) +'_'
                                          + str(self.cb_turn.currentIndex()))
    def dd_add(self):
        global list_feature, list_date2
        if self.flag_dd_sel == False:
            feature = 'dd_'+ list_date2[0] +'_'+ list_date2[1]
            if feature in list_feature:
                pass
            else:
                list_feature.append(feature)
                item = QListWidgetItem()
                btn = QPushButton('最大回撤:' +'自' + self.l_dd1.text() 
                                  +'\n至' + self.l_dd2.text())
                btn.setObjectName(feature)
                btn.clicked.connect(self.btn_del)
                self.tree4.addItem(item)
                self.tree4.setItemWidget(item, btn)
                item.setSizeHint(QSize(60,60))
                print(list_feature)
        else:
            self.l_feature1.setText('最大回撤:' +'自' + self.l_dd1.text() 
                              +'\n\t 至' + self.l_dd2.text()
                              +'\n\t 选取' + self.cb_dd.currentText())
            self.l_feature1.setObjectName('dd_'+ list_date2[0] +'_'+ list_date2[1] +'_'
                                          + str(self.cb_dd.currentIndex()))
    def dt_add(self):
        global list_feature, list_date1
        if self.flag_dt_sel == False:
            feature = 'dt_'+ self.te_dt.text()  +'_'+ str(self.cbx_dt.currentIndex() + 1)
            if feature in list_feature:
                pass
            else:
                list_feature.append(feature)
                item = QListWidgetItem()
                btn = QPushButton('持股:' + self.te_turn.text() 
                                  +'年 ' + self.cbx_turn.currentText())
                btn.setObjectName(feature)
                btn.clicked.connect(self.btn_del)
                self.tree4.addItem(item)
                self.tree4.setItemWidget(item, btn)
                item.setSizeHint(QSize(60,60))
                print(list_feature)
    def btn_del(self):
        global list_feature
        button = self.sender()
        list_feature.remove(button.objectName())
        row = self.tree4.indexAt(button.pos()).row()
        self.tree4.takeItem(row)
        print(list_feature)
    
    def calculate(self):
        global list_feature, df
        #筛选
        if self.l_feature1.objectName() == '':
            print('pass')
        else:
            fund_list = list(set(df['基金代码'].tolist()))
            fund_code = ','.join(fund_list)
            l_flt = self.l_feature1.objectName().split('_')
            if l_flt[0] == 'nav':
                self.nav_cal(l_flt, flag = True)
            elif l_flt[0] == 'turn':
                self.turn_cal(l_flt, flag = True)
            elif l_flt[0] == 'dd':
                self.dd_cal(l_flt, flag = True)
        #添加属性
        fund_list = list(set(df['基金代码'].tolist()))
        fund_code = ','.join(fund_list)
        for i in list_feature:
            l = i.split('_')
            if l[0] == 'nav':
                self.nav_cal(l)
            elif l[0] == 'turn':
                self.turn_cal(l)
            elif l[0] == 'dd':
                self.dd_cal(l)
            elif l[0] == 'dt':
                self.dt_cal(l)
        #输出图像
    def plot_table(self):
        global df
        model = QtTable(df)
        fnt = self.view.font()
        fnt.setPointSize(9)
        self.view.setFont(fnt)
        self.view.setModel(model)
        self.view.setWindowTitle('viewer')
        self.view.resize(1080, 400)
        self.view.show()
    def nav_cal(self, l, flag = False):
        global df
        l_sel = list(set(df['类别'].tolist()))
        print(l_sel, l)
        df2 = pd.DataFrame(columns = df.columns.tolist()) 
        for i in l_sel:
            df_sel = df.loc[df['类别']==i]
            fund_list = list(set(df_sel['基金代码'].tolist()))
            print(i,len(fund_list))
            df_sel['nav_'+ l[1]] = None
            df_sel['nav_'+ l[2]] = None
            count = int(len(fund_list)/4000) + 1
            print(count)
            for i in range(count):
                print(i)
                try:
                    fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
                    lenth = 4000
                    print('you')
                except:
                    fund_code = ','.join(fund_list[4000*i :])
                    lenth = len(fund_list[4000*i :])
                    print('fuck')
                a = w.wsd(fund_code, "nav", l[1], l[1])
                print(a)
                nav = a.Data[0]
                df_sel['nav_'+ l[1]].iloc[4000*i : 4000*i + lenth] = nav
                
                a = w.wsd(fund_code, "nav", l[2], l[2])
                nav = a.Data[0]
                df_sel['nav_'+ l[2]].iloc[4000*i : 4000*i + lenth] = nav
                
            d1 = datetime.strptime(l[1], '%Y-%m-%d')
            d2 = datetime.strptime(l[2], '%Y-%m-%d')
            diff = str(d2-d1).split(' ')[0]
            df_sel[diff +'日收益率_'+ l[1] +'_'+ l[2]] = (df_sel['nav_'+ l[2]] - df_sel['nav_'+ l[1]])/int(diff)
            if flag == True:
                if l[-1] == '0':
                    print('pass')
                if l[-1] == '1':
                    df_sel = df_sel.sort_values(by = [diff +'日收益率_'+ l[1] +'_'+ l[2]], ascending=False)
                    df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
            df2 = pd.concat([df2, df_sel])
        df = df2
    def turn_cal(self, l, flag = False):
        global df
        l_sel = list(set(df['类别'].tolist()))
        print(l_sel,l)
        df2 = pd.DataFrame(columns = df.columns.tolist()) 
        for i in l_sel:
            df_sel = df.loc[df['类别']==i]
            fund_list = list(set(df_sel['基金代码'].tolist()))
            print(i,len(fund_list))
            dict_turn = {'1': '上半年', '2': '下半年', '3': '全年'}
            df_sel['turn_'+ l[1] +'年'+dict_turn[l[2]]] = None
            count = int(len(fund_list)/4000) + 1
            for i in range(count):
                try:
                    fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
                    lenth = 4000
                except:
                    fund_code = ','.join(fund_list[4000*i :])
                    lenth = len(fund_list[4000*i :])
                a = w.wsd(fund_code, "style_rpt_turn",
                             "2020-07-27", "2020-07-27", 'year='+ l[1] +'; Intervaltype='+ l[2])
                print(a)
                turn = a.Data[0]
                print(len(turn))
                df_sel['turn_'+ l[1] +'年'+dict_turn[l[2]]].iloc[4000*i : 4000*i + lenth] = turn
            if flag == True:
                if l[-1] == '0':
                    print('pass')
                if l[-1] == '1':
                    df_sel = df_sel.sort_values(by = ['turn_'+ l[1] +'年'+dict_turn[l[2]]], ascending=False)
                    df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
            df2 = pd.concat([df2, df_sel])
            print(df_sel)
        df = df2
        print(df)
    def dd_cal(self, l, flag = False):
        global df
        l_sel = list(set(df['类别'].tolist()))
        print(l_sel)
        df2 = pd.DataFrame(columns = df.columns.tolist()) 
        for i in l_sel:
            df_sel = df.loc[df['类别']==i]
            fund_list = list(set(df_sel['基金代码'].tolist()))
            print(i,len(fund_list))
            df_sel['dd'+'_'+ l[1] +'_'+ l[2]] = None
            count = int(len(fund_list)/4000) + 1
            for i in range(count):
                try:
                    fund_code = ','.join(fund_list[4000*i : 4000*(i + 1)])
                    lenth = 4000
                except:
                    fund_code = ','.join(fund_list[4000*i :])
                    lenth = len(fund_list[4000*i :])
                a = w.wsd(fund_code, "risk_maxdownside", l[1], l[2])
                dd_raw = a.Data
                dd = []
                for j in dd_raw:
                    dd.append(j[0])
                print(len(df_sel), len(dd))
                df_sel['dd'+'_'+ l[1] +'_'+ l[2]].iloc[4000*i : 4000*i + lenth] = dd
            if flag == True:
                if l[-1] == '0':
                    print('pass')
                if l[-1] == '1':
                    df_sel = df_sel.sort_values(by = ['dd'+'_'+ l[1] +'_'+ l[2]], ascending=False)
                    df_sel = df_sel.iloc[:int(len(df_sel)/100 + 1)]
            df2 = pd.concat([df2, df_sel])
            print(df_sel)
        df = df2
        print(df)
    def dt_cal(self, l, flag = False):
        global df            
        fund_list = list(set(df['基金代码'].tolist()))
        dict_date = {'1': '0331',
                     '2': '0630',
                     '3': '0930',
                     '4': '1231'}
        date = l[1] + dict_date[l[2]]
        d = dt()
        data = d.add(fund_list, date)
        for i in data.keys():
            df[date +'_'+ i] = data[i]
    
    def to_csv(self):
        global df
        path = dl_new_0.path_text
        df.to_csv(path, header=True, index=True, encoding = "gb2312")
        print('done')
        
    def feature_clear(self):
        global list_feature
        self.l_feature1.setObjectName('')
        self.l_feature1.setText('')
        
        list_feature = []
        print(list_feature)
        self.tree4.clear()
        
if __name__ == "__main__":
    import sys
    import dl_new_0
    app = QApplication(sys.argv)
    w2 = window2()
    dl1 = dl_new_0.dialog_1()
    dl2 = dl_new_0.dialog_2()
    dl3 = dl_new_0.dialog_3()
    w2.show()
    w2.btn_dl.clicked.connect(dl1.show)
    w2.btn_feature2.clicked.connect(dl2.show)
    w2.btn_feature3.clicked.connect(dl3.show)
    dl1.btn2.clicked.connect(w2.dl_add)
    dl2.btn.clicked.connect(w2.save_fund)
    dl3.btn.clicked.connect(w2.to_csv)
    sys.exit(app.exec())
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值