Python 데이터 분석
Python 데이터분석 기초 23 - Django에서의 DataFrame, crosstab, 시각화
코딩탕탕
2022. 11. 3. 11:32
models.py
from django.db import models
# Create your models here.
class Jikwon(models.Model):
jikwon_no = models.IntegerField(primary_key=True)
jikwon_name = models.CharField(max_length=10)
buser_num = models.IntegerField()
jikwon_jik = models.CharField(max_length=10, blank=True, null=True)
jikwon_pay = models.IntegerField(blank=True, null=True)
jikwon_ibsail = models.DateField(blank=True, null=True)
jikwon_gen = models.CharField(max_length=4, blank=True, null=True)
jikwon_rating = models.CharField(max_length=3, blank=True, null=True)
class Meta:
managed = False
db_table = 'jikwon'
maria DB에 있는 데이터를 aa.py라는 파일에 넣고 그것을 models.py로 넣는다.
migrations, migrate를 적용시킨다.
urls.py
from django.contrib import admin
from django.urls import path
from mypandas import views
urlpatterns = [
path("admin/", admin.site.urls),
path("", views.mainFunc),
path("showjikwon", views.showFunc)
]
views.py
from django.shortcuts import render
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mypandas.models import Jikwon
plt.rc('font', family = 'malgun gothic')
# Create your views here.
def mainFunc(request):
return render(request, 'main.html')
def showFunc(request):
jikwons = Jikwon.objects.all().values()
# print(Jikwons)
df = pd.DataFrame.from_records(data = jikwons)
df.columns = ['사번', '직원명', '부서', '직급', '연봉', '입사', '성별', '평점']
# print(df.head(2))
# 직급별 연봉합/평균
jik_group = df['연봉'].groupby(df['직급'])
# print(jik_group.sum())
jik_group_detail = {'sum':jik_group.sum(), 'avg':jik_group.mean()}
df2 = pd.DataFrame(jik_group_detail)
# dict 타입으로 합과 평균 함수를 적용하고 DataFrame으로 표로 작성
# print(df2)
# crosstab
ctab = pd.crosstab(df['직급'],df.성별) # df['직급'],df.성별 둘 다 같은 방법
# print(ctab)
# 시각화
jik_result = jik_group.agg(['sum','mean']) # 열 컬럼 변경
print(jik_result)
jik_result.plot(kind = 'barh') # DataFrame으로 시각화를 진행(가로막대)
plt.title('직급 별 연봉 합/평균')
plt.xlabel('연봉')
plt.ylabel('직급')
fig = plt.gcf()
fig.savefig('django12_pandas/mypandas/static/images/jik.png') # 무조건 절대 주소를 적어야 된다(프로젝트 명부터).
return render(request, 'list.html', # html 형식(테이블)으로 넘어간다.
{'datas':df.to_html(index = False, border = 1),
'jik_group' : jik_group,
# 'jik_group2' : jik_group.to_html() # to_html 함수를 쓰지 않으면 넘길 수 없다.
'jik_group_detail':df2.to_html(),
'ctab':ctab.to_html()
})
DataFrame 방식, crosstab 방식, 시각화를 이곳에서 작성하였다.
시각화 이미지를 저장할 때는 무조건 절대 경로로 설정해야된다. 프로젝트 명부터 적으면 된다.
main.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>홈페이지</p>
<a href="showjikwon">직원자료 출력</a>
</body>
</html>
list.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원 자료</h2>
{% if datas %}
{{datas|safe}}
{% endif %}
<hr>
직급별 연봉 합:<br />
과장 : {{jik_group.sum.과장}} <br />
대리 : {{jik_group.sum.대리}} <br />
사원 : {{jik_group.sum.사원}} <br />
<hr>
{{jik_group_detail | safe}} <!-- |safe를 넣지 않으면 태그까지 나온다. -->
<hr>
직급별 성별 인원수 : <br />
{{ctab|safe}}
<br />
<img src="/static/images/jik.png"/>
</body>
</html>
pandas의 DataFrame(to_html())을 사용하면 table을 만들지 않아도 알아서 만들어진다. |safe는 꼭 사용!
사용하지 않으면 table 형식이 아닌 태그까지 나오게 된다.