• 멀티/복합인데스 
  • 데이터프레임 구조화다시하기/크기 조정 
  • 판다스 실습 
  • 특강( 학습법 마음가짐
  • 회고

 

 

6-1

멀티/복합인데스

데이터프레임에서 데이터의 인덱스를 다차원으로 구성하는 방법

이개념들은 데이터가 계층적 구조를 띄거나 다차원 구조를 가질 때 유용하게 사용 가능

 

멀티인덱스

하나 이상의 인덱스를 사용하여 데이터프레임의 행과 열을 구조화하는 방법

다차원 데이터를 보다 효율적으로 관리하고 분석

멀티인뎃스를 사용하면 계층적으로 멀티인덱스를 생성하고 이를 데이터 프레임의 인덱스로 활용하게 된다.

현재는 예시이기 때문에 인덱스 계층을 써놓았지만 나중에 활용방법들이 나올 것이다.

 

1. 멀티인덱스 생성

1) set_index을 사용한 멀티인덱스 코드

#데이터 프레임을 작성 한 뒤

df_multi_index = df.set_index(['도시', '년도']) #도시와 년도를 인덱스로 가져온다.

 

2) pd.MultiIndex.from_tuples()을 사용한 멀티인덱스 코드

멀티인데스를 튜플로 직접 생성

index = pd.MultiIndex.from_tuples([(리스트, 리스트1-1),(리스트2, 리스트2-1)], names = [리스트3, 리스트3-3]) 

#인덱스 계층 설정

 

df_multi_index = pd.DataFrame({'인구수': [9700000, 9720000, 3400000, 3450000]}, index=index)

#데이터프레임 설정

 

pd.MultiIndex #멀티 인데스 객체를 생성

 

.from_tuples() #멀티인덱스를 구성할 튜플의 리스트 받아서 멀티 인덱스 객체를 반환해주는 작업

(리스트, 리스트1-1) 튜플은 인덱스의 각 계층에서 사용할 값을 나타냄 =>1계층에서 리스트1, 2계층에서 리스트1-1

 

names = [리스트3] #name은 멀티인덱스에 어떤 이름을 지정할지 나타냄

1계층은 리스트3, 2계층은 리스트3-3

 

2. 멀티인덱스 데이터 접근

1) loc[]을 사용한 접근

print(df_multi_index.loc['서울']) #서울(레이블)이라는 인덱스의 데이터 선택 

tip. 위에서 인덱스를 설정했기 때문에 loc을 사용해 접근 시 인덱스가 또 사용 됨

tip. 위에서 설정하지 않은 인덱스인 '인구수'로 잡히는데 시리즈객체를 이해해야한다.

     시리즈 객체는 단일 열을 나타내는데 원래 데이터 프렝임에서 선택 된 이름은 자동으로 시리즈의 인덱스로 설정 된다.

 

2) 슬라이싱을 사용한 접근

계층적으로 구성된 데이터를 만들어 놓았기 때문에 특정 범위의 구간이나 데이터를 쉽게 선택할 수 있다.

멀티 인덱스는 슬라이싱을 통해 특정 구간의 데이터를 쉽게 선택할 수 있습니다.

 

df_multi_index = df_multi_index.sort_index()

print(df_multi_index.loc['부산':'부산'])

 

tip. loc으로 검색할 때 기본적으로 인덱스는 정렬 되어있다 판다한다. 이때 인덱스가 정렬 되어있지 않으면 판다스는 효율적으로 검색하기 위해 인데스의 정렬 수준을 확인한다. 키가 정렬수준이 안좋으면 오류를 발생시킨다.(검색 수준이 보장되지않으면 에러를 발생 시킨다.)

=>  인덱스를 정렬하면 된다.

df_multi_index = df_multi_index.sort_index(ascending = True)

 

3) xs()를 사용한 멀티인덱스 교차 선택

특정 레벨을 기준으로 그 데이터를 추출하고 그 레벨을 제거해서 나머지 데이터를 반환한다.

 

-XS()코드

print(df_multi_index.xs('서울', level='도시')) #서울에 대한 데이터만 가져온다

레벨을 넘어서 데이터를 선택한다는건 어떤 의미?

 

