목록Software (66)
YOGYUI
pandas 데이터프레임(DataFrame) 객체의 열(column)의 데이터형을 가져오는 방법을 알아보자 (get data type of columns in dataframe) 예시를 위해 int, float, str, bool, datetime 데이터를 가진 데이터프레임을 만들어준다 from datetime import datetime import pandas as pd array = list() array.append({'A': 1, 'B': 1.0, 'C': '1', 'D': True, 'E': datetime(2021, 9, 1)}) array.append({'A': 2, 'B': 1.1, 'C': '2', 'D': False, 'E': datetime(2021, 9, 2)}) array.app..
4. DART 공시 관련 속성 추가 신규상장 관련 기업의 정보를 가장 정확하게 파악할 수 있는 것은 금융감독원의 전자공시시스템(DART : Data Analysis, Retrieval and Transfer System)이다 2020년 4월부터 Open API 형식으로 누구든지 DART 홈페이지에 접속하지 않고서도 쉽게 접근할 수 있게 OpenDART를 서비스하고 있으므로 이를 활용해서 전에 만들어둔 IPO2021 테이블에 DART 관련 속성(칼럼)을 추가해보도록 하자 ※ OpenDART는 회원 가입 후 API Key를 발급받아야 한다. OpenDART 활용법에 대한 개요는 링크 참고 4.1. 기업 DART 고유번호 테이블 추가 상장기업의 유가증권 시장에서의 증권코드(ex: 삼성전자 = 005930)와는..
Mac OS에서 PyQt5로 윈도우를 만들어서 메뉴바를 추가하면 default로 상단 작업표시줄에 메뉴바가 표시된다 (테스트 당시 OSX 버전은 11.5.2, PyQt5 버전은 5.15.4) [테스트 코드] if __name__ == '__main__': import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * app = QCoreApplication.instance() if app is None: app = QApplication(sys.argv) window = QMainWindow() menubar = QMenuBar(window) window.setMenuBar(menubar) menu1..
작년 SK바이오팜을 시작으로 미래에셋증권에서 진행하는 공모주 청약에 대부분 참여하고 있다 상반기에는 거의 대부분 익절할 수 있었는데 하반기 종목들은 시퍼렇게 질린채 회복하지를 못하고 있다 ㅠ 분석기사나 유튜브를 보면 청약경쟁률, 기관의무보유확약비율 등 몇몇 지표에 따라 희비가 엇갈렸다고 하는데, 다른 사람이 분석한 것만 쳐다보면 재미가 없으니깐 직접 DB를 구축하고 레코드를 입력해서 직접 분석(R이나 Python을 써서)을 해보려 한다 우선 DB부터 구축해보자 DBMS는 개인 NAS(ipTime 제품)에 탑재해 둔 MySQL을 활용하기로 했다 (요즘은 시놀로지 NAS에 설치해둔 몽고DB를 주로 사용하는지라 SQL은 진짜 오랜만이라 차근차근 정리할 겸 ㅎㅎ) 대부분 작업은 커맨드 라인 툴 (MariaDB ..
(Latex 연습용 포스트) 수치형 데이터 \(N\)개의 평균(average)을 구하는 공식은 다음과 같다 \(avg_{N}={\sum_{i=1}^{N}{a_{i}} \over N}\) 이 때, 위 수식은 다음과 같이 분해할 수 있다 \(\begin{align*} avg_{N}&={a_{1}+a_{2}+a_{3}+ \cdots +a_{N-2}+a_{N-1}+a_{N} \over N} \\&= {a_{1}+a_{2}+\cdots +a_{N-2}+a_{N-1}\over N}+{a_{N} \over N} \\&= {a_{1}+a_{2}+\cdots +a_{N-2}+a_{N-1} \over N-1} \times {N -1 \over N} + {a_{N} \over N} \\&= avg_{N-1} \times {..
일전에 PyQt를 사용해서 내가 직접 만든 웹브라우저(링크)로 내 블로그를 방문하는 테스트를 진행했는데, 네이버 애널리틱스의 '사용자 웹브라우저' 분석에 'Chrome 83' 항목이 새로 생긴 것을 볼 수 있었다 QtWebEngine의 Chromium 버전은 다음과 같다고 한다 내 개발환경이 Qt 5.15.2니깐 Chromium 83이 코어로 사용되었다는 것을 알게 되었다 ㅎㅎ 일일이 Qt 버전을 확인하지 않고 브라우저 버전 정보를 가져올 수 있는 방법을 찾다가, 자바스크립트로 'navigator.userAgent'를 호출하면 된다는 것을 확인했다 https://www.w3schools.com/jsref/prop_nav_useragent.asp Navigator userAgent Property Navi..
4. 네비게이션 툴바 만들기 북마크바를 만들려고 하다보니, 탭 안의 위젯이 url 에디트 등의 컨트롤들을 각각 모두 가지고 있는 것이 불합리해보여서 별도로 네비게이션 툴바를 만들었다 (QToolBar 상속) [NavigationWidget.py] from PyQt5.QtCore import pyqtSignal, QSize from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QToolBar, QToolButton, QLineEdit class NavigationToolBar(QToolBar): _is_loading: bool = False sig_navigate_url = pyqtSignal(str) sig_go_backward = pyqtSignal()..
3. 윈도우 만들기 앞서 구현한 WebPageWidget 여러개를 하나의 윈도우가 관리할 수 있도록 QTabWidget을 사용해서 윈도우를 만들어보자 [WebBrowserWindow.py] from functools import partial from PyQt5.QtCore import QSize from PyQt5.QtGui import QIcon, QCloseEvent from PyQt5.QtWidgets import QMainWindow, QTabWidget, QTabBar, QPushButton from WebPageWidget import WebPageWidget class WebBrowserWindow(QMainWindow): def __init__(self, parent=None): supe..
웹크롤링 관련해서 작업을 할 때 간혹 브라우저를 열어서 웹페이지에 직접 접근해야 하는 경우가 있는데, 크롬을 쓰다보니 원하는 동작들을 구현하기 힘든 경우가 간혹 있어서 간단한 수준의 웹브라우저를 직접 구현해보기로 했다 (만들다보니 재미들려서 조금씩 기능을 추가해나가는 중 ㅎㅎ) 개발일지 남길 겸 블로그에 포스팅해보도록 한다 (Github 저장소도 만들고...) 1. Package Install PyQt가 워낙에 익숙하다보니 웹브라우저도 PyQt로 만들어보기로 했다 필요한 패키지인 'PyQtWebEngine'은 최신 PyQt5 패키지에는 포함이 되어 있지 않아서 따로 pip으로 설치해줘야 한다 (https://pypi.org/project/PyQtWebEngine/) pip install PyQtWebEn..
Python으로 문자열(str)을 다룰 때 format을 자주 활용하게 된다 print("Hello World! {}".format('yogyui')) print("Hello World! {:d}".format(1234)) print("Hello World! 0x{:X}".format(255)) temp = "Hello World! {}" print(temp) print(temp.format('test')) print("{0} {1}!".format('Hello', 'World')) 출력 Hello World! yogyui Hello World! 1234 Hello World! 0xFF Hello World! {} Hello World! test Hello World! Problem format을 활용할..
Python 내장함수인 hex는 정수값을 16진수로 표현된 문자열(str)을 반환해준다 help(hex) >> Help on built-in function hex in module builtins: hex(number, /) Return the hexadecimal representation of an integer. hex(12648430) '0xc0ffee' In [1]: hex(25) Out[1]: '0x19' In [2]: hex(1234) Out[2]: '0x4d2' 그런데, 함수의 인자로 음의 정수 (negative integer)를 입력하면 다른 프로그래밍 언어에서와는 다른 결과가 출력된다 In [3]: hex(-1) Out[3]: '-0x1' In [4]: hex(-128) Out[4]:..
Python 코딩할 때 자주 활용하는 자료구조 중 하나인 list의 요소들을 뒤집는 방법을 알아보자 (은근히 쓸데가 많다) 참고: 모든 코드는 python 3.x에서 작성되었다 1. 리스트 객체 자체를 뒤집기 list 객체의 reverse 메서드를 사용하면 된다 예를 위해 리스트 객체를 하나 생성한다 a = [1, 2, 3, 4, 5] In [1]: print(a) Out[1]: [1, 2, 3, 4, 5] 이제 뒤집어보자 a.reverse() In [2]: print(a) Out[2]: [5, 4, 3, 2, 1] 간단하게 요소를 뒤집을 수 있다 그런데 리스트 객체 자체가 바뀌는 것이기 때문에, 원본 리스트를 그대로 남겨두고자 하는 경우에는 적절한 구현 방식이 아니다 (나도 이 방식은 거의 쓰지 않는다..
Visual Studio Code를 사용하다보면 간혹 다음과 같은 오류창이 뜨는 경우가 있다 액세스 거부는 역시 폴더 접근 권한 문제다 해결책 VS Code가 설치된 경로에 대한 접근 권한을 바꿔주면 해결된다 탐색기에서 설치 경로 (위 메시지에서는 C:\Program Files\Microsoft VS Code)를 우클릭해서 속성창을 연 뒤 '보안' 탭을 연 뒤 사용 권한 '편집' 버튼을 클릭 '그룹 또는 사용자 이름' 리스트에서 Users (로그인아이디\Users) 선택 후 사용 권한 리스트에서 '모든 권한' 허용 체크박스 클릭 후 적용 오류창에서 재시도 버튼을 클릭 오류창이 다시 뜨지 않는다면 해결된 것이다 혹은, VS Code를 Program Files 내에 설치하지 않는 것도 하나의 방법이다 (C:..
윈도 OS를 사용하다보면 (특히 개발자들은) 환경 변수를 설정해야하는 경우가 있다 제어판 - 시스템 - 고급 탭의 '환경 변수' GUI로 해결하는게 일반적이다 예시를 위해 'TEST' 변수를 한 개 만든 뒤에 Python으로 수정하는 방법을 알아보자 (이 글에서는 사용자 변수가 아니라 시스템 변수를 대상으로 한다) 임의로 C:\test1, C:\test2, C:\test3 3개의 경로를 값으로 입력했다 (실제 존재하지 않는 경로여도 상관없다) 여러 개의 경로를 입력할 경우 세미콜론(;) 구분자로 입력해줘야 한다 1. OS module Python 구동 시 환경변수를 동적으로 변경하고자 할 경우 built-in 모듈인 os의 environ (_Environ) 클래스를 사용하는게 일반적인 방법이다 'TEST..
PyQt5의 pyqtSignal 혹은 pyqtBoundSignal을 함수와 연결(connect)시, 여러 객체를 for문 안에서 lambda를 사용하여 연결할 경우 정상적으로 동작하지 않는 문제가 있다 다음 예시를 통해 문제를 확인해보자 if __name__ == '__main__': import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * app = QCoreApplication.instance() if app is None: app = QApplication(sys.argv) btns = [ QPushButton('BUTTON1'), QPushButton('BUTTON2'), QPushBut..