반응형

최신 오라클  라이브러리가 cx_Oracle에서 oracledb 변경되었다.

 

Insert

# Plan MH 일괄 추출
from datetime import datetime

import oracledb
import os


os.putenv('NLS_LANG', '.UTF8')
now = datetime.today()

# DB연결
conn = oracledb.connect(user='myuser', password='1234', dsn='abcd.abcde.com:1526/abcd')
cursor = conn.cursor() #지시자 생성

query_str = "insert into SOME_TABLE values (:1,:2,:3,:4,:5,:6,:7,:8)"
data = ('20240125','AAAA','BBBB','1400350','CCCC','2',now,'DDDD')
cursor.execute(query_str,data)
conn.commit()

conn.close()
반응형
반응형
import turtle

turtle.title('거북이')
turtle.color('black', 'red')
turtle.shape('turtle')
turtle.penup();
turtle.write("빠른 거북이!!")
turtle.forward(80)
turtle.pendown();
turtle.backward(100)
turtle.exitonclick()

 

 

수행해보니 이번엔 속도가 너무 빠르네요. 속도값은 다음과 같습니다.

 

0: 가장 빠른

1: 가장 느린

3: 느린

6: 보통 (기본값)

10: 빠른

 

지금 기본값이 보통 이라고? 너무 빠른데요. 1로 변경해보겠습니다.

import turtle

turtle.title('거북이')
turtle.color('black', 'red')
turtle.shape('turtle')
turtle.penup();
turtle.write("빠른 거북이!!")

turtle.speed(1) #코드 추가

turtle.forward(80)
turtle.pendown();
turtle.backward(100)
turtle.exitonclick()

 

숫자값이 기억하기 어렵다면 문자로 전달해도 됩니다.

 'fastest', 'fast', 'normal', 'slow', 'slowest'

 

 

반응형
반응형

Tkinter에서 다른 위젯의 배치를 위한 Frame을 사용할 수 있습니다. 아래는 Frame 예제입니다.

import tkinter as tk

root = tk.Tk()
root.title("GUI Frame")
root.geometry("640x480+100+100")
root.resizable(True,True)

frame1 = tk.Frame(root, relief="solid", bd=1, highlightcolor="red")
frame1.pack(side="top", fill="both", expand=True)

frame2 = tk.Frame(root, relief="solid", bd=2, bg="blue")
frame2.pack(side="bottom", fill="both", expand=True)

root.mainloop()

 

 

Frame Parameter

Param 의미 기본값 속성
width 프레임의 너비 0 상수
height 프레임의 높이 0 상수
relief 테두리 모양 flat flat, groove, raised, ridge, solid, sunken
bg 배경색 SystemButtonFace color
bd 테두리 두께 0 상수
padx 내부 x방향 패딩 1 상수
pady 내부 y방향 패딩 1 상수
highlightcolor 프레임이 선택될 때 색상 SystemWindowFrame color

 

반응형
반응형

Tkinter에서 위젯을 화면에 배치하는 방법에는 pack / grid / place의 세가지 방식이 있습니다. grid는 엑셀과 같은 이미지를 떠올리면 될 것 같습니다. 행과 열을 기준으로 위치시키는 방식이고, pack은 상/하/좌/우(동/서/남/북)으로 위치시키는 방식, 그리고 place는 절대좌표계를 이용해서 위치시키는 방식입니다.

 

1. Grid방식

import tkinter as tk

root = tk.Tk()
root.title("GUI Grid위젯배치")
root.geometry("640x480+100+100")
root.resizable(True,True)

bb1 = tk.Button(root, text="(0,0)")
bb1.grid(row=0,column=0)
bb2 = tk.Button(root, text="(0,1)")
bb2.grid(row=0,column=1)
bb3 = tk.Button(root, text="(0,2)")
bb3.grid(row=0,column=2)
bb4 = tk.Button(root, text="(1,0)")
bb4.grid(row=1, columnspan=3, sticky="ew")

root.mainloop()

 

Grid 속성

- 먼저 선언한 Grid부터 배치된다.

- 셀 단위로 배치되며, 한번에 여러 셀을 건너뛰어 배치할 수 없다.

- pack()과 같이 사용할 수 없으며, place()와는 같이 사용할 수 있다.

 

