Python 데이터 분석

Python 데이터분석 기초 22 - 원격 DB와 연동 후 DataFrame으로 처리, 시각

코딩탕탕 2022. 11. 2. 17:56

 

'''
원격 DB와 연동 후 DataFrame으로 처리
'''
import MySQLdb
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from conda.common._logic import FALSE
plt.rc('font', family='malgun gothic')
plt.rcParams['axes.unicode_minus'] = False
import pickle
import csv


try:
    with open('mydb.dat', mode='rb') as obj:
        config=pickle.load(obj) 
except Exception as e:
    print('connect err : ', e)


try:
    conn=MySQLdb.connect(**config)
    cursor = conn.cursor()
    sql="""
    select jikwon_no, jikwon_name, buser_name, jikwon_jik, jikwon_gen, jikwon_pay
    from jikwon inner join buser
    on buser_num=buser_no
    """
    cursor.execute(sql)
    
    #출력 1 --> DataFrame
    df1=pd.DataFrame(cursor.fetchall(),
                     columns=['jikwon_no', 'jikwon_name', 'buser_name', 'jikwon_jik', 'jikwon_gen', 'jikwon_pay'])
    print(df1.head(3))
    
    #출력 2 --> csv 파일
    with open("직원.csv", mode='w', encoding='utf-8') as fo:
        writer = csv.writer(fo)
        for r in cursor:
            writer.writerow(r)

    # csv 읽기
    df2=pd.read_csv("직원.csv", names=['번호','이름','부서','직급', '성별','연봉'])
    print(df2.head(3))

    print()
    df = pd.read_sql(sql, conn)
    df.columns = ['번호','이름','부서','직급', '성별','연봉']
    print(df.head(3))
    print()
    print('건수 :', len(df), df['이름'].count())
    print('직급별 인원수 :', df['직급'].value_counts())
    print('연봉 평균 :', df.loc[:,'연봉'].mean())
    print('연봉 표준편차 :', df.loc[:,'연봉'].std())
    ctab = pd.crosstab(df['성별'], df['직급'], margins = True) # 각 직급별로 성별 구분
    print(ctab)

    # 시각화 : 직급별 연봉 평균
    jik_ypay = df.groupby(['직급'])['연봉'].mean() # 직급별로 연봉 평균 구하기
    print(jik_ypay, type(jik_ypay))
    print(jik_ypay.index)
    print(jik_ypay.values)
    
    plt.pie(jik_ypay, explode = (0.2,0,0,0.3,0), labels = jik_ypay.index, shadow = True,
        labeldistance=0.8, counterclock=False)
    plt.show()
    
except Exception as e:
    print('process err : ', e)
finally:
    cursor.close()
    conn.close()
    
<console>
   jikwon_no jikwon_name buser_name jikwon_jik jikwon_gen  jikwon_pay
0          1         홍길동        총무부         이사          남        9900
1          2         한송이        영업부         부장          여        8800
2          3         이순신        영업부         과장          남        7900
   번호   이름   부서  직급 성별    연봉
0   1  홍길동  총무부  이사  남  9900
1   2  한송이  영업부  부장  여  8800
2   3  이순신  영업부  과장  남  7900

   번호   이름   부서  직급 성별    연봉
0   1  홍길동  총무부  이사  남  9900
1   2  한송이  영업부  부장  여  8800
2   3  이순신  영업부  과장  남  7900

건수 : 30 30
직급별 인원수 : 사원    13
대리     7
과장     6
부장     3
이사     1
Name: 직급, dtype: int64
연봉 평균 : 5305.0
연봉 표준편차 : 2069.6222377275885
직급   과장  대리  부장  사원  이사  All
성별                          
남     4   3   2   5   1   15
여     2   4   1   8   0   15
All   6   7   3  13   1   30
직급
과장    7200.000000
대리    5064.285714
부장    8466.666667
사원    3476.923077
이사    9900.000000
Name: 연봉, dtype: float64 <class 'pandas.core.series.Series'>
Index(['과장', '대리', '부장', '사원', '이사'], dtype='object', name='직급')
[7200.         5064.28571429 8466.66666667 3476.92307692 9900.        ]

 

 

원형 차트 시각화