데이터 사이언스 100번의 노크(구조화 데이터 처리편) – Python Part 1 (Q1 to Q20)

데이터 사이언스

데이터 사이언스 100번의 노크(구조화 데이터 처리편) – Python Part 1 (Q1 to Q20)의 해설입니다.

 

참고(Reference) : 「데이터 사이언티스트 협회 스킬 정의 위원」의 「데이터 사이언스 100번의 노크(구조화 데이터 처리편)」입니다.

데이터 사이언티스트 소사이어티 깃허브 : https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

데이터 사이언스 100 노크 (구조화된 데이터 처리) URL : https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess/blob/master/docker/work/answer/ans_preprocess_knock_Python.ipynb

– 참고: 원래 데이터 사이언티스트 소사이어티(データサイエンティスト協会スキル定義委員)에서 만든 ipynb 파일을 DeepL 에서 일본어에서 영어로 번역한 파일입니다.

– 이 파일을 업데이트한 이유는 초보자부터 고급 엔지니어까지 Python을 사용하고자 하는 모든 사람에게 유용한 이 실습을 전파하기 위해서입니다.

– 이 데이터는 일본어로 작성되었으므로 연습할 때 언어 문제가 발생할 수 있습니다. 그러나 크게 영향을 미치지 않으므로 걱정하지 마십시오.

 

해설:

df_receipt.head(10) 코드는 df_receipt라는 Pandas DataFrame의 첫 10개의 행을 표시하는 데 사용된다.

Pandas에서 DataFrame은 잠재적으로 서로 다른 데이터 타입의 열을 가진 2차원 레이블이 있는 데이터 구조입니다. 이는 스프레드시트나 SQL의 테이블과 유사하다.

Pandas의 .head() 메서드는 DataFrame의 처음 n개의 행을 표시하는 데 사용된다. 기본적으로 처음 5개 행이 표시됩니다. 이 경우 .head(10)은 DataFrame의 처음 10개의 행을 표시하는 데 사용된다.
 
해설 :

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].head(10) 코드는 df_receipt라는 Pandas DataFrame의 컬럼의 하위 집합인 df_receipt의 첫 10개의 행을 표시하는 데 사용됩니다. 에 사용됩니다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]라는 코드는 DataFrame df_receipt에서 컬럼의 하위 집합을 선택하는 데 사용된다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 컬럼이 선택된다.

결과 DataFrame에는 이러한 선택된 컬럼만 포함된다. 그리고 .head(10) 메서드를 사용하여 이 서브셋 DataFrame의 처음 10개의 행을 표시한다.

 

 
 
해설 :

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].query('customer_id == "CS018205000001"')라는 코드는 df_receipt라는 Pandas DataFrame에서 customer_id 열이 특정 값(CS0182050001)과 일치하는 행의 하위 집합을 선택하는 데 사용됩니다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]라는 코드는 DataFrame df_receipt에서 컬럼의 하위 집합을 선택하는 데 사용됩니다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 이름의 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 특정 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 이 경우 조건은 customer_id 열이 "CS018205000001" 값과 같아야 한다는 것입니다. 첫 번째 행 끝에 있는 백슬래시(백슬래시)는 가독성을 높이기 위해 코드를 다음 행으로 이어진다는 의미입니다.

결과 DataFrame에는 customer_id 컬럼이 지정된 값과 일치하는 행만 포함됩니다.
 
 
해설:

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].query('customer_id == "CS018205000001"')라는 코드는 df_receipt라는 Pandas DataFrame에서 customer_id 열이 특정 값(CS0182050001)과 일치하는 행의 하위 집합을 선택하는 데 사용됩니다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]라는 코드는 DataFrame df_receipt에서 컬럼의 하위 집합을 선택하는 데 사용됩니다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 이름의 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 특정 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 이 경우 조건은 customer_id 열이 "CS018205000001" 값과 같아야 한다는 것입니다. 첫 번째 행 끝에 있는 백슬래시(백슬래시)는 가독성을 높이기 위해 코드를 다음 행으로 이어진다는 의미입니다.

