728x90
반응형

 티스토리 

날짜별 열의 구성 비율을 누적 막대 그래프로 시각화하기

주어진 데이터를 사용하여 날짜별 열의 구성 비율을 계산하고, 이를 누적 막대 그래프로 시각화.

한글 폰트 깨짐 현상이 있어 폰트를 별도로 설정하여 그래프를 더 가독성 있게 표현했습니다.

1. 코드리뷰

Python
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Malgun Gothic'
plt.rcParams['axes.unicode_minus'] = False


# 날짜별 열의 구성 비율을 나타내는 데이터프레임 생성
df_data = pd.DataFrame({
    'date': ['2023-10-13', '2023-10-14', '2023-10-15', '2023-10-16', '2023-10-17', '2023-10-18'],
    'test1': [134, 87, 32, 35, 1543, 332],
    'test2': [3434, 44, 567, 45, 32, 675],
    'test3': [120, 435, 122, 2344, 124, 125],
    'test4': [98, 11, 333, 13323, 3, 135],
    'test5': [24, 367, 235, 46, 456, 765],
    'test6': [344, 234, 323, 98, 34, 234]
})


# 각 열의 날짜별 구성 비율 계산
df_percentage = df_data.div(df_data.sum(axis=1), axis=0)


# 누적 막대 그래프 생성
fig, ax = plt.subplots(figsize=(10, 6))
ax = df_percentage.plot(kind='bar', stacked=True, ax=ax)

# 그래프에 제목과 레이블 추가
ax.set_title('날짜별 열의 구성 비율')
ax.set_xlabel('날짜')
ax.set_ylabel('누적 비율')

# X축 레이블 가로로 회전
ax.set_xticklabels(ax.get_xticklabels(), rotation=0)


# 그래프 표시
plt.show()
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

코드 설명

이 데이터프레임에서 각 열은 날짜별 데이터를 나타냅니다. 예를 들어, test1 열은 2023년 10월 13일부터 18일까지의 데이터를 나타냅니다.

다음으로, 각 열의 날짜별 구성 비율을 계산합니다. 다음과 같이 div() 함수를 사용하여 계산할 수 있습니다.
각 열의 합계를 구하고, 그 합계를 각 열의 데이터로 나누어 구성 비율을 계산합니다.

kind='bar' 옵션을 사용하여 막대 그래프를 생성하고, stacked=True 옵션을 사용하여 각 막대를 누적하여 표시합니다.

날짜별 열의 구성 비율을 나타냅니다. 예를 들어, 2023년 10월 13일에는 test1 열이 전체 데이터의 27.4%를 차지하고, test2 열이 12.6%를 차지합니다.

이 그래프를 사용하여 날짜별 열의 구성 비율을 한눈에 확인할 수 있습니다.

결과 : 

 

 

2. 매출액 비중 변화를 누적 막대 그래프로 시각화하기

이 글에서는 매출액 비중 변화를 누적 막대 그래프로 시각화하는 방법을 소개합니다.

먼저, 매출액 데이터를 나타내는 데이터프레임을 생성합니다. 예를 들어, 다음과 같은 데이터프레임을 생성할 수 있습니다.

Python
df_data = pd.DataFrame({
    'year': [2022, 2023, 2024],
    'division': ['A', 'B', 'C'],
    'revenue': [1000, 2000, 3000]
})
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

이 데이터프레임에서 각 열은 다음과 같은 의미를 나타냅니다.

  • year: 연도
  • division: 부문
  • revenue: 매출액

다음으로, 각 부문의 매출액 비중을 계산합니다. 다음과 같이 div() 함수를 사용하여 계산할 수 있습니다.

Python
df_percentage = df_data.groupby('division')['revenue'].apply(lambda x: x / x.sum())
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

이 코드는 각 부문의 매출액 데이터를 그룹화하고, 각 그룹의 매출액을 합산합니다. 그 후, 각 그룹의 매출액 합계를 전체 매출액으로 나누어 비중을 계산합니다.

마지막으로, 누적 막대 그래프를 생성합니다. 다음과 같이 plot() 함수를 사용하여 생성할 수 있습니다.

Python
fig, ax = plt.subplots(figsize=(10, 6))
ax = df_percentage.plot(kind='bar', stacked=True, ax=ax)
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

이 코드는 kind='bar' 옵션을 사용하여 막대 그래프를 생성하고, stacked=True 옵션을 사용하여 각 막대를 누적하여 표시합니다.

다음은 위 코드를 실행한 결과입니다.

<AxesSubplot: xlabel='연도' ylabel='누적 비율'>

