데이터 사이언스 100번의 노크(구조화 데이터 처리편) – Python Part 4 (Q61 to Q80)

데이터 사이언스
해설:

이 코드는 다음과 같은 동작을 수행합니다.

df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python')
df_receipt라는 DataFrame에서 customer_id 열이 "Z"로 시작하지 않는 행을 모두 선택한다. 완성된 DataFrame은 df_sales_amount로 저장된다.

df_sales_amount = df_sales_amount.groupby('customer_id').agg({'amount':'sum'}).reset_index()
df_sales_amount의 DataFrame을 customer_id로 그룹화하고, agg 메서드로 각 그룹의 금액 열의 합계를 계산합니다. 결과 DataFrame은 df_sales_amount로 저장됩니다.

df_sales_amount['log_amount'] = np.log10(df_sales_amount['amount'] + 0.5)
df_sales_amount DataFrame의 amount 열의 대수(하단 10)를 계산하는데, 0 또는 음수 값의 대수를 취하지 않기 위해 먼저 amount 값에 0.5를 더하고 있다. 결과 대수는 log_amount라는 새로운 컬럼에 저장됩니다.

df_sales_amount.head(10)
head 메서드를 사용하여 결과 df_sales_amount DataFrame의 처음 10줄을 표시합니다.

요약하면, 이 코드는 고객 ID가 "Z"로 시작하지 않는 DataFrame에서 행을 선택하고, 그 행을 고객 ID로 그룹화하고, 각 고객의 판매 금액의 합계를 계산하고, 판매 금액의 대수(10을 기준으로)를 취하여 결과 DataFrame의 처음 10개의 행을 표시합니다.
 
해설:

이 코드는 df_receipt라는 pandas의 DataFrame에 대해 몇 가지 데이터 처리를 수행합니다.

먼저 customer_id 열이 "Z"로 시작하는 행을 필터링하고 있습니다. 이는 str.startswith() 메서드를 사용하여 조건부로 query() 메서드를 사용하고 있으며, engine='python' 인수는 문자열 조작에 기본 pandas 파서가 아닌 Python 파서를 사용하기 위해 제공되었습니다.

얻어진 DataFrame은 groupby() 메서드를 사용하여 customer_id 컬럼으로 그룹화된다.

agg() 메서드는 각 그룹의 금액 컬럼에 함수를 적용하는 데 사용된다. 이 경우 sum() 함수를 사용하여 각 고객의 매출 금액의 합계를 계산합니다.

그런 다음 reset_index()를 사용하여 결과 DataFrame을 재설정하고 새로운 인덱스를 갖도록 합니다.

마지막으로, amount 열의 자연대수에 0.5를 더한 값(0 또는 음수 값의 대수를 취하지 않기 위해)을 취하여 log_amount라는 새로운 열을 만듭니다.

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

이 코드는 다음과 같은 동작을 수행합니다.

df_tmp = df_product.copy()
df_product라는 DataFrame의 복사본을 만들어 df_tmp라는 새로운 변수에 대입하고 있습니다. 복사본은 원본 DataFrame을 변경하지 않도록 만들어졌습니다.

df_tmp['unit_profit'] = df_tmp['unit_price'] - df_tmp['unit_cost'].
이는 단가에서 단가를 빼서 각 상품의 단위당 이익을 계산하고, 그 결과를 unit_profit이라는 새로운 컬럼에 저장한다. 완성된 DataFrame은 df_tmp로 저장됩니다.

df_tmp.head(10)
head 메서드를 사용하여 df_tmp DataFrame의 처음 10개의 행을 표시하고 있습니다.

요약하면, 이 코드는 DataFrame의 복사본을 만들고, 단가에서 단가를 빼서 각 상품의 단위당 이익을 계산하고, 복사한 DataFrame에 단위당 이익이 있는 새로운 열을 추가하고, 결과 DataFrame의 처음 10줄을 표시하는 것입니다.

 

해설:

이 코드는 다음과 같은 동작을 수행합니다.

df_tmp = df_product.copy()
df_product라는 DataFrame의 복사본을 만들어 df_tmp라는 새로운 변수에 대입하고 있습니다. 복사본은 원본 DataFrame을 변경하지 않도록 만들어졌습니다.

df_tmp['unit_profit_rate'] = (df_tmp['unit_price'] - df_tmp['unit_cost']) / df_tmp['unit_price'].
이익(단가에서 단가를 뺀 것)을 단가로 나누어 각 상품의 단위당 이익률을 계산하고, 그 결과를 unit_profit_rate라는 새로운 컬럼에 저장하고 있습니다. 완성된 DataFrame은 df_tmp로 저장됩니다.

df_tmp['unit_profit_rate'].mean(skipna=True)
df_tmp DataFrame의 unit_profit_rate 열의 평균값을 mean 방식으로 계산하고, 결손값(NaN)이 있으면 건너뛰고 결과를 표시한다.