결과 DataFrame에는 customer_id 컬럼이 지정된 값과 일치하는 행만 포함됩니다.
 
해설:

코드 df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]입니다. \ .query('customer_id == "CS018205000001" & amount >= 1000')는 df_receipt라는 Pandas DataFrame에서 행의 하위 집합을 선택하기 위해 사용되며, 여기서 customer_id 열은 특정 값(CS 018205000001)과 같고, amount 열은 1000 이상이다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]라는 코드는 DataFrame df_receipt에서 열의 하위 집합을 선택하는 데 사용된다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 이름의 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 여러 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 기호 &는 두 조건 간의 논리적 AND 연산을 나타내기 위해 사용됩니다. 첫 번째 조건은 customer_id 컬럼이 'CS018205000001'과 같아야 한다는 것이고, 두 번째 조건은 amount 컬럼이 1000 이상이어야 한다는 것이다.

결과 DataFrame에는 두 조건이 모두 충족되는 행만 포함됩니다.
 
해설:

코드 df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]. query('customer_id == "CS018205000001" & (amount >= 1000 | quantity >=5)')는 df_receipt라는 Pandas DataFrame에서 고객_id 열이 특정 값(CS018205000001)을 갖는 행의 하위 집합을 선택하는 데 사용됩니다. 이 특정 값(CS018205000001)과 같고, umount 열이 1000 이상 또는 quantity 열이 5 이상이다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]라는 코드는 DataFrame df_receipt에서 열의 하위 집합을 선택하는 데 사용되는 코드이다. 구체적으로 sales_ymd, customer_id, product_cd, quantity, amount라는 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 여러 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 기호 &는 두 조건 간의 논리적 AND 연산을 나타내기 위해 사용됩니다. 첫 번째 조건은 customer_id 열이 'CS018205000001' 값과 같아야 한다는 것이고, 두 번째 조건은 괄호로 둘러싸여 있고 논리 OR 연산을 나타내는 | 기호로 구분된 두 개의 하위 조건이 포함되어 있습니다. 첫 번째 하위 조건은 금액 열이 1000 이상이고, 두 번째 하위 조건은 quantity 열이 5 이상이다.

결과 DataFrame에는 customer_id가 지정된 값과 같고 amount가 1000 이상, quantity가 5 이상인 행만 포함된다.
 
 
해설:

코드 df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]입니다. \ .query('customer_id == "CS018205000001" & 1000 <= amount <= 2000')는 df_receipt라는 Pandas DataFrame에서 행의 하위 집합을 선택하는 데 사용되며, 여기서 customer_id 열은 특정 값(CS018205000001)과 동일합니다. 값(CS018205000001)과 같고, amount 열은 1000에서 2000(inclusive)까지이다.

df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]라는 코드는 DataFrame df_receipt에서 열의 하위 집합을 선택하는 데 사용된다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 여러 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 기호 &는 두 조건 간의 논리적 AND 연산을 나타내기 위해 사용됩니다. 첫 번째 조건은 customer_id 열이 'CS018205000001' 값과 같아야 한다는 것이고, 두 번째 조건은 비교 연산자 <=와 >=를 사용하여 amount 열의 값 범위를 지정하는 것이다.

완성된 DataFrame에는 customer_id가 지정된 값과 같고 amount가 1000에서 2000 사이인 행만 포함됩니다(포괄적인 값).
 
해설:

코드 df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]입니다. \ df_receipt['customer_id == "CS018205000001" & product_cd ! = "P071401019"]는 Pandas DataFrame의 df_receipt에서 고객_id 열이 특정 값(CS018205000001)과 같고, product_cd 열이 특정 값(P0714019)과 같지 않은 행의 하위 집합을 선택하는 데 사용된다. )와 동일하지 않다.

코드 df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]는 DataFrame df_receipt에서 열의 하위 집합을 선택하는 데 사용한다. 구체적으로 sales_ymd, customer_id, product_cd, amount라는 이름의 컬럼을 선택합니다.

