2022/01/07/FRI
import pandas as pd
mpg=pd.read_csv("mpg.csv")
from plotnine import *
ggplot(mpg) + geom_point(aes(x = "displ", y = "hwy"))
$\to$ 엔진크기와 연료효율은 반비례 $\to$ 엔진크기가 클수록 연비 안 좋다
fig=ggplot(mpg)
a1=aes(x='displ',y='hwy')
point1=geom_point(a1)
fig+point1
ggplot(mpg)+ geom_point(aes(x='displ',y='hwy',size= 'class'))
ggplot(data=mpg)+ geom_point(mapping=aes(x='displ',y='hwy',alpha= 'class'))
# 여기서 data와 mapping은 생략 가능
ggplot(data=mpg)+ geom_point(mapping=aes(x='displ',y='hwy',size= 'class',alpha='class'))
ggplot(data=mpg)+ geom_point(mapping=aes(x='displ',y='hwy',shape='class'))
ggplot(data=mpg)+ geom_point(mapping=aes(x='displ',y='hwy',color='class'))
- 객체지향적으로?
a2=aes(x='displ',y='hwy',color='class')
a1
a2
point2=geom_point(a2)
fig+point2
fig+point1
sline1=geom_smooth(a1)
fig+point1+sline1
fig+point2+sline1
- 명령어로 한번에 그리기
ggplot(mpg)\
+geom_point(aes(x='displ',y='hwy',color='class'))\
+geom_smooth(aes(x='displ',y='hwy')) # aes(x='displ',y='hwy') 이건 생략해도 됨, 밑에서 설명할 것
- 공통적인 맵핑규칙은 ggplot()쪽으로 빼기도 한다. (figure를 선언하는 곳에서 공통으로 선언함)
ggplot(mpg,aes(x='displ',y='hwy'))+geom_point(aes(color='class'))+geom_smooth()
ggplot(mpg,aes(x='displ',y='hwy'))+geom_point(aes(size='class',color='drv'),alpha=0.2)
- 모든 $x$에 대하여 붉은색 점들이 대부분 초록선과 보라색 점들에 비하여 아래쪽에 위치하여 있음 $\to$ 4륜구동방식이 연비가 좋지 않음
- 객체지향적
a1,a2
a3=a2.copy()
a1,a2,a3
a3['color']='drv'
a3['size']='class' # 이건 새로 생성
a1,a2,a3
- 아래와 같이 선언해도 괜찮음
a3=aes(x='displ',y='hwy',color='drv',size='class')
point3=geom_point(a3,alpha=0.2)
fig+point3
fig+point3+sline1
a1,a2,a3
a4=a2.copy()
a4['color']='drv'
a4
sline2=geom_smooth(a4)
fig+sline2+point3
- 선의 색깔을 동일하게 하고 선의 타입을 변경하여 그룹을 표시할수도 있지 않을까?
a1,a2,a3,a4
a5=a1.copy()
a5['linetype']='drv'
a5
sline3=geom_smooth(a5,size=1,color='gray')
# size는 선의 굵기
fig+point3+sline3
fig+point3+sline3+sline1
sline2=geom_smooth(a4,size=1,linetype='dashed')
fig+point3+sline2+sline1
- 고차원의 변수를 표현할 수 있는 무기는 다양하다.
- 산점도(포인트지옴): 점의크기, 점의형태, 점의색깔, 점의투명도
- 라인플랏(스무스지옴, 라인지옴): 선의형태, 선의색깔, 선의굵기
import numpy as np
dic={'X1':np.random.normal(0,1,5),
'X2':np.random.normal(0,1,5),
'X3':np.random.normal(0,1,5)}
df=pd.DataFrame(dic)
df
df.X1
df['X1']
df[['X1']]
df['X1']는 series를 리턴하고df[['X1']]는 dataframe을 리턴한다.
df.loc[:,'X1']
- 방법5
df.loc[:,['X1']]
- 방법6
df.loc[:,[True,False,False]]
- 방법7
df.iloc[:,0]
- 방법8
df.iloc[:,[0]]
- 방법9
df.iloc[:,[True,False,False]]
_df = pd.DataFrame(np.array([[1,2,3],[3,4,5],[5,6,7]]))
_df
- 아래가 모두 가능하다.
_df[0]
_df[[0]]
_df.loc[:,0]
_df.loc[:,[0]]
_df.iloc[:,0]
_df.iloc[:,[0]]
dic={'X.1':np.random.normal(0,1,5),
'X.2':np.random.normal(0,1,5),
'X.3':np.random.normal(0,1,5)}
_df=pd.DataFrame(dic)
_df
_df['X.1']
# 이건 사용 불가
# df.~ 이 형태로 indexing할 땐 column명에 dot이 있거나 공백이 있으면 사용할 수 없다
dic={'X1':np.random.normal(0,1,5),
'X2':np.random.normal(0,1,5),
'X3':np.random.normal(0,1,5),
'X4':np.random.normal(0,1,5)}
df=pd.DataFrame(dic)
df
- 방법1
df[['X1','X2','X3']]
- 방법2
df.loc[:,['X1','X2','X3']]
- 방법3
df.loc[:,'X1':'X3']
- 방법4
df.loc[:,[True,True,True,False]]
- 방법5
df.iloc[:,[0,1,2]]
- 방법6
df.iloc[:,:3]
df.iloc[:,0:3]
df.iloc[:,range(3)]
- 방법7
df.iloc[:,[True,True,True,False]]
df.iloc[:,0:3] ## 0,1,2,3중 3은 포함되지 않는다.
df.loc[:,'X1':'X3'] ## 'X3'도 포함된다.
- 그래서 column의 이름이 integer일 경우는 종종 매우 헷갈리는 일이 일어남
_df = pd.DataFrame(np.array([[1,2,3,4],[3,4,5,6],[5,6,7,8]]))
_df
_df.loc[:,0:2]
_df.iloc[:,0:2]
df=pd.read_csv('https://raw.githubusercontent.com/PacktPublishing/Pandas-Cookbook/master/data/movie.csv')
- 열의 이름을 출력하여 보자.
df.columns
pd.Series(df.columns)
list(range(13))+[26]
df.iloc[:,list(range(13))+[26]]
- 다시열의 이름들을 확인
df.columns
list(map(lambda x : 'actor' in x, df.columns))
df.iloc[:,list(map(lambda x : 'actor' in x, df.columns))]
df.loc[:,list(map(lambda x : 'actor' in x, df.columns))]
loc으로 해도 되고 iloc으로 해도 된다.
- 방법3
list로 안 만들어도 됨
df.iloc[:,map(lambda x : 'actor' in x, df.columns)]
- 방법4
df.loc[:,map(lambda x : 'face' in x, df.columns)]
df.iloc[:,map(lambda x: 's' == x[-1],df.columns )]
df.loc[:,map(lambda x: 's' == x[-1],df.columns )]
df.iloc[:,map(lambda x: 'c' == x[0] or 'd' == x[0] ,df.columns )]