# 초기화
## 모듈을 가져온다.
import pandas as pd
import numpy as np
from pandas import Series, DataFrame
# 그래픽에 필요한 페키지와 라이브라리...
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
%matplotlib inline
## 폰트지정....
plt.rcParams["font.family"] = 'NanumGothic'
plt.rcParams["font.size"] = 18
# 폰트를 지정하면 그래프에서 마이너스 폰트가 깨져서 다음과 같이 셋팅
mpl.rcParams["axes.unicode_minus"] = False
now = '2019-05-30 02:00 pm'
type(now)
str
# 날짜와 시간은 해당 타입에 맞는 날짜와 시간을 사용해야 한다.
from datetime import datetime, date, time
# 모듈은 datetime 폴더 안에 datetime.py, date.py, time.py가 있어서(또는 구조로) 위와 같이 from ~ import 한다.
# 날짜는 [일자-시간] --> datetime, date, time 세개가 있는 이유.
# datetime은 원하는 단위까지 지정하면된다.
# 지정되지 않은 값은 0 이다.
dt = datetime(2019, 5, 30, 16)
# 문자열 포멧을 이용해서 각 요소를 가져....
'{0}-{1}-{2}'.format(dt.year, dt.month, dt.day)
'2019-5-30'
# 날짜에 대한 포멧을 이용해 다음과 같이 할수도 있다.
'{0.year}-{0.month}-{0.day} {0.hour}:{0.minute:02d}'.format(dt)
'2019-5-30 16:00'
# date 추출
dt.date()
datetime.date(2019, 5, 30)
# 시간 추출
dt.time()
datetime.time(16, 0)
dt.strftime('%Y-%m-%d %H:%M')
'2019-05-30 16:00'
# strftime 함수는 한국어 처리가 안된다.
# dt.strftime('%Y년%m월%일 %H:%M') --> 오류가 발생 한다.
# 한글을 쓰기 위해서는 문자열 포멧을 사용해야 한다.
'{0.year}년{0.month}월{0.day}일 {0.hour}:{0.minute:02d}'.format(dt)
'2019년5월30일 16:00'
# 문자열을 datetime으로 변환하기
# 국가별로 년, 월, 일의 위치가 다르다.
# 단서 변수는 해석하는 방식(지역화)에 따라서 값이 달라진다.
# 년/월/일, 월/일/년, 일/월/년 --> 국가별로 다르게 봄.
단서 = "07/11/17"
datetime.strptime(단서, '%d/%m/%y')
datetime.datetime(2017, 11, 7, 0, 0)
# 문자열을 읽어서 변환하는 경우 한글을 사용할 수 있다.
datetime.strptime("2019년 5월 30일", '%Y년 %m월 %d일')
datetime.datetime(2019, 5, 30, 0, 0)
from dateutil.parser import parse
## 문자열을 알아서 파싱....
parse('May 15, 2019 04:50 pm')
datetime.datetime(2019, 5, 15, 16, 50)
# parse 함수는 한국어 처리가 안된다.
# 에러 발생.
# parse('2017년 9월 15일')
# strptime 함수를 사용해야 한다.
# 날짜를 요소로 가지는 시리즈
날짜시리즈 = Series(['2019-03-01', '2019-05-30'])
날짜시리즈
0 2019-03-01 1 2019-05-30 dtype: object
## 날짜 값을 가지는 문자열을 날짜 타입으로 변환.
pd.to_datetime(날짜시리즈)
0 2019-03-01 1 2019-05-30 dtype: datetime64[ns]
now = datetime.now()
print(now)
2019-05-30 16:27:29.507328
now.weekday()
3
# 숫자로 나오는 이유는 문자의 지역화 문제가 있기 때문이다.
# 요일.... 리스트로 변환
요일맵 = list('월화수목금토일')
요일맵
['월', '화', '수', '목', '금', '토', '일']
요일맵[now.weekday()]
'목'
## 식당의 주문 자료....
식당 = pd.read_excel('data/food_order.xlsx')
식당[:5]
date | dine_type | corner | menu | is_sold_out | use_count | pred_count | additional | good | ok | bad | diff_use_pred | year | month | day | wday | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2013-08-06 | dinner | grill & fry | 훈제연어벤또(200개) | F | 213 | 0 | 0 | 0 | 0 | 0 | -213 | 2013 | 8 | 6 | 1 |
1 | 2013-08-06 | dinner | rice & soup 1 | 뚝배기 우거지 갈비탕 | F | 261 | 0 | 0 | 0 | 0 | 0 | -261 | 2013 | 8 | 6 | 1 |
2 | 2013-08-06 | lunch | noodle bar | 판모밀정식 | F | 267 | 0 | 0 | 0 | 0 | 0 | -267 | 2013 | 8 | 6 | 1 |
3 | 2013-08-06 | breakfast | rice & soup 1 | 설렁탕정식 | F | 1 | 0 | 0 | 0 | 0 | 0 | -1 | 2013 | 8 | 6 | 1 |
4 | 2013-08-06 | lunch | rice & soup 1 | A. 부대찌개정식 | F | 376 | 0 | 0 | 0 | 0 | 0 | -376 | 2013 | 8 | 6 | 1 |
# 모든행의 데이터를 가져오고, 0~5 까지의 칼럼 가져오는데.... is_sold_out은 제외....
식당 = 식당.iloc[:, :6].drop('is_sold_out', axis=1)
식당[:5]
date | dine_type | corner | menu | use_count | |
---|---|---|---|---|---|
0 | 2013-08-06 | dinner | grill & fry | 훈제연어벤또(200개) | 213 |
1 | 2013-08-06 | dinner | rice & soup 1 | 뚝배기 우거지 갈비탕 | 261 |
2 | 2013-08-06 | lunch | noodle bar | 판모밀정식 | 267 |
3 | 2013-08-06 | breakfast | rice & soup 1 | 설렁탕정식 | 1 |
4 | 2013-08-06 | lunch | rice & soup 1 | A. 부대찌개정식 | 376 |
식당.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 6825 entries, 0 to 6824 Data columns (total 5 columns): date 6825 non-null datetime64[ns] dine_type 6825 non-null object corner 6825 non-null object menu 6825 non-null object use_count 6825 non-null int64 dtypes: datetime64[ns](1), int64(1), object(3) memory usage: 266.7+ KB
## date 칼럼의 첫번째 행의 년도
식당['date'][0].year
2013
## 연도별-corner 데이터 추세...
## 람다식을 이용해서 ...
## 식당의 date 칼럼의 시리즈에서 map 함수의 매개변수로 날짜를 받아서 년도를 반환.....
##def 날짜반환(d):
## return d.year
연도 = 식당['date'].map(lambda d: d.year)
연도.sample(10)
6790 2015 381 2013 4349 2014 1976 2014 6675 2015 1846 2014 2360 2014 1934 2014 1455 2014 1293 2014 Name: date, dtype: int64
# 연도-코너의 user_count 평균을 구한다.
#
식당.pivot_table('use_count',
aggfunc='mean',
index='corner',
columns=연도
)
date | 2013 | 2014 | 2015 |
---|---|---|---|
corner | |||
after school | 160.355191 | 143.287815 | 123.577778 |
burger&pizza | 147.179191 | 146.825902 | 137.977695 |
grill & fry | 261.616667 | 218.817610 | 214.850746 |
noodle bar | 209.266667 | 175.964135 | 164.936803 |
rice & soup 1 | 323.147368 | 205.251034 | 181.417476 |
rice & soup 2 | NaN | 240.285000 | 244.340909 |
take out | 249.029536 | 195.580027 | 148.888620 |
## 각 년월별 코너별 주문수량
년월 = 식당['date'].map(lambda d: "{0.year}-{0.month:02d}".format(d))
년월.sample(10)
2591 2014-05 3390 2014-08 6386 2015-06 6817 2015-07 407 2013-10 281 2013-09 2961 2014-06 2697 2014-06 3691 2014-09 2199 2014-04 Name: date, dtype: object
년월사용량 = 식당.pivot_table("use_count", aggfunc="mean", index=년월, columns="corner")
년월사용량[:10]
corner | after school | burger&pizza | grill & fry | noodle bar | rice & soup 1 | rice & soup 2 | take out |
---|---|---|---|---|---|---|---|
date | |||||||
2013-08 | 154.333333 | 188.352941 | 299.565217 | 221.695652 | 330.976190 | NaN | 230.600000 |
2013-09 | 152.138889 | 156.700000 | 327.096774 | 224.419355 | 341.907407 | NaN | 244.528302 |
2013-10 | 157.190476 | 139.047619 | 266.571429 | 214.023810 | 329.539683 | NaN | 260.343284 |
2013-11 | 174.476190 | 146.452381 | 249.619048 | 209.309524 | 322.619048 | NaN | 267.692308 |
2013-12 | 159.452381 | 132.571429 | 199.547619 | 186.476190 | 295.984127 | NaN | 233.619048 |
2014-01 | 174.333333 | 142.282051 | 222.400000 | 199.625000 | 317.116667 | NaN | 249.383333 |
2014-02 | 172.589744 | 140.948718 | 220.282051 | 190.692308 | 279.155172 | 199.500000 | 254.368421 |
2014-03 | 170.952381 | 153.500000 | 221.809524 | 181.476190 | 203.682540 | 257.400000 | 252.161290 |
2014-04 | 166.487805 | 146.309524 | 224.829268 | 174.609756 | 190.919355 | 229.523810 | 243.714286 |
2014-05 | 145.000000 | 125.138889 | 231.027778 | 183.722222 | 182.907407 | 259.166667 | 236.508772 |
년월사용량.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x2c0c3453390>
조건문 정리 (0) | 2023.05.21 |
---|---|
기초 자료형 I 정리 (0) | 2023.04.19 |
파이썬(Python) 고급연산 (0) | 2020.12.31 |
파이썬(Python) 고급문자열 처리 (0) | 2020.12.31 |
파이썬(Python) - 분석 실습 영화평점분석 (0) | 2020.12.29 |