요약하면, DataFrame의 복사본을 생성하고, 이익(단가에서 단가를 뺀 금액)을 단가로 나누어 각 상품의 단위당 이익률을 계산하고, 복사한 DataFrame에 단위당 이익률 열을 새로 추가하고, 이익률 열의 평균을 계산하고, 결과의 평균값을 표시하는 코드입니다.
 
해설:

이 코드는 다음과 같은 동작을 수행합니다.

df_tmp = df_product[['product_cd', 'unit_price', 'unit_cost']].copy()
df_tmp라는 새로운 DataFrame을 생성하여 product_cd, unit_price, unit_cost라는 세 개의 열만 포함하도록 하고, 원래의 df_product DataFrame에서 이 열들을 복사한다.

df_tmp['new_price'] = np.floor(df_tmp['unit_cost'] / 0.7)
이는 단가를 0.7(마크업 계수 1.43)로 나누고 floor 메서드로 소수점 이하를 반올림하여 각 상품의 새로운 가격을 계산하고, 그 결과를 new_price라는 새로운 컬럼에 저장하고 있습니다. 결과 DataFrame은 df_tmp로 저장된다.

df_tmp['new_profit_rate'] = (df_tmp['new_price'] - df_tmp['unit_cost']) / df_tmp['new_price'].
이전 단계에서 계산한 새로운 가격을 사용하여 각 상품의 단위당 수익률을 계산하고, 그 결과를 new_profit_rate라는 새로운 컬럼에 저장합니다. 결과 DataFrame은 df_tmp로 저장됩니다.

df_tmp.head(10)
head 메서드를 사용하여 df_tmp DataFrame의 처음 10개의 행을 표시하고 있습니다.

요약하면, 이 코드는 세 개의 열을 가진 새로운 DataFrame을 만들고, 마크업 계수 1.43을 기반으로 각 상품의 새로운 가격을 계산하고, 새로운 가격을 사용하여 각 상품의 단위당 수익률을 계산하고, 복사한 DataFrame에 새로운 두 개의 열을 추가하고, 결과의 DataFrame의 처음 10개의 행을 표시합니다.

 

해설:

이 코드는 다음과 같은 동작을 수행합니다.

df_tmp = df_product[['product_cd', 'unit_price', 'unit_cost']].copy()
df_tmp라는 새로운 DataFrame을 생성하여 product_cd, unit_price, unit_cost 세 개의 열만 포함하도록 하고, 원래의 df_product DataFrame에서 이 열들을 복사한다.

df_tmp['new_price'] = np.round(df_tmp['unit_cost'] / 0.7)
이것은 단가를 0.7(마크업 계수 1.43)로 나누어 각 상품의 새로운 가격을 계산하고, round 메서드를 사용하여 가장 가까운 정수로 반올림하여 결과를 new_price라는 새로운 컬럼에 저장하고 있습니다. 결과 DataFrame은 df_tmp로 저장됩니다.

df_tmp['new_profit_rate'] = (df_tmp['new_price'] - df_tmp['unit_cost']) / df_tmp['new_price'].
이전 단계에서 계산한 새로운 가격을 사용하여 각 상품의 단위당 수익률을 계산하고, 그 결과를 new_profit_rate라는 새로운 컬럼에 저장합니다. 결과 DataFrame은 df_tmp로 저장됩니다.

df_tmp.head(10)
head 메서드를 사용하여 df_tmp DataFrame의 처음 10개의 행을 표시하고 있습니다.

요약하면, 이 코드는 세 개의 열을 가진 새로운 DataFrame을 생성하고, 마크업 계수 1.43과 가장 가까운 정수로 반올림하여 각 제품의 새로운 가격을 계산하고, 새로운 가격을 사용하여 각 제품의 단위당 수익률을 계산하고, 복사한 DataFrame에 새로운 두 개의 열을 추가하고, 결과 DataFrame의 처음 10개의 행을 표시하는 것입니다.

 

해설:

이 코드는 df_product라는 pandas DataFrame 객체를 조작하고 있습니다.

아래 코드를 한 줄씩 분해해 보겠습니다.

df_tmp = df_product[['product_cd', 'unit_price', 'unit_cost']].copy(): 이 라인은 df_product의 하위 집합으로 "product_cd", "unit_price", "unit_cost"의 열만 를 포함하는 df_tmp라는 새로운 DataFrame 객체를 생성한다. .copy() 메서드는 원본 df_product를 참조하는 대신 DataFrame의 새로운 복사본을 생성하는 데 사용된다.

df_tmp['new_price'] = np.ceiling(df_tmp['unit_cost'] / 0.7): 이 행은 df_tmp에 'new_price'라는 새로운 열을 계산한다. 이는 'unit_cost' 열을 0.7로 나눈 후 numpy의 ceiling() 함수로 상한을 구한 결과입니다. 그러면 이윤율 30%를 기준으로 새로운 가격이 계산됩니다.

