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
'Machine Learning' 카테고리의 다른 글
상관 분석 / Correlation Analysis / 피어슨 / 스피어만 / 켄달 상관계수 (0) | 2021.03.30 |
---|---|
머신러닝 / Iris 데이터 분류 / 5가지 모델 작성법 (Logistic Regression/SVM/Random Forest/Naïve Bayes/Tree) (0) | 2021.03.18 |
머신러닝 / 선형회귀분석 / 모델 작성후 추정치 얻기 (0) | 2021.03.11 |
머신러닝 / Python / ANOVA(analysis of variance) / 분산분석 (0) | 2021.03.11 |
머신러닝 / 웹크롤링 / 형태소분석 / WordCloud 차트 출력하기 (2) | 2021.03.10 |
댓글