그런 다음 .query() 메서드를 사용하여 여러 조건에 따라 DataFrame의 행을 필터링하고 있습니다. 기호 &는 두 조건 간의 논리적 AND 연산을 나타내기 위해 사용됩니다. 첫 번째 조건은 customer_id 열이 "CS018205000001" 값과 같아야 한다는 것이고, 두 번째 조건은 product_cd 열이 "P071401019" 값과 같지 않아야 한다는 것이며, 이는 ! = 비교 연산자를 사용하여 실현됩니다.

결과 DataFrame에는 customer_id가 지정된 값과 같고 product_cd가 지정된 값과 같지 않은 행만 포함된다.
 
해설 : 

df_store.query('prefecture_cd ! = "13" & floor_area <= 900')라는 코드는 df_store라는 Pandas DataFrame에서 prefecture_cd 열이 특정 값(13)과 같지 않고, floor_area 열이 특정 값(900) 이하인 행을 필터링하는 데 사용됩니다. 에 사용된다.

.query() 메서드는 부울 식을 기반으로 DataFrame의 행을 필터링하는 데 사용된다. 이 경우 부울 표현식은 'prefecture_cd ! = "13" & floor_area <= 900' 입니다.

! = 연산자는 prefecture_cd 열의 각 값이 '13'과 같지 않은지 확인하는 데 사용된다. 연산자 &는 이 조건과 floor_area 열의 값이 900 이하인지 여부를 확인하는 두 번째 조건 사이의 논리적 AND 연산을 나타내기 위해 사용된다.

결과 DataFrame에는 두 조건이 모두 True인 행만 포함된다.
 
해설:

df_store.query("store_cd.str.startswith('S14')", engine='python').head(10)라는 코드는 df_store라는 Pandas DataFrame에서 store_cd 열이 특정 문자열 (S14) 로 시작하는 행을 필터링하는 데 사용된다.

.query() 메서드는 DataFrame의 행을 부울 표현식에 따라 필터링하는 데 사용된다. 이 경우 부울 표현식은 'store_cd.str.startswith('S14')'가 된다. 이 표현식은 engine 파라미터가 'python'으로 설정되어 있기 때문에 파이썬 구문으로 작성되어 있다. 이 식은 store_cd 컬럼이 'S14' 문자열로 시작하는지 여부를 확인한다.

str.startswith() 메서드는 Python의 문자열 메서드로, 문자열이 지정된 접두어로 시작하면 True를 반환하는 메서드이다. 이 경우 str.startswith('S14') 메서드가 store_cd 컬럼의 각 요소에 적용된다.

결과 DataFrame에는 store_cd 컬럼의 시작이 'S14' 문자열인 행만 포함된다.

.head(10) 메서드를 사용하여 결과 DataFrame의 처음 10개의 행만 반환합니다.
 
해설:

이 코드는 df_customer라는 Pandas DataFrame에서 데이터의 하위 집합을 선택한다. 이 서브셋은 query() 메서드에서 지정한 조건에 따라 필터링됩니다.

조건은 query() 메서드의 인수로 전달되는 문자열 'customer_id.str.endswith('1')'에 의해 정의된다. 이 조건은 df_customer DataFrame의 행 중 customer_id 컬럼의 끝이 '1'인 행만 포함하도록 필터링한다.

engine='python' 파라미터는 선택 사항으로, 조건 평가에 Python 엔진을 사용하도록 지정합니다. query() 메서드의 기본 엔진(pandas.evaluate)이 모든 문자열 연산을 지원하는 것은 아니기 때문에 조건에 문자열 연산이 포함된 경우 이 파라미터를 지정해야 합니다. 포함되는 경우 이 지정이 필요하다.

