LiJell's 성장기

__15.data.analyzing_Danawa_preprocessing(다나와 2편) 본문

Bigdata/Web Crawling

__15.data.analyzing_Danawa_preprocessing(다나와 2편)

All_is_LiJell 2022. 1. 21. 18:39
반응형
 

__14.data.analyzing_Danawa_Crawling (다나와 1편)

다나와 2편 전처리: https://lime-jelly.tistory.com/55 다나와 3편 시각화: https://lime-jelly.tistory.com/56 14. Danawa crawling (다나와 크롤링) 우리는 무선 청소기가 목표다! __15.data.analyzing_Danawa_..

lime-jelly.tistory.com

 

__16.data.analyzing_Danawa_Visualizing (다나와 3편)

다나와 1편 크롤링: https://lime-jelly.tistory.com/54 다나와 2편 전처리: https://lime-jelly.tistory.com/55 16. 다나와 데이터 시각화 __14.data.analyzing_Danawa_Crawling (다나와 1편) 다나와 2편 전처리:..

lime-jelly.tistory.com

 

__17.data.analyzing_Danawa_Find_Monitor (다나와 4편)

다나와 1편 크롤링: https://lime-jelly.tistory.com/54 다나와 2편 전처리: https://lime-jelly.tistory.com/55 다나와 3편 시각화: https://lime-jelly.tistory.com/56 __14.data.analyzing_Danawa_Crawling (다..

lime-jelly.tistory.com

 

15. 다나와 크롤링 데이터 전처리 (preprocessing)


15.1. 데이터 가져오기

import pandas as pd
import numpy as np
data = pd.read_excel('./files/danawa_crawling_result_class.xlsx')
data.info()
data.head()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 440 entries, 0 to 439
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   상품명     410 non-null    object
 1   스펙 목록   410 non-null    object
 2   가격      440 non-null    int64 
dtypes: int64(1), object(2)
memory usage: 10.4+ KB
'''
'''
    상품명    스펙 목록    가격
0    LG전자 오브제컬렉션 코드제로 ThinQ A9S AO9571    핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / 소비전력: 590W...    1057840
1    삼성전자 비스포크 제트 VS20A956A3    핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / [성능] 흡입력: ...    564850
2    LG전자 코드제로 ThinQ A9S AS9370IKT    핸디/스틱청소기 / 핸디+스틱형 / 무선형 / 흡입+걸레겸용 / 소비전력: 590W...    793780
3    샤오미 CLEANFLY 차량용 무선 청소기 4세대 H2 (해외구매)    차량용청소기 / 무선 / 흡입력: 16,800Pa / 최대출력: 120W / 헤파필...    60090
4    G00FvMK3Am    G00FvMK3Am879586    879586
'''

15.2. 회사명, 모델명 정리

company_list = data['상품명'][0].split(' ', 1)[0]
product_list =data['상품명'][0].split(' ', 1)[1]
print(company_list)
print(product_list)
'''
LG전자
오브제컬렉션 코드제로 ThinQ A9S AO9571
'''
# data.head()
company_list = []
product_list = []

for title in data['상품명']:
    try:

        title_info  = title.split(" ", 1)
        company_name = title_info[0]
        product_name = title_info[1]

        company_list.append(company_name)
        product_list.append(product_name)

    except:
#         pass
        company_list.append(None)
        product_list.append(None)


# print(company_list[:5])
# print(product_list[:5])    
len(company_list)
len(product_list)
'''
440
'''

15.3. 스펙 목록 데이터 살펴보기

spec_list = data['스펙 목록'][0].split(' / ')
category = spec_list[0].strip()

for spec in spec_list:
    if '사용시간' in spec:
        use_time_spec = spec
    elif '흡입력' in spec:
        suction_spec = spec
print(use_time_spec)
print(suction_spec)

use_time_value = use_time_spec.split(': ')[1].strip()
suction_value = suction_spec.split(': ')[1].strip()

print(use_time_value)
print(suction_value)
'''
사용시간(개당): 1시간
[성능] 흡입력: 210W
1시간
210W
'''
category_list = []
use_time_list = []
suction_list = []

for spec_data in data['스펙 목록']:
    spec_list = spec_data.split(' / ')

    category = spec_list[0].strip()
    category_list.append(category)    


    for spec in spec_list:
        if '사용시간' in spec :
            use_time_spec = spec
        elif '흡입력' in spec:
            suction_spec = spec


    use_time_value = use_time_spec.split(': ')[1].strip()
    suction_value = suction_spec.split(': ')[1].strip()
    use_time_list.append(use_time_value)
    suction_list.append(suction_value)
print(category_list[:5])
print(use_time_list[:5])
print(suction_list[:5])
'''
['핸디/스틱청소기', '15HbyqXjpg492473', '핸디/스틱청소기', '핸디/스틱청소기', '차량용청소기']
['1시간', '1시간', '1시간', '1시간', '30분']
['210W', '210W', '210W', '210W', '16,800Pa']
'''

15.4. 단위 맞추기

15.4.1. 시간

mytime = '1시간30분'
mytime.split('시간')[0]
# mytime.split('시간')[-1].replace('분', "")
mytime.split('시간')[-1].split('분')[0]
'''
'30'
'''
def convert_time_minute(time):

    try:
        if '시간' in time:
            hour = time.split('시간')[0]

            if '분' in time:
                minute = time.split('시간')[-1].split('분')[0]
            else:
                minute = 0
        else:
            hour = 0
            minute = time.split('분')[0]

        return int(hour)*60 + int(minute)

    except:
        return None       
time = '1시간40분'

result = convert_time_minute(time)
result
'''
100
'''
new_use_time_list = []
for time in use_time_list:
    value = convert_time_minute(time)
    new_use_time_list.append(value)

new_use_time_list[:10]    
'''
[60, 60, 60, 60, 30, 60, 60, 45, 60, 60]
'''

15.4.2. 흡입력

suction_list[:20]
'''
['210W',
 '210W',
 '210W',
 '210W',
 '16,800Pa',
 '210W',
 '20000Pa',
 '15,000Pa',
 '22000Pa',
 '210W',
 '210W',
 '210W',
 '151AW',
 '140W',
 '210W',
 '210W',
 '13,000Pa',
 '8,000Pa',
 '22000Pa',
 '200W']