xs()를 이용해서 서울에 대한 데이터만을 가져왔는데 그 과정에서 어떤게 추출되고 제거 되었는지 이해가 안간다.

 

 

3. 복합인데스의 활용

 

1) sort_index()

정렬하기

 

2) unstack과 stack으로 인덱스 변환

 

-unstack활용

df_unstacked = df_multi_index.unstack(level='년도') #인덱스를 열로 반환한다.

-stack활용

df_stacked = df_unstacked.stack() #인덱스로 바꿀 수 있다.

 

 

4. 멀티인덱스 응용

그룹화와 함께 사용한다.

 

1) 그룹화란?

데이터를 데이터를 특정 기준에 따라 나누어서 그룹에 대한 집계 연산을 수행하는 것

 

2) 멀티인덱스란?

인덱스가 2개이상의 계층으로 구성 되어서 데이터를 계층적으로 다처원적 특성을 반영할 수 있게 하는것

 

3) 조합

2개를 조합하면 그룹화한 데이터를 멀티인덱스로 변환하게 되고 각 그룹에 대한 집계결과를 계층적으로 반환하게 된다.

=> 데이터의 관계를 더 명확하게할 수 있고 다차원적인 분석이 가능해진다.

 

4)코드

#데이터프레임 설정 후

grouped_df = df.groupby(['도시', '년도']).mean() #그룹화 시키기

print(grouped_df)

(이렇게 그룹화를 진행했을 때 grouped_df.INDEX로 인덱스를 확인했을 때 자동으로 멀티인덱스가 설정 된것을 확인할 수 있다.)

그래서 grouped.loc[" "]을 했을때 데이터를 편하게 가져올 수 있다.

 

 


 

6-2

데이터프레임 구조화다시하기/크기 조정

 

1. 데이터프레임 구조화 다시하기

데이터를 원하는 형태로 변형할 수 있습니다.

 

1) 피벗(pivot)

열 데이터를 행 또는 열로 이동시켜 새로운 데이터프레임을 만든다.

이는 데이터를 재구성하고 분석하는 데 매우 유용합니다.

 

-활용

하나의 테이블이 있는데 서브테이블을 만들고싶을 때

 

-코드

pivot_df = df.pivot(index='날짜', columns='도시', values='온도')

#도시를 기준으로 날자를index로 온도를 값(행과 열의 교차지점에 값으로 사용 될 것)으로표현

tip. values에 값을 지정하지 않고 columns만 열을 지정하면 다른 모든 열이 값으로 사용 된다.

 

2) 변경(melt)

피벗된 데이터를 다시 긴 형식(long format)으로 변환할 때 사용된다.

이는 여러 열을 하나의 열로 통합하는 데 유용.

 

-활용

피벗 된 데이터를 다시 긴데이터 형식으로 만들 때.

여러열을 하나의 열로 축소하고 데이터의 다른 열들은 식별자 변수로 남게 되면서 재구조 할 수 있다.

 

-코드

melted_df = pd.melt(df, id_vars=['날짜', '도시'], value_vars=['온도', '습도'], valuse = 'test')

 

pd. melt #멜트 메서드 사용

df  #변환 할 데이터 프레임

id_vars #식별자 변수로 사용 할 열들 지정

value_vars #값으로 녹여낼 열 지정

valuse = 'test' #값(valuse)의 이름을 지정

 

3) 스택(stack)

열 데이터를 인덱스의 하위 레벨로 이동

기본적으로 모든 열을 인덱스로 바꿔준다.

 

-코드

#데이터 프레임 설정 한 후

df =df.set_index('날짜') #날짜 데이터를 인덱스로 설정

 

df = df.stack()#데이터프레임에 stack()적용

 

df.index #인덱스를 확인하면 모든 열들이 인덱스인 날짜의 하위레벨로 인덱싱화 된 것을 확인 된다.

 

4) 언스택(unstack)

하위레벨의 인덱스를 열 데이터로 바꿔준다

 

-코드

unstacked_df = stacked_df.unstack() #위의 stacked_df에 unstack() 사용하고 unstacked_df설정

 

tip. stack()을 진행한 후에 바로 unstck()은 진행 되지 않을 수 있다.

