728x90
반응형

 티스토리 

ASCII 코드표 ord(), chr()로 변환하는 방법

ord()와 chr()는 파이썬의 내장 함수로, 문자와 ASCII 코드 간의 변환을 돕습니다.

1. 파이썬으로 ASCII 코드 표 만들기

 

# ASCII 코드 표를 생성하여 출력하기

# ASCII 코드 표를 위한 빈 문자열 초기화
ascii_table = ""

# ASCII 코드 범위에 대해 반복
for i in range(128):
    # 각 줄에 ASCII 코드와 해당 문자를 추가
    ascii_table += f"{i:3} -> '{chr(i)}'\t"
    # 4개의 코드마다 줄바꿈 추가
    if (i + 1) % 4 == 0:
        ascii_table += "\n"

print(ascii_table) # 테이블 출력

 

{i:3}는 파이썬의 문자열 포맷팅 기법 중 하나입니다. 이 구문은 변수 i의 값을 문자열로 포맷팅할 때 사용됩니다. 여기서 3은 공간의 폭을 지정합니다. 구체적으로 설명하면:

{}: 중괄호는 변수를 문자열에 포맷팅하기 위한 표시입니다. format 메소드나 f-string을 사용할 때 이 중괄호 안에 변수를 넣어 해당 위치에 변수의 값을 삽입합니다.
i: 이 부분은 변수 i의 값이 들어갈 자리를 나타냅니다.
:3: 콜론(:) 뒤에 오는 숫자 3은 최소 폭을 지정합니다. 이는 i의 값이 차지할 최소한의 공간을 3자리로 설정합니다. 만약 i의 값이 3자리 미만이면 나머지 공간은 공백으로 채워집니다.
예를 들어, i가 2일 때 {i:3}를 사용하면, 출력은 ' 2'가 됩니다. 여기서 2 앞에 두 개의 공백이 있어서 총 3자리를 차지하게 됩니다. 이는 출력물을 더 깔끔하고 정렬된 형태로 만드는 데 도움이 됩니다.

이와 같은 포맷팅 방식은 테이블, 리스트, 또는 어떤 형태의 데이터를 보기 좋게 출력할 때 유용하게 사용됩니다.