'''
def get_suction(value):
    try:
        value = value.upper()

        if "AW" in value or "W" in value:
            result = value.replace("A", "").replace("W", "").replace(",", "")
            result = int(result)

        elif "PA" in value:
            result = value.replace("PA", "").replace(",", "")
            result = int(result)/100 # 얼추 AW = W = 100Pa 라고 한다.
        else:
            result = None
        return result

    except:
        return None
new_suction_list = []
for power in suction_list:
    value = get_suction(power)
    new_suction_list.append(value)

new_suction_list[:10]    
'''
[210, 210, 210, 210, 168.0, 210, 200.0, 150.0, 220.0, 210]
'''

15.5. 파일저장

15.5.1. 저장할 파일 카테고리 추가

pd_data = pd.DataFrame()
pd_data['카테고리'] = category_list
pd_data['회사명'] = company_list
pd_data['제품'] = product_list
pd_data['가격'] = data['가격'].astype(np.int32)
pd_data['사용시간'] = new_use_time_list
pd_data['흡입력'] = new_suction_list
pd_data.head()
'''
    카테고리    회사명    제품    가격    사용시간    흡입력
0    핸디/스틱청소기    LG전자    오브제컬렉션 코드제로 ThinQ A9S AO9571    1055260.0    60.0    210.0
1    15HbyqXjpg492473    None    None    492473.0    60.0    210.0
2    핸디/스틱청소기    삼성전자    비스포크 제트 VS20A956A3    564850.0    60.0    210.0
3    핸디/스틱청소기    LG전자    코드제로 ThinQ A9S AS9370IKT    784550.0    60.0    210.0
4    차량용청소기    샤오미    CLEANFLY 차량용 무선 청소기 4세대 H2 (해외구매)    59840.0    30.0    168.0
'''
print(len(category_list))
print(len(company_list))
print(len(product_list))
print(len(new_use_time_list))
print(len(new_suction_list))
'''
410
410
410
410
410
'''
15.5.2. 저장

condition = pd_data['카테고리'] == '핸디/스틱청소기'

pd_data_final = pd_data[condition]
len(pd_data_final)


# pd_data_final.to_excel('./files/2_danawa_data_final_class.xlsx',
#                       index = False)

pd_data_final.dropna(inplace = True)

pd_data_final.info()
pd_data_final.to_excel('./files/2_danawa_data_final_class.xlsx',
                      index = False)
'''
<class 'pandas.core.frame.DataFrame'>
Int64Index: 260 entries, 0 to 409
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   카테고리    260 non-null    object 
 1   회사명     260 non-null    object 
 2   제품      260 non-null    object 
 3   가격      260 non-null    float64
 4   사용시간    260 non-null    float64
 5   흡입력     260 non-null    float64
dtypes: float64(3), object(3)
memory usage: 14.2+ KB
'''
# pd_data_final.to_excel('./files/2_danawa_data_final_class.xlsx',
#                       index = False)

pd_data_final.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 260 entries, 0 to 409
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   카테고리    260 non-null    object 
 1   회사명     260 non-null    object 
 2   제품      260 non-null    object 
 3   가격      260 non-null    float64
 4   사용시간    260 non-null    float64
 5   흡입력     260 non-null    float64
dtypes: float64(3), object(3)
memory usage: 14.2+ KB
반응형
Comments