멀티인덱스 레벨에 중복 된 값이 있다면 오류 

스택을 사용해서 멀티인덱스 구조가 적절하지않으면 오류

 

2. 데이터프레임 크기조정

 

1) 열 추가하기

 

-코드

#데이터프레임 생성 후

df['날씨'] = ['맑음', '흐림', '맑음', '흐림'] #데이터 프레임에 추가할 열과 값들을 지정

 

2) 행/열 삭제하기

 

-열 삭제 코드

#데이터프레임 생성 후

df_dropped = df.drop(columns=['습도']) #데이터프레임에서 삭제할 columns지정하고 df_dropped 데이터프레임 설정

 

tip. 원본에 영향을 주지 않기 때문에 영향을 주기 위해선 새로운 데이터프레임이 아닌 기존 데이터 프레임에 적용 시켜야한다.

df = df.drop(columns=['습도'])

 

-행 삭제 코드

df_dropped_row = df.drop(index=0) #drop함수 안에 인덱스=0을 지정하여 첫번째 행 삭제

 

 


 

 

6-3

판다스 실습

전체데이터에 대한 전처리

 

데이터 딕셔너리를 보고 각 데이터들의 특징을 파악한 뒤

 

# 실습할 데이터 다운 후 

 

order_items_df = pd.read_csv('order_items.csv')  #파일 가져오기

payment_df = pd.read_csv('payments.csv')

customer_df = pd.read_csv('customers.csv')

order_df = pd.read_csv('orders.csv')

products_df = pd.read_csv('products.csv')

 

파일의 위치를 파이썬 파일과 같은 경로에 두어야한다.

나는 파이썬 파일이 어디에 생성 되는 건지 찾지 못해 애먹었지만 

jupyter home에서 파일을 열어 위치를 찾고 다운받은 파일을 옮겨 주었다.

그러면 쥬피터나 vscode에서 파이썬 파일을 만들 때 위치 지정을 해줄수있나?(파일들이 지저분함)

오후 회의때 질문 해보기

 

order_items_df.isnull().sum() #결측치 확인

payment_df .isnull().sum() 

customer_df.isnull().sum()

order_df.isnull().sum()

products_df.isnull().sum()

# order_df와 products_df 에서 결측치 확인

 

tip.결측치를 찾는 방법 isnull() / 결측치의 합을 보여주게 하는 sum()을 붙여서 1이상이 나오면 결측치가 있고 0이면 없는 것이다.

 

payment_df.duplicated().sum() #중복값이 없는지 확인

order_items_df.duplicated().sum()

customer_df.duplicated().sum()  

order_df.duplicated().sum()  

products_df.duplicated().sum() 

# customer_df에서 3089개의 중복값 확인

 

tip. primry key는 테이블의 각 행을 고유하게 식별되는 데 사용

 

null값이 1개 이상인 전체 데이터를 보고싶다.

 

products_df['missing_count'] = products_df.isnull().sum(axis=1)

# ['missing_count']를 추가하여 몇개의 결측치가 있는지 저장할 공간 생성

# products_df.isnull().sum( )결측치의 개수를 찾는방법

# (axis=1) 축설정

 

이후에는 각각의 행에 대해서 결측치가 몇개인지 알려주는 열이 생겨서 필터링 필요

 

filtered_df = products_df[products_df['missing_count'] > 0 ]

# products_df에 조건 걸기

# [products_df['missing_count'] > 0 ]는 products_df['missing_count']가 0개 초과하는 것만 보겟다는 조건

=> 결측치가 있던 애들이 하나의 행에서 발생한 것을 볼 수 있다.

 

merge() 진행 전에 중복값을 제거 해야한다.

 

customer_df = customer_df.drop_duplicates() #중복값 제거

 

merged_ order_id  = pd.merge(orders_df, payments_df, how = 'left', on = 'order_id' )

# orders_dfpayments_df는 order_id로 연결 되어있으니 order_id를 기준으로 merged_ order_id을 left 조인 할거다.
merged_ customer_id = pd.merge( merged_ order_id , customers_df, how = 'left', on = 'customer_id')