이 그래프는 매출액 비중 변화를 나타냅니다. 예를 들어, 2022년에는 부문 A가 전체 매출액의 50%를 차지하고, 부문 B가 30%를 차지합니다. 2023년에는 부문 A의 비중이 33.3%로 감소하고, 부문 B의 비중이 50%로 증가합니다. 2024년에는 부문 A의 비중이 25%로 감소하고, 부문 C의 비중이 50%로 증가합니다.

이 그래프를 사용하여 매출액 비중 변화를 한눈에 확인할 수 있습니다.

마무리

- 이번 포스팅은 항목별 합산 비율 누적막대 그래프 그리는 코드에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

딕셔너리

파이썬 딕셔너리는 키와 값의 쌍으로 이루어진 자료 구조입니다. 키는 고유해야 하며, 값은 어떠한 자료형도 될 수 있습니다.
딕셔너리를 생성하려면 다음과 같은 방법을 사용할 수 있습니다.

1. 코드리뷰

 딕셔너리를 생성하려면 다음과 같은 방법을 사용할 수 있습니다.

Python
# 빈 딕셔너리 생성
dict()

# 키와 값의 쌍으로 딕셔너리 생성
{'key1': 'value1', 'key2': 'value2'}

# 반복 가능한 객체를 사용하여 딕셔너리 생성
dict(zip(['key1', 'key2'], ['value1', 'value2']))
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

딕셔너리의 키와 값에 접근하려면 다음과 같은 방법을 사용할 수 있습니다.

Python
# 키로 값을 가져오기
dict['key1']

# 키가 존재하는지 확인하기
'key1' in dict

# 키의 값을 변경하기
dict['key1'] = 'new_value'

# 키를 삭제하기
del dict['key1']
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

딕셔너리를 순회하려면 다음과 같은 방법을 사용할 수 있습니다.

Python
# 키를 순회하기
for key in dict:
    print(key, dict[key])

# 값을 순회하기
for value in dict.values():
    print(value)

# 키와 값을 순회하기
for key, value in dict.items():
    print(key, value)
코드를 사용할 때는 주의하시기 바랍니다. 자세히 알아보기
content_copy

딕셔너리의 주요 메서드는 다음과 같습니다.

  • keys(): 딕셔너리의 키를 가져옵니다.
  • values(): 딕셔너리의 값을 가져옵니다.
  • items(): 딕셔너리의 키와 값을 튜플로 가져옵니다.
  • get(key, default=None): 지정된 키의 값을 가져옵니다. 키가 존재하지 않으면 default 값을 반환합니다.
  • setdefault(key, default=None): 지정된 키의 값을 가져옵니다. 키가 존재하지 않으면 default 값을 설정하고, 키의 값을 반환합니다.
  • update(dict2): 다른 딕셔너리의 값을 병합합니다.
  • pop(key, default=None): 지정된 키의 값을 제거하고 값을 반환합니다. 키가 존재하지 않으면 default 값을 반환합니다.
  • popitem(): 임의의 키와 값의 쌍을 제거하고 쌍을 반환합니다.
  • clear(): 딕셔너리의 모든 항목을 제거합니다.

파이썬 딕셔너리는 다양한 용도로 사용할 수 있습니다. 예를 들어, 다음과 같은 용도로 사용할 수 있습니다.

  • 데이터 저장: 사용자 정보, 제품 정보, 설정 정보 등을 저장할 수 있습니다.
  • 검색: 키로 값을 검색할 수 있습니다.
  • 그룹핑: 키로 데이터를 그룹핑할 수 있습니다.

파이썬 딕셔너리를 사용하여 코드를 더 간결하고 효율적으로 작성할 수 있습니다.

마무리

- 이번 포스팅은 딕셔너리(dictionary) 타입에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

장고 소개 

장고(Django)는 파이썬으로 작성된 오픈 소스 웹 프레임워크입니다. 장고는 다양한 기능을 제공하여 웹페이지 개발을 쉽고 빠르게 할 수 있도록 도와줍니다.

Django는 다음과 같은 이유로 웹 서버 프레임워크 중 가장 유명합니다.

  • 생산성 향상: Django는 다양한 기능을 제공하여 웹페이지 개발을 쉽고 빠르게 할 수 있도록 도와줍니다.
  • 보안 강화: Django는 기본적으로 보안을 강화하는 기능을 제공합니다.
  • 확장성: Django는 다양한 모듈과 프레임워크를 사용하여 확장할 수 있습니다.

