Category: Python

  • pip 패키지 제거

    내가 도커 컨테이너에서 주피터랩을 사용해서 파이썬을 사용한다. 이 과정에서 pip로 여러 패키지를 설치하게 된다. 시간이 지나면 사용하지 않는 패키지가 생기게 되고, 이를 제거하고 싶었다.

    평소에는 코파일럿을 이용했지만, 이번에는 제미나이에게 물어 보았다.

    아래와 같이 현재 설치된 패키지 목록을 저장한다.

    pip freeze > to_delete.txt

    아래와 같이 현재 설치된 패키지를 제거한다.

    pip uninstall -r final_to_delete.txt -y --break-system-packages

    주피터랩을 다시 설치한다.

  • eval

    7을 구하지 못해서 답안지를 찾아보려고 했다. 이 회사 문제집은 접근 방법이 마음에 들지 않는 경우가 있었다. 그래서 모든 경우를 찾아보기로 했다.

    파이썬 f-string과 eval()을 이용하면 계산된 결과를 얻을 수 있다. 0을 나누는 경우에는 zero division error가 생긴다. 그래서 try ~ except로 이용한다.

    calc = ['+', '-', '*', '/']
    for cal1 in calc:
        for cal2 in calc:
            for cal3 in calc:
                expr = f"(5 {cal1} 5) {cal2} (5 {cal3} 5)"
                
                try:
                    result = eval(expr)
                except ZeroDivisionError:
                    result = None
    
                if result == 1:
                    print(expr)

    이를 이용해서 풀어보면 결과는 다음과 같다.

    • 1개만 있는 경우: 2, 3, 7
    • 2개 있는 경우: 9,
    • 3개 있는 경우: 11
    • 7개: 1, 10

  • matplotlib.pie

    matplotlib 으로 파이 차트를 그린다. 파이 크기가 작으면 글자가 서로 겹친다. 코파일럿이 제시해 준 방법들을 다 시도했지만 마음에 들지 않았다. adjustText 패키지를 이용하면 편할 것 같았지만, 마음대로 안된다.

    이 과정에서 얻은 정보는 유용했다. 직접 안겹치게 코딩했다.

    wedges, texts = ax.pie(df['pie'], labels=labels_raw, wedgeprops=dict(width=size, edgecolor='none'), colors=colors)

    이 과정으로 texts 정보를 얻는다.

    우선 나의 자료는 내림 차순으로 정렬되어 있다. 큰 값들은 겹치지 않게 출력되므로 겹치게 출력되는 작은 크기만 고려한다.

    작은 파이가 첫 번째로 나올 때 위치를 기록한다.

    init_x, init_y = text.get_position()

    이렇게 하면 x, y 값의 좌표가 나온다. x 값은 양수, y 값은 음수였다. 4사분면에 위치함을 의미한다. 처음 값은 그대로 출력한다.

    여러 번 반복해서 확인한 결과 나의 파이 차트에서는 2.5도씩 회전하면 가독성이 좋다. 다음을 이용하여 회전한 각도를 지정한다.

    theta = np.deg2rad(small_pie * 2.5)

    원점을 중심으로 회전한 좌표를 구한다.

    x_new = init_x * np.cos(theta) - init_y * np.sin(theta)
    y_new = init_x * np.sin(theta) + init_y * np.cos(theta)

    새로운 좌표를 지정한다.

    text.set_position((x_new, y_new))
  • matplotlib에서 font 등록

    코파일럿 도움을 받음.

    특정 글꼴을 사용해서 작업을 할 경우 폰트를 등록해 주어야 한다.

    스크립트를 실행할 때 마다 실행해 준다.

    from matplotlib import font_manager
    
    font_dirs = ["/usr/share/fonts"]
    font_files = font_manager.findSystemFonts(fontpaths=font_dirs)
    for font_file in font_files:
        font_manager.fontManager.addfont(font_file)

    이렇게 하면 등록된 글꼴을 이용해서 matplotlib에서 사용할 수 있다.

    plt.rcParams['font.family'] = 'D2Coding'

    파일명과 등록된 글꼴명이 다른 경우가 많다. 그럴 경우에는 다음의 코드를 이용해서 글꼴을 파악한다.

    font_list = font_manager.fontManager.ttflist
    for font in font_list:
        print(f"Path: {font.fname}, Name: {font.name}")