# merged_ order_id  customer_id 를 기준으로 customers_df 와 결합해 merged_ customer_id  생성
merged_ order_id2 = pd.merge( merged_ customer_id , order_items_df, how = 'left', on = 'order_id')

# merged_ customer_id  order_id 를 기준으로 order_items_df 결합해  merged_ order_id2 생성
merged_ product_id = pd.merge( merged_ order_id2 , products_df, how = 'left', on = 'product_id')

#   merged_ order_id2product_id 를 기준으로 products_df 결합해 merged_ product_id  생성

 

merged_product_id.duplicated().sum() # merged_product_id의 중복값 확인

 

merged_product_id.isnull().sum()

#결측치 확인 됨(원래 결측치가 있었어서 여전히 존재하는데 merge결과에 따라 급격히 늘어남)

 

merged_product_id = merged.dropna() #결측치 제거

 

 

1. 파생변수 만들기

1) merged['product_volume'] = merged['product_length_cm'] + merged['product_height_cm'] + merged['product_width_cm']

 

merged['product_volume']  # product_volume라는 새로운 변수 생성

merged['product_length_cm'] + merged['product_height_cm'] + merged['product_width_cm']

#product요소들의 합을 값으로 준다

 

2) merged['delivered_time'] = merged['order_delivered_timestamp'] - merged['order_purchase_timestamp'] 

(타입변환을 진행해 주었기 때문에 같은 타입끼리 연산이 가능)

 

2. 타입 변환(object타입을date타입으로 변환 할건데 지원하는 연산이 한정적 / 다르기 때문에변환한다)

merged['order_delivered_timestamp'] = pd.to_datetime(merged['order_delivered_timestamp'])

 

merged['order_delivered_timestamp'] #바꾼 요소의 변수이름 설정

pd.to_datetime() #datetime으로 데이터타입 변환 함수

['order_delivered_timestamp']  #바꿀 요소 선택

 

3. 이상치 찾기

tip. 찾기전에 데이터의 특성을 분석하고 논리에 맞는 기준을 세우고 그후에 그 기준대로 이상치를 처리해야지 의미있는 데이터가 나온다.

주의. 이상치를 처리 후 결측치 처리와 결측치 처리 후 이상치 처리는 값이 다르다.

1.IQR사용(숫자형 데이터 사용 가능)

1) IQR방법을 일괄로 사용하려면 코드적으로 접근하는게 좋다.

 

4. 인코딩

 

1).nunique()

각각의 컬럼에 유일값이 몇개있는지 확인하는 함수

merged_product_id.nunique()

카테고리형 변수는 한정 된 범위를 갖는다고해서 항상 카테고리라고 하지 않는다.

범주에 속하는 경우 카테고리 변수라고 하기 때문에 적절한 인코딩 방법을 사용해야한다.

빈도수에 따라 인코딩해야한다. (변수가 name이면 다양한  이름이 올것이기 때문에 딥러닝의 인베딩 개념을 사용하면 좋다.)

 

2) 원핫 인코딩(새로운 컬럼 생성)

pd.get_dummies()

 

merged = pd.get_dummies(merged, columns = ['payment_type'])

pd.get_dummies( merged_product_id ) #새로운 columns 생성 위치  merged_product_id 지정

columns = ['payment_type'] #지정한 columns에만 새로운 columns 생성

주의. 컬럼이 너무 많은 곳에 사용하면 컬럼이 너무 많아져 좋지않은 영향을 준다.

 

5. 스케일링(이해가 안되요)

from sklearn.preprocessing import StandardScaler

 

scaler = StandardScaler()

 

scaler_data = scaler.fit_transform(merged_product_id)=>안된다면 타입이 안맞아서 그럴 수 있다.

타입캐스팅이 발생할 수 있기 때문에 항상 주의 해야한다.

 

 

 

정확성 검증

(테이블 단위로 info(), .isnull().sum(), .duplicated().sum()으로 검증이 가능 하다.

해당 과정은 전반적인 전처리를 진행하는 것)

 

가격과 배송비의 합을 order_item_id 단위로 더해서 order_id행에 추가해야한다.

order_id에 item 단위로 각각의 price를 구해줄것이다.