마지막으로 head(10) 메서드를 사용하여 필터링된 DataFrame의 처음 10줄을 반환한다. 이는 선택 사항이며, 여기서는 출력을 관리하기 쉬운 크기로 제한하는 데 사용됩니다.
 
해설:

구체적으로 query()의 인수로 전달되는 "address.str.contains('요코하마시')라는 문자열로 조건을 정의한다. 이 문자열은 df_store의 address 컬럼에 '요코하마시'라는 부분 문자열이 포함되어 있는지 확인하는 부울 식이다.

str.contains() 메서드는 Pandas의 문자열 메서드로, 주어진 문자열의 각 요소가 지정된 부분 문자열을 포함하는지 여부를 나타내는 부울 배열을 반환한다. 이번에는 df_store의 address 컬럼에 적용해 보겠습니다.

engine='python' 인수는 기본 numexpr 엔진이 아닌 파이썬의 내장된 eval() 함수로 필터링 처리를 수행하도록 지정한다. 이는 str.contains()와 같이 numexpr 엔진에서 지원하지 않는 특정 유형의 문자열 연산을 쿼리 식에서 사용할 때 필요하다.
 
해설:

df_customer는 DataFrame 객체이다.

.query()는 특정 조건에 따라 행을 필터링하기 위해 Pandas가 제공하는 메소드이다. 조건은 문자열 인수로 지정됩니다.

이 경우 조건은 'status_cd.str.contains(r'^[A-F]')이다. 이는 str.contains() 메서드를 사용하여 DataFrame의 status_cd 컬럼에 A부터 F까지 문자로 시작하는 문자열이 포함되어 있는지(포괄적으로) 검사하는 것이다. 정규 표현식 패턴 '^[A-F]' 앞의 r은 원시 문자열 리터럴을 나타내며, 백슬래시 문자(\)가 이스케이프 문자가 아닌 문자 그대로 해석되도록 보장합니다.

engine='python' 인수는 Pandas가 사용하는 기본 엔진이 아닌 Python의 내장 정규 표현식 엔진을 사용하여 필터링을 수행하도록 지정한다. 이는 기본 엔진이 특정 정규 표현식 기능을 지원하지 않거나 너무 느릴 때 유용하다.

.head(10) 메서드는 필터링된 DataFrame의 처음 10줄만 반환하는 데 사용된다.

즉, 이 코드는 전체적으로 df_customer DataFrame을 필터링하여 status_cd 열이 A부터 F까지의 문자로 시작하는 행만 포함하도록 필터링하고, 그 결과 DataFrame의 처음 10개의 행을 반환한다.

 

 
해설:

df_customer는 DataFrame 객체이다.

.query()는 특정 조건에 따라 행을 필터링하기 위해 Pandas가 제공하는 메소드이다. 조건은 문자열 인수로 지정됩니다.

이 경우 조건은 'status_cd.str.contains(r'[1-9]$', regex=True)가 된다. 이는 str.contains() 메서드를 사용하여 DataFrame의 status_cd 컬럼에 1~9(포함)로 끝나는 문자열이 포함되어 있는지 확인합니다. 문자 $는 문자열의 끝을 나타내며, regex=True 인수는 패턴이 정규 표현식으로 해석될 것임을 나타낸다.

engine='python' 인수는 Pandas가 사용하는 기본 엔진이 아닌 Python의 내장 정규 표현식 엔진을 사용하여 필터링을 수행하도록 지정한다. 이는 기본 엔진이 특정 정규 표현식 기능을 지원하지 않거나 너무 느린 경우에 유용하다.

.head(10) 메서드는 필터링된 DataFrame의 처음 10줄만 반환하는 데 사용된다. 즉, 전체적으로 이 코드는 status_cd 열이 1에서 9까지의 숫자로 끝나는 행만 포함하도록 df_customer DataFrame을 필터링하고 그 결과 DataFrame의 처음 10개의 행을 반환한다.
 