Grid Parameter

Param 의미 기본값 속성
row 행 위치 0  
column 열 위치 0  
rowspan 행 합치기 1  
columnspan 열 합치기 1  
sticky 할당된 공간 내에서 위치 조정. 어디에 고정할 것인가? - n(north), e(east), s(south), w(west)
news와 같이 전방향 고정으로 조합하여 사용 가능
ipadx x방향 내부 패딩 0  
ipady y방향 내부 패딩 0  
padx x방향 외부 패딩 0  
pady y방향 외부 패딩 0  

 

2. Pack방식

Pack은 상하좌우(동서남북) 에 위젯들을 위치시키는 방식입니다.

import tkinter as tk

root = tk.Tk()
root.title("GUI pack 위젯배치")
root.geometry("640x480+100+100")
root.resizable(True,True)

bb1 = tk.Button(root, text="left", width=10)
bb1.pack(side="left", fill="y")
bb2 = tk.Button(root, text="top", width=10)
bb2.pack(side="top")
bb3 = tk.Button(root, text="(right)", width=10)
bb3.pack(side="right")
bb4 = tk.Button(root, text="(bottom)", width=10)
bb4.pack(side="bottom", anchor="n")

root.mainloop()

 

Pack 속성

- 먼저 선언한 pack부터 배치된다.

- pack의 파라미터로 위젯의 크기를 변경할 수 있다.

- grid()와 같이 사용할 수 없으며 place()와는 같이 사용할 수 있다.

 

Pack Parameter

Param 의미 기본값 속성
side 위치(공간)할당 top top, bottom, left, right
anchor 고정 기준 center center, n(north), e(east), s(south), w(west)
news와 같이 전방향 고정으로 조합하여 사용 가능
fill 할당된 공간에 대한 크기 맞춤 none none, x, y, both
expand 미사용 공간 확보 False Boolean
ipadx x방향 내부 패딩 0  
ipady y방향 내부 패딩 0  
padx x방향 외부 패딩 0  
pady y방향 외부 패딩 0  

 

3. place방식

import tkinter as tk

root = tk.Tk()
root.title("GUI Grid위젯배치")
root.geometry("640x480+100+100")
root.resizable(True,True)

bb1 = tk.Button(root, text="(30,30)")
bb1.place(x=30, y=30)
bb2 = tk.Button(root, text="(100,30)")
bb2.place(x=100, y=30)
bb3 = tk.Button(root, text="(30,80)")
bb3.place(x=30, y=80)
bb4 = tk.Button(root, text="(100,80)")
bb4.place(x=100, y=80)

root.mainloop()

 

Place 속성

- 먼저 선언한 요소부터 배치된다.

- place의 절대 위치로 배치되며, 크기를 조정할 수 있다.

- pack(), grid()와 같이 사용할 수 있다.

 

place Parameter

Param 의미 기본값 속성
x x 좌표 0 상수
y y 좌표 0 상수
relx x좌표 배치 비율 0 0~1
rely y좌표 배치 비율 0 0~1
width 위젯 폭 0 상수
height 위젯 높이 0 상수
relwidth 위젯의 상대 너비 0 0~1
relheight 위젯의 상대 높이 0 0~1
anchor 고정 기준 nw n(north), e(east), s(south), w(west)
news와 같이 전방향 고정으로 조합하여 사용 가능

 

 

오늘은 헷갈리지 않도록 grid / pack / place의 속성에 대해 정리하는 시간을 가져봤습니다. 

반응형
반응형

예전에 테스트삼아 해봤는데, 오랫만에 하니까 잘 모르는 것도 있고, 좀 바뀐 부분도 있어서 정리도 할겸 올립니다. 아래와 같은 tkinter 화면을 만들겁니다.

 

1. main.py

우선 main.py에서는 구동만 시켜주고, 화면을 구성하는 파일은 gui.py로 별도 모듈로 만들 예정입니다.

import gui

if __name__ == '__main__':
    gui.main_screen()

 

2. gui.py

import tkinter as tk


