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 형식이 아닌 태그까지 나오게 된다.