해설:

이 코드에서는 Python의 Pandas 라이브러리를 사용하여 df_customer라는 이름의 DataFrame에서 행을 필터링하고 있다. 필터링은 query() 메서드에서 지정한 조건에 따라 이루어지며, 이 메서드는 부울 식을 나타내는 문자열 인수를 받습니다.

status_cd: df_customer DataFrame의 컬럼이라고 가정한다.

. : 파이썬에서 객체의 메서드나 속성에 접근할 때 사용하는 점 표기법이다.

str: str: status_cd 컬럼의 문자열 메서드를 가리킨다.

contains() : 컬럼의 각 요소에 주어진 부분 문자열 또는 정규 표현식이 존재하는지 확인하는 문자열 메서드이다.

r'^[A-F]. *[1-9]$': 문자 A부터 F(포함)로 시작하고 1부터 9(포함)의 숫자로 끝나는 문자열과 일치하는 정규 표현식 패턴이다. 패턴 앞의 r 접두사는 원시 문자열임을 나타냅니다. 이는 백슬래시가 이스케이프 문자가 아닌 리터럴 백슬래시로 취급된다는 것을 의미한다.

또한, query() 메서드에서 engine의 인수로 'python'이라는 값이 지정되어 있다. 이는 Pandas가 사용하는 기본 엔진이 numexpr로 쿼리 종류에 따라서는 빠르게 처리할 수 있지만, 모든 종류의 정규 표현식을 지원하지 않을 수 있기 때문입니다. 처리되도록 합니다.

마지막으로 .head(10) 메서드를 호출하면 필터 조건과 일치하는 처음 10개의 라인으로 출력이 제한된다.
 
해설:

이 코드에서는 Python의 Pandas 라이브러리를 사용하여 df_store라는 DataFrame에서 행을 필터링하고 있다. 필터링은 query() 메서드에서 지정한 조건에 따라 이루어지며, 이 메서드는 부울 식을 나타내는 문자열 인수를 받습니다.

tel_no : df_store DataFrame의 컬럼이라고 가정한다.

. : 파이썬에서 객체의 메서드나 속성에 접근할 때 사용하는 점 표기법이다.

str : tel_no 컬럼의 문자열 메서드를 참조한다.

contains() : 컬럼의 각 요소에 주어진 부분 문자열 또는 정규 표현식이 존재하는지 확인하는 문자열 메서드이다.

r'^[0-9]{3}-[0-9]{3}-[0-9]{3}-[0-9]{4}$' : 북미 전화번호 형식(3자리, 하이픈, 추가 3자리, 추가 3자리, 추가 하이픈, 추가 4자리)의 문자열과 일치하는 정규식 패턴이다. 패턴 앞의 r 접두사는 원시 문자열임을 나타내며, 이는 백슬래시가 이스케이프 문자가 아닌 리터럴 백슬래시로 취급된다는 것을 의미한다. 중괄호 {}는 직전 패턴을 지정한 횟수만큼 반복한다는 것을 나타내며, 마지막 $는 문자열의 끝을 의미한다.

또한, query() 메서드에서 engine의 인수에 'python'이라는 값이 지정되어 있다. 이는 Pandas가 사용하는 기본 엔진이 numexpr로 쿼리 종류에 따라서는 빠르게 처리할 수 있지만, 모든 종류의 정규 표현식을 지원하지 않을 수 있기 때문이다. 처리하게 됩니다.

그 결과, df_store DataFrame에서 tel_no 컬럼에 유효한 북미 전화번호를 가진 행만 남기는 필터가 생성된다.
 
해설:

이 코드에서는 Python의 Pandas 라이브러리를 사용하여 df_customer라는 DataFrame의 행을 birth_day 열의 값을 기준으로 오름차순으로 정렬하고 있다. 결과적으로 정렬된 DataFrame은 head() 메서드를 사용하여 처음 10개의 행으로 제한됩니다.

df_customer: 정렬될 DataFrame의 이름이다.

sort_values() : 하나 이상의 컬럼 값을 기준으로 DataFrame을 정렬하는 데 사용되는 Pandas의 메소드이다. 이 경우 birth_day 컬럼이 정렬 키로 지정되어 있다.

'birth_day' : 정렬 키로 사용되는 컬럼의 이름이다.

.head(10) : 출력을 정렬된 DataFrame의 첫 10행으로 제한하는 메서드 호출이다.

결과적으로 df_customer DataFrame의 첫 10개의 행이 birth_day 컬럼의 값을 기준으로 오름차순으로 정렬된 상태로 출력됩니다. 이를 통해 birth_day가 고객의 생년월일을 나타낸다고 가정할 때, 데이터 집합에서 가장 오래된 10명의 고객을 확인할 수 있습니다.
 
해설:

이 코드에서는 Python의 Pandas 라이브러리를 사용하여 df_customer라는 DataFrame의 행을 birth_day 열의 값을 기준으로 내림차순으로 정렬하고 있다. 결과적으로 정렬된 DataFrame은 head() 메서드를 사용하여 처음 10개의 행으로 제한됩니다.

df_customer: 정렬될 DataFrame의 이름입니다.

sort_values() : Pandas의 메소드이며, 하나 이상의 컬럼 값을 기준으로 DataFrame을 정렬하는 데 사용됩니다. 이 경우, birth_day 컬럼이 정렬 키로 지정되어 있습니다.

'birth_day' : 정렬 키로 사용될 컬럼의 이름입니다.

ascending=False : 이 인수는 정렬 순서를 기본 오름차순이 아닌 내림차순으로 지정하는 데 사용된다.

.head(10): 출력을 정렬된 DataFrame의 처음 10행으로 제한하는 메서드 호출이다.

결과적으로 출력되는 것은 df_customer DataFrame의 처음 10개의 행이며, birth_day 열의 값을 기준으로 내림차순으로 정렬된다. 이를 통해 birth_day가 고객의 생년월일을 나타낸다고 가정할 때, 데이터 세트에서 가장 어린 10명의 고객을 확인할 수 있습니다.
 
해설:

주어진 코드는 다음과 같은 처리를 수행하고 있다.

pd.concat() 함수를 사용하여 두 개의 데이터 프레임 df_receipt[['customer_id', 'amount']]와 df_receipt['amount'].rank(method='min', ascending=False)를 열 축(axis= 1)을 따라 연결하고 있다. 얻어진 데이터 프레임은 변수 df_tmp에 할당된다. 첫 번째 dataframe df_receipt[['customer_id', 'amount']]에는 더 큰 dataframe df_receipt에서 'customer_id'와 'amount' 두 개의 열이 포함되어 있고, 두 번째 dataframe은 ' min' 방식으로 계산한 'amount' 열의 내림차순 순위를 담고 있다.

연결된 df_tmp의 컬럼을 df_tmp.columns 속성을 사용하여 'customer_id', 'amount', 'ranking'으로 이름을 바꾼다.

sort_values() 메서드로 df_tmp의 데이터 프레임을 'ranking' 열에서 오름차순으로 정렬하고, head(10) 메서드로 상위 10개의 행을 반환한다.

전체적으로 이 코드는 df_receipt dataframe의 'customer_id'와 'amount' 컬럼과 'min' 메서드로 계산한 'amount'의 순위를 내림차순으로 연결하고 있다. 결과 dataframe은 'ranking' 컬럼으로 정렬되어 가장 높은 순위를 가진 상위 10개의 행을 반환합니다. 이는 구매에 가장 많은 비용을 지출한 고객을 나타냅니다.
 

 

 

 

Comment