def main_screen():
    root = tk.Tk()
    root.title("GUI Sample")
    root.geometry("640x480+100+100")
    root.resizable(True,True)
    root.configure(background='white')  # 배경을 흰색으로 하고,
    # root.wm_attributes("-transparentcolor", 'white') # 흰색을 투명으로 하면 투명한 앱이 됩니다.

    #레이블
    label_1=tk.Label(root, text="위젯 테스트", width=20,height=3,fg="red",relief="solid")
    label_1.pack()
    label_2=tk.Label(root, text="위젯 테스트2", width=20, height=3, fg="blue", relief="groove")
    label_2.pack()

    #리스트박스
    listbox = tk.Listbox(root, selectmode='extended', height=0)
    listbox.insert(0, "no1")
    listbox.insert(1, "no2")
    listbox.insert(2, "no3")
    listbox.insert(3, "no4")
    listbox.insert(4, "no5")
    listbox.pack()

    #체크박스
    checkVal1 = tk.IntVar()
    checkVal2 = tk.IntVar()
    checkBtn1 = tk.Checkbutton(root, text="체크박스 고르기1", variable=checkVal1, activebackground="blue")
    checkBtn2 = tk.Checkbutton(root, text="체크박스 고르기2", variable=checkVal2, activebackground="blue")
    checkBtn1.pack()
    checkBtn2.pack()

    #라디오버튼
    radioVal1=tk.IntVar()
    radioBtn1 = tk.Radiobutton(root, text="1번", value=3, variable=radioVal1)
    radioBtn2 = tk.Radiobutton(root, text="2번", value=6, variable=radioVal1)
    radioBtn3 = tk.Radiobutton(root, text="3번", value=9, variable=radioVal1)
    radioBtn1.pack()
    radioBtn2.pack()
    radioBtn3.pack()

    #상단메뉴
    def close():
        root.quit()
        root.destroy()

    menubar = tk.Menu(root)

    menu_1 = tk.Menu(menubar, tearoff=0)
    menu_1.add_command(label="Sub Menu1-1")
    menu_1.add_command(label="Sub Menu1-2")
    menu_1.add_separator()
    menu_1.add_command(label="종료", command=close)
    menubar.add_cascade(label="Menu1", menu=menu_1)

    menu_2 = tk.Menu(menubar, tearoff=0, selectcolor="red")
    menu_2.add_radiobutton(label="Sub Menu2-1", state="disable")
    menu_2.add_radiobutton(label="Sub Menu2-2")
    menu_2.add_radiobutton(label="Sub Menu2-3")
    menubar.add_cascade(label="Menu2", menu=menu_2)

    menu_3 = tk.Menu(menubar, tearoff=0)
    menu_3.add_checkbutton(label="Sub Menu3-1")
    menu_3.add_checkbutton(label="Sub Menu3-2")
    menu_3.add_checkbutton(label="Sub Menu3-3")
    menubar.add_cascade(label="Menu3", menu=menu_3)

    root.config(menu=menubar)

    # 메뉴 버튼 (상단 메뉴바랑 상관 없음)
    menubutton = tk.Menubutton(root, text="Menu Button", relief="raised", direction="right")
    menubutton.pack()

    menu = tk.Menu(menubutton, tearoff=0)
    menu.add_command(label="Sub-1")
    menu.add_separator()
    menu.add_command(label="Sub-2")
    menu.add_command(label="Sub-3")

    menubutton["menu"] = menu

    # 배치연습
    bb1=tk.Button(root, text="(50,50)")
    bb1.place(x=50,y=50)
    bb2 = tk.Button(root, text="(130,50)",width=10, height=1)
    bb2.place(x=130, y=50)
    bb3 = tk.Button(root, text="(50,100)", border=3)
    bb3.place(x=50, y=100)
    bb4 = tk.Button(root, text="(130,100)")
    bb4.place(x=130, y=100)


    root.mainloop()
반응형
반응형

파이썬으로 엑셀 파일을 불러오고 데이터 다루는 가장 기본적인 라이브러리인 openpyxl에 대해 알아보도록 하겠습니다.

