import pandas as pd
import seaborn as sns
tips = sns.load_dataset("tips")
tips.head()
tips.sex.values.categories
tips.sex.values.codes
#Apply 메서드
def my_sq(x):
return x**2
def my_exp(x,n):
return x**n
my_sq(3)
my_exp(3,5)
df = pd.DataFrame({'a':[10,20,30],'b':[20,30,40]})
df
df['a'].apply(my_sq)
df.apply(my_sq)
df['a'].apply(my_exp,n=3)
df['a'].apply(lambda x : x**2)
titanic = sns.load_dataset("titanic")
titanic.sample(2)
titanic.info()
import numpy as np
def count_missing(vec):
return np.sum(pd.isnull(vec))
titanic.apply(count_missing)
def prob_missing(vec):
num = count_missing(vec)
dem = vec.size
return num/dem
titanic.apply(prob_missing)
def prop_complete(vec):
return 1-prob_missing(vec)
titanic.apply(prop_complete)
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np #NumPy("넘파이"라 읽는다)는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리 할 수 있도록 지원하는 파이썬의 라이브러리이다.
import warnings
warnings.filterwarnings('ignore') #경고메세지 뜨면 이걸 켜주세요
mpl.rcParams['axes.unicode_minus']=False #좌표에 값이 깨지면 이걸 실행하세요
#선그래프
plot(x,y)
plot(y)
plt.plot([-1,2,3,4],[-2,4,8,16]) #기본 선그래프가 그려짐
plt.plot([1,2,3,4]) #하나만 넣으면 y값만 들어감, 밑에는 인덱스로 대체되어 들어감
plt.plot([1,2,3,4],[1,4,9,16], 'go--') #g는 그린 o는 점선으로 표시
plt.plot([1,2,3,4],[1,4,9,16], 'r+')
x=[1,2,3,4]
y=[1,4,9,16]
plt.plot(x, y, color='green', marker='o', linestyle='dashed', linewidth=2, markersize=12)
x1=[1,2,3,4]
y1=[1,4,9,16]
x2=[4,6,9,14]
y2=[3,6,9,12]
plt.plot(x1, y1, 'g^', x2, y2, 'g-')
data = {'a':np.arange(50),
'c':np.arange(50),
'd':np.random.randn(50)}
data['b'] = data['a']+10*np.random.randn(50)
data['d'] = np.abs(data['d'])*100
#data
plt.scatter('a','b',c='c',s='d',marker='^',data=data) #c는 컬러, s는 사이즈, 마커는 모양
names=['group_a','group_b','group_c']
values=[1,10,100]
plt.figure(figsize=(9,3)) #(행, 열)을 뜻함 그래프 만들기 전에 전체 틀부터 만들어주는 작업
plt.subplot(131)
plt.bar(names, values)
plt.subplot(132)
plt.scatter(names, values)
plt.subplot(133) #1행에 3열 3번째
plt.plot(names, values)
plt.suptitle('Categorical plotting') #위쪽 최상위 타이틀(슈퍼타이틀)
plt.show() #차트 위에 텍스트 사라짐
#한글폰트 설정, 세가지 방식이 있음
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.font_manager as fm
import numpy as np
data = np.random.randint(-100,100,50)
data
plt.plot(range(50),data,'r')
plt.title('시간별 가격 추이')
plt.ylabel('주식가격')
plt.xlabel('시간(분)')
fm.findSystemFonts()
fm.fontManager.ttflist
[(f.name,f.fname) for f in fm.fontManager.ttflist if 'Nanum' in f.name][:5]
mpl.font_manager._rebuild() #글씨 표시 안될 때 쿠키 한번 리셋해주는 코드
#1. 경로 이용
path = 'C:\\Windows\\Fonts\\NanumSquareRoundB.ttf'
fontprop = fm.FontProperties(fname=path, size=15)
plt.plot(range(50),data,'r')
plt.title('시간별 가격 추이',fontproperties=fontprop) #kwargs 딕셔너리로 들어감
plt.ylabel('주식가격',fontproperties=fontprop)
plt.xlabel('시간(분)',fontproperties=fontprop)
#2. rcParams 이용
plt.rcParams['font.size']
plt.rcParams['font.family']
plt.rcParams['font.family']='NanumSquareRound'
plt.rcParams['font.size']=18
mpl.rcParams['axes.unicode_minus']=False #좌표에 값이 깨지면 이걸 실행하세요
plt.plot(range(50),data,'r')
plt.title('시간별 가격 추이')
plt.ylabel('주식가격')
plt.xlabel('시간(분)')
#3.fname()
mpl.matplotlib_fname()
key='cc05f1619fd8b32c880441798bfa3805'
targetDt='20211013'
url=f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={key}&targetDt={targetDt}'
url
from urllib import request
import json, time, datetime
import pandas as pd
res = request.urlopen(url)
result = res.read()
result = json.loads(result) #loads 파일로 된 것 안읽어올때, load는 파일로된걸 읽어올때
result = result['boxOfficeResult']['dailyBoxOfficeList']
pd.DataFrame(result) #데이터 프레임 만들기
#문제 : 오늘날짜 기준으로 이전 30일에 해당하는 데이터를 데이터프레임으로 만드시오
time.localtime()
str_date = time.strftime('%Y%m%d',time.localtime())
str_date
time_date = datetime.datetime.strptime(str_date,'%Y%m%d')
time_date
time_date1=time_date-datetime.timedelta(days=1)
str_date = time_date1.strftime('%Y%m%d')
str_date
time.localtime()
str_date = time.strftime('%Y%m%d',time.localtime())
str_date
time_date = datetime.datetime.strptime(str_date,'%Y%m%d')
time_date
time_date1=time_date-datetime.timedelta(days=1)
str_date = time_date1.strftime('%Y%m%d')
str_date
def BoxOffice(day=30):
key = 'cc05f1619fd8b32c880441798bfa3805'
targetDt = time.strftime('%Y%m%d', time.localtime())
cine=[]
for i in range(day):
time_date = datetime.datetime.strptime(targetDt, '%Y%m%d')
time_date = time_date - datetime.timedelta(days=1)
targetDt = time_date.strftime('%Y%m%d')
url = f'http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key={key}&targetDt={targetDt}'
#print(targetDt)
res = request.urlopen(url)
result = res.read()
result = json.loads(result)
result = result['boxOfficeResult']['dailyBoxOfficeList']
#print(result)
for j in range(len(result)):
result[j]['targetDt']=targetDt
cine.extend(result)
df = pd.DataFrame(cine)
return df
cine = BoxOffice()
cine
time.localtime()
targetDt = time.strftime('%Y%m%d', time.localtime())
time_date = datetime.datetime.strptime(targetDt, '%Y%m%d')
time_date = time_date - datetime.timedelta(days=1)
targetDt = time_date.strftime('%Y%m%d')
pd.unique(cine['targetDt']) #unique() 중복값을 제거하고 유일값만 반환한다.
df = cine.drop('rnum',axis=1) #열단위 제거
df.columns
import matplotlib.pyplot as plt
title = '보이스'
temp = df[df['movieNm']==title]
plt.bar(temp['targetDt'],temp['salesAmt'].astype(int))
plt.title('일별 매출액')
plt.xlabel('날짜')
plt.ylabel('매출액')
plt.xticks(fontsize=10,rotation=90)
plt.show()
title = '보이스'
temp = df[df['movieNm']==title]
temp1 = temp.sort_values(by=['targetDt'])
plt.plot(temp1['targetDt'],temp1['salesAmt'].astype(int)) #기본값이 오브젝트라서 int타입으로 바꿔줌
plt.title(f'{title}의 일별 매출액')
plt.xlabel('날짜')
plt.ylabel('매출액')
plt.xticks(fontsize=10,rotation=90)
plt.show()
cine = BoxOffice()
#cine['salesAmt']=cine['salesAmt'].astype(int)
#temp2 = cine.groupby('movieNm')['salesAmt'].sum() #영화 이름이 같은 것 끼리 묶는 것
cine['salesAmt']=cine['salesAmt'].astype('int64')
temp2 = cine.groupby('movieNm').sum()
temp2['salesAmt'] = temp2['salesAmt'].astype('int64')
temp2.info()
temp2.index
plt.figure(figsize=(15,5))
plt.bar(temp2.index,temp2['salesAmt'])
plt.title('영화별 총 매출액')
plt.xlabel('영화명')
plt.ylabel('총매출액')
plt.xticks(fontsize=9,rotation=90)
plt.show()
cine.groupby('movieNm')['salesAmt'].count()
판다스 차트 라이브러리 정리
Matplotlib 갤러리 바로가기
python import time
time.localtime() targetDt = time.strftime('%Y%m%d', time.localtime()) time_date = datetime.datetime.strptime(targetDt, '%Y%m%d') #datetime 안에 datetime을 쓰겠다 time_date = time_date - datetime.timedelta(days=1) #하루씩 빼주는 것