데이터베이스

pandas라이브러리 & matplotlib.pyplot

Barbarian developer 2024. 10. 10.

<남여 성별 인구 비율 표현하기>

 

bar형 그래프

import os
import pandas as pd
import matplotlib.pyplot as plt


def load_csv(name:str) -> pd.DataFrame:
    try:
        df = pd.read_csv(name, encoding="cp949") #윈도우에서 작성된 파일이기 때문에 기본 구성이 cp949입니다. 리눅스에서는 utf-8을 사용합니다. 그렇기 때문에, 아래서 다시 선언합니다.
        print(f"'{os.path.basename(name)}'이 로드되었습니다.")
        return df
    except FileNotFoundError as e:
        print("해당 파일이 존재하지 않습니다.")
        return pd.DataFrame("[[]]")

 

def load_csv()함수는 csv파일을 불러오는 함수다.

 

try를 이용하여 예외 처리를 하여 프로그램의 에러를 잡는다.

 

def jeju_pop():
    df = load_csv("../data/gender.csv")
    print(df)

    m = []
    f = []

    name = input('찾고 싶은 지역의 이름을 입력하세요. : ')

    for idx, row in df.iterrows():
        if name in row.iloc[0]:
            for i in row.iloc[3:104]:
                m.append(-int(i))
            for i in row.iloc[106:]:
                f.append(int(i))
            break

    plt.style.use('ggplot')
    plt.figure(figsize=(10,5), dpi=300)
    plt.rc('font', family='Malgun Gothic')
    plt.rcParams['axes.unicode_minus'] = False
    plt.title(name+'Gender Population distribution')
    plt.barh(range(101), m, label='Man')
    plt.barh(range(101), f, label='Woman')
    plt.legend()
    plt.show()

 

iterrows() 함수를 사용하면 DataFrame의 각 행을 반복하면서 해당 행의 인덱스와 행 데이터를 받을 수 있다.

for index, row in df.iterrows():

의 형태로 쓰인다.

데이터 프레임의 행이나 칼럼의 순서를 나타내는 정수로 특정 값을 추출해오는 방법이다

 

iloc

iloc는 0부터 시작하는 인덱스를 사용하며, 슬라이싱도 지원한다.

df.iloc[0]은 첫 번째 행을 반환하고, df.iloc[:, 0]은 첫 번째 열을 반환한다

# 첫 번째 행 출력
row_1 = df.iloc[0]
print(row_1)
# 두 번째 열 출력
col_2 = df.iloc[:, 1]
print(col_2)
# 첫 번째 행, 두 번째 열의 값 출력
value = df.iloc[0, 1]
print(value)

pie형 그래프

def want_pop():
    df = load_csv("../data/gender.csv")

    size = []

    name = input('찾고 싶은 지역의 이름을 입력하세요. : ')
    for idx, row in df.iterrows():
        if name in row.iloc[0] :
            m = 0
            f = 0
            for i in range(101) :
                m += int(row.iloc[i+3])
                f += int(row.iloc[i+106])
            break
    size.append(m)
    size.append(f)

    color = ['crimson', 'yellow']
    plt.axis('equal')

    plt.pie(size, labels = ['Male','Female'], autopct = '%.1f%%', colors=color, startangle=90)
    plt.title("Male and female population distribution in the region")
    plt.show()

 

def main() -> None:
    # jeju_pop()
    want_pop()

if __name__ == "__main__":
    main()

 

타이타닉을 이용한 그래프 생성

import os
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def load_csv(name:str) -> pd.DataFrame:
    try:
        df = pd.read_csv(name, encoding="cp949") #윈도우에서 작성된 파일이기 때문에 기본 구성이 cp949입니다. 리눅스에서는 utf-8을 사용합니다. 그렇기 때문에, 아래서 다시 선언합니다.
        print(f"'{os.path.basename(name)}'이 로드되었습니다.")
        return df
    except FileNotFoundError as e:
        print("해당 파일이 존재하지 않습니다.")
        return pd.DataFrame("[[]]")

def survived_probability():
    df=load_csv('../data/titanic.csv')

    size = []

    print(len(df[df['Survived'] == 1]))
    print(len(df[df['Survived'] == 0]))

    live = len(df[df['Survived'] == 1])
    die = len(df[df['Survived'] == 0])

    size.append(live)
    size.append(die)

    color = ['crimson', 'yellow']
    plt.axis('equal')
    plt.pie(size, labels=['live', 'die'], autopct='%.1f%%', colors=color, startangle=90)
    plt.title("survive")
    plt.show()

def survive_gender():
    df = load_csv('../data/titanic.csv')

    size = []

    print(len(df[(df['Survived'] == 1) & (df['Sex'] == 'male')]))
    print(len(df[(df['Survived'] == 1) & (df['Sex'] == 'female')]))

    live_male = len(df[(df['Survived'] == 1) & (df['Sex'] == 'male')])
    live_female = len(df[(df['Survived'] == 1) & (df['Sex'] == 'female')])

    size.append(live_male)
    size.append(live_female)

    color = ['crimson', 'yellow']
    plt.axis('equal')
    plt.pie(size, labels=['male', 'female'], autopct='%.1f%%', colors=color, startangle=90)
    plt.title("male vs female")
    plt.show()


def titanic_prob(target:str, live:bool=True, graph:str="pie"): #target은 원하는 컬렴명.
    df = load_csv('../data/titanic.csv')
    if live: a, b = "Live", 1
    else: a, b = "Die", 0
    size = []

    unique_value = df[target].unique()  #unique()라는 함수는 pandas에서 제공하는 메서드함수로, 유일한 값을 찾는데 사용되는 함수이다.
    unique_value_ = unique_value[~pd.isnull(unique_value)] #pd는 pandas에서 제공하는 메서드 함수이며, '~'는 not을 의미한다. isnull은 널인 것 즉, 널이 아닌 것만 선별하여 다시 변수에 저장한다는 의미이다.
    for v in unique_value_:
        v1 = len(df[(df['Survived'] == b) & (df[target] == v)])
        size.append(v1)

    #기본 그래프 모양은 pie
    if graph == "pie":
        plt.pie(size, labels=unique_value_, autopct='%.1f%%', startangle=90)
        plt.title(f"{target} {a} Prob.")
        plt.show()
    #마지막 인자에 "bar"를 추가하면 그래프형식으로 바꿔준다.
    elif graph == "bar":
        plt.bar(unique_value_, size)
        plt.title(f"{target} {a} Prob.")
        plt.show()

    df.plot(kind='bar', figsize=(10, 5), stacked=True)
    plt.xlabel('age_cat')
    plt.ylabel('rate')
    plt.show()

    print(df.head())

def main() -> None:
    # survived_probability()
    # survive_gender()
    titanic_prob("Age", True, "bar")

if __name__ == "__main__":
    main()

 

타이타닉 생존자 중 Age 컬럼을 bar형 그래프로 출력하고 싶을 때

def main() -> None:
    titanic_prob("Age", True, "bar")

타이타닉 생존자 중 Embarked을 pie형으로 출력하고 싶을 때

def main() -> None:
  titanic_prob("Embarked", True)

타이타닉 생존자 중 Sex를 pie형으로 출력하고 싶을 때

def main() -> None:
    titanic_prob("Sex", True)

'데이터베이스' 카테고리의 다른 글

프로시저와 트리거  (0) 2024.09.20
수강신청 DB만들어보기  (0) 2024.09.08
DB 만들어보기  (0) 2024.09.06
Data Base  (0) 2024.08.18

댓글