043 파이썬 모듈 이해하기
파이썬에서는 각각의 소스 파일을 일컬어 모듈이라고 함. 이미 만들어져 있고 안정성이 검증된 함수들을 성격에 맞게 하나의 파일로 묶어 놓은 것을 모듈이라고 함.
외부의 모듈에 있는 함수를 사용하려면 이 모듈을 먼저 우리 코드로 가져와서 자유롭게 사용할 수 있도록 해야하는데 이런 일을 파이썬에서는 모듈을 import한다라고 함.
import pandas as pd #판다스라는 모듈을 임폴트해서 쓰겠다는 의미
emp = pd.read_csv("c:\\data\\emp2.csv") #판다스의 read_csv라는 함수를 호출
우리가 직접 모듈을 만들고 싶다면 아래와 같이하면 됨.
일단 함수를 생성함.
def add_number(n1,n2):
result = n1 + n2
return result
print(add_number(1,2))
위의 함수 생성 코드를 모듈로 생성 > 메모장을 열어 함수 생성 코드를 저장 ( add.py )
c:\User\ejcej 밑에 add.py라는 이름으로 저장. 저장하는 형식은 모든 파일
import add # add라는 모듈을 임폴트
print(add.add_number(1,2)) # add 모듈 안에 add_number라는 함수를 불러와서 실행함
문제174. coffee_kiosk 함수를 모듈로 만들어서 coffee_kiosk 함수를 호출하게 하시오.
import coffee as c
c.coffee_kiosk()
문제175. 현재 주피터 노트북에 현재 워킹 디렉토리를 확인하고 싶다면?
# 윈도우
!dir
# 맥 또는 리눅스
!pwd
C:\Users\ejcej 디렉터리
044 파이썬 패키지 이해하기
파이썬 모듈을 계층적인 디렉토리 형태로 구성한 것을 파이썬 패키지라고 함.
예제. c:\User\ejcej 디렉토리 밑에 my_loc7 이라는 폴더 생성
내가 작성하는 모든 모듈들을 하나의 폴더에서 관리하고 싶다면 my_loc7 폴더에 포듈을 넣으면 됨. 그러면 my_loc7폴더는 패키지가 됨.
예제. coffee.py와 add.py를 my_loc7 폴더에 넣으시오.
이제 my_loc7 폴더는 패키지가 됨.
예제. my_loc7 패키지에 있는 coffee 모듈을 불러오시오
# 문법
# from 패키지명 import 모듈명
from my_loc7 import coffee
045 파이썬 모듈 임포트 이해하기 ① (import)
이미 만들어져 있는 어떤 함수를 우리가 작성하는 코드에서 자유롭게 활용할 수 있으려면 해당 함수가 포함된 모듈을 임폴트 해야함.
# 문법
# import 모듈이름
# from 패키지 import 모듈이름
예제. 그동안 import pandas라고 했었는데 그렇다면 pandas.py는 어디 있는 것일까?
import 할 때 import 모듈이름하고 실행하면 파이썬이 모듈을 찾는 순서가 있음.
1. 파이썬 내장모듈
import sys
sys.builtin_module_names
# math 같은 모듈은 내장모듈임
2. sys.path에 정의되어 있는 모듈
import sys
for i in sys.path:
print(i)
# C:\Users\ejcej\anaconda3\lib\site-packages 안에 pandas라는 패키지가 있음
046 파이썬 모듈 임포트 이해하기 ② (from~import)
# 문법
# from 모듈이름 import 함수이름
# from 패키지이름 import 모듈이름
파이썬의 장점이 내가 다 코드를 작성하지 않아도 되고 누군가가 작성한 코드를 위의 방법으로 쉽게 불러와서 나에게 맞게 수정해서 쓸 수 있다는게 장점.
from datetime import datetime # datetime 패키지에 datetime모듈을 가져와서
now = str(datetime.now()) #datetime 모듈에 now라는 함수를 실행함.
print(now)
문제176. math모듈에 sqrt함수를 호출해서 아래의 수학식을 계산하시오.
import math
(3*math.sqrt(12))*(2*math.sqrt(17))+9*math.sqrt(53)
047 파이썬 모듈 임포트 이해하기 ③ (import~as)
# 문법
# import 모듈이름 as 별칭
import math as m
(3*m.sqrt(12))*(2*m.sqrt(17))+9*m.sqrt(53)
모듈이름이 길 경우 코드를 간단하게 작성하기 위해서 별칭 이용을 권장
문제177. emp2.csv를 판다스로 불러와서 월급으로 막대 그래프를 그리시오.
import pandas as pd
emp=pd.read_csv("c:\\data\\emp2.csv")
emp[['sal','ename']].plot.bar(x = 'ename', color = 'lightsteelblue')
이름과 월급을 가져오고 막대그래프를 그리면 이름과 월급 중에 숫자로 된 데이터에 대해서 막대 그래프를 그림.
x = 'x축 컬럼명'을 사용하여 x축 이름을 변경하고 color = '색'을 지정함
(구글에 파이썬 색상표 검색해서 참고하여 넣으면 됨)
문제178. 아래의 SQL을 판다스로 구현하시오!
-- SQL
select job, sum(sal)
from emp
group by job;
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
emp.groupby('job')['sal'].sum().reset_index()
문제179. 위의 결과를 result라는 변수에 담고 result를 실행하시오.
# 판다스
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
result = emp.groupby('job')['sal'].sum().reset_index()
result
#데이터 프레임의 컬럼명 변경
result.columns=['직업','토탈월급']
result
문제180. 위의 결과를 막대그래프로 그리시오.
# 한글 안깨지는 방법 = 폰트 설정을 바꿔줘야함 > 맑음(malgun) 폰트를 불러와야함
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
result.plot.bar(x='직업', color = 'lightsteelblue')
판다스에서 시각화할 때 한글안깨지게 하려면 한글폰트를 불러와야함.
문제181. 부서번호, 부서번호별 토탈월급을 막대그래프로 출력하시오
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
result = emp.groupby('deptno')['sal'].sum().reset_index()
result.columns=['부서번호','토탈월급']
result.plot.bar(x='부서번호', color = 'lightsteelblue')
ㅁ그룹함수 오라클과 판다스 비교
오라클 | 판다스 |
max() | max() |
min() | min() |
sum() | sum() |
count() | count() |
avg() | mean() |
문제182. 부서번호, 부서번호별 인원수를 막대그래프로 그리시오.
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
result = emp.groupby('deptno')['empno'].count().reset_index()
result.columns=['부서번호','인원수']
result.plot.bar(x='부서번호', color = 'lightsteelblue', ylabel = '인원수')
# emp.groupby('deptno')['empno'].count() > 각 행을 세기 위한 컬럼 아무거나 지정해야함.
# ylabel = '인원수' > y축에 컬럼명 넣을 때 사용
문제183. 부서번호, 부서번호별 인원수로 원형그래프를 그리시오.
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
result = emp.groupby('deptno')['empno'].count().reset_index()
result.columns=['부서번호','인원수']
result.plot.pie(y = '인원수',labels = [10,20,30], autopct='%1.1f%%', colors =['red','blue','green'])
# autopct='%1.1f%%' > 퍼센테이지 넣는 방법
# colors =['red','blue','green'] > 원형 그래프 색상 바꾸는 법
문제184. 직업, 직업별 토탈월급을 원형그래프로 그리시오.
# 범례(legend) 를 옮기는 방법
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
result = emp.groupby('job')['sal'].sum().reset_index()
result.columns=['직업','토탈월급']
result.plot.pie(y = '토탈월급',labels = result['직업'], startangle=30, autopct='%1.1f%%')
plt.legend(loc='best',bbox_to_anchor=(2, 1))
# bbox_to_anchor=(2,1)는 레전드의 위치를 x축 2, y축 1에 해당하는 위치로 지정하는 것임.
# 그 다음에 loc = 'best' 실행되면서 적정한 위치에 알아서 레전드를 위치 시킨다.
# 그래프 사이즈를 키우는 법
import pandas as pd
emp = pd.read_csv("c:\\data\\emp2.csv")
result = emp.groupby('job')['sal'].sum().reset_index()
result.columns = ['직업', '토탈월급']
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt # matplotlib패키지의 pyplot모듈을 가져옴
font_name = font_manager.FontProperties(fname = "c:/windows/Fonts/malgun.ttf").get_name()
rc('font', family = font_name)
result.plot.pie(y = '토탈월급', labels = result['직업'], autopct = '%1.1f%%', figsize = (10, 10))
plt.legend(loc = 'right')
참고 사이트
pyplot 그래프의 범주박스 위치 변경하기 (tistory.com)
pyplot 그래프의 범주박스 위치 변경하기
matplotlib.pyplot 그래프에서 범주(legend) 의 위치를 조정하고 싶을 때가 있다. 일반적으로, 범주는 다음과 같이 그린다. print(df) 성별 F M 년 2017 0.380887 0.619113 2018 0.372857 0.627143 df.plot(kind='..
dailyheumsi.tistory.com
문제185. (오늘의 마지막 문제) 인공지능화 될 커피 키오스크 프로그램에 관리자 모드에 정산할 때 맨 아래쪽에 커피종류, 커피종류별 총 매출액을 원형그래프로 시각화하는 코드를 추가하세요.
# 원형그래프
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name) #폰트설정
result = cafe.groupby('커피종류')['가격'].sum().reset_index()
result.columns=['커피종류','총매출']
result.plot.pie(y = '총매출',labels = result['커피종류'], startangle=100, autopct='%1.1f%%')
plt.legend(loc='best',bbox_to_anchor=(2, 1))
plt. title('커피종류별 총 매출액') #제목설정
plt.savefig("c:\\data\\coffee_piechart_"+ time+".png") #파이차트 이미지 자동저장
29. Matplotlib 이미지 저장하기
 **matplotlib.pyplot** 모듈의 **savef ...
