[Pandas] 5. 조건에 맞춰 데이터 추출하고 수정하기 (Kaggle 에서 가져온 Gear Defection 데이터 이용)
공부/코딩

[Pandas] 5. 조건에 맞춰 데이터 추출하고 수정하기 (Kaggle 에서 가져온 Gear Defection 데이터 이용)

 Kaggle 이라는 사이트가 있습니다. 데이터 사이언스 커뮤니티입니다. 유명한 IT 기업들이 데이터 분석 Competition을 열기도 합니다. 많은 데이터들이 올라와있고, 사람들이 그 분석방법을 공유합니다. 공공데이터 말고 재밌는 게 없을까 하고 찾다 발견했습니다. 한국에는 비슷한 사이트로 데이콘(Daycon)이 있습니다.

 

 

Mechanical Gear Vibration Dataset

Vibration of six gear types are measured under various working conditions

www.kaggle.com

 제가 오늘 사용할 데이터입니다. 기어의 진동 데이터이고, 문제가 발생했을 때의 값이 모두 적혀있습니다. 데이터 파일은 6개로 나뉩니다. 각각 Eccentricity, Missing tooth, Root crack, Surface fault, Tooth chipped, 마지막으로 no fault 입니다. 교양삼아 어떤 문제들인지 알아봅시다.

 

  • Eccentricity : 이심입니다. 돌아가는 기어에 이심이 생기면 Rotating Unbalance (회전불균형)이 생겨 자체 가진을 합니다. 세탁기 같은 상태가 되는거죠.
  • Missing Tooth : 기어의 이가 통채로 사라진 것입니다.
  • Root crack : 기어 이의 하단부인 Root에 크랙이 생긴 것입니다.
  • Surface fault : 기어 이의 surface가 마모되는 등 문제가 생긴 것입니다.
  • Tooth Chipped : 기어 이가 일부만 부서진(Chipped) 것입니다.

데이터 제공자의 설명

 같은 속도와 하중에서 문제를 구분할 수 있다고 합니다. 변수가 x축 변위, y축 변위 밖에 없으니 이 두가지를 이용해 구분할 수 있다는 말이겠죠. 아직 이거까지 할 짬은 안되니 아래에서 기본적인 것만 써보겠습니다.

 

1. describe() 로 데이터 둘러보기


import pandas as pd
import numpy as np

df = pd.read_csv('no_fault.csv')
df.describe()

 각 컬럼별로 15만개의 데이터가 있다고 합니다. 위에서 말한 것처럼 하중은 0, 40, 80, 속도는 8.33, 25, 40 으로 나뉘는군요.

 

 하중이 0, 속도가 8.33 인 값만 일단 추출해봅시다.

 

2. 조건에 맞는 데이터 추출하기


min =df['speedSet'].min()
df['speedSet'] <= min

결과값

 8.33인데, 숫자가 좀 복잡해서 min 값을 넣었습니다. 데이터프레임 형태로 모두 가져와야 여기서 load 도 조건을 걸어줄 수 있을 듯 합니다.

 

filt = (df['speedSet']<=min)
df[filt] # filt라는 조건을 가지고 df에서 값을 가져옴

결과값

 됐네요. 참고로 df[~filt] 를 하면 조건을 반대로 적용할 수 있습니다.

 이제 Load 값이 0 인 데이터를 뽑아내면 되겠습니다.

 

df.loc[(df['speedSet']<=min) & (df['load_value']==0)] // speed 가 가장 작으면서 load가 0인 값

결과값

 &은 and를 의미하며 | 는 or를 의미합니다. 여기선 &을 사용하였습니다.

df.loc 를 써도 되고, 그냥 df를 써도 됩니다.

 

3. 두 열의 값을 합쳐서 새로운 열 추가


 진동에 있어 변위는 중요합니다.  x축 변위, y축 변위를 합쳐 총 변위량을 만들어봅시다.

 

data = df.loc[(df['speedSet']<=min) & (df['load_value']==0)]
data['displacement'] = data['sensor1'] + data['sensor2']

오류발생

 SettingWithCopyWarning 이 발생했습니다. 이에 관한 내용은 아래 링크에서 자세히 확인할 수 있습니다. 결론은 위 코드에서 data에 입력한 기존 데이터프레임 일부를 입력하였으나, 이걸 호출해도 새로운 데이터프레임이 나오지 않습니다. 원래 데이터의 일부를 잘라서 보여주는 것입니다. 이때, data에 Column을 추가하면 원본에도 넣을지, 참조한 것만 넣을지 결정을 해야합니다.

 

 정답은 없습니다. Pandas에서는 이런 경우 copy() 메소드를 통해 독립적인 메모리를 사용하는 것을 추천한다고 합니다.

 

Pandas의 DataFrame 사용 중 SettingWithCopyWarning 발생할 때

Python, Pandas를 Excel보다 사랑하는 직장인을 위한 블로그

emilkwak.github.io

 

data = df.loc[(df['speedSet']<=min) & (df['load_value']==0)].copy()
data['displacement'] = np.sqrt(np.square(data['sensor1']) + np.square(data['sensor2']))
data

 

 

 좋습니다. 이제 Column 위치만 sensor2의 오른쪽으로 옮겨가면 좋을 것 같아요.

 

4. Column 위치 옮기기

col_list=data.columns.tolist() #data의 컬럼들을 리스트 형태로 받기

new_col_list = col_list[0:2] + col_list[-1:] + col_list[3:-1] #col_list를 슬라이싱해서 배치

data2=data[new_col_list]
data2

 이름으로 쫙 뽑아내서 배치해도 되는데, 나중에 컬럼수가 많아질 때를 생각해서 연습 겸 슬라이싱 했습니다. Displacement 값으로 어떤 고장인지 판별하는 것도 해보고싶네요. 다음에 한번 해보겠습니다.

 

 오늘도 읽어주셔서 감사합니다.