결과(RESULT):

  0 -> '\x00'	  1 -> '\x01'	  2 -> '\x02'	  3 -> '\x03'	
  4 -> '\x04'	  5 -> '\x05'	  6 -> '\x06'	  7 -> '\x07'	
  8 -> '\x08'	  9 -> '\t'	 10 -> '\n'	 11 -> '\x0b'	
 12 -> '\x0c'	 13 -> '\r'	 14 -> '\x0e'	 15 -> '\x0f'	
 16 -> '\x10'	 17 -> '\x11'	 18 -> '\x12'	 19 -> '\x13'	
 20 -> '\x14'	 21 -> '\x15'	 22 -> '\x16'	 23 -> '\x17'	
 24 -> '\x18'	 25 -> '\x19'	 26 -> '\x1a'	 27 -> '\x1b'	
 28 -> '\x1c'	 29 -> '\x1d'	 30 -> '\x1e'	 31 -> '\x1f'	
 32 -> ' '	 33 -> '!'	 34 -> '"'	 35 -> '#'	
 36 -> '$'	 37 -> '%'	 38 -> '&'	 39 -> '''	
 40 -> '('	 41 -> ')'	 42 -> '*'	 43 -> '+'	
 44 -> ','	 45 -> '-'	 46 -> '.'	 47 -> '/'	
 48 -> '0'	 49 -> '1'	 50 -> '2'	 51 -> '3'	
 52 -> '4'	 53 -> '5'	 54 -> '6'	 55 -> '7'	
 56 -> '8'	 57 -> '9'	 58 -> ':'	 59 -> ';'	
 60 -> '<'	 61 -> '='	 62 -> '>'	 63 -> '?'	
 64 -> '@'	 65 -> 'A'	 66 -> 'B'	 67 -> 'C'	
 68 -> 'D'	 69 -> 'E'	 70 -> 'F'	 71 -> 'G'	
 72 -> 'H'	 73 -> 'I'	 74 -> 'J'	 75 -> 'K'	
 76 -> 'L'	 77 -> 'M'	 78 -> 'N'	 79 -> 'O'	
 80 -> 'P'	 81 -> 'Q'	 82 -> 'R'	 83 -> 'S'	
 84 -> 'T'	 85 -> 'U'	 86 -> 'V'	 87 -> 'W'	
 88 -> 'X'	 89 -> 'Y'	 90 -> 'Z'	 91 -> '['	
 92 -> '\\'	 93 -> ']'	 94 -> '^'	 95 -> '_'	
 96 -> '`'	 97 -> 'a'	 98 -> 'b'	 99 -> 'c'	
100 -> 'd'	101 -> 'e'	102 -> 'f'	103 -> 'g'	
104 -> 'h'	105 -> 'i'	106 -> 'j'	107 -> 'k'	
108 -> 'l'	109 -> 'm'	110 -> 'n'	111 -> 'o'	
112 -> 'p'	113 -> 'q'	114 -> 'r'	115 -> 's'	
116 -> 't'	117 -> 'u'	118 -> 'v'	119 -> 'w'	
120 -> 'x'	121 -> 'y'	122 -> 'z'	123 -> '{'	
124 -> '|'	125 -> '}'	126 -> '~'	127 -> '\x7f'

 

2. ord(), chr(), hex()

  1. ord(): 문자를 해당하는 ASCII(또는 유니코드) 값으로 변환합니다. 이 함수는 하나의 문자열을 인자로 받으며, 해당 문자의 ASCII 코드 값을 정수로 반환합니다. 예를 들어, ord('A')는 65를 반환하며, ord('가')는 44032를 반환합니다.
  2. chr(): ASCII(또는 유니코드) 값을 해당하는 문자로 변환합니다. 이 함수는 하나의 정수를 인자로 받으며, 해당 정수에 해당하는 문자를 반환합니다. 예를 들어, chr(65)는 'A'를 반환하며, chr(44032)는 '가'를 반환합니다.

이 두 함수는 문자와 그에 대응하는 코드 값을 변환할 때 유용하게 사용됩니다. 예를 들어, 암호화, 디코딩, 데이터 처리 등에서 문자 데이터를 숫자 형태로 변환하거나 그 반대의 작업을 할 때 사용될 수 있습니다.

간단한 예시를 보여드리겠습니다:

# 문자에서 ASCII 코드로 변환
print(ord('A'))  # 65
print(ord('가'))  # 44032

# ASCII 코드에서 문자로 변환
print(chr(65))  # 'A'
print(chr(44032))  # '가'

print(hex(255))  # '0xff'
print(hex(10))   # '0xa'

1. ord() 함수를 사용한 예제: 문자열의 각 문자에 대한 ASCII 코드 얻기
이 예제에서는 문자열의 각 문자에 대한 ASCII 코드 값을 출력합니다.

text = "Hello"
ascii_values = [ord(char) for char in text]
print(ascii_values)

이 코드는 문자열 "Hello"의 각 문자에 대해 ord() 함수를 사용하여 ASCII 코드 값을 리스트로 만들고 출력합니다.

2. chr() 함수를 사용한 예제: ASCII 코드 값을 문자로 변환하기
이 예제에서는 ASCII 코드 값의 시퀀스를 해당 문자로 변환합니다.

codes = [72, 101, 108, 108, 111]
text = ''.join(chr(code) for code in codes)
print(text)

이 코드는 ASCII 코드 값 리스트 [72, 101, 108, 108, 111]를 문자열 "Hello"로 변환하여 출력합니다.

3. hex() 함수를 사용한 예제: 숫자를 16진수 문자열로 변환하기
이 예제에서는 숫자의 리스트를 16진수 문자열로 변환합니다.

numbers = [10, 255, 48879]
hex_values = [hex(number) for number in numbers]
print(hex_values)

 

마무리

- 이번 포스팅은 ASCII 코드 테이블을 만들고 변환하는 방에 대해 알아봤습니다.

 

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

 

 

728x90
반응형
728x90
반응형

 티스토리 

 

Python 데이터분석 필수 라이브러리 PANDAS

안녕하세요, 데이터 분석가 여러분! 오늘은 데이터 분석에 있어서 빼놓을 수 없는 필수 라이브러리, 바로 '판다스(Pandas)'에 대해 이야기해보려고 합니다. 판다스는 파이썬을 사용하는 데이터 과학자들에게 있어 빵과 버터와도 같은 존재죠. 왜냐하면, 이 라이브러리는 데이터 분석을 위한 효율적이고 강력한 도구를 제공하기 때문입니다.

판다스는 크게 두 가지 주요 데이터 구조를 제공하는데요, 바로 '시리즈(Series)'와 '데이터프레임(DataFrame)'입니다. 시리즈는 일련의 데이터를, 데이터프레임은 테이블 형태의 데이터를 다룰 때 사용합니다. 이 두 구조를 이해하는 것이 판다스를 활용하는 첫걸음입니다.

데이터프레임과 시리즈: 판다스의 핵심
데이터프레임은 여러분이 가장 자주 사용하게 될 구조입니다. 이것은 엑셀 스프레드시트와 유사하게 생각하면 쉽습니다. 여러 개의 열과 행으로 데이터를 구성하죠. 각 열은 시리즈라고 할 수 있습니다. 그래서, 데이터프레임은 여러 시리즈의 결합으로 볼 수 있어요.

시리즈는 단일 열의 데이터를 나타냅니다. 각각의 시리즈는 고유한 이름(열 이름)을 가지고 있고, 데이터프레임의 각 열을 구성합니다.

판다스로 데이터 불러오기 및 조작하기
판다스의 진정한 힘은 데이터를 쉽게 불러오고, 조작하고, 분석할 수 있다는 데 있습니다. read_csv, read_excel과 같은 함수를 사용하면 다양한 형식의 파일에서 데이터를 쉽게 불러올 수 있죠. 데이터를 불러온 후에는, head(), tail(), describe() 같은 메소드를 사용하여 데이터를 빠르게 살펴볼 수 있습니다.

데이터 조작은 판다스의 또 다른 강력한 기능입니다. sort_values(), drop(), fillna() 같은 메소드를 통해 데이터를 정렬하거나, 불필요한 열을 제거하거나, 누락된 값을 채울 수 있습니다.

실제 사례를 통한 판다스 활용
이론적인 부분도 중요하지만, 실제 사례를 통해 배우는 것이 더 효과적일 수 있습니다. 예를 들어, 실제 판매 데이터를 사용하여 월별 매출 분석을 해볼 수 있습니다. 이를 통해 판다스의 groupby(), pivot_table() 같은 기능을 실습해보며 데이터 분석 역량을 한층 더 키울 수 있습니다.

결론: 데이터 분석의 강력한 도구, 판다스
판다스는 데이터 분석에 있어서 강력하고 필수적인 도구입니다. 이 라이브러리를 통해 데이터를 쉽게 불러오고, 처리하고, 분석할 수 있습니다. 여러분이 데이터 과학자이든, 마케팅 분석가이든, 혹은 단순히 데이터에 관심이 많은 학습자이든 간에, 판다스는 여러분의 데이터 분석 여정에 큰 도움이 될 것입니다.

마무리

- 이번 포스팅은 파이썬 판다스 라이브러리에 대해 알아봤습니다.

 

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

 

 

728x90
반응형
728x90
반응형

 티스토리 

서로 다른 시계열 데이터프레임을 날짜 시간 순서로 병합(Merge)

Pandas 라이브러리는 데이터 조작 및 분석에 필수적인 도구입니다. 오늘은 Pandas를 사용하여 서로 다른 구조를 가진 두 데이터프레임을 날짜 및 시간을 기준으로 효과적으로 병합하는 방법을 탐구하겠습니다.

1. 코드리뷰

  

import pandas as pd
# 두 데이터프레임 생성
df1 = pd.DataFrame({
    'date': pd.to_datetime(['2023-10-13 0:00', '2023-10-14 1:00', '2023-10-15 2:00', 
                            '2023-10-16 3:00', '2023-10-17 4:00', '2023-10-18 5:00']),
    'A1': [1, 2, 3, 4, 5, 6],
    'B1': [3434, 1, 3, 45, 5, 675],
    'Vendor': ['SAMSUNG', 'TESLA', 'TESLA', 'SAMSUNG', 'TESLA', 'SAMSUNG']
})

df2 = pd.DataFrame({
    'date': pd.to_datetime(['2023-10-13 0:00', '2023-10-14 1:00', '2023-10-15 2:00', 
                            '2023-10-16 3:00', '2023-10-17 4:00', '2023-10-18 5:00']),
    'A1': [4, 8, 3, 5, 3, 2],
    'B1': [3434, 1, 3, 45, 5, 675],
    'Vendor': ['LG', 'KIA', 'TESLA', 'SAMSUNG', 'BMW', 'SAMSUNG'],
    'C2': ['JK1', 'JK3', 'JK5', 'DH3', 'LK2', 'MN2']
})

# 데이터프레임 병합 및 날짜 시간 순서 정렬
merged_df = pd.concat([df1, df2]).sort_values(by='date')


병합하기전 두개의 다른 데이터 프레임 

결과(OUTPUT) : 

 

2. 이슈사항

중복 데이터 확인: 두 데이터프레임이 날짜 및 시간이 동일한 열을 포함하고 있으므로, 병합 후 중복 데이터가 발생할 수 있습니다. drop_duplicates 메소드를 사용하여 중복을 제거할 수 있습니다. 

# 기존 코드에 중복 제거 추가 merged_df = pd.concat([df1, df2]).drop_duplicates().sort_values(by='date')

컬럼 일치성 확인: 두 데이터프레임의 컬럼이 일부 다릅니다. df1은 'C2' 컬럼이 없으므로, 병합 후 'C2' 컬럼에는 NaN 값이 들어갈 것입니다. 필요에 따라 이를 처리하는 로직을 추가할 수 있습니다. 

날짜 형식 일관성: 날짜 및 시간 데이터는 pd.to_datetime을 사용하여 일관된 형식으로 변환되어 있습니다. 이는 데이터 처리의 정확성과 효율성을 보장합니다.

Pandas를 사용하여 다른 형식의 데이터프레임을 날짜 및 시간을 기준으로 효율적으로 병합하는 방법을 배웠습니다. 이 방법은 데이터 분석에서 자주 마주치는 시나리오로, 이를 통해 데이터 전처리 과정을 간소화하고 분석의 정확성을 높일 수 있습니다.

마무리

- 이번 포스팅은 시계열 데이터프레임의 병합(Merge) 에 대해 알아봤습니다.

 

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

 

 

728x90
반응형
728x90
반응형

 티스토리 

데이터 프레임 특정 열 삭제

파이썬 판다스 데이터 프레임에서 특정 열을 삭제하는 방법은 두 가지가 있습니다.

drop(), del 키를 사용하는 2가지에 대해 알아 보겠습니다.

1. drop() 메서드 사용

 파이썬 판다스 데이터 프레임에서 특정 열을 삭제하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 다음과 같습니다.
drop() 메서드는 데이터 프레임에서 행 또는 열을 삭제하는 데 사용됩니다. 열을 삭제하려면 axis=1 매개변수를 설정하고 삭제할 열 이름을 지정해야 합니다.

df = df.drop('열 이름', axis=1)

예시

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

# 'B' 열 삭제
df = df.drop('B', axis=1)

print(df)

#   A  C
# 0  1  7
# 1  2  8
# 2  3  9

2. del 키워드 사용

 

del 키워드를 사용하여 데이터 프레임에서 열을 직접 삭제할 수도 있습니다.

del df['열 이름']

예시

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

# 'B' 열 삭제
del df['B']

print(df)

#   A  C
# 0  1  7
# 1  2  8
# 2  3  9

- 특정 조건에 따라 열 삭제

불리언 인덱싱 또는 loc 인덱서를 사용하여 특정 조건에 따라 열을 삭제할 수 있습니다.

예시

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

# 'B' 열의 값이 5보다 큰 경우 삭제
df = df.drop(df['B'] > 5, axis=1)

print(df)

#   A  C
# 0  1  7
# 1  2  8

- 여러 열 동시 삭제

drop() 메서드 또는 del 키워드를 사용하여 여러 열을 동시에 삭제할 수 있습니다.

예시

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9], 'D': [10, 11, 12]})

# 'B' 및 'D' 열 삭제
df = df.drop(['B', 'D'], axis=1)

print(df)

#   A  C
# 0  1  7
# 1  2  8
# 2  3  9

참고:

  • inplace=True 옵션을 사용하면 원본 데이터 프레임을 변경할 수 있습니다. 기본적으로 inplace=False이며, 새 데이터 프레임을 반환합니다.
  • axis=0 옵션을 사용하면 행을 삭제할 수 있습니다.

 

 df.drop() 사용 시 발생하는 흔한 에러 예시

1. 존재하지 않는 열 삭제 시도

df.drop("존재하지_않는_열", axis=1)

에러 메시지:

KeyError: '존재하지_않는_열'

해결 방법:

  • 삭제하려는 열 이름이 정확한지 확인합니다.
  • errors='ignore' 옵션을 사용하여 오류를 무시하고 진행할 수 있습니다.

예시:

df.drop("존재하지_않는_열", axis=1, errors='ignore')

2. 축(axis) 값 오류

df.drop("컬럼 이름", axis=2)  # axis 값이 잘못됨

에러 메시지:

ValueError: Wrong number of dimensions. Expected 1, got 2.

해결 방법:

  • axis 값이 0 또는 1인지 확인합니다.
  • 0은 행, 1은 열을 의미합니다.

3. inplace 옵션 오용

df = df.drop("컬럼 이름", axis=1, inplace=True)  # inplace 옵션 오용

# df 값이 None으로 변함

해결 방법:

  • inplace=True 옵션을 사용하면 원본 데이터 프레임이 변경됩니다.
  • 원본 데이터 프레임을 유지하려면 inplace=False를 사용해야 합니다.

4. 복수 열 삭제 시 라벨 오류

df.drop(["컬럼 이름1", "컬럼 이름2"], axis=1)  # 라벨 오류

# KeyError: "['컬럼 이름1', '컬럼 이름2'] not found in axis"

해결 방법:

  • 삭제하려는 열 이름이 리스트에 정확하게 포함되어 있는지 확인합니다.
  • 리스트 대신 튜플을 사용해도 됩니다.

5. MultiIndex 열 삭제 시 오류

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[("a", 1), ("b", 2), ("c", 3)])

df.drop("A", axis=1)  # MultiIndex 열 삭제 시 오류

# KeyError: 'A'

해결 방법:

  • MultiIndex 열을 삭제하려면 level 옵션을 사용해야 합니다.

예시:

df.drop("A", axis=1, level=0)
 

df.drop("A", axis=1, level=0) 코드에서 level=0의 의미

df.drop("A", axis=1, level=0) 코드에서 level=0은 MultiIndex의 첫 번째 레벨을 기준으로 삭제하라는 의미입니다.

1. MultiIndex란 무엇인가?

MultiIndex는 Pandas DataFrame에서 행 또는 열 인덱스를 여러 레벨로 구성하는 기능입니다. 각 레벨은 서로 다른 차원을 나타냅니다.

예시:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[("a", 1), ("b", 2), ("c", 3)])

print(df)

# 출력
#        A  B
# 0 (a, 1)  1  4
# 1 (b, 2)  2  5
# 2 (c, 3)  3  6

위 예시에서 DataFrame의 인덱스는 ("a", 1), ("b", 2), ("c", 3) 처럼 두 개의 레벨로 구성된 MultiIndex입니다. 첫 번째 레벨은 문자 a, b, c를 나타내고, 두 번째 레벨은 숫자 1, 2, 3을 나타냅니다.

2. level=0 옵션의 역할

df.drop("A", axis=1, level=0) 코드에서 level=0 옵션은 첫 번째 레벨인 문자 a, b, c를 기준으로 "A" 열을 삭제하라는 의미입니다. 즉, "A" 열이 포함된 모든 레벨 1 값이 삭제됩니다.

예시:

df = df.drop("A", axis=1, level=0)

print(df)

# 출력
#        B
# 0 (a, 1)  4
# 1 (b, 2)  5
# 2 (c, 3)  6

위 예시에서 "A" 열은 첫 번째 레벨인 문자 a, b, c 모두에서 삭제되었습니다.

3. level 옵션 사용 시 참고 사항

  • level 옵션은 MultiIndex를 사용하는 경우에만 사용할 수 있습니다.
  • level 옵션은 0부터 시작하며, 각 레벨은 정수 값으로 나타냅니다.
  • 여러 레벨을 동시에 삭제하려면 튜플 형태로 레벨 값을 지정할 수 있습니다.

 

마무리

- 이번 포스팅은 데이터 프레임 열 삭제에 대해 알아봤습니다.

 

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

 

 

728x90
반응형
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
반응형

+ Recent posts