df_tmp['new_profit_rate'] = \ (df_tmp['new_price'] - df_tmp['unit_cost']) / df_tmp['new_price']: 이 행은 df_tmp에 'new_profit_rate'라는 새로운 열을 만들고 'new_price' 열에 'unit_cost'를 입력한다. new_price' 열에서 'unit_cost' 열을 빼고 'new_price' 열로 나눈 결과이다. 이를 통해 새로운 가격에 대한 수익률이 계산된다.

df_tmp.head(10): df_tmp DataFrame의 처음 10개의 행을 출력한다. 이 행은 이전 행의 계산이 제대로 이루어졌는지 확인하는 데 사용된다.
 
해설:

이 코드에서는 df_product라는 이름의 pandas DataFrame 객체도 조작하고 있습니다.

아래 코드를 한 줄씩 분해해 보겠습니다.

df_tmp = df_product[['product_cd', 'unit_price']].copy(): 이 줄은 df_product의 하위 집합으로 "product_cd"와 "unit_price" 컬럼만 포함하는 df_tmp라는 새로운 DataFrame 객체를 생성합니다. .copy() 메서드는 원래의 df_product를 참조하는 대신 DataFrame의 새로운 복사본을 생성하는 데 사용됩니다.

df_tmp['tax_price'] = np.floor(df_tmp['unit_price'] * 1.1): 이 행은 df_tmp에 'tax_price'라는 새로운 열을 계산한다. 이 열은 'unit_price' 열에 1.1을 곱하고 그 결과의 바닥을 numpy의 floor() 함수로 구한 결과입니다. 그러면 10%의 세금이 추가된 새로운 가격이 계산된다.

df_tmp.head(10): 이 행은 df_tmp의 DataFrame의 처음 10개의 행을 출력한다. 이전 행의 계산이 제대로 이루어졌는지 확인하는 데 사용합니다.

 

해설:

이 코드에서는 pandas의 DataFrame 객체인 df_receipt와 df_product도 조작하고 있습니다.

아래 코드를 한 줄씩 분해해 보겠습니다.

df_tmp_1 = df_receipt.groupby('customer_id').agg({'amount':'sum'}).reset_index().rename(columns={'amount':'sum_all'}): 이 줄은 df_receipt DataFrame을 "customer_id"로 변경합니다. receipt DataFrame을 "customer_id"로 그룹화하여 그룹별로 "amount" 열의 합계를 계산하고, 그 결과 DataFrame의 인덱스를 재설정하고 있습니다. 이후 .rename() 메서드를 사용하여 결과 DataFrame의 이름을 "sum_all"로 변경합니다.

