본문 바로가기
Machine Learning

머신러닝 / Python / Pandas 판다스 / MariaDB 연결

by with chu 2021. 3. 11.
728x90

Python - MariaDB 연결

목표 : 원격 DB연결 후 DataFrame에 저장


 

파일명 : db_remote.py

import MySQLdb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import csv
import ast
import sys
plt.rc('font', family='malgun gothic') # 한글자료를 받아오기 위해 폰트입력

try : 
    with open('mariadb.txt','r') as f:
        config = f.read()
except Exception as e:
    print('read err : ',e)
    sys.exit()
    
config = ast.literal_eval(config) # dict type으로 변환
print(config)

try ~ except 블럭으로 마리아디비 연결을 시도한다.

config 를 ast.literal_eval 로 str에서 dict type으로 바꿔준다.

 

try:
    conn = MySQLdb.connect(**config)
    cursor = conn.cursor()
    sql = """
    select jikwon_no, jikwon_name, jikwon_jik, buser_name, jikwon_gen, jikwon_pay
    from jikwon inner join buser
    on jikwon.buser_num=buser.buser_no
    """
    cursor.execute(sql)
    for(jikwon_no, jikwon_name, jikwon_jik, buser_name, jikwon_gen, jikwon_pay) in cursor:
        print(jikwon_no, jikwon_name, jikwon_jik, buser_name, jikwon_gen, jikwon_pay)
    
    #jikwon.csv로 저장
    """
    with open('jikwon.csv','w',encoding='utf-8') as fw:
        writer = csv.writer(fw)
        for row in cursor:
            writer.writerow(row)
        print('success')
    """
    
    print('============ csv 파일읽기 1===========')
    df1 = pd.read_csv('jikwon.csv',header=None, names=('번호','이름','직급','부서','성별','연봉'))
    print(df1.head(3))
    print(df1.shape) # (30, 6)

    print('============ csv 파일읽기 2 ===========')
    df2 = pd.read_sql(sql,conn)
    df2.columns = ('번호','이름','직급','부서','성별','연봉')
    print(df2.head(3))
    
 
except Exception as e:
    print('process err : ',e)
finally:
    cursor.close()
    conn.close()

sql 문장을 쓰고 cursor로 실행한다.

config 를 csv.writer로 저장하고 pd.read_csv로 읽어온다. 

df1.shape을 통해 모든 데이터가 잘 불러와졌는지 확인할 수 있다.

 

 

추가 )

    print('인원수 : ',len(df2))
    print('인원수 : ',df2['이름'].count())
    print('직급별 인원수 : ',df2['직급'].value_counts())
    print('연봉평균 : ',df2.loc[ :,'연봉'].sum() / len(df2))
    print('연봉평균 : ',df2.loc[ :,'연봉'].mean())
    print('연봉요약통계 : \n',df2.loc[ :,'연봉'].describe())
    print('연봉 8000이상인 행 : \n',df2.loc[df2['연봉'] >= 8000])
    print('연봉 7000이상인 영업부 : \n',df2.loc[(df2['연봉'] >= 7000) & (df2['부서']=='영업부')])
    
    print('==========crosstab==========')
    ctab = pd.crosstab(df2['성별'],df2['직급'],margins=True)
    print(ctab)
    
    print('=========groupby==========')
    print(df2.groupby(['성별','직급'])['이름'].count())
    
    print('===========pivot_table=============')
    print(df2.pivot_table(['연봉'],index=['성별'],columns=['직급'],aggfunc=np.mean))
    
    #시각화
    #직급별 연봉평균
    jik_ypay = df2.groupby(['직급'])['연봉'].mean()
    print(jik_ypay, type(jik_ypay))
    print(jik_ypay.index)
    print(jik_ypay.values)
    
    plt.pie(jik_ypay,labels=jik_ypay.index,
            labeldistance=0.5,
            counterclock=False,
            shadow=True,
            explode=(0.2, 0, 0, 0.3, 0)) # cake처럼 떨어져나감
    plt.show()
    

읽어온 데이터로 crosstab,  groupby, pivot_table 을 만들거나 아래와 같이 plt.pie를 이용해 시각화해볼 수 있다.

 

728x90

댓글