[ 목차 ]

    1. Openpyxl 설치

    $ pip install openpyxl

     

    2. 파일 생성

    import openpyxl
    
    # 새로운 엑셀 파일 생성
    wb = openpyxl.Workbook()
    
    # 새로운 시트 추가
    sheet = wb.active
    
    # 셀에 데이터 쓰기
    sheet['A1'] = '가나다'
    sheet['B1'] = '라마바사아'
    
    # 엑셀 파일로 저장
    wb.save('example.xlsx')

     

    3. 파일 열기

    import openpyxl
    # 기존 파일 열기
    wb=openpyxl.load_workbook('example.xlsx') #파일명 혹은 패스+파일명 입력
    
    # sheet 선택하기
    sheet = wb.get_sheet_by_name('Sheet1')
    
    # 셀 값 가져오기 방법1
    sheet['A1'].value 
    # 셀 값 가져오기 방법2
    sheet.cell(row=1, column=1).value

     

    4. 워크시트 추가

    import openpyxl
    wb = openpyxl.Workbook()
    
    wb.create_sheet() # 기본값으로 시트 생성
    wb.create_sheet(index=숫자, title=’시트명’) # 지정된 이름으로 시트 생성

     

    5. 행/열 다루기

    모든 행/열 출력

    from openpyxl import load_workbook
    import pandas as pd
    
    wb = load_workbook('sample.xlsx')
    ws = wb['sample']
    
    all_values = []
    for row in ws.rows:
      for cell in row:
        all_values.append(cell.value)
    
    print(all_values)

     

    6. Pandas Dataframe으로 데이터 변환

    from openpyxl import load_workbook
    import pandas as pd
    
    wb = load_workbook('sample.xlsx')
    ws = wb['sample']
    
    data = ws.values
     
    columns = next(data)[0:]  #첫행을 칼럼으로 쓰고, 첫행은 data에서 지워짐
    
    df = pd.DataFrame(data, columns=columns)

     

    기본적인 내용만 정리해 올립니다.

    반응형
    반응형

    오랫만에 Python 관련 포스팅을 하나 할까 합니다. 최근에 Python보다 35,000배 빠른 언어가 나타났다는 기사를 봤습니다. 잉? 뭐지? 인터프리터 언어가 아닌건가? 속도로만 치면 빠른 언어는 많은데...무슨 소리지? 하는 궁금증이 들더군요. 오늘은 Python의 새로운 대안언어라는 타이틀을 들고 나온 "Mojo언어"에 대해 알아보도록 하겠습니다.

     

    Mojo �

     

    Mojo 🔥: Programming language for all of AI

    Mojo combines the usability of Python with the performance of C, unlocking unparalleled programmability of AI hardware and extensibility of AI models.

    www.modular.com

     

    1. 탄생 배경

    Mojo 언어는 Swift의 개발자로 잘 알려진 크리스 래트너(Chris Lattner)가 개발했습니다. Python의 장점은 다양한 라이브러리와 풍부한 문서화로 인해 데이터 분석 분야에 널리 쓰이고 있지만 치명적인 단점이 있습니다. 인터프린터 언어가 내재하고 있는 속도의 한계로 인해 대용량 데이터 처리나 실시간 처리를 하기에는 너무 느리다는 거였죠. LLVM과 Clang의 공동 개발자였던 크리스 래트너역시 본인이 세운 Machin Learning회사인 Modular Inc.에서 Python으로 수행하던 머신러닝 태스크를 돌리기 위해서는 C, C++을 빌리지 않을 수 없었는데요, 이런 불편함을 해소하고자 개발하게 된 것이 Mojo의 탄생 배경입니다.

     

    2. 상세

    Mojo는 Python의 한계를 극복하고자 만들어진 새로운 패러다임의 언어입니다. 기존의 python 문법을 그대로 유지하면서도 빠른 속도를 자랑합니다. 문법 뿐만 아니라 기존의 Python 라이브러리들을 사용할 수 있다고 하는데 아직 100% 호환이 되는지 밝혀지진 않았지만 이게 사실이라면 엄청난 장점이 아닐 수 없습니다. 또한 컴파일러 언어이기 때문에 단일 패키지로 배포도 가능합니다.

     

    3. 빠른 속도

    망델브로 집합 연산을 실시한 결과를 바탕으로 보면 Python 3.10.9버전과 비교하여 35,000배의 속도를 나타내고 있습니다. 이는 C++보다도 빠른 수준인데, 어떻게 이렇게 빠른 수행이 가능할까요?

      Mojo언어는 JIT 컴파일러 방식을 채택하여 기존의 Python과 비교하여 높은 실행 속도를 자랑하고 있습니다. 하지만 단순히 JIT컴파일러 방식만으로는 충분치 않음이 최근 문제로 제기되었습니다. 이를 해소하고자 도입된 방법이 멀티쓰레드 기술과 MLIR 활용입니다.

     

      기존의 Python은 싱글쓰레드로 동작하는데 반해 Mojo는 멀티스레드를 이용한 병렬처리가 가능합니다. 작성된 코드를 동시에 병렬 처리하게 되면 빠른 실행과 함께 효율적인 메모리 관리가 가능하여 대용량 데이터처리에 유리해집니다.

     

      MLIR(Multi-level Intermediate Representation)는 Mojo언어를 중간코드로 변환하고 최적화하는 기술입니다. 이를 통해 최적화된 최종 코드를 생성할 수 있으며 성능을 더욱 개선하는데 큰 기여를 합니다.

     

    4. 시작방법

    아직은 초기 개발단계인 관계로 일반 유저들에게 Open되기 전입니다. 대신 waitlist를 받아 일부 개발자들에게 허용하고 있습니다. 아래의 사이트에서 신청하면 되고 아래의 사이트에서 이름, 메일주소 등을 입력하여 신청할 수 있습니다.

    Modular: Get started today

     

    Modular: Get started today

    Get started with Modular and tell us how we can help you scale your AI workloads with our next generation developer platform.

    www.modular.com

    반응형
    반응형

    머신러닝 알고리즘은 크게 지도학습, 비지도학습, 강화학습으로 분류됩니다. 각 카테고리에 속하는 주요한 알고리즘들을 간단히 살펴보겠습니다.

    1. 지도학습 (Supervised Learning)

    지도학습은 입력 데이터와 정답(label) 쌍을 통해 학습하는 방법입니다. 주어진 입력에 대해 정확한 출력을 예측하는 모델을 학습합니다. 주요한 지도학습 알고리즘으로는 다음과 같은 것들이 있습니다:
       1. 선형 회귀 (Linear Regression)
       2. 로지스틱 회귀 (Logistic Regression)
       3. 의사결정 트리 (Decision Trees)
       4. 랜덤 포레스트 (Random Forests)
       5. K-최근접 이웃 (K-Nearest Neighbors)
       6. 서포트 벡터 머신 (Support Vector Machines)
       7. 신경망 (Neural Networks)

    2. 비지도학습 (Unsupervised Learning)

    비지도학습은 정답(label) 없이 입력 데이터의 내부 구조를 발견하거나 데이터를 그룹화하는 방법입니다. 입력 데이터의 특징을 스스로 학습하여 새로운 관점이나 패턴을 발견합니다. 주요한 비지도학습 알고리즘으로는 다음과 같은 것들이 있습니다:
       1. 군집화 (Clustering)
       2. 주성분 분석 (Principal Component Analysis, PCA)
       3. 자기조직화 맵 (Self-Organizing Maps, SOM)
       4. 혼합 모델 (Mixture Models)
       5. 이상치 탐지 (Anomaly Detection)
       6. 차원 축소 (Dimensionality Reduction)

    3. 강화학습 (Reinforcement Learning)

    강화학습은 에이전트가 환경과 상호작용하며 보상을 최대화하는 의사결정을 학습하는 방법입니다. 시행착오를 통해 최적의 행동 정책을 학습하고 개선합니다. 주요한 강화학습 알고리즘으로는 다음과 같은 것들이 있습니다:
       1. Q-학습 (Q-Learning)
       2. SARSA
       3. 딥 강화학습 (Deep Reinforcement Learning)
       4. 강화학습 기반 신경망 (Reinforcement Learning-based Neural Networks)

     

    각각의 학습 방법은 다른 목적과 응용 분야에 적용될 수 있으며, 종종 혼합하여 사용되기도 합니다. 예를 들어, 지도학습을 통해 레이블된 데이터를 사용하여 모델을 학습한 후, 비지도학습을 통해 데이터의 구조를 이해하거나 강화학습을 통해 최적의 의사결정 전략을 개발하는 등의 방식으로 조합될 수 있습니다.

     

     

     

    반응형

    + Recent posts