df_tmp_2 = pd.merge(df_receipt, df_product.query('category_major_cd == "07"'), how='inner', on='product_cd').groupby('customer_id').agg ({'amount': sum'}).reset_index().rename(columns={'amount': 'sum_07' }): 이 라인은 먼저 df_product를 필터링하여 category_major_cd 열이 "07"과 같은 행만 포함하도록 하도록 합니다. 그런 다음 이 필터링된 DataFrame을 내부 바인딩을 사용하여 "product_cd" 열의 df_receipt와 결합한다. 그런 다음 결과 DataFrame을 'customer_id'로 그룹화하여 그룹별로 'amount' 열의 합계를 계산하고 인덱스를 재설정한다. 완성된 DataFrame은 .rename() 메서드를 사용하여 "sum_07"로 이름이 변경된다.

df_tmp_3 = pd.merge(df_tmp_1, df_tmp_2, how='inner', on='customer_id'): 이 행은 내부 결합을 사용하여 df_tmp_1과 df_tmp_2를 'customer_id' 컬럼으로 병합한다. 이렇게 하면 각 고객의 'sum_all' 컬럼과 'sum_07' 컬럼을 포함하는 새로운 DataFrame이 생성된다.

df_tmp_3['sales_rate'] = df_tmp_3['sum_07'] / df_tmp_3['sum_all']: 이 행은 df_tmp_3의 새로운 열 'sales_rate'를 계산하는 것으로, 'sum_07' 열을 'sum_all' 열로 나눈 결과입니다. 이는 고객의 총 구매액 중 '07' 카테고리에서 구매한 금액의 비율을 계산하는 것이다.

df_tmp_3.head(10): df_tmp_3 DataFrame의 처음 10개의 행을 출력한다. 이 행은 이전 행의 계산이 제대로 이루어졌는지 확인하는 데 사용된다.

 

 
해설:

이 코드에서는 pandas의 DataFrame 객체인 df_receipt와 df_product도 조작하고 있습니다.

아래 코드를 한 줄씩 분해해 보겠습니다.

df_temp = df_receipt.merge(df_product, how='left', on='product_cd').groupby(['customer_id', 'category_major_cd']) ['amount'].sum(). unstack(): 이 행은 먼저 왼쪽 결합을 사용하여 df_receipt와 df_product를 "product_cd" 컬럼으로 결합한다. 그런 다음 결과 DataFrame을 "customer_id"와 "category_major_cd"로 그룹화하여 각 그룹의 "amount" 열의 합계를 계산하고, 결과 시리즈를 언스택하여 "customer_id"를 인덱스로, "category_major_cd"를 열 이름으로 지정합니다. category_major_cd", "amount" 열을 값으로 하는 DataFrame을 만들었습니다.

df_temp = df_temp[df_temp['07'] > 0]: 이 행은 df_temp DataFrame을 필터링하여 '07' 열의 값이 0보다 큰 행만 포함하도록 합니다. 이렇게 하면 '07' 카테고리에서 아무것도 구매하지 않은 고객이 제거됩니다.

df_temp['sum_all'] = df_temp.sum(axis=1): 이 행은 df_temp에 'sum_all'이라는 새로운 열을 계산하여 각 행의 모든 열의 합계를 계산합니다. 이는 각 고객이 모든 카테고리에서 지출한 금액의 합계를 계산하는 것이다.

df_temp['sales_rate'] = df_temp['07'] / df_temp['sum_all']: 이 행은 df_temp에 'sales_rate'라는 새로운 열을 계산한다. 이는 고객의 총 구매 금액 중 '07' 카테고리에서 구매한 금액의 비율을 계산하는 것입니다.

df_temp.columns.name = '': 이 행은 df_temp DataFrame에서 열 이름을 삭제하고 있습니다.

df_temp = df_temp.reset_index(): 이 행은 df_temp의 인덱스를 재설정하고 0부터 시작하는 정수 범위를 가진 'index'라는 새로운 열을 생성합니다.

df_temp.head(10): df_temp 데이터 프레임의 처음 10개의 행을 출력한다. 이 행은 이전 행의 계산이 올바르게 수행되었는지 확인하는 데 사용됩니다.

 

해설:

이 코드는 df_receipt라는 DataFrame과 df_customer라는 또 다른 DataFrame에 대해 데이터 조작을 하고 있습니다. 고객의 신청일과 구매일 사이의 일수를 계산하고 있습니다.

다음은 코드의 단계별 예시입니다.

df_tmp = df_receipt[['customer_id', 'sales_ymd']].drop_duplicates(): df_receipt DataFrame에서 "customer_id"와 "sales_ymd" 컬럼만 선택해서 df_tmp라는 새로운 DataFrame을 생성하고 중복된 행을 삭제합니다. 그 결과, 고객 ID와 매출 날짜의 조합이 고유한 DataFrame이 만들어졌다.

df_tmp = pd.merge(df_tmp, df_customer[['customer_id', 'application_date']], how='inner', on='customer_id'): df_tmp와 df_customer DataFrame의 내부 결합을 수행하고, df_customer DataFrame에서 'customer_id' 열과 'application_date' 열만 선택한다. 결과 DataFrame에는 df_tmp와 df_customer에 모두 존재하는 고객 ID를 가진 행만 포함하게 된다.

df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'].astype('str')): df_tmp의 "sales_ymd" 열을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다. 이 함수는 컬럼을 문자열 형식에서 계산에 사용할 수 있는 datetime 형식으로 변환한다.

df_tmp['application_date'] = pd.to_datetime(df_tmp['application_date']): df_tmp의 "application_date" 칼럼을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다. 로 변환한다. 이 함수는 컬럼을 문자열 형식에서 계산에 사용할 수 있는 datetime 형식으로 변환한다.

df_tmp['elapsed_days'] = df_tmp['sales_ymd'] - df_tmp['application_date']: "sales_ymd"와 "application_date" 열의 차이를 계산하고, 그 결과를 df_tmp의 새로운 열 "elapsed _days"에 대입한다. 이 계산의 결과로 두 날짜의 차이를 일, 시간, 분, 초 단위로 표현한 timedelta 객체가 생성된다.

df_tmp['elapsed_days'] = df_tmp['elapsed_days'].dt.days: "elapsed_days" 열에서 일수만 가져와서 그 결과를 같은 열에 대입하여 반환한다. 객체가 포함되어 있지만, 일수만 보관하고 싶기 때문에 이 단계가 필요하다.

df_tmp.head(10): df_tmp의 처음 10줄을 표시하여 계산이 제대로 이루어졌는지 확인한다.

전반적으로 이 코드는 고객의 행동을 분석하고 고객이 멤버십이나 계정을 신청한 후 구매하기까지 걸리는 시간을 파악하는 데 유용하다.
 
해설:

이 코드는 지난번 설명한 코드와 비슷하지만, 고객의 신청일로부터 구매일까지의 일수를 계산하는 것이 아니라 경과한 개월 수를 계산하는 코드입니다.

다음은 코드를 단계별로 설명합니다.

df_tmp = df_receipt[['customer_id', 'sales_ymd']].drop_duplicates(): df_receipt DataFrame에서 customer_id와 sales_ymd 열만 선택하고 중복된 행을 삭제하여 새로운 df_tmp라는 DataFrame을 생성합니다. 이렇게 하면 고객 ID와 판매 날짜의 조합이 고유한 DataFrame이 만들어집니다.

df_tmp = pd.merge(df_tmp, df_customer[['customer_id', 'application_date']], how='inner', on='customer_id'): df_tmp와 df_customer DataFrame의 내부 결합을 수행하고, df_customer DataFrame에서 'customer_id' 열과 'application_date' 열만 선택한다. 결과 DataFrame에는 df_tmp와 df_customer에 모두 존재하는 고객 ID를 가진 행만 포함하게 된다.

df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'].astype('str')): df_tmp의 "sales_ymd" 열을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['application_date'] = pd.to_datetime(df_tmp['application_date']): df_tmp의 "application_date" 컬럼을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['elapsed_months'] = df_tmp[['sales_ymd', 'application_date']]. \ Γ apply(lambda x: relativedelta(x[0], x[1]).years * 12 + Γ relativedelta(x[0], x[1]).months, axis=1): "sales_ymd"와 "application_date" 열의 차이를 계산한다, 결과를 df_tmp의 "elapsed_months"라는 새로운 열에 대입한다. 이 계산은 dateutil 라이브러리의 relativedelta 함수를 사용하여 두 datetime 값의 차이를 년 또는 월 단위로 계산하고, apply() 메서드에서 "sales_ymd"와 "application_date" 열의 각 행에 이 함수를 적용하고 경과한 개월의 합계를 반환한다.

df_tmp.head(10): df_tmp의 처음 10개의 행을 표시하여 계산이 제대로 이루어졌는지 확인한다.

전체적으로 이 코드는 고객의 행동을 분석하고 고객이 회원 가입 또는 계정을 신청한 후 구매하기까지의 기간을 경과 개월 수로 판단하는 데 편리합니다.

 

해설:

이 코드는 앞서 설명한 예제와 비슷하지만, 고객의 신청일로부터 구매일까지의 경과 일수나 경과 월수를 계산하는 것이 아니라 경과 년수를 계산하는 코드입니다.

아래 코드를 순서대로 설명합니다.

df_tmp = df_receipt[['customer_id', 'sales_ymd']].drop_duplicates(): df_receipt DataFrame에서 customer_id와 sales_ymd라는 컬럼만 선택하여 중복되는 행을 모두 삭제하고 하여 df_tmp라는 새로운 데이터 프레임을 생성합니다. 이렇게 하면 고객 ID와 판매일 조합이 고유한 DataFrame이 만들어진다.

df_tmp = pd.merge(df_tmp, df_customer[['customer_id', 'application_date']], how='inner', on='customer_id'): df_tmp와 df_customer DataFrame의 내부 결합을 수행하고, df_customer DataFrame에서 'customer_id' 열과 'application_date' 열만 선택한다. 결과 DataFrame에는 df_tmp와 df_customer에 모두 존재하는 고객 ID를 가진 행만 포함하게 된다.

df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'].astype('str')): df_tmp의 "sales_ymd" 열을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['application_date'] = pd.to_datetime(df_tmp['application_date']): df_tmp의 "application_date" 컬럼을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['elapsed_years'] = df_tmp[['sales_ymd', 'application_date']]. \ Γ apply(lambda x: relativedelta(x[0], x[1]).years, axis=1): "sales_ymd"와 "application_date" 열의 차이를 계산하고 그 결과를 df_tmp의 새로운 열 "elapsed_years"에 대입한다. 에 대입한다. 이 계산은 dateutil 라이브러리의 relativedelta 함수를 사용하여 두 datetime 값의 차이를 연 단위로 계산하고, apply() 메서드는 "sales_ymd"와 "application_date" 열의 각 행에 이 함수를 적용하여 총 경과 연수를 반환한다.

df_tmp.head(10): df_tmp의 처음 10개의 행을 표시하여 계산이 제대로 이루어졌는지 확인한다.

전체적으로 이 코드는 고객의 행동을 분석하고 고객이 회원 가입이나 계정을 신청한 후 구매하기까지의 기간을 경과 년수로 판단하는 데 유용하다.

 

해설:

이 코드는 datetime의 값을 유닉스 타임스탬프로 변환하여 고객의 신청일과 구매일 사이의 경과 시간(초)을 계산하는 코드입니다.

다음은 코드의 단계별 예시입니다.

df_tmp = df_receipt[['customer_id', 'sales_ymd']].drop_duplicates(): df_receipt DataFrame에서 "customer_id"와 "sales_ymd" 컬럼만 선택해서 df_tmp라는 새로운 DataFrame을 생성하고, 중복된 행은 삭제합니다. 그 결과 고객 ID와 판매일 조합이 고유한 DataFrame이 만들어졌다.

df_tmp = pd.merge(df_tmp, df_customer[['customer_id', 'application_date']], how='inner', on='customer_id'): df_tmp와 df_customer DataFrame의 내부 결합을 수행하고, df_customer DataFrame에서 'customer_id' 열과 'application_date' 열만 선택한다. 결과 DataFrame에는 df_tmp와 df_customer에 모두 존재하는 고객 ID를 가진 행만 포함하게 된다.

df_tmp['sales_ymd'] = pd.to_datetime(df_tmp['sales_ymd'].astype('str')): df_tmp의 "sales_ymd" 열을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['application_date'] = pd.to_datetime(df_tmp['application_date']): df_tmp의 "application_date" 컬럼을 pd.to_datetime() 함수를 사용하여 datetime 형식으로 변환한다.

df_tmp['elapsed_epoch'] = df_tmp['sales_ymd'].view(np.int64) - \ df_tmp['application_date'].view(np.int64): "sales_ymd" 와 "application_date" 열의 차이를 계산한다. date" 열의 차이를 계산하고 그 결과를 df_tmp의 "elapsed_epoch" 열에 할당한다. 이 계산은 view() 메서드에서 datetime 값을 int64 형식(Unix 타임스탬프)으로 변환하고, 두 값을 요소별로 감산하여 나노초 단위의 경과 시간을 구하고 있다.

df_tmp['elapsed_epoch'] = df_tmp['elapsed_epoch'] / 10**9: "elapsed_epoch" 열을 10^9로 나누어 경과 시간을 나노초에서 초로 변환한다.

df_tmp.head(10): df_tmp의 처음 10줄을 표시하여 계산이 제대로 이루어졌는지 확인한다.

전체적으로 이 코드는 고객의 행동을 분석하고 고객이 회원 가입이나 계정을 신청한 후 구매하기까지의 시간을 초 단위로 판단하는 데 유용하다.
 
해설:

이 코드는 다음과 같은 단계를 수행하고 있습니다.

기존 DataFrame df_receipt에서 sales_ymd 컬럼을 선택하고 해당 컬럼의 복사본을 생성하여 df_tmp라는 새로운 DataFrame을 생성하고 있습니다.

그런 다음 df_tmp의 sales_ymd 컬럼은 pd.to_datetime 함수를 사용하여 pandas의 datetime 형식으로 변환됩니다. 이렇게 하면 요일 등의 정보를 추출할 수 있는 등 보다 유연한 방식으로 날짜를 다룰 수 있게 된다.

df_tmp에는 apply 메서드를 사용하여 elapsed_days라는 새로운 컬럼이 생성됩니다. 이 메서드는 sales_ymd 열의 각 행에 람다 함수를 적용하고, 이 경우 요일을 정수 값으로 반환한다(월요일은 0, 일요일은 6이다).

apply 메서드와 또 다른 람다 함수를 사용하여 df_tmp에 new column named monday를 생성한다. 이 함수는 sales_ymd 열의 각 행을 받아 주초부터 경과한 일수(x.weekday()에서 얻은)를 빼고, 그 결과 날짜를 가장 최근 월요일로 반올림하여 반환한다. 이렇게 하면 df_tmp의 모든 날짜가 월요일을 기점으로 한 주 단위로 효과적으로 그룹화됩니다.

마지막으로 head 메서드가 df_tmp에서 호출되어 결과 DataFrame의 처음 10행이 표시됩니다.

전체적으로 이 코드는 판매일 열을 처리하여 분석 또는 집계 목적으로 유용한 정보를 추출하고 있습니다. 구체적으로 DataFrame에 요일과 해당 주의 시작일을 나타내는 새로운 열을 생성하여 주 또는 요일별로 판매 데이터를 그룹화하거나 집계하는 데 사용할 수 있습니다.

 

해설:

이 코드는 df_customer라는 pandas의 DataFrame에서 행의 하위 집합을 샘플링하여 그 하위 집합의 첫 10개의 행을 표시하는 코드입니다.

아래는 코드의 각 부분이 하는 일이다.

df_customer는 고객 데이터가 포함된 pandas의 DataFrame으로, 아마도 많은 행과 열이 있을 것이다.

sample 메서드는 df_customer에 대해 frac=0.01이라는 인수로 호출된다. 이 메서드는 DataFrame의 일부 행을 무작위로 선택한다. 여기서 frac은 샘플링할 행의 비율을 나타낸다. 이 경우 frac=0.01은 df_customer의 행 중 1%가 무작위로 선택됨을 의미한다.

head 메서드는 df_customer 결과의 하위 집합에 대해 인수 10으로 호출된다. 이 메서드는 하위 집합의 처음 10개의 행을 반환하고 이를 표시합니다.

즉, 이 코드는 전체적으로 df_customer에서 1%의 무작위 샘플을 선택하고 그 샘플의 처음 10개의 행을 표시하고 있다. 이는 전체 데이터 세트를 조작하지 않고도 데이터의 작은 하위 집합에 대해 데이터를 탐색하거나 빠른 분석을 수행하는 데 유용하다.

 

해설:

이 코드는 다음 단계를 수행한다.

train_test_split은 scikit-learn 라이브러리의 함수로, 데이터 세트를 무작위로 두 개의 하위 집합('훈련' 하위 집합과 '테스트' 하위 집합)으로 분할하는 함수입니다. 이 코드에서는 df_customer라는 pandas의 DataFrame에 적용하고, 인수 test_size=0.1로 데이터의 10%를 테스트용으로 확보할 것을 지정하고, 인수 stratify=df_customer['gender_cd']로 gender_cd 열의 값으로 계층화할 것을 지정했습니다. 이 함수는 두 개의 DataFrame을 반환하지만, 첫 번째 DataFrame은 무시된다(_가 할당되는데, 이는 파이썬의 관행으로, 사용되지 않을 변수를 나타내는 것이다).

train_test_split이 반환하는 두 번째 DataFrame은 df_tmp라는 새로운 변수에 할당된다.

df_tmp에 대해 gender_cd라는 인수로 groupby 메서드가 호출된다. 이 메서드는 df_tmp의 행을 gender_cd 열의 값으로 그룹화한다.

agg 메서드는 groupby 연산 결과에 대해 {'customer_id' : 'count'}라는 인수로 호출된다. 이 메서드는 각 그룹의 customer_id 컬럼에 함수(여기서는 count)를 적용하고, 각 그룹의 결과 카운트를 가진 DataFrame을 반환한다.

완성된 DataFrame이 표시된다.

즉, 이 코드는 전체적으로 pandas의 DataFrame을 훈련용과 테스트용으로 무작위로 분할하고 특정 열(gender_cd)의 값에 따라 계층화합니다. 그리고 테스트용 서브셋에서 새로운 DataFrame을 생성하여 gender_cd 열로 그룹화하여 각 그룹의 customer_id 열의 고유한 값의 개수를 계산할 수 있습니다. 이는 테스트용 서브셋의 데이터에서 성별에 따른 고객 분포를 파악하는 데 유용합니다.
 
해설:

이 코드는 df_receipt라는 pandas DataFrame 객체에 대해 데이터 전처리 및 필터링을 수행하고 있다.

다음은 코드의 단계별 설명입니다.

df_sales_amount = df_receipt.groupby('customer_id').agg({'amount':'sum'}).reset_index(): 이 행은 df_receipt의 행을 customer_id 열의 값으로 그룹화하고, 각 그룹의 amount 열의 합계를 계산합니다. 그룹의 amount 열의 합계를 계산하고 있다. 결과 DataFrame df_sales_amount는 고유한 customer_id 값마다 1행, customer_id와 amount의 2열을 가지며, reset_index() 메서드를 사용하여 그룹화 후 인덱스를 정수값으로 재설정하여 하고 있습니다.

df_sales_amount['log_sum_amount'] = np.log(df_sales_amount['amount'] + 0.5): 이 행은 df_sales_amount에 log_sum_amount라는 새로운 컬럼을 생성하고, 각 고객별 금액의 합계 의 자연대수, 그리고 0의 대수를 피하기 위해 0.5를 더한 값을 저장합니다.

df_sales_amount['log_sum_amount_ss'] = preprocessing.scale(df_sales_amount['log_sum_amount']): 이 행은 df_sales_amount에 log_sum_amount_ss 라는 새로운 열을 만들고, scikit-learn 라이브러리의 preprocessing.scale 함수를 사용하여 log_sum_amount를 스케일링한 값을 저장한다. 이 함수는 입력 배열의 평균을 빼고 표준편차로 나누어 평균이 0이고 분산이 0인 단위의 새로운 배열을 만든다.

df_sales_amount.query('abs(log_sum_amount_ss) > 3').head(10): 이 행은 log_sum_amount_ss의 절대값이 3보다 큰 행만 남도록 df_sales_amount를 필터링하고 결과의 DataFrame의 처음 10개의 행을 선택한다. 이 필터는 총매출액의 평균값에서 표준편차가 3 이상 떨어져 있는 고객을 선택하여 이상값일 가능성을 표시하고 있으며, query 메서드를 사용하여 문자열 표현식(이 경우 'abs(log_sum_amount_ss) > 3')을 기준으로 행을 필터링하고 있다.

 

해설:

이 코드는 df_receipt라는 pandas DataFrame 객체에 대해 데이터 전처리 및 필터링을 수행하고 있다.

다음은 코드의 단계별 설명입니다.

df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z")', engine='python').groupby('customer_id').agg({'amount':'sum '}).reset_index(): 이 행은 먼저 df_receipt를 필터링하여 customer_id 열이 'Z'로 시작하는 행을 제외하고 있으며, query 메서드는 문자열 표현식을 기반으로 행을 필터링하는 데 사용된다. python' 인수는 쿼리에 Python 엔진을 사용하도록 지정하는 데 사용되며, str.startswith 메서드를 사용할 수 있다. 결과 DataFrame은 customer_id로 그룹화되며, 그룹별로 금액 열의 합계가 계산된다. 결과 DataFrame df_sales_amount는 고유한 customer_id 값마다 한 줄, customer_id와 amount 두 개의 컬럼을 가지며, reset_index() 메서드를 사용하여 그룹화 후 인덱스를 정수 값으로 재설정 하고 있다.

pct25 = np.percentile(df_sales_amount['amount'], q=25): 이 행은 numpy.percentile 함수를 사용하여 df_sales_amount의 amount 컬럼의 25번째 백분위수를 계산하고, 그 결과를 변수 pct25에 대입하고 있습니다.

pct75 = np.percentile(df_sales_amount['amount'], q=75): 이 행은 numpy.percentile 함수를 사용하여 df_sales_amount의 amount 열의 75번째 백분위수를 계산하고 그 결과를 pct75 변수에 대입한다. 변수에 대입합니다.

iqr = pct75 - pct25: 이 행은 75백분위수(pct75)에서 25백분위수(pct25)를 빼서 df_sales_amount의 금액 열의 사분위수 범위(IQR)를 계산하고 그 결과를 iqr 변수에 대입하고 있다.

amount_low = pct25 - (iqr * 1.5): 이 행은 amount_low = pct25 - (iqr * 1.5) 공식을 사용하여 판매 금액의 "정상" 범위의 하한을 계산한다. 이것은 일반적으로 박스형 플롯의 아래쪽 "수염"으로 알려져 있다.

amount_high = pct75 + (iqr * 1.5). 이 행은 amount_high = pct75 + (iqr * 1.5) 공식을 사용하여 판매 금액의 "정상" 범위의 상한을 계산한다. 이것은 일반적으로 상자 수염 도표의 상한 "수염"으로 알려져 있다.

df_sales_amount.query('amount < @amount_low or @amount_high < amount').head(10): 이 행은 amount 열이 amount_low보다 작거나 amount_high보다 큰 행만 남겨두도록 df sales_amount를 필터링하여 결과 DataFrame의 처음 10개의 행을 선택한다. 이 필터는 매출 금액 합계가 매출 금액의 '정상' 범위를 벗어난 고객을 선택하는 것으로, 박스 플롯의 아래쪽 수염과 위쪽 수염 사이의 범위로 정의되며, Python의 변수 amount_low와 amount_high를 참조하기 위해 @ 기호를 사용하는 문자열 표현식을 기반으로 한다. 행을 필터링하기 위해 query 메서드가 사용되었습니다.
 
 
해설:

이 코드는 pandas의 DataFrame df_product의 각 열의 결손(null) 값 수를 계산하는 데 사용됩니다. 아래에서 단계별로 설명한다.

df_product: 사용 중인 DataFrame의 이름입니다.

isnull(): 이 메서드는 df_product와 동일한 모양의 DataFrame을 반환하며, 각 요소는 df_product의 해당 요소가 null인지 여부를 나타내는 boolean 값이다.

sum(): isnull()이 반환하는 boolean DataFrame에 적용되어 각 열의 boolean 값의 합을 반환하는 메서드이며, boolean 값은 정수로 취급되므로 사실상 df_product의 각 열의 null 값의 개수를 세는 것과 같다.

따라서 df_product.isnull().sum()은 인덱스가 df_product의 열 이름, 값이 각 열의 NULL 값 수인 Series 객체를 반환한다. 이는 누락된 값이 있는 열과 각 열에 몇 개의 누락된 값이 있는지를 파악하는 데 사용할 수 있다.

 

해설:

이 코드는 pandas의 DataFrame df_product에서 NULL(결손) 값을 포함하는 모든 행을 제거하고, NULL이 아닌 행만 포함하는 새로운 DataFrame df_product_1을 생성하는 데 사용됩니다. 아래에서 단계별로 설명한다.

df_product: 사용할 원본 DataFrame의 이름이다.

df_product.copy(): 이 메서드는 원본 DataFrame의 복사본을 생성하여 원본 DataFrame이 변경되지 않도록 한다.

df_product_1: 생성되는 새로운 DataFrame의 이름이다.

dropna(). 이 메서드는 df_product_1에서 null 값을 포함한 모든 행을 삭제하는 데 사용되며, inplace=True 인수는 새로운 DataFrame을 반환하는 대신 df_product_1을 그 자리에서 변경하는 데 사용된다.

print('Before deletion:', len(df_product)): null 값을 삭제하기 전 원래 DataFrame df_product의 행 수를 표시한다.

print('After deletion:', len(df_product_1)): 이 줄은 널 값이 삭제된 후 새로운 DataFrame df_product_1의 행 수를 표시합니다.

따라서 이 코드에서는 먼저 원본 DataFrame df_product의 복사본을 만들고, 복사한 DataFrame에서 NULL 값을 포함한 모든 행을 삭제하여 새로운 DataFrame df_product_1을 만들고, 마지막으로 NULL 값 삭제 전과 삭제 후의 원본 DataFrame과 새로운 DataFrame의 행 수를 표시합니다. DataFrame과 새로운 DataFrame 내의 행 수를 표시한다. 이 코드는 NULL 값으로 인해 삭제된 행 수를 확인하고 NULL 값을 포함하지 않는 깨끗한 DataFrame을 생성하는 데 사용할 수 있다.

 

 
 
 

Comment