그런데  order_item_id가 같더라도 payment가 여러번 나뉜 경우 행이 쪼개져있기 때문에 이경우에는 order_id와 order_item_id로 그룹화 하는데 price의 평균을 구해 줄것이다. 그래서 order_item_id로 모든 값을 하나로 묶어 줄 것이다.

 

1. order_id와 order_item_id의 price와 shipping_charges의 평균

grouped_1 = merged_product_id.groupby(by = ['order_id', 'order_item_id']).agg({"price":'mean','shipping_charges':'mean'})

 

grouped_1 #그룹화할 변수 생성

merged_product_id.groupby() # merged_product_id에 groupby()함수 사용

by = ['order_id', 'order_item_id'] #그룹화할 요소 선택

agg() #연산 함수 사용를 포함 시키기 위한 함수

{"price":'mean','shipping_charges':'mean'} # price와 shipping_charges에 각각 평균함수 사용 지정

 

2. order_id의 price와 shipping_charges가 궁금하다.

grouped_1 = grouped_1.groupby(by = ['order_id']).agg({'price':'sum', 'shipping_charges':'sum'})

 

grouped_1 #그룹화할 변수 생성

grouped_1.groupby() #  grouped_1에 groupby() 함수사용

by = ['order_id'] #그룹화할 요소 선택

agg() #연산 함수 사용를 포함 시키기 위한 함수

{'price':'sum', 'shipping_charges':'sum'} # price와 shipping_charges가 하나하나 독립 된 값이여서 'SUM'사용

 

3. order_id와 payment_sequential의 payment_value평균

grouped_2 = merged_product_id.groupby(by = ['order_id', 'payment_sequential']).agg({'payment_value':'mean'})

 

4. order_id의 payment_value

grouped_2 = grouped_2.groupby(by = ['order_id']).agg({'payment_value':'sum'})

 

 

merge()전/후 그리고 데이터 처리 전/후 비교를 꼭 해보아야한다.

 


특강( 학습법 마음가짐 

 

 

중요한건 협업과 기술적 고민

문제해결능력/커뮤니케이션 능력

로직과 코드 의도생각하기

구현하는 기술,스택에 목적과 근거 가지기

더 좋은 방법이 있는지 고민하기 AZURE

예쁘게말하기

명확하게 말하기 = 두괄식

근거를 바탕으로 소통하기

 

9to9활용법

개념 구조 => 실습으로 익히기강의는 복습 필요 => 키워드 필기해서 찾아보는게 필수(전체를 파악하기 힘드니)과제는 완성하지 못해도 피드백받으면서 부족한 부분 채우고 최종적으론 기한 지키기질문과 공유는 필수

 

질문

구글링할때 유용한 확장팩 notion clipper, liner, openai

협업에 대해 => 회사마다 프로젝트마다 다르다.

변수 컨벤션, git.branch등 여러방법을 사전에 정한다.

redis, github살펴보기 (github가 뭐지)개발자로 처음 들어가게 되면 코드로 과제를 받고 수행하는 것 부터 시작할 것이다.

잘못된 코드 컨벤션 고치냐 안고치고 잘못된 변수명을 통일되게 쓰냐

 


 

회고

6-1

멀티인덱스 데이터 접근

 xs()를 이용해서 서울에 대한 데이터만을 가져왔는데 그 과정에서 어떤게 추출되고 제거 되었는지 이해가 안간다.

=재수강

 

6-3

판다스 실습

파일의 위치를 파이썬 파일과 같은 경로에 두어야한다.

나는 파이썬 파일이 어디에 생성 되는 건지 찾지 못해 애먹었지만 

jupyter home에서 파일을 열어 위치를 찾고 다운받은 파일을 옮겨 주었다.

 

그러면 쥬피터나 vscode에서 파이썬 파일을 만들 때 위치 지정을 해줄수있나?(파일들이 지저분함)

오후 회의때 질문 해보기(질문 찾지 못해서 질문 못함 다음 수업 회의때나 튜터님에게 질문 해보기)

 

primry key란

테이블의 각 행을 고유하게 식별되는 데 사용

 

직접 진행한 이상치 찾기 실습은 오류가 낫음

=코드 해석해보기 

 

스케일링 이해가 안감

=재수강 or 질문해보기

 

+ Recent posts