wikidocs.net
ㅁ커피 키오스크 프로그램 코드
def coffee_kiosk():
import pandas as pd
print('='*16,' CAFE ','='*16)
print('1 :아메리카노:1500원 \n2 :카페라떼:2500원 \n3 :카페모카:3500원 \n4 :녹차라떼:3500원 \n\n10 > 결산(관리자용)')
print('='*40)
c_type = ['아메리카노','카페라떼','카페모카','녹차라떼']
c_stock = [20,10,30,20] # [0]: 아메리카노 재고, [1] : 카페라떼 재고, [2] : 카페모카 재고, [3] : 녹차라떼 재고
c_price = [1500,2500,3500,3500] # [0]: 아메리카노 가격, [1] : 카페라떼 가격, [2] : 카페모카 가격, [3] : 녹차라떼 가격
coupon = 0
order_no = 1
cafe_dict = {}
cafe_dict['주문번호'] = []
cafe_dict['주문시간'] =[]
cafe_dict['커피종류'] = []
cafe_dict['수량'] = []
cafe_dict['가격'] = []
while True:
# 전체 품절
if c_stock[0] == 0 and c_stock[1] == 0 and c_stock[2] == 0 and c_stock[3] == 0:
print('\n\n\n모든 커피가 품절입니다.')
print('='*40,'\n')
break
num = int(input('\n%d번손님,주문하시겠습니까? \n메뉴를 골라주세요. 번호를 눌러주세요.'%order_no))
# 주문
if num < 5:
print('%s를 선택하셨습니다.'%c_type[num-1])
if c_stock[num-1] == 0:
print('\n%s : 품절'%c_type[num-1])
print('\n다시 입력해주세요~')
continue
cup = int(input('몇 잔 주문하시겠습니까? '))
if cup > c_stock[num-1]:
print('\n죄송합니다. 주문량에 비해 %s가 부족합니다.'%c_type[num-1])
print('현재 주문 가능한 수량은 %d잔 입니다.' %c_stock[num-1], '다시 입력해주세요.')
cup = int(input('몇 잔 주문하시겠습니까? '))
price = c_price[num-1] * cup
print('\n결제하실 금액은 %d원 입니다.'%price)
# 쿠폰x, 정상결제 시
if coupon < 20:
money = int(input('돈을 입력하시오~ '))
if c_stock[num-1] >= cup and money >= price:
print('\n[주문번호 %d]'%order_no)
print('%s가 나왔습니다. 거스름돈은 '%c_type[num-1],money - price,'원 입니다.')
print('쿠폰이 %d개 발급되었습니다.(20개 모으면 한잔 무료)'%cup)
c_stock[num-1] -= cup
coupon += cup
print('현재 보유한 쿠폰 : %d개 '%coupon)
print('='*40,'\n')
from datetime import datetime
now = str(datetime.now())
cafe_dict['주문번호'].append(order_no)
cafe_dict['주문시간'].append(now)
cafe_dict['커피종류'].append(c_type[num-1])
cafe_dict['수량'].append(cup)
cafe_dict['가격'].append(price)
order_no += 1
elif c_stock[num-1] >= cup and money < price:
print('금액이 부족합니다. 돈을 반환합니다.')
print('='*40,'\n')
continue
#쿠폰 20개 이상
elif coupon >= 20:
question1 = int(input('쿠폰을 사용하시겠습니까?(1일 1회 1잔만 가능) \n예 : 1번\n아니오 : 2번 '))
# 쿠폰사용
if question1 == 1:
print('\n쿠폰 20개가 차감됩니다.')
coupon -= 20
if cup == 1:
price -= price
print('\n[주문번호 %d]'%order_no)
print('%s가 나왔습니다. 쿠폰은 발급되지 않습니다.'%c_type[num-1])
print('현재 보유한 쿠폰 : %d개 '%coupon)
print('='*40,'\n')
else:
price -= c_price[num-1]
money2 = int(input('결제할 차액은 %s 원 입니다. 돈을 입력하세요~ '%price))
if money2 >= price:
print('\n[주문번호 %d]'%order_no)
print('%s가 나왔습니다. 거스름돈은 %s원 입니다. 쿠폰은 발급되지 않습니다.'%(c_type[num-1],money2 - price))
print('현재 보유한 쿠폰 : %d개 '%coupon)
print('='*40,'\n')
elif money2 < price:
print('금액이 부족합니다. 돈을 반환합니다.')
print('='*40,'\n')
continue
from datetime import datetime
now = str(datetime.now())
cafe_dict['주문번호'].append(order_no)
cafe_dict['주문시간'].append(now)
cafe_dict['커피종류'].append(c_type[num-1])
cafe_dict['수량'].append(cup)
cafe_dict['가격'].append(price)
order_no += 1
#쿠폰 사용 안함
elif question1 == 2:
print('\n쿠폰을 사용하지 않습니다')
money = int(input('돈을 입력하시오~ '))
if c_stock[num-1] >= cup and money >= price:
print('\n[주문번호 %d]'%order_no)
print('%s가 나왔습니다. 거스름돈은 '%c_type[num-1],money - price,'원 입니다.')
print('쿠폰이 %d개 발급되었습니다.(20개 모으면 한잔 무료)'%cup)
c_stock[num-1] -= cup
coupon += cup
print('현재 보유한 쿠폰 : %d개 '%coupon)
print('='*40,'\n')
from datetime import datetime
now = str(datetime.now())
cafe_dict['주문번호'].append(order_no)
cafe_dict['주문시간'].append(now)
cafe_dict['커피종류'].append(c_type[num-1])
cafe_dict['수량'].append(cup)
cafe_dict['가격'].append(price)
order_no += 1
elif c_stock[num-1] >= cup and money < price:
print('금액이 부족합니다. 돈을 반환합니다.')
print('='*40,'\n')
continue
else:
print('번호를 잘못 입력했습니다. 처음 화면으로 돌아갑니다.')
# 결산(관리자용)
elif num == 10:
print('\n\n------- 관리자 모드로 실행됩니다 -------')
password = int(input('비밀번호를 입력하세요~ '))
if password == 1234:
print('\n\t정산 내역을 출력합니다')
break
else:
print('비밀번호가 틀렸습니다. 처음 화면으로 돌아갑니다.')
continue
# 메뉴 없음
else:
print('메뉴가 없습니다. 처음 화면으로 돌아갑니다.')
print('='*40,'\n')
continue
cafe = pd.DataFrame(cafe_dict)
time = now[:10]+'일_'+now[11:13]+'시_'+now[14:16]+'분_'+now[17:19]+'초' #현재시간
cafe.to_csv("c:\\data\\coffee_report_"+ time +".csv",encoding = "ANSI") #판다스 dataframe 자동저장
print('\n 오늘 지금까지 총 수익은 ',cafe['가격'].sum(),'원 입니다.')
# 원형그래프
from matplotlib import font_manager, rc
import matplotlib.pyplot as plt
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name) #폰트설정
result = cafe.groupby('커피종류')['가격'].sum().reset_index()
result.columns=['커피종류','총매출']
result.plot.pie(y = '총매출',labels = result['커피종류'], startangle=100, autopct='%1.1f%%')
plt.legend(loc='best',bbox_to_anchor=(2, 1))
plt. title('커피종류별 총 매출액') #제목설정
plt.savefig("c:\\data\\coffee_piechart_"+ time+".png") #파이차트 이미지 자동저장
return cafe
'Study > class note' 카테고리의 다른 글
python / open, close (0) | 2021.12.16 |
---|---|
커피키오스크 + 이미지 (0) | 2021.12.16 |
python / 함수(지역변수, 전역변수, return값) (0) | 2021.12.15 |
커피키오스크 최최종 (0) | 2021.12.15 |
python / 함수 (0) | 2021.12.15 |