상세 컨텐츠

본문 제목

지저분한 코드로 대충 완성..

프로그래밍

by 독서와 여행 2020. 6. 13. 22:18

본문

상당히 지저분한 코드인데 그래도 대충 완성 했다.... 원하는 기능은 넣었고 문제는 자산관리인데 어떻게 해야할까?

안전자산과 투자자산에 대한 개념을 정확히 좀 해야지

import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
from stock_content import Financial_Statements
import webbrowser
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from PyQt5.QtGui import QTextCursor
from PyQt5 import QtCore
from pandas.io.json import json_normalize
import pandas as pd
from urllib.request import urlopen,Request
from bs4 import BeautifulSoup
import requests
import json
import os
#C:\Users\Hello world\AppData\Local\Programs\Python\Python37\Lib\site-packages\QtDesigner

# show하는 부분 해야함
form_class = uic.loadUiType(r'untitled.ui')[0]
class financail_show_window(QDialog):
    def __init__(self, parent):
        super(financail_show_window, self).__init__(parent)
        uic.loadUi(r"financial_show.ui", self)
        self.show()
        self.parent = parent

        data = parent.get_request()
        self.plainTextEdit.setPlainText(str(data))
class stock_memo(QDialog):    #문제 열기하면 바로 데이터 떠야하는데 지금 코드는 바로 데이터 뜨는게 아니라 불러오기 해야 데이터가 뜸
    def __init__(self,parent):
        super(stock_memo, self).__init__(parent)
        uic.loadUi(r"stock_memo.ui", self)
        self.show()
        self.parent = parent
        self.pushButton_open.clicked.connect(self.openFunction)
        self.pushButton_save.clicked.connect(self.saveFunction)
        self.opened = False
        self.file_path = ''
    
    def save_changed_data(self):
        msgBox = QMessageBox()
        msgBox.setText("변경 내용을 {}에 저장하시겠습니까?".format(self.file_path))
        msgBox.addButton('저장', QMessageBox.YesRole) #0
        msgBox.addButton('저장 안 함', QMessageBox.NoRole) #1
        msgBox.addButton('취소', QMessageBox.RejectRole) #2
        ret = msgBox.exec_()
        
        if ret == 0:
            self.saveFunction()
        else:
            return ret

    def closeEvent(self, event):
        # if self.ischanged(): # 열린적이 있고 변경사항이 있으면 열린적은 없는데 에디터 내용이 있으면
        ret = self.save_changed_data()
        
        if ret == 2:
            event.ignore()

    
    def save_file(self, fname):
        data = self.plainTextEdit.toPlainText()
        with open(fname[0], 'w', encoding='UTF8') as f:
                f.write(data)
        self.opened = True
        self.file_path = fname

    def open_file(self, fname):
        with open(fname[0], encoding='UTF8') as f:
            data = f.read()
        self.plainTextEdit.setPlainText(data)
        self.opened = True
        self.file_path = fname
    def openFunction(self):
        fname = QFileDialog.getOpenFileName(self)
        if fname[0]:
            self.open_file(fname)
        
    def saveFunction(self):
        if self.opened:
            self.save_file(self.file_path)
        else:
            self.save_as_function()

    def save_as_function(self):
        fname = QFileDialog.getSaveFileName(self)
        if fname[0]:
            self.open_file(fname)


