ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5주 5일차 TIL 정리
    웅진 STARTERS 부트캠프 2023. 3. 10. 17:42

    5주 5일차에는 중간평가를 본 만큼, 중간평가를 위한 공부를 위주로 진행했다.


     짚고 넘어가야 할 내용 정리 


    # pandas의 논리연산자
    논리연산자는 '&' , '|' ,'~', '^' 기호를 사용한다.

    # 특정 값을 가졌는지 여부

    df['name'].isin(['Amy','Rose'])


    # null 여부 판별

    df.kor.isnull()
    df.kor.notnull()


    # 인덱스명으로 행 데이터 추출: loc

    df.loc['i3'] 			# 시리즈
    df.loc[['i1','i3','i5']] 	# 데이터프레임


    # 인덱스, 컬럼에 해당하는 데이터 뽑아오기

    df.loc['i1','kor']		# 인덱스 i1의 kor점수
    df.loc['i1',['name','kor']] 	# 인덱스 i1 name, kor


    # 여러 인덱스의 여러 컬럼 가져오기

    df.loc[['i1','i3','i5'],['name', 'kor']]
    df.loc[:,'name'] 			# 모든 인덱스의 name행
    df.loc[:,:] 				# 모든 인덱스의 모든 행



    # 행번호로 행데이터 추출: iloc

    df.iloc[[1,3,5]]
    df.iloc[1:4]
    df.iloc[1:6:2]
    df.iloc[::2]


    # 열 추가/수정하기

    df['no'] = range(1,len(df)+1) 			# 추가
    df['sum'] = df['kor']+df['eng']+df['math']	# 추가
    df['no']  = df['no']+99 			# 수정



    # 열 삭제/수정 등 확인

    inplace = True



    # 컬럼명 한번에 바꾸기

    df.columns=['이름','국어','영어','수학']


    # 마지막에 행 추가하고 인덱스 다시 지정하기

    new_value = {'name':'Python','kor':80,'eng':90,'math':100}
    df = df.append(new_value, ignore_index=True)



    # 인덱스 지정하여 추가/수정하기

    df.loc[35] = ['aaa',70,80,90] 	# 인덱스 35로 추가


    # 행 삭제

    df.drop(index=[30,34,35], inplace=True)
    df = df.drop(index=[30,34,35])


    # 함수로 컬럼의 데이터 변경

    def plus5(x):
        score = x+5
        if score>=100:
            score=100
        return score
        
    df_copy['math'] = df['math'].apply(plus5)
    df_copy


    # 결측치 확인

    df.isnull().sum()


    # 결측치 삭제

    df.dropna() 		# 결측치 있는 모든 행 삭제
    df.dropna(axis=1)	# 결측치 있는 모든 열 삭제


    # 결측치 대치

    df.fillna(0) 			# 0으로
    df.fillna(df.mean()) 		# 평균으로
    df.fillna(method='ffill') 	# 이전 값
    df.fillna(method='bfill') 	# 다음 값


    # 시리즈와 데이터프레임의 자료형

    # 시리즈
    df['int'].dtype 		# 확인
    df['int'] = df.astype('str')	# 변환
    
    # 데이터프레임
    df.dtypes


    # 자료형이 혼합된 컬럼을 숫자형으로 변경

    pd.to_numeric(s2, errors='ignore') 	# 변경 불가하면 작업 x
    pd.to_numeric(s2, errors='coerce') 	# 변경 불가하면 NaN으로 설정
    pd.to_numeric(s2, errors='raise') 	# 변경 불가하면 error


    # 시계열 데이터로 변환

    df['출생'] = df['출생'].astype('datetime64')
    df['사망'] = pd.to_datetime(df['사망'])


    # 카테고리로 사용할 수 있는 컬럼은 카테고리형으로 변환

    df['grade'] = df['grade'].astype('category')


    # 카테고리 이름 바꾸기

    df['grade'].cat.categories = ['A','B','C','D']


    # 연, 월, 일, 분기 추출하기

    df['출생'][0].year 	# 단일값이면 dt 안붙여도 됨
    df['출생'].dt.month
    df['출생'].dt.day
    df['분기']=df['출생'].dt.quarter


    # 요일, 월이름 추출하기
        컬럼.dt.strftime('%a') : 요약된 요일이름
        컬럼.dt.strftime('%A') : 긴 요일이름
        컬럼.dt.strftime('%w') : 숫자요일(0:일요일)
        컬럼.dt.strgtime('%b') : 요약된 월이름
        컬럼.dt.strftime('%B') : 긴 월이름

    # 데이터프레임 연결하기(concat)

    df_rowconcat = pd.concat([df1,df2,df3]) 			# 컬럼 기준 연결
    df_rowconcat = pd.concat([df1,df2,df3], join='inner') 		# 공통된 컬럼만 남기기
    df_rowconcat = pd.concat([df1,df2,df3], ignore_index=True) 	# 인덱스 재지정
    
    df_column_concat = pd.concat([df4,df5,df6], axis=1) 		# 인덱스 기준 연결


    # 행을 열로 보내기(melt)

    df.melt()
    pd.melt(df)


    # 고정할 컬럼 지정하여 melt

    df.melt(id_vars=['name','kor'])

     

    # 행으로 위치 변경

    value_vars=[열이름리스트]


    # 열을 행으로 보내기(pivot)

    df.pivot(index='name', columns='subject',values='score')



    # 행과 열 바꾸기

    df.transpose()



    # 그룹의 통계값 계산
        df.groupby(그룹기준컬럼).통계적용컬럼.통계함수
        count() : 누락값을 제외한 데이터 수
        size() : 누락값을 포함한 데이터 수
        mean() : 평균
        sum() : 합계
        std() : 표준편차
        min() : 최소값
        max() : 최대값
        sum() : 전체 합


    # 맷플롯립 pyplot 임포트

    import matplotlib.pyplot as plt


    # 그래프 종류

    plt.scatter(x,y)
    plt.plot(x,y)
    plt.bar(x,y)
    plt.barh(y,x)
    plt.pie(value)
    plt.hist(value)
    plt.boxplot(value)
    plt.violinplot(value)
    plt.pcolor(dataframe) = sns.heatmap(df)


    # 한글폰트 설정

    plt.rcParams['font.family'] = 'Malgun Gothic'


    # 한글폰트 사용 시 -기호 깨지는 문제 해결

    plt.rcParams['axes.unicode_minus']=False


    # 스타일링

    linestyle, ls		# 선스타일
    linewidth, lw 		# 선 굵기
    
    marker 			# 마커종류 (* . , o v ^ < > 1 2 3 4 s p * h H + x D d)
    markersize, ms 		# 마커사이즈
    markeredgecolor, mec 	# 마커 선 색깔
    markeredgewidth, mew 	# 마커 선 굵기
    markerfacecolor, mfc 	# 마커 내부 색깔
    plt.plot(x,y,color='#A566FF', marker='D', ms='10', mec='b', mew='3', mfc='y', ls=':', lw=3)
    
    plt.plot(x,y,'ro-', mec='b', mfc='b', lw=3, ms=7)
    plt.show()


    # 축의 범위

    plt.xlim(1,12)
    plt.ylim(0,100)


    # 축의 틱

    plt.xticks(range(0,14,1))
    plt.yticks(range(0,110,10))


    # 틱 레이블 지정

    plt.xticks(range(0,14,1), labels=xticks_lable)
    plt.yticks(range(0,110,10), labels=yticks_label)


    # 틱 스타일 지정

    plt.tick_params( )
    direction 		# 틱 위치 (in, out, inout)
    length 			# 틱의 길이
    width 			# 틱의 두께
    color 			# 틱 색상
    labelcolor 		# 틱 레이블 색상
    colors 			# 틱과 틱 레이블 색상
    pad	 		# 틱과 레이블 사이의 거리
    labelsize 		# 틱 레이블 사이즈
    axis 			# 축 지정


    # 범례 지정
      plt.legend()

      열 개수 : plt.legend(ncol=열개수)
      폰트 사이즈 : plt.legend(fontsize=폰트사이즈)
      테두리 : plt.legend(frameon=True/False)
      음영 : plt.legend(shadow=True/False)
      바탕색 : plt.legend(facecolor=색상)
      테두리색 : plt.legend(edgecolor=색상)
      위치 지정 : plt.legend(loc=(x,y))


    # 서브플롯 그리기 1
      plt.subplot(전체행개수,전체열개수,그래프순서)

      plt.subplot(221)
      plt.plot(df1['x'],df1['y'],'o')



    # 서브플롯 그리기 2
      1)figure 객체를 생성한다.

    fig = plt.figure(figsize=(8,6))


      2) figure객체의 add_axes 메소드로 위치와 크기를 지정하여 axes 객체를 생성한다.

        ax1 = fig.add_axes([0,0.5,0.4,0.4])
        ax2 = fig.add_axes([0.5,0.5,0.4,0.4])


      3) axes에 그래프를 그린다.

        ax1.plot(df1['x'],df1['y'],'o')
        ax2.plot(df2['x'],df2['y'],'r^')


      4) axes에 제목 추가.

        ax1.set_title('ax1')
        ax2.set_title('ax2')


    # 서브플롯 그리기 3(축 공유)
      1) figure 객체를 생성한다.

        fig = plt.figure(figsize=(9,6), facecolor='ivory')


      2) 서브플롯을 그릴 axes 객체를 생성한다.

        ax1 = fig.add_subplot(2,2,1)
        ax2 = fig.add_subplot(2,2,2, sharex=ax1, sharey=ax1)
        ax3 = fig.add_subplot(2,2,3, sharex=ax1, sharey=ax1)
        ax4 = fig.add_subplot(2,2,4)


      3) axes 객체에 그래프를 그린다.
      4) 축 공유하기 : 어떤 axes의 축을 공유할 것인지 지정한다.

        ax1.plot(df1['x'],df1['y'],'o', label='ax1')
        ax2.plot(df2['x'],df2['y'],'^', label='ax2')
        ax3.plot(df3['x'],df3['y'],'*', label='ax3')
        ax4.plot(df4['x'],df4['y'],'+', label='ax4')



    # 그래프를 이미지로 저장

    fig.savefig('img150.png', dpi=150)

     

    # 그래프에서 패턴 넣기

    bars[0].set_hatch('.')
    bars[1].set_hatch('/')
    bars[2].set_hatch('+')
    bars[3].set_hatch('-')
    bars[4].set_hatch('*')
    bars[5].set_hatch('|')
    bars[6].set_hatch('o')


    # 산점도 스타일링

    s: size
    c: color
    cmap: color map
    plt.scatter(tips['total_bill'], tips['tip'], s=tips['size']*50, alpha=0.5, c=tips['color'])


    # 히스토그램 설정

      bins= 			# 구간 개수 변경
      cumulative=True 		# 누적값으로 변경
      range=(min,max) 		# 범위 지정
      density=True 			# 밀도 표시(도수/총 개수)
      orientation='horizontal' 	# 가로 히스토그램으로 표시
      histtype='step' 		# 아웃라인만 표시


    rwidth=막대폭(0~1) color=막대색 alpha=투명도
    edgecolor(ec)=선색 linewidth(lw)=선두께 linestyle(ls)=선스타일
    hatch=패턴

    # 박스플롯

      plt.boxplot(series)
      showmeans = True 		# 평균표시
      meanline = True 		# 평균 선으로 표시


      
    # 바이올린플롯

      plt.violinplot(series)
      showmeans
      showmedians


    # 파이차트

      plt.pie(value)


      labels=label목록
      labeldistance = 그래프로부터 레이블을 얼만큼 떨어뜨려서 표시할것인가 (default:1.1)
      autopct = '%소수점자리수%%'
      pctdistance = 중심에서의 거리
      explode=돌출정도리스트
      startangle = 시작각도
      counterclock=True/False (반시계/시계)
      wedgeprops = {'ec':테두리컬러, 'lw':선두께, 'ls':선스타일, 'width':반지름에대한비율}

    # 그래프를 구성하는 공통속성 지정: rcParams


    # 그래프 영역 채우기 - 행방향으로 채우기

    plt.fill_between(x[1:3], y[1:3], color='skyblue', alpha=0.5, hatch='/')


    # 그래프 영역 채우기 - 열방향으로 채우기

    plt.fill_betweenx(y[:2], x[:2], alpha=0.3)


    # 두 그래프 사이 영역 채우기

    plt.fill_between(x[1:3], y1[1:3], y2[1:3], color='darkorange')


    # x,y좌표를 지정해 채우기

    plt.fill([2.75, 3.25, 3.0],[2.5, 2.5, 3.5], color='pink')


    # 수평선 그리기

    plt.axhline(2,0,1, color='b', alpha=0.5, ls=':')


    # 수직선 그리기

    plt.axvline(1, 0, 0.5, ls='--', color='r')


    # 텍스트 추가하기

    plt.text(2.1, 3, '(x:2, y:3)', ha='left', va='bottom', fontsize=12, rotation=45
            , bbox={'boxstyle':'round', 'fc':'skyblue', 'ec':'b', 'alpha':0.3})


    # 화살표와 텍스트 추가하기

    plt.annotate('(x:1,y:2)', xy=(1,2), xytext=(1.5,2.5)
                 , arrowprops={'width':1, 'headwidth':10, 'headlength':10, 'shrink':0.1, 'fc':'r'}
                 , fontsize=12, color='r')


    # 두가지 정보를 하나의 그래프에 그리기

    fig, ax = plt.subplots()
    ax.bar(age, height, color='skyblue', width=0.5, ec='lightgray', label='height')
    ax.plot(age, weight, color='darkred', marker='o', ls='-.', label='weight')

     


    # 두가지 정보를 하나의 그래프에 그리기 - 이중축, 2중 y축

      fig, ax1 = plt.subplots()
      ax1.bar(age, height, color='skyblue', width=0.5, ec='lightgray', label='height')
    
      ax2 = ax1.twinx()
      ax2.plot(age, weight, color='darkred', marker='o', ls='-.', label='weight')
      plt.show()


    # seaborn 그래프
      # 막대그래프

    sns.barplot(data=tips, x='day', y='tip', ci=None, estimator=sum, hue='smoker' : ci는 추세선
               , palette ={'Yes':'gray', 'No':'skyblue'}) : hue는 y를 그룹핑할 컬럼


      # 산점도

    sns.scatterplot(data=tips, x='total_bill', y='tip', hue='day', size='size', alpha=0.5)


      # 다중라인그래프

    sns.lineplot(data=flights, x='month', y='passengers', ci=None, hue='year')


    # 카운트플롯: 데이터 갯수 카운트해 시각화

    sns.countplot(data=titanic, x='age')
    sns.countplot(data=titanic, x='who', hue='alive')


    # 러그플롯: 빈도수 파악

    sns.rugplot(data=titanic,x='age', hue='alive')


    # 히스토그램

    sns.displot(data=iris, x='petal_length', bins=20, rug=True, hue='species', kde=True)


    # 상자수염, 바이올린, 스트립, 스웜

    # 상자수염그림
    sns.boxplot(data=iris, x='species', y='petal_length')
    # 바이올린플롯
    sns.violinplot(data=iris, x='species', y='petal_length')
    # 스트립플롯
    sns.stripplot(data=iris, x='species', y='petal_length')
    # 스웜플롯
    sns.swarmplot(data=iris, x='species', y='petal_length',s=2)

    댓글

Designed by Tistory.