본문 바로가기

TIL 통합

12/20 일지 - 팀플 파이썬(피봇테이블, 히트맵, replace, query, np.where)

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rc('font', family='NanumBarunGothic')

#한글 깨짐 방지! 실행하고서 런타인 세션 재시작
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf


#1. 불러오기 및 기본 가공 : 2~5 피봇테이블 및 히트맵 만드는 데 필수!
#1)불러오기
ycn = pd.read_csv('/content/illegal_parking.csv')

#2)단속일시 시간 칼럼 및 요일, 시간 칼럼 만들기
format = '%Y-%m-%dT%H-%M-%S.%f'
ycn['단속일시자료'] = pd.to_datetime(ycn['단속일시'], format=format, infer_datetime_format=True)
ycn['단속요일'] = ycn['단속일시자료'].dt.day_name()
ycn['단속시간'] = ycn['단속일시자료'].dt.hour

#3)요일 자료 정렬해줄 weeks 미리 형성
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']



#2. 양천구 전체
#1)요일 시간 피봇테이블 만들기
weeks = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
all_pivot = pd.pivot_table(ycn, values = '연번',
                               index = ['단속요일'],
                               columns= ['단속시간'],
                               aggfunc="count").agg(weeks)
#2)히트맵 만들기
plt.figure(figsize = (14, 5))
plt.pcolor(all_pivot)
plt.xticks(np.arange(0, len(all_pivot.columns), 1), all_pivot.columns)
plt.yticks(np.arange(0, len(all_pivot.index), 1), all_pivot.index)
plt.title('양천구 요일별 단속 시간 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()



#3. 동별 비교 데이터
#1)동이름 정정 칼럼 만들기
ycn = pd.read_csv('/content/illegal_parking.csv')
ycn['단속동'] = ycn['단속동'].str.replace('목  동', '목동')      #<----'단속동' 칼럼의 모든 '목  동'을 '목동'으로 바꿈
ycn['동이름 정정'] = np.where(ycn['단속동'].str.contains(r'(신월)'), '신월동', np.where(ycn['단속동'].str.contains(r'(신정)'), '신정동', np.where(ycn['단속동']=='목동', '목동', '기타')))
#<-------'단속동'칼럼에 '신월'이 있으면 '신월동'으로, '신정'있으면 '신정동'으로, '목동'은 '목동'으로 입력되는 "동이름 정정"칼럼 생성(np.where : 조건에 따라 칼럼 생성)

#2)정정된 동이름으로 막대그래프 만들기
dongdata = ycn.groupby('동이름 정정')['연번'].count()

plt.figure(figsize = (7,7))
plt.bar(dongdata.index, dongdata)
plt.title('동별주정차위반건수')
plt.xlabel('동')
plt.xticks(rotation=70)
plt.ylabel('건수')
plt.show

#3)동별 요일별 자료 피봇테이블 및 히트맵 만들기
dong_week_pivot = pd.pivot_table(ycn, values = '연번',
                                 index = ['단속요일'],
                                 columns = ['동이름 정정'],
                                 aggfunc='count').agg(weeks)

plt.figure(figsize = (8, 6))
plt.pcolor(dong_week_pivot)
plt.xticks(np.arange(0, len(dong_week_pivot.columns), 1), dong_week_pivot.columns)
plt.yticks(np.arange(0, len(dong_week_pivot.index), 1), dong_week_pivot.index)
plt.title('양천구 동/요일별 단속건수 히트맵')
plt.xlabel('동')
plt.ylabel('요일')
plt.colorbar()
plt.show()

#4)동별 시간별 피봇테이블 및 히트맵 만들기
dong_hour_pivot = pd.pivot_table(ycn, values = '연번',
                                 index = ['단속시간'],
                                 columns = ['동이름 정정'],
                                 aggfunc='count')

plt.figure(figsize = (8, 6))
plt.pcolor(dong_hour_pivot)
plt.xticks(np.arange(0, len(dong_hour_pivot.columns), 1), dong_hour_pivot.columns)
plt.yticks(np.arange(0, len(dong_hour_pivot.index), 1), dong_hour_pivot.index)
plt.title('양천구 동/시간별 단속건수 히트맵')
plt.xlabel('동')
plt.ylabel('요일')
plt.colorbar()
plt.show()



#4. 목동 데이터
#1)목동 여부 칼럼 만들기
ycn['목동'] = np.where(ycn['단속동']=='목동', 1, 0) #<-----'단속동'이 '목동'이면 1, 아니면 0인 "목동"칼럼 생성

#2)목동인 케이스(행)만 뽑아서 테이블 만들고 인덱스 리셋
ycn_mokdong = ycn.query('목동 == 1')      #<-------'목동'칼럼이 1인 케이스(행)들만으로 테이블 생성
ycn_mokdong = ycn_mokdong.reset_index()

#3)목동 요일 시간 피봇테이블 및 히트맵 만들기
mokdong_pivot = pd.pivot_table(ycn_mokdong, values = '연번',
                               index = ['단속요일'],
                               columns = ['단속시간'],
                               aggfunc='count').agg(weeks)

plt.figure(figsize = (14, 5))
plt.pcolor(mokdong_pivot)
plt.xticks(np.arange(0, len(mokdong_pivot.columns), 1), mokdong_pivot.columns)
plt.yticks(np.arange(0, len(mokdong_pivot.index), 1), mokdong_pivot.index)
plt.title('목동 시간/요일별 단속건수 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()



#5.교육기관
#1)교육기관 여부 칼럼 만들기
ycn['교육기관'] = np.where(ycn['단속장소'].str.contains(r'(여고|학교|어린이집|유치원|초교|학원)'), '1', "0")
#<------------'단속장소'에서 '여고, 학교, 어린이집, 유치원, 초교, 학원' 중 하나라도 언급되는 케이스는 1로 표시, 그렇지 않으면 0으로 표시되는 "교육기관"칼럼 생성

#2)교육기관에 해당하는 행들만 뽑아서 새 테이블 만들고 인덱스 리셋
ycn_schools = ycn.query('교육기관 == "1"')   #<-------'교육기관' 칼럼이 1인 케이스(행)들만으로 테이블 생성
ycn_schools.reset_index()

#3)교육기관 피봇테이블 및 히트맵 만들기
schools_pivot = pd.pivot_table(ycn_schools, values = '연번',
                               index = ['단속요일'],
                               columns= ['단속시간'],
                               aggfunc="count").agg(weeks)

plt.figure(figsize = (14, 5))
plt.pcolor(schools_pivot)
plt.xticks(np.arange(0, len(schools_pivot.columns), 1), schools_pivot.columns)
plt.yticks(np.arange(0, len(schools_pivot.index), 1), schools_pivot.index)
plt.title('교육기관 요일시간 교차 히트맵')
plt.xlabel('시간')
plt.ylabel('요일')
plt.colorbar()
plt.show()

 


TMI

-직접 가서 살지 고민하다가 시간도 없고, 노트북만으로 너무 피로해져서 쿠팡으로 산 모니터 점심에 도착. 삶의 질이 대폭 상승했다. 급하게 마련한 노트북 받침은 남아도는 소프트 커버 석사논문. 여러모로 상징적.

-어제까지만 해도 프로젝트에서 파이썬을 써먹기 너무 힘들 것 같다고 생각했는데, 막히는 부분이 풀리니 신나서 히트맵을 주구장창 만들었다. 어제 낮에 피곤한 채로 아무것도 잘 안 풀리니까 진만빠지면서 골골거리다가, 밤에 막히는 코드에 대한 답을 알고나니 난데없이 머리가 생생해져서 새벽 3시에 히트맵 만들고 노션 작성하다가 잠;;

결국 아침운동은 무슨 8시 30분에 일어나서 점심이랑 저녁에 틈틈이 홈트랑 요가?하는 것밖에 못했는데 언제쯤 생활 패턴이 잡힐런지 껄껄. 그래도 애매하게 자는 것보단 그냥 확 적게 자는게 나은 건지 오늘 하루 종일 컨디션은 멀쩡했다.

-프로젝트하다보니 넘 재밌고, 적어도 다음주까지는 팀원이 유지되면 좋겠다.