class WindowClass(QMainWindow, form_class):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

     
        self.API_KEY = "입력하세요"
        self.company_code = '0000'
        self.year = None
        self.report_sort = None
        self.data = None
        self.input = False
        self.save = False # 적정주가를 확인해야 self.stock값이 생겨서 있어야함
        self.stock_price_ = None
        self.per = 0
        self.roe = 0
        self.pushButton_find_company_code.clicked.connect(self.search_company_code)
        self.pushButton_input.clicked.connect(self.get_information)
        self.pushButton_download.clicked.connect(self.download_linked_financial_statement_to_cvs)
       
       
        self.pushButton_naver_finance.clicked.connect(self.naver_finance)
        self.pushButton_check_stock_price.clicked.connect(self.show_price)
        self.pushButton_show_financal_data.clicked.connect(self.show_financial_data)
        self.pushButton_check_roe.clicked.connect(self.show_roe)
        self.pushButton_help.clicked.connect(self.help)
        #self.pushButton_save_stock_price.clicked.connect(self.save_price) #class에 데이터 넘겨줄 생각 해야함 how?
        self.pushButton_open_memo.clicked.connect(self.open_memo)
        self.pushButton_save_stock_price.clicked.connect(self.save_stock)
    
    def open_memo(self):
        stock_memo(self)




    
    def save_stock(self):
        fname = QFileDialog.getSaveFileName(self)
       
        if fname[0]:
            data = 'ROE: %0.2f \n원하는 수익률 %s% 일때, 적정가격: %0.2f\n기업코드: %s\n주식수 : %s' %(self.roe,self.lineEdit_roe.text(),self.stock_price_,self.company_code,self.lineEdit_stock_num.text())
            with open(fname[0], 'w', encoding='UTF8') as f:
                f.write(data)

    
    def help(self):
        msgBox = QMessageBox()
        msgBox.setText("사업보고서 코드는 11011입니다. \n분기 보고서 코드는 11013 11012 11014로 1분기 2분기 3분기 순서입니다.\n\
적정주가는 재무제표를 기반으로 간단한 공식을 이용한 것 입니다. \n 다른 변수는 참고하지 않은 것이니 주의하세요 \n\
다른 문의 사항은 whiteleo96@gmail.com으로 보내주세요")

        
        msgBox = msgBox.exec_() 

    def show_financial_data(self):
        financail_show_window(self)

 
    
    def keyReleaseEvent(self, event):
        if self.lineEdit_companycode.text() and self.lineEdit_year.text() and self.lineEdit_reportnum.text():
            self.pushButton_input.setEnabled(True)
        else:
            self.pushButton_input.setEnabled(False)
        if self.lineEdit_companyname.text():
            self.pushButton_find_company_code.setEnabled(True)
        else:
            self.pushButton_find_company_code.setEnabled(False)
        if self.input:
            self.pushButton_download.setEnabled(True)
            self.pushButton_show_financal_data.setEnabled(True)
            self.pushButton_check_roe.setEnabled(True)
        else:
            self.pushButton_download.setEnabled(False)
            self.pushButton_show_financal_data.setEnabled(False)
            self.pushButton_check_roe.setEnabled(False)
        if self.lineEdit_roe.text() and self.lineEdit_stock_num.text() and self.input:
            self.pushButton_check_stock_price.setEnabled(True)
            
        else:
            self.pushButton_check_stock_price.setEnabled(False)
           
        if self.save:
            self.pushButton_save_stock_price.setEnabled(True)
        else:
            self.pushButton_save_stock_price.setEnabled(False)
        




    def show_price(self):
        data = self.data
        linked_data = data[data['fs_nm'] == '연결재무제표'].set_index('fs_nm') #일단 인덱스를 0123에서 없애버림, 필요하면 바꾸자 정규식 이용하면 인덱스 있어도 사용가능임

        during_year_capital = linked_data[linked_data['account_nm'] == '자본총계']['thstrm_amount']

        during_year_capital =  float(re.sub('[^0-9]', '',str(during_year_capital)))#해당년도 자본

        during_year_debt = linked_data[linked_data['account_nm'] == '부채총계']['thstrm_amount']
        during_year_debt =  float(re.sub('[^0-9]', '',str(during_year_debt)))

        during_year_protit = linked_data[linked_data['account_nm'] == '당기순이익']['thstrm_amount']
        during_year_protit = float(re.sub('[^0-9]', '',str(during_year_protit)))
        

        during_year_roe = during_year_protit / during_year_capital * 100 #해당년도 roe 


    
        stock_num =  float(re.sub('[^0-9]', '',str(self.lineEdit_stock_num.text())))
        wanting_revenue = float(self.lineEdit_roe.text())

        stock_price = (during_year_capital + (during_year_capital * (during_year_roe - wanting_revenue)/wanting_revenue)) / stock_num 
        msgBox = QMessageBox()
        self.save = True
        self.input = True
        self.stock_price_  = stock_price
        self.roe = during_year_roe
        msgBox.setText("적정주가는 %.2f 원입니다."%(stock_price))
       

        msgBox = msgBox.exec_() 



    def show_roe(self):
        data = self.data
        linked_data = data[data['fs_nm'] == '연결재무제표'].set_index('fs_nm') #일단 인덱스를 0123에서 없애버림, 필요하면 바꾸자 정규식 이용하면 인덱스 있어도 사용가능임

        during_year_capital = linked_data[linked_data['account_nm'] == '자본총계']['thstrm_amount']

        during_year_capital =  float(re.sub('[^0-9]', '',str(during_year_capital)))#해당년도 자본

        during_year_debt = linked_data[linked_data['account_nm'] == '부채총계']['thstrm_amount']
        during_year_debt =  float(re.sub('[^0-9]', '',str(during_year_debt)))

        during_year_protit = linked_data[linked_data['account_nm'] == '당기순이익']['thstrm_amount']
        during_year_protit = float(re.sub('[^0-9]', '',str(during_year_protit)))

        during_year_roe = during_year_protit / during_year_capital * 100 #해당년도 roe
        self.roe = during_year_roe

        msgBox = QMessageBox()
        msgBox.setText("ROE는 %0.2f입니다." %during_year_roe,)

        msgBox = msgBox.exec_() 




    def download_linked_financial_statement_to_cvs(self):  
        
        data = self.data

        fname = os.getcwd()
        linked_data = data[data['fs_nm'] == '연결재무제표']
        linked_data.to_csv(str(self.company_code)+'.csv',encoding = 'utf-8')
        msgBox = QMessageBox()
        msgBox.setText(fname+"\n 위 경로에 다운 되었습니다.")
        msgBox = msgBox.exec_() 
        
  



    
    def get_information(self): #재무제표 가저오는 함수 
        try:
            self.company_code = re.sub('[^0-9]', '',str(self.lineEdit_companycode.text()))

            self.year = re.sub('[^0-9]', '',str(self.lineEdit_year.text()))
            self.report_sort =  re.sub('[^0-9]', '',str(self.lineEdit_reportnum.text()))
        
            self.data = self.get_request()
           
        
            self.input = True
            msgBox = QMessageBox()
            msgBox.setText("정상적으로 입력되었습니다.")
            msgBox = msgBox.exec_() 
        except KeyError:
            self.input = False
            self.save = False
            msgBox = QMessageBox()
            msgBox.setText("올바른 정보를 입력하세요.")
            msgBox = msgBox.exec_() 
       


    def naver_finance(self):
        url = "https://finance.naver.com/"
        webbrowser.open(url)

    def get_request(self):
        request= Request('https://opendart.fss.or.kr/api/fnlttSinglAcnt.json?crtfc_key='+self.API_KEY+'&corp_code='+self.company_code+'&bsns_year='+self.year+'&reprt_code='+self.report_sort)
        
        response = urlopen(request)
        elevations = response.read()
        data = json.loads(elevations)
        data = json_normalize(data['list']) ##--- json to dataframe
        data = data.loc[:,['fs_nm','sj_nm','account_nm','thstrm_dt','thstrm_nm','thstrm_amount','frmtrm_nm','frmtrm_amount','bfefrmtrm_nm','bfefrmtrm_amount']] 
       
        return data

    def search_company_code(self):
        company_name = self.lineEdit_companyname.text()
           
        
        options = webdriver.ChromeOptions()
   
        driver = webdriver.Chrome(r'C:\Users\Hello world\Desktop\python\chromedriver.exe',chrome_options=options)

        driver.get('https://dart.fss.or.kr/dsae001/main.do')


        driver.find_element_by_name('textCrpNm').send_keys(company_name)

        options = webdriver.ChromeOptions()
        driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[2]/div[2]/div[1]/form/fieldset/p[5]/input').click()
       
        msgBox = QMessageBox()
        msgBox.setText("종목을 클릭 하시고 rss를 눌러서 기업 코드를 복사하세요 \n 기업코드는 마지막 숫자 8자리 입니다.")
        msgBox.exec_() 
        msgBox.done(3)
       
    

app = QApplication(sys.argv)
mainwindow = WindowClass()
mainwindow.show()
app.exec_() 

관련글 더보기

댓글 영역