ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 데이터분석 기초 23 - Django에서의 DataFrame, crosstab, 시각화
    Python 데이터 분석 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 형식이 아닌 태그까지 나오게 된다.

     

     

     

     

     

     

     

    댓글

Designed by Tistory.