장고의 주요 기능은 다음과 같습니다.
( 아래 내용은 나중에 다시 공부할 예정이니 한번만 읽고 스킵 하자!)

  • 모델-뷰-템플릿(MVC) 패턴을 지원하여 웹페이지의 구조를 명확하게 구분할 수 있습니다.
    • 모델-뷰-템플릿(MVC) 패턴은 웹 애플리케이션을 개발하는 데 사용되는 소프트웨어 디자인 패턴입니다. 이 패턴은 애플리케이션을 세 가지 구성 요소로 분리합니다. 
    • 모델: 애플리케이션의 데이터와 비즈니스 로직을 담당합니다. 예를 들어, 사용자, 제품 또는 주문과 같은 개체를 나타내는 클래스를 포함할 수 있습니다.
    • 뷰: 사용자 인터페이스를 담당합니다. 웹 페이지를 생성하고 사용자 입력을 처리합니다.
    • 템플릿: 뷰가 사용하는 HTML 코드를 생성합니다
  • MVC 패턴은 다음과 같은 몇 가지 장점이 있습니다.
    • 관심사 분리: 각 구성 요소는 애플리케이션의 특정 측면에만 집중하므로 코드가 더 이해하기 쉽고 유지 관리하기 쉽습니다.
    • 재사용성: 구성 요소를 개별적으로 빌드하고 재사용할 수 있으므로 애플리케이션을 더 빠르게 개발할 수 있습니다.
    • 확장성: 구성 요소를 쉽게 추가하거나 제거할 수 있으므로 애플리케이션을 쉽게 확장할 수 있습니다.
  • MVC 패턴은 웹 애플리케이션을 개발하는 데 널리 사용되는 인기 있는 패턴입니다. Django, Rails 및 ASP.NET MVC와 같은 많은 인기 있는 웹 프레임워크는 MVC 패턴을 기반으로 합니다.
  • 자동화된 폼 처리 기능을 제공하여 폼의 생성 및 처리를 쉽게 할 수 있습니다.
    • Django는 폼을 생성하고 처리하기 위한 강력한 기능을 제공합니다. 이러한 기능을 사용하면 폼 HTML을 생성하고, 사용자 입력을 유효성 검사하고, 유효한 입력을 Python 데이터로 변환할 수 있습니다.
    • 이건 한번 읽고 스킵하자. 다시 자세하게 다뤄볼 예정. 
  • 다양한 유효성 검사 기능을 제공하여 사용자 입력의 유효성을 검사할 수 있습니다.
  • 로그인, 로그아웃, 권한 관리 등의 기능을 제공하여 보안을 강화할 수 있습니다.
  • 템플릿 엔진을 제공하여 동적인 웹페이지를 쉽게 만들 수 있습니다.

1. 장고 설치

장고는 설치 및 구성에서 매우 유연( 윈도우, 맥 OS X, 리눅스/유닉스 )하며,
여러 운영 체제에서 설치가 가능합니다.

- 가능한 최신 버전을 사용할 것을 권장합니다.
(3.7이상 추천)
장고는 네 가지 메인 데이터베이스(PostgreSQL, MySQL, Oracle 그리고 SQLite)를 지원
 * SQLite는 가벼운 데이터베이스로 사용하기에 적합해서 주로 읽기 전용인 응용 프로그램을 위해서는 추천.

장고를 설치하려면 다음 명령어를 실행합니다.

pip install django

이 명령어는 장고의 최신 버전을 설치합니다.

장고를 설치한 후에는 다음 명령어를 실행하여 새로운 프로젝트를 생성합니다.

django-admin startproject costzerocode

이 명령어는 costzerocode라는 이름의 Project를 생성. 프로젝트 디렉토리에는 다음과 같은 파일들이 생성됩니다.

  • __init__.py: 프로젝트의 시작 파일
  • settings.py: 프로젝트의 설정 파일
  • urls.py: 프로젝트의 URL 맵핑 파일
  • wsgi.py: 프로젝트의 WSGI 구성 파일

 

2. 장고의 기본 개념

장고의 기본 개념은 다음과 같습니다.

  • 모델: 데이터베이스의 테이블과 일치하는 클래스입니다.
  • 뷰: HTTP 요청을 처리하는 함수입니다.
  • 템플릿: HTML 코드에 동적인 데이터를 포함하는 파일입니다.

일단 이런게 있구나 하고, 코드를 만들면서 위의 개념을 익혀 봅시다.

3. 장고로 웹페이지 만들기 

장고로 간단한 웹페이지를 만들려면 다음 단계를 따릅니다.

  1. 모델을 정의합니다.
  2. 뷰를 정의합니다.
  3. 템플릿을 정의합니다.
  4. URL 맵핑을 정의합니다.

모델 정의

모델을 정의하려면 models.py 파일에 다음과 같은 코드를 작성합니다.

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=255)

이 코드는 MyModel이라는 모델을 정의합니다. name 필드는 문자열 데이터를 저장하는 필드입니다.

뷰 정의

뷰를 정의하려면 views.py 파일에 다음과 같은 코드를 작성합니다.

클래스 기반 뷰 (Class-Based Views)
클래스 기반 뷰는 Django의 뷰를 클래스로 정의할 수 있게 해줍니다. 이 방식은 뷰의 재사용성과 코드의 구조화를 더욱 쉽게 해줍니다. 아래는 views.py 파일에 클래스 기반 뷰를 정의하는 예제입니다.

from django.http import HttpResponse
from django.views import View

# 클래스 기반 뷰 예제
class IndexView(View):
    def get(self, request):
        return HttpResponse("Hello, world. You're at the index page.")

이 코드는 IndexView()이라는 뷰를 정의합니다. 이 뷰는 index.html이라는 템플릿을 렌더링합니다.

IndexView 클래스는 View 클래스를 상속받아 정의되며, HTTP GET 요청을 처리하는 get 메소드를 포함하고 있습니다. 이 메소드 역시 사용자의 요청을 받아서 텍스트를 포함한 HTTP 응답을 반환합니다.

함수형으로 구현한 코드 예 :

함수 기반 뷰 (Function-Based Views)
함수 기반 뷰는 Django에서 뷰를 정의하는 가장 기본적인 방식입니다. 아래는 views.py 파일에 함수 기반 뷰를 정의하는 간단한 예제입니다.

from django.http import HttpResponse

# 함수 기반 뷰 예제
def index(request):
    return HttpResponse("Hello, world. You're at the index page.")

두 예제 모두 Django 프로젝트의 views.py 파일에 추가한 후, 해당 뷰를 URLconf에 연결해야 합니다. 함수 기반 뷰는 그대로 URLconf에 추가하면 되고, 클래스 기반 뷰는 .as_view() 메소드를 호출하여 연결합니다.

# urls.py 예제
from django.urls import path
from .views import index, IndexView

urlpatterns = [
    path('fbv/', index, name='fbv-index'),  # 함수 기반 뷰 연결
    path('cbv/', IndexView.as_view(), name='cbv-index'),  # 클래스 기반 뷰 연결
]

이렇게 하면 /fbv/ URL로 접근할 때는 함수 기반 뷰가, /cbv/ URL로 접근할 때는 클래스 기반 뷰가 처리하게 됩니다.

 

템플릿 정의

템플릿을 정의하려면 templates 디렉토리에 index.html 파일을 생성하고 다음과 같은 코드를 작성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>My Site</title>
</head>
<body>
    <h1>My Site</h1>
    <p>{{ name }}</p>
</body>
</html>

이 코드는 name 변수를 사용하여 모델의 데이터를 출력합니다.

URL 맵핑 정의

URL 맵핑을 정의하려면 urls.py 파일에 다음과 같은 코드를 작성합니다.

간단한 애플리케이션에 대한 기본 URL 패턴을 정의합니다.

from django.contrib import admin
from django.urls import path

from myapp import views

urlpatterns = [
    path('', views.index, name='index'),
    path('admin/', admin.site.urls),
]

코드 리뷰:

  • Imports:
    • django.contrib.admin: 사이트 콘텐츠를 관리하기 위한 admin유저의 인터페이스를 포함합니다.
      • 장고의 특화된 장점이라고 하는 관리자에 대한 기능이 다양하게 제공된다.
    • django.urls.path: URL 패턴 정의 가능합니다.
    • myapp.views: "myapp"이라는 애플리케이션에서 뷰를 가져옵니다.
  • URL 패턴:
    • path('', views.index, name='index'):
      • 루트 URL (/)을 myapp.views의 index 뷰 함수에 매핑합니다.
      • 이 패턴에 이름 index를 지정하여 템플릿 및 코드에서 쉽게 참조할 수 있습니다.
    • path('admin/', admin.site.urls):
      • /admin/에서 액세스할 수 있는 Django 관리 인터페이스에 대한 URL 패턴을 포함합니다.
  • myapp.views의 뷰가 적절하게 정의되고 요청을 올바르게 처리하는지 확인하십시오.
  • myapp 애플리케이션의 구조를 일관성과 모듈성에 대해 검토하십시오.
  • 애플리케이션을 확장할 계획이라면 그에 따라 더 많은 URL 패턴을 추가하십시오.
  • 사용자 입력, 데이터베이스 상호 작용 또는 기타 기능을 처리하는 뷰를 포함하는 것을 고려하십시오.
728x90

마무리

- 이번 포스팅은 django-admin startproject 명령을 이용해 어떻게 새로운 장고 웹사이트를 생성할 수 있는지 간단하게 확인했습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

PySimpleGUI

 tkinter 보다 저는 주로 간단하게 PySimpleGUI을 주로 이용합니다.
모듈이름 처럼 간단한 주요 10가지 예제를 알아 봅시다.

1. 코드리뷰- 텍스트 입력창 만들기

  이 예제는 간단한 텍스트 입력 윈도우를 생성합니다. "이름을 입력하세요."라는 텍스트와 입력 필드, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 입력된 텍스트가 출력됩니다.

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("이름을 입력하세요.")],
    [sg.InputText()],
    [sg.Button("확인")]
]
window = sg.Window("간단한 텍스트 입력", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 입력된 텍스트 출력
    print(values["input_text"])

# 윈도우 종료
window.close()

결과 화면 : 

2. 코드리뷰 - 텍스트 출력

텍스트를 윈도우 창에 출력

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("오늘은 화요일입니다.")]
]
window = sg.Window("텍스트 출력", layout)

# 윈도우 표시
window.read()

# 윈도우 종료
window.close()

결과 :

 

3. 코드리뷰 - 콤보 박스

이 예제는 콤보박스를 사용하여 이름을 선택하는 윈도우를 생성합니다. "선수를 선택하세요."라는 텍스트와 콤보박스, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 선택된 선수 이름이 출력됩니다.

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("축구 선수를 선택하세요.")],
    [sg.Combo(key='combo' ,values=["손흥민", "이강인", "김민재"],  size=(30, 50))],
    [sg.Button("확인")]
]
window = sg.Window("콤보박스", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 선택된 이름 출력
    print(values["combo"])

# 윈도우 종료
window.close()

결과 화면 :

 

4. 코드리뷰 - 라디오 버튼

 

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("성별을 선택하세요.")],
    [sg.Radio("남성", "gender", key = 'gender', default=True)],
    [sg.Radio("여성", "gender", key = 'gender')],
    [sg.Button("확인")]
]
window = sg.Window("라디오 버튼", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 선택된 성별 출력
    print(values["gender"])

# 윈도우 종료
window.close()

결과 화면 :

 

5. 코드리뷰 -  체크박스

이 예제는 체크박스를 사용하여 취미를 선택하는 윈도우를 생성합니다. "취미를 선택하세요."라는 텍스트와 체크박스 3개, 그리고 "확인" 버튼으로 구성되어 있습니다. "확인" 버튼을 누르면 선택된 취미가 출력됩니다.

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("취미를 선택하세요.")],
    [sg.Checkbox("독서", "hobby")],
    [sg.Checkbox("운동", "hobby")],
    [sg.Checkbox("여행", "hobby")],
    [sg.Button("확인")]
]
window = sg.Window("체크박스", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 선택된 취미 출력
    hobbies = []
    for key, value in values.items():
        if value:
            hobbies.append(key)
    print(hobbies)

# 윈도우 종료
window.close()

결과

 

6. 코드리뷰 -  리스트 박스

참고 : size() 속성을 (-1, -1)로 설정하면 콤보 박스의 크기가 윈도우 크기에 맞게 자동으로 조정됩니다.

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("선수를 선택하세요.")],
    [sg.Listbox(values=["손흥민", "김민재", "이강인", "황희찬"], size=(10,5), key='listbox')],
    [sg.Button("확인")]
]
window = sg.Window("리스트박스", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 선택된 이름 출력
    print(values["listbox"])

# 윈도우 종료
window.close()

결과

 

7. 코드리뷰 -  슬라이더

 

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("밝기를 조절하세요.")],
    [sg.Slider(range=(0, 100), default_value=50, orientation="horizontal")],
    [sg.Button("확인")]
]
window = sg.Window("슬라이더", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 슬라이더 값 출력
    print(values["slider"])

# 윈도우 종료
window.close()

결과

 

 

8. 코드리뷰 -  텍스트 에디터 , 여러 문장 출력하기

이 예제는 텍스트 에디터를 사용하여 텍스트를 입력하는 윈도우를 생성합니다.

import PySimpleGUI as sg

# 윈도우 생성
layout = [
    [sg.Text("텍스트를 입력하세요.")],
    [sg.Multiline(size=(50, 10),key='multiline')],
    [sg.Button("확인")]
]
window = sg.Window("텍스트 에디터", layout)

# 이벤트 처리
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break

    # 입력된 텍스트 출력
    print(values["multiline"])

# 윈도우 종료
window.close()

결과

 

마무리

- 이번 포스팅은 PysimpleGUI 주요 10가지 기능을 예제 코드로 알아봤습니다.

- 주요 에러 원인 분석 :

print(values["input_text"])
     ~~~~~~^^^^^^^^^^^^^^
KeyError: 'input_text'

위와 같이 key 에러가 나면..


오류의 원인:

해당 오류는 values 딕셔너리에 "input_text" 키가 존재하지 않아 발생하는 KeyError입니다. 이는 보통 다음과 같은 이유에서 발생할 수 있습니다.

입력 엘리먼트의 이름이 다름:

코드에서 입력 엘리먼트의 이름이 input_text가 아닌 다른 이름으로 설정되었을 수 있습니다. 코드에서 입력 엘리먼트를 생성하는 부분을 확인하여 올바른 이름을 사용해야 합니다.
윈도우 레이아웃에 입력 엘리먼트가 없음:

윈도우 레이아웃에 sg.InputText()를 사용하여 입력 엘리먼트를 추가하지 않았거나, 추가한 입력 엘리먼트의 이름이 input_text가 아닌 경우 이 오류가 발생합니다.
이벤트 발생 전 접근 시도:

window.read() 함수를 호출하여 이벤트를 발생시키기 전에 values["input_text"]에 접근하려고 하면 이 오류가 발생합니다. 입력 값을 가져오려면 이벤트가 발생한 후에 접근해야 합니다.
해결 방안:

입력 엘리먼트 이름 확인:

코드에서 입력 엘리먼트를 생성하는 부분을 찾아 정확한 이름을 확인합니다. 예를 들어, sg.InputText(key="my_input")와 같이 생성했다면 values["my_input"]으로 접근해야 합니다.
레이아웃에 입력 엘리먼트 추가:

윈도우 레이아웃에 sg.InputText()를 사용해 입력 엘리먼트를 추가하고, 이름을 input_text로 설정합니다.
이벤트 발생 후 접근:

window.read() 함수 호출 후 이벤트 루프에서 입력 값을 가져옵니다

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

LOCAL CHATGPT4 사용하기.

  회사 또는 보안으로 인한 제약사항이 있다면 로컬 컴퓨에서 사용가능한 생성형 AI를 만들어보자. 
  개인 정보나 회사 기밀정보가 있어서 ChatGPT 대안으로 공부하여 보자.
  아직 로컬용 오픈소스가 계속 발전되고 있으니, 추후에는 더 간편하게 사용 할수 있지 않을가 합니다.

GPT4ALL 사이트 : https://gpt4all.io/index.html

 

1. GPT4ALL

  아래 사이트를 참고하여 정리해 보았습니다.
아래 사이트에는 다양한 LLM 들이 있으니 참고하세요.
https://python.langchain.com/docs/integrations/llms/gpt4all

Import 준비 

from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_community.llms import GPT4All

LLM에 질문 하는 코드

template = """Question: {question}

Answer: Let's think step by step."""

prompt = PromptTemplate(template=template, input_variables=["question"])

LLM 위치 지정

local_path = (
    "./models/ggml-gpt4all-l13b-snoozy.bin"  # replace with your desired local file path
)
# Callbacks support token-wise streaming
callbacks = [StreamingStdOutCallbackHandler()]

# Verbose is required to pass to the callback manager
llm = GPT4All(model=local_path, callbacks=callbacks, verbose=True)

# If you want to use a custom model add the backend parameter
# Check https://docs.gpt4all.io/gpt4all_python.html for supported backends
llm = GPT4All(model=local_path, backend="gptj", callbacks=callbacks, verbose=True)
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = "What NFL team won the Super Bowl in the year Justin Bieber was born?"

llm_chain.run(question)

아직 위코드를 실행을 못해 봤다.
완료후에 다시 후기를 써볼 예정.

GPT4All 사이트에 가서  윈도우용 설치 파일을 다운로드하여 다양한 모델을 다운로드 할수도 있다.

 .bin 또는 .gguf로 끝나는 파일을 다운로드
q_숫자는 양자화 정도를 나타낸다. 
숫자가 높을수록 인공지능 데이터가 많아 정확도 가 높고, 컴퓨터 사양도 좋아야 겠지..

https://huggingface.co/models?language=ko&sort=trending&search=gguf

For more info, visit https://github.com/nomic-ai/gpt4all.

마무리

- 이번 포스팅은 GPT4ALL 에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

Replit.com에서 웹페이지에서 코딩 

코딩의 끊임없는 발전 속에서 온라인 코딩 플랫폼은 개발자와 학습자들에게 접근 가능하고 협업이 용이한 환경을 제공하는 데 중요한 역할을 합니다. 이 중 하나로 주목받고 있는 플랫폼이 바로 Replit.com으로, 주로 Python을 포함한 다양한 프로그래밍 언어를 사용하는 이용자들에게 효과적인 플랫폼을 제공하고 있습니다.

1. Replit.com이란?

  개인적으로 가장 많이 사용하는 온라인 플랫폼 이라 소개 합니다.

Replit.com은 사용자들이 웹 브라우저에서 직접 코드를 작성하고 실행하며 공유할 수 있는 온라인 통합 개발 환경(IDE)입니다. 당신이 경험이 풍부한 개발자이든 초보자이든 Replit.com은 다양한 프로그래밍 언어로 실험할 수 있는 다재다능한 공간을 제공합니다.

코딩 화면 :아래 그림처럼 웹에서 작성. 중간 중간 AI의 문법 철자 등을 자동으로 찾아주는 편리함까지..

 

2. 주요 기능

1. 다국어 지원:
Replit.com은 다양한 프로그래밍 언어를 지원하며 특히 Python에 중점을 두고 있습니다. 사용자들은 쉽게 언어를 전환하고 다양한 코딩 프로젝트에 참여할 수 있습니다.

2. 실시간 협업:
Replit.com은 협업을 쉽게 만듭니다. 여러 사용자가 동시에 동일한 코드에서 작업할 수 있어 팀워크와 지식 공유를 촉진합니다.

3. 즉각적 실행:
이 플랫폼은 빠르고 번거로움 없는 코드 실행을 제공합니다. 사용자들은 실시간으로 코드 결과를 확인할 수 있어 원활한 디버깅 및 테스트 프로세스를 도와줍니다.

4. 교육 자료:
Replit.com은 전문가들 뿐만 아니라 교육자와 학생들을 위한 환경을 제공합니다. 협업 코딩과 대화형 튜토리얼과 같은 기능들이 교육에 적합한 환경을 만들어줍니다.

시작하기
1. 계정 생성:
사용자는 Replit.com에서 무료 계정을 생성하여 프로젝트를 저장하고 어디서든 액세스할 수 있게 됩니다.

2. 프로젝트 생성:
새로운 프로젝트를 시작하는 것은 간단합니다. 사용자는 선호하는 프로그래밍 언어를 선택하고 즉시 코딩을 시작할 수 있습니다. 또한 일반적인 프로젝트 유형에 대한 템플릿도 제공됩니다.

3. 공유와 협업:
Replit.com을 통해 사용자는 프로젝트를 다른 사람들과 쉽게 공유할 수 있습니다. 이는 커뮤니티와 연결되어 다른 개발자로부터 학습할 수 있는 기회를 열어줍니다.

Replit.com 장점
1. 접근성:
웹 기반으로 된 이 플랫폼은 사용자가 어디에서나 인터넷 연결만 있다면 프로젝트에 액세스할 수 있는 유연성을 제공합니다. 이동 중에도 개발자에게 공간의 제약에 자유로워 집니다.

2. 다양성:
Replit.com은 다양한 프로젝트, 간단한 Python 스크립트부터 복잡한 웹 개발 작업까지 수용할 수 있는 다재다능성을 지니고 있습니다. 이는 다양한 요구에 맞는 개발자들에게 매력적인 선택지가 됩니다.

3. 커뮤니티 참여:
Replit.com 커뮤니티의 일원이 되면 사용자는 이와같이 개발자들과 연결되어 도움을 얻고 지식을 공유할 수 있는 기회를 가집니다. 커뮤니티 참여로 많은 자료를 서로 공유 합니다.

 

마무리

- 이번 포스팅은  replit.com 웹기반 개발툴 / 컴파일러 에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

랜덤 난수 생성 모듈 

Python의 random 모듈을 사용해서 숫자 맞추기 게임을 만들면서 공부해 보자.
we'll review and optimize a simple number guessing game code.

Hello! In this article, we'll review and optimize a simple number guessing game code written in Python.

1. 코드리뷰

  이 코드는 1부터 100까지의 랜덤한 숫자를 생성하고, 사용자에게 숫자를 입력받아 정답을 맞추는 게임입니다. 사용자가 입력한 숫자에 따라 "높은 숫자를 선택하세요." 또는 "낮은 숫자를 선택하세요." 등의 힌트가 표시됩니다.

import random

def Guessing_Number():
    random_number = random.randint(1, 1000)
    play_count = 1

    while True:
        try:
            my_number = int(input("1~1000 사이의 숫자를 입력하세요: "))

            if my_number > random_number:
                print("낮은 숫자를 선택하세요. ~^^")
            elif my_number < random_number:
                print("높은 숫자를 선택하세요. ~^^")
            else:
                print(f"정답입니다!. 시도한 횟수 : {play_count} ")
                break

            play_count += 1
        except ValueError:
            print("에러가 발생하였습니다. 올바른 숫자를 입력하세요.")
            

# 게임 실행
Guessing_Number()

 

 

2. 영문 버전 코드

import random

def number_guessing_game():
    print("Welcome to the Number Guessing Game!")
    min_value = 1
    max_value = 100
    answer = random.randint(min_value, max_value)
    attempts = 0

    while True:
        try:
            guess = int(input(f"Enter a number between {min_value} and {max_value}: "))
        except ValueError:
            print("Please enter a valid number.")
            continue

        attempts += 1

        if guess < min_value or guess > max_value:
            print(f"Please enter a number between {min_value} and {max_value}.")
            continue

        if guess < answer:
            print("Choose a higher number.")
        elif guess > answer:
            print("Choose a lower number.")
        else:
            print(f"Congratulations! You guessed the correct number in {attempts} attempts.")
            break

# Run the game
number_guessing_game()

마무리

- 이번 포스팅은 랜덤 모듈을 활용하여 숫자 맞추기 게임에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

두 개의 판다스 데이터프레임을 b_id 열을 기준으로 병합

두 개의 판다스 데이터프레임을 b_id 열을 기준으로 병합하는 방법은 merge 함수를 사용하는 것입니다. 아래는 주어진 데이터프레임을 기반으로 b_id 열을 기준으로 병합하는 예제 코드로 공부해 보자.

1. 코드리뷰

  2개의 판다스 데이터 프레임의 'b_id'열을 기준으로 값이 같은 행을 병합하는 코드

import pandas as pd

# 1번 데이터프레임 생성
df1_data = {'sepal_length': [5.1, 4.9, 4.7, 4.6, 5.0, 5.4],
            'sepal_width': [3.5, 3.0, 3.2, 3.1, 3.6, 3.9],
            'petal_length': [1.4, 1.4, 1.3, 1.5, 1.4, 1.7],
            'petal_width': [0.2, 0.2, 0.2, 0.2, 0.2, 0.4],
            'species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa'],
            'species_id': [1, 1, 1, 1, 1, 1],
            'b_id': [33, 765, 54, 2, 43, 1]}

df1 = pd.DataFrame(df1_data)

# 2번 데이터프레임 생성
df2_data = {'a': [5.1, 4.9, 4.7, 4.6, 5.0, 5.4],
            'b': [3.5, 3.0, 3.2, 3.1, 3.6, 3.9],
            'c': [1.4, 1.4, 1.3, 1.5, 1.4, 1.7],
            'petal_width': [0.2, 0.2, 0.2, 0.2, 0.2, 0.4],
            'species': ['setosa', 'setosa', 'setosa', 'setosa', 'setosa', 'setosa'],
            'species_id': [1, 1, 1, 1, 1, 1],
            'b_id': [33, 765, 1, 2, 3, 1]}

df2 = pd.DataFrame(df2_data)

# b_id 열을 기준으로 데이터프레임 병합
merged_df = pd.merge(df1, df2, on='b_id', how='inner')

# 결과 출력
print(merged_df)

이 코드는 'b_id' 열을 기준으로 내부 조인(inner join)을 수행하여 두 데이터프레임을 병합합니다. how='inner' 파라미터는 공통된 값이 있는 행들만을 병합하도록 합니다. 결과는 merged_df에 저장되며 출력됩니다.

 

2. 코드리뷰 - key 열을 기준으로 두 데이터프레임을 병합

이 예제에서는 key 열을 기준으로 두 데이터프레임을 병합하고 있습니다.

import pandas as pd

# 첫 번째 데이터프레임 생성
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c'], 'key': ['X', 'Y', 'Z']})

# 두 번째 데이터프레임 생성
df2 = pd.DataFrame({'C': ['x', 'y', 'z'], 'D': [4, 5, 6], 'key': ['X', 'Y', 'Z']})

# 데이터프레임 병합
merged_df = pd.merge(df1, df2, on='key')

# 결과 출력
print(merged_df)

 

 

3. 코드리뷰 - key 열을 기준으로 두 데이터프레임을 병합 #2

 

import pandas as pd

# 세 번째 데이터프레임 생성
df3 = pd.DataFrame({'E': [10, 20, 30], 'F': ['apple', 'banana', 'cherry'], 'key': ['X', 'Y', 'Z']})

# 네 번째 데이터프레임 생성
df4 = pd.DataFrame({'G': ['red', 'green', 'blue'], 'H': [100, 200, 300], 'key': ['X', 'Y', 'Z']})

# 데이터프레임 병합
merged_df_2 = pd.merge(df3, df4, on='key')

# 결과 출력
print(merged_df_2)

이 예제에서도 key 열을 기준으로 두 데이터프레임을 병합하고 있습니다. pd.merge 함수는 공통된 열을 기준으로 데이터프레임을 효과적으로 병합할 수 있는 강력한 기능을 제공합니다.

 

마무리

- 이번 포스팅은 pd.merge 또다른 예에 대해 알아봤습니다.

 

궁금한 사항은 댓글을 통해서 남겨 주시면 답변 드리겠습니다.
감사합니다.

 

 

728x90
반응형

+ Recent posts