ch0nny_log

[빅데이터분석] Python_37. 파이썬 웹스크롤링9 (쿠팡) & pandas 본문

빅데이터 분석(with 아이티윌)/python

[빅데이터분석] Python_37. 파이썬 웹스크롤링9 (쿠팡) & pandas

chonny 2024. 8. 22. 15:16

◈ 쿠팡 웹 스크롤링

※ 쿠팡 웹스크롤링 실습
import urllib.request    # 웹요청 모듈 
from bs4 import BeautifulSoup    # html 파싱 모듈 
from selenium import webdriver   # 브라우저 제어 모듈 
from selenium.webdriver.chrome.service import Service   # 드라이버 관리 모듈 
from selenium.webdriver.common.by import By     # 요소 탐색 모듈 
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time    # 대기 시간 정해주는 모듈 

!pip install pandas
import pandas as pd

def cuppang_shopping(keyword, n):

    # 크롬 로봇 드라이버의 위치를 지정
    chrome_options =  Options()
    service = Service('C:\\data\\chromedriver-win32\\chromedriver-win32\\chromedriver.exe')
    driver = webdriver.Chrome(service=service, options=chrome_options)

    # 검색어 입력
    text1 = urllib.parse.quote(keyword)

    # 데이터 수집할 리스트 선언
    list_name = []     # 상품명
    list_price = []    # 상품가격

    # 페이지 번호를 제공할 for loop 문 작성 
    for  i  in  range(1, n+1):
        url ="https://www.coupang.com/np/search?q=" + text1 + "&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page=" + str(i) + "&rocketAll=false&searchIndexingToken=1=9&backgroundColor="

        # 크롬 로봇이 위의 url 을 열게 합니다.
        driver.get(url)
        time.sleep(2)

        #마우스 스크롤을 아래로 내려서 전체 페이지가 다 보이게 합니다.
        for  i  in  range(1,6):
            driver.find_element(By.XPATH, value='//body').send_keys(Keys.END)
            time.sleep(0.5)

        #보이는 페이지의 html 코드를 뷰티플 스프로 파싱합니다.
        soup = BeautifulSoup( driver.page_source, 'html.parser')

        # 상품정보가 있는 HTML 코드 부분으로 접근
        goods_list = soup.select('ul.search-product-list')

        # 상품명, 가격 가져오기 
        for  v  in  goods_list:
            # 상품명 
            item_name = v.select('div.name') 
            for  i  in  item_name:
                list_name.append( i.text.strip() )
                
            # 가격 
            item_price = v.select('strong.price-value')
            for p  in  item_price:
                list_price.append( p.text.strip() )  

    #크롬 로봇 닫기
    driver.close()

    # 판다스 데이터 프레임 생성하기
    df = pd.DataFrame(  { '상품명' : list_name, '가격' : list_price } )

    # 판다스 데이터프레임의 데이터를 csv 파일로 내리기 
    df.to_csv("c:\\data\\cuppang_shopping.csv", encoding="utf8")
            
cuppang_shopping('그릭 요거트', 1)​


 

※ pandas

1. 판다스 데이터 프레임 불러오기

df = pd.read_csv('c:\\data\\coupang_shopping.csv')
df

 

2. 위의 코드를 수정해서 리뷰의 수도 출력되게 하시오.

import urllib.request    # 웹요청 모듈 
from bs4 import BeautifulSoup    # html 파싱 모듈 
from selenium import webdriver   # 브라우저 제어 모듈 
from selenium.webdriver.chrome.service import Service   # 드라이버 관리 모듈 
from selenium.webdriver.common.by import By     # 요소 탐색 모듈 
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import time    # 대기 시간 정해주는 모듈 

def coupang_shopping(keyword, n):

    # 크롬 로봇 드라이버의 위치를 지정
    chrome_options =  Options()
    service = Service('C:\\data\\chromedriver-win32\\chromedriver-win32\\chromedriver.exe')
    driver = webdriver.Chrome(service=service, options=chrome_options)

    # 검색어 입력
    text1 = urllib.parse.quote(keyword)

    # 데이터 수집할 리스트 선언
    list_name = [] # 상품명
    list_price = [] # 상품가격
    list_review = [] # 상품리뷰수

    # 페이지 번호를 제공할 for loop 문 작성
    for i in range(1, n+1):
        url = 'https://www.coupang.com/np/search?q='+text1+'&channel=user&component=&eventCategory=SRP&trcid=&traid=&sorter=scoreDesc&minPrice=&maxPrice=&priceRange=&filterType=&listSize=36&filter=&isPriceRange=false&brand=&offerCondition=&rating=0&page='+str(i)+'&rocketAll=false&searchIndexingToken=1=9&backgroundColor='

        # 크롬 로봇이 위의 url 열게 하기
        driver.get(url)
        time.sleep(2)

        # 마우스 스크롤을 아래로 내려서 전체 페이지가 다 보이게 하기
        for  i  in  range(1,6):
            driver.find_element(By.XPATH, value='//body').send_keys(Keys.END)
            time.sleep(0.5)

        # 보이는 웹페이지의 html 코드를 뷰티플 스프로 파싱합니다. 
        time.sleep(2) # 웹페이지가 다 뜰 수 있도록 기다려줌 

        # 현재 페이지를 BS 로 파싱
        soup = BeautifulSoup(driver.page_source, 'html.parser')

        # 광고 상품 정보가 있는 html 코드 부분으로 접근
        goods_list = soup.select('ul.search-product-list')

        # 상품명 가져오기
        for v in goods_list:
            # 상품명
            item_name = v.select('div.name')
            for i in item_name:
                list_name.append(i.text.strip())
                
            # 가격
            item_price = v.select('strong.price-value')
            for p in item_price:
                list_price.append(p.text.strip())

            # 리뷰수
            item_review = v.select('span.rating-total-count')
            for x in item_review:
                list_review.append(x.text.strip('()'))

            # 가장 길이가 긴 리스트의 길이를 기준으로 부족한 값에 0 넣어주기
            max_length = max(len(list_name), len(list_price), len(list_review))
            list_name.extend([0] * (max_length - len(list_name)))
            list_price.extend([0] * (max_length - len(list_price)))
            list_review.extend([0] * (max_length - len(list_review)))

    # 크롬 로봇 닫기
    driver.close()

    # 판다스 데이터 프레임 생성하기
    df = pd.DataFrame({'상품명' :list_name, '가격' : list_price, '리뷰수' : list_review})

    # 판다스 데이터프레임의 데이터를 csv 파일로 내리기
    df.to_csv('c:\\data\\coupang_shopping.csv', encoding = 'utf8')
            
coupang_shopping('그릭요거트', 1)
df = pd.read_csv('c:\\data\\coupang_shopping.csv')
df

 

3. 위 판다스 데이터프레임 컬럼의 구조를 확인하시오.

df.info()

** object → 문자형 / int64 → 숫자형

 

※ pandasql

1. 위의 판다스 데이터 프레임의 데이터를 SQL 로 SELECT 할 수 있도록 pandasql 을 설치하시오.

!pip install pandasql # 파이썬에서 SQL 을 사용해서 데이터를 검색할 수 있도록 해주는 모듈

 

 

2. emp.csv 를 emp 데이터 프레임으로 생성하시오.

import pandas as pd

emp = pd.read_csv("c:\\data\\emp.csv")
emp

 

3. emp 데이터 프레임에서 이름과 월급을 출력하는데 월급이 높은 순서대로 출력되게 하시오.

from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = """ select ename, sal
            from emp
            order by sal desc; """

pysqldf(q)

문제1. 직업이 SALESMAN 인 사원들의 이름과 월급과 직업을 출력하는데 월급이 높은 사원부터 출력하시오.
from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = ''' select ename, sal, job
            from emp
            where job = 'SALESMAN'
            order by sal desc; '''

pysqldf(q)​



문제2. c 드라이브 밑에 dept.csv 를 가지고 dept 라는 데이터 프레임을 구성하시오.
import pandas as pd

dept = pd.read_csv("c:\\data\\dept.csv")
dept​


문제3. emp 와 dept 를 조인해서 이름과 부서위치를 출력하시오. → 1999 ansi 문법으로 수행해야함!!  ( ** where 적어도 되긴 함.)
from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = ''' select e.ename, d.loc
            from emp e join dept d
            on( e.deptno = d.deptno ); '''

pysqldf(q)​
문제4. 문제. 그릭요거트로 검색한 결과에서 리뷰수가 가장 많은 상품명과 가격과 리뷰수를 출력하시오.
import pandas as pd

cp_greek = pd.read_csv('c:\\data\\coupang_shopping.csv')​
from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = ''' select 상품명, 가격, 리뷰수
            from cp_greek
            order by 리뷰수 desc; '''

pysqldf(q)

 

 

 

★ 심화 문제. cp_greek 에서 가격이 높은 순서대로 상품명, 가격, 리뷰 출력하시오.
 1. 현재 가격이 문자형이기 때문에 숫자형으로 변환하기
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex = True). astype('int64')
cp_greek.info()​
2. 정렬하기
from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = ''' select 상품명, 가격, 리뷰수
            from cp_greek
            order by 가격 desc; '''

pysqldf(q)​


3. 쿠팡에서 다른 검색어를 검색하여 스크롤링 한 후 리뷰수나 가격이 높은 순서대로 정렬해서 결과를 출력하시오.

coupang_shopping('노트북', 1)
from pandasql import sqldf

pysqldf = lambda q : sqldf(q, globals())

q = ''' select 상품명, 가격, 리뷰수
            from cp_laptop
            order by 가격 desc;'''

pysqldf(q)

 

 


 

※실습1. 기존 코드로 돌렸을 때 나는 오류 확인

※ 실습2. 크롭 로봇이 아니라 정상적으로 웹페이지를 통해서 웹에 접근할 수 있도록함

def get_coupang_data(keyword, pages):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.coupang.com/"
    }

 

(코드 설명)

"User-Agent": 요청을 보낼 때 웹브라우져에서 요청한다는 것

"Accept-Language": 한국어를 우선으로 하고 그 다음으로 영어, 일반어를 선호한다.
"Referer" : 요청이 어디서 왔는지 나타냄. 쿠팡의  메인페이지에서 요청이 왔다고 알려줌

 

import  requests    # 크롬 로봇 안쓰고 웹에 접근하는 모듈
from  bs4  import BeautifulSoup
import  pandas  as  pd

def get_coupang_data(keyword, pages):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.coupang.com/"
    }
    list_name = []
    list_price = [] 
    list_review = []

    for   page  in   range( 1, pages+1):
        search_url = f"https://www.coupang.com/np/search?q={keyword}&channel=user&page={page}"
        response = requests.get(search_url, headers=headers)
        # print(response) # 접근 가능한 상태 


get_coupang_data('그릭 요거트', 1)

 

   상품명 불러오기

import  requests    # 크롬 로봇 안쓰고 웹에 접근하는 모듈
from  bs4  import BeautifulSoup
import  pandas  as  pd

def get_coupang_data(keyword, pages):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.coupang.com/"
    }
    list_name = []
    list_price = [] 
    list_review = []

    for   page  in   range( 1, pages+1):
        search_url = f"https://www.coupang.com/np/search?q={keyword}&channel=user&page={page}"
        response = requests.get(search_url, headers=headers)
        # print(response) # 접근 가능한 상태 

        if response.status_code == 200: # 사이트 접속이 정상이면
            soup = BeautifulSoup( response.text , 'html.parser')
            goods_list = soup.select('ul.search-product-list > li') #쿠팡 제품이 있는 곳 태그 주소
            print( goods_list)
            
get_coupang_data('그릭 요거트', 1)

 

 

● 상품명, 상품가격, 리뷰수, 별점, 광고 여부,순위 가져오기

import  requests    # 크롬 로봇 안쓰고 웹에 접근하는 모듈
from  bs4  import BeautifulSoup
import  pandas  as  pd

def get_coupang_data(keyword, pages):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.coupang.com/"
    }
    
    list_name = []
    list_price = [] 
    list_review = []
    list_star = [] 
    list_ad = []
    list_rank = []
    list_url = []

    for   page  in   range( 1, pages+1):
        search_url = f"https://www.coupang.com/np/search?q={keyword}&channel=user&page={page}"
        response = requests.get(search_url, headers=headers)
        #print(response)  # <Response [200]> 이렇게 나오면 정상적으로 접근이 된것임

        if  response.status_code == 200:  # 사이트 접속이 정상이면 
            soup = BeautifulSoup( response.text, 'html.parser')
            goods_list = soup.select('ul.search-product-list > li')
            #print(goods_list)

            for  item  in  goods_list:
                #상품명 가져오기
                item_name = item.select_one('div.name')
                if item_name:
                    list_name.append( item_name.text.strip() )
                else:
                    list_name.append('')
                    
                #상품가격 가져오기 
                item_price = item.select_one('strong.price-value')
                if item_price:
                    list_price.append( item_price.text.strip() )
                else:
                    list_price.append('')

                #리뷰수 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner') # 상품의 상세정보
                if descriptions_inner and descriptions_inner.select_one('div.other-info'):  # 상세정보도 있고 기타 정보도 있으면                 
                    item_review = descriptions_inner.select_one('span.rating-total-count')
                    if item_review:
                        list_review.append(item_review.text.strip('()')) 
                    else:
                        list_review.append('0')  # 리뷰수가 없으면 0 으로 넣어라 
                else:
                    list_review.append('0')   # 상품의 기타정보가 없으면 0으로 넣어라

                #별점 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner')
                if descriptions_inner and descriptions_inner.select_one('div.other-info'):
                    item_star = descriptions_inner.select_one('em.rating')
                    if item_star:
                        list_star.append(item_star.text.strip() )
                    else:
                        list_star.append('0')    # 별점이 없으면 0으로 넣어라 !
                else:
                    list_star.append('0')        # 상품의 기타정보가 없으면 0으로 넣어라 !
                        
                # 광고 상품 여부 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner')
                if descriptions_inner and descriptions_inner.select_one('div.other-info'):
                    item_ad = descriptions_inner.select_one('span.ad-badge-text')
                    if item_ad:
                        list_ad.append('O' )
                    else:
                        list_ad.append('X')    # 광고가 아니면 0으로 넣어라 !
                else:
                    list_ad.append('X')        # 상품의 기타정보가 없으면 0으로 넣어라 !
                    
                #순위 가져오기 
                item_rank = item.select_one('span[class^="number no-"]')
                if item_rank:
                    list_rank.append(item_rank.text.strip() )
                else:
                    list_rank.append('')    # 순위 없으면 NA 으로 넣어라 !

                # 상품의 상세 URL 가져오기 
                item_url = item.select_one('a.search-product-link')
                if item_url:
                    list_url.append("https://www.coupang.com"+ item_url['href'])
                else:
                    list_url.append('')    # 순위 없으면 NA 으로 넣어라 !
                   
        print(len(list_name))
        print(len(list_price))
        print(len(list_review))
        print(len(list_star))
        print(len(list_ad))
        print(len(list_rank))
        print(len(list_url))
        
        # 판다스 데이터 프레임 만들기
        df = pd.DataFrame( {  '상품명' : list_name,
                              '가격' :  list_price,
                              '리뷰수' :  list_review,
                              '별점'   :  list_star,
                              '광고여부' : list_ad,
                              '순위' :  list_rank,
                              '상세url' : list_url} )

    # df 데이터프레임의 결과를 csv 파일로 내립니다. 
    df.to_csv("c:\\data\\cuppang_shopping.csv", encoding="utf8", index=False)
    print('성공적으로 c:\\data\\cuppang_shopping.csv 가 저장되었습니다')
        

get_coupang_data('그릭 요거트', 1)

 

● 판다스 데이터 프레임 만들고 출력하기

import  requests    # 크롬 로봇 안쓰고 웹에 접근하는 모듈
from  bs4  import BeautifulSoup
import  pandas  as  pd

def get_coupang_data(keyword, pages):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
        "Accept-Language": "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7",
        "Referer": "https://www.coupang.com/"
    }
    list_name = []
    list_price = [] 
    list_review = []
    list_star = [] 
    list_ad = []

    for   page  in   range( 1, pages+1):
        search_url = f"https://www.coupang.com/np/search?q={keyword}&channel=user&page={page}"
        response = requests.get(search_url, headers=headers)
        #print(response)  # <Response [200]> 이렇게 나오면 정상적으로 접근이 된것임

        if  response.status_code == 200:  # 사이트 접속이 정상이면 
            soup = BeautifulSoup( response.text, 'html.parser')
            goods_list = soup.select('ul.search-product-list > li')
            #print(goods_list)

            for  item  in  goods_list:
                #상품명 가져오기
                item_name = item.select_one('div.name')
                if item_name:
                    list_name.append( item_name.text.strip() )
                else:
                    list_name.append('')
                    
                #상품가격 가져오기 
                item_price = item.select_one('strong.price-value')
                if item_price:
                    list_price.append( item_price.text.strip() )
                else:
                    list_price.append('')

                #리뷰수 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner') # 상품의 상세정보
                if descriptions_inner and descriptions_inner.select_one('div.other-info'): # 상세정보도 있고 기타 정보도 있으면
                    item_review = descriptions_inner.select_one('span.rating-total-count') 
                    if item_review:
                        list_review.append(item_review.text.strip('()')) 
                    else:
                        list_review.append('0') # 리뷰수가 없으면 0으로 넣어라
                else:
                    list_review.append('0')  # 상품의 기타정보가 없으면 0으로 넣어라

                #별점 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner')
                if descriptions_inner and descriptions_inner.select_one('div.other-info'):
                    item_star = descriptions_inner.select_one('em.rating')
                    if item_star:
                        list_star.append(item_star.text.strip() )
                    else:
                        list_star.append('0')  # 별점이 없으면 0으로 넣어라
                else:
                    list_star.append('0')   # 상품의 기타정보가 없으면 0으로 넣어라
                        
                # 광고 상품 여부 가져오기 
                descriptions_inner=item.select_one('div.descriptions-inner')
                if descriptions_inner and descriptions_inner.select_one('div.other-info'):
                    item_ad = descriptions_inner.select_one('span.ad-badge-text')
                    if item_ad:
                        list_ad.append('O' )
                    else:
                        list_ad.append('X') # 광고가 없으면 x으로 넣어라
                else:
                    list_ad.append('X')  # 상품의 기타정보가 없으면 x으로 넣어라

        # print(len(list_name)) #49
        # print(len(list_price)) #49
        # print(len(list_review)) #49
        # print(len(list_star)) #49
        # print(len(list_ad)) #49
        
        # 판다스 데이터 프레임 만들기
        df = pd.DataFrame( {  '상품명' : list_name,
                              '가격' :  list_price,
                            '리뷰수' :  list_review,
                            '별점'   :  list_star,
                            '광고여부' : list_ad   } )
        # return df #프레임 출력

    # df 데이터프레임의 결과를 csv 파일로 내립니다. 
    df.to_csv("c:\\data\\cuppang_shopping.csv", encoding="utf8", index=False)
    print('성공적으로 c:\\data\\cuppang_shopping.csv 가 저장되었습니다')
        
        
get_coupang_data('그릭 요거트', 2)

 

저장된 csv파일

문제1. 쿠팡 그릭 요거트 데이터를 조회하는데 리뷰수가 높은 순서데로 모든 컬럼을 출력하시오 !
import pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek

from  pandasql  import  sqldf

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  *
           from  cp_greek
           order  by 리뷰수 desc; """

pysqldf(q)​

문제2. 위의 결과를 다시 출력하는데 상품명에 '1개'포함된 상품명만출력하시오.
import pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek

from  pandasql  import  sqldf

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  *
           from  cp_greek
           where 상품명 like '%1개%'
           order  by 리뷰수 desc; """

pysqldf(q)​


문제3. 위의 결과에서 상품명에 1개와 450g 을 포함하는 것만 출력하시오.
import pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek

from  pandasql  import  sqldf

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  *
           from  cp_greek
           where 상품명 like '%1개%' and 상품명 like '%450g%'
           order  by 리뷰수 desc; """

pysqldf(q)​

문제 4. 가격 컬럼의 유형을 숫자로 변환하시오 !
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex=True).astype('int64')
cp_greek.info()​


문제5. 전체 모든 테이블의 데이터를 가지고 결과를 출력하는데 별점, 별점별 평균가격을 출력하는데 평균가격이 15000원 이상인것만 출력하시오 !
from  pandasql  import  sqldf
import  pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex=True).astype('int64')

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  별점, round(avg(가격)) "평균가격"
           from  cp_greek
           group by 별점
           having round(avg(가격)) >= 15000"""

pysqldf(q)​

 


문제 6. cp_greek 테이블에서 가격이 가장 비싼 상품의 상품명, 가격, 리뷰수, 순위를 출력하시오 !
from  pandasql  import  sqldf
import  pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex=True).astype('int64')

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  상품명, 가격, 리뷰수, 순위
           from  cp_greek
           where  가격 = ( select max(가격)
                                from  cp_greek ); """

pysqldf(q)​

문제7. 상품명, 가격, 가격에대한 순위를 출력하시오. 
from  pandasql  import  sqldf
import  pandas  as  pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex=True).astype('int64')

pysqldf = lambda q : sqldf(q, globals() )

q = """ select  상품명, 가격, rank() over (order by 가격 desc) 순위2
           from  cp_greek; """

pysqldf(q)​

문제 8. 별점, 별점별 평균가격을 출력하는데 맨아래에 전체 평균가격이 출력이 되게하시오
from pandasql import sqldf
import pandas as pd

cp_greek = pd.read_csv("c:\\data\\cuppang_shopping.csv")
cp_greek['가격'] = cp_greek['가격'].str.replace(r'[^\d]', '', regex=True).astype('int64')

pysqldf = lambda q : sqldf(q, globals())

q = """
SELECT 별점, ROUND(AVG(가격)) AS 평균가격
FROM cp_greek
GROUP BY 별점

UNION ALL

SELECT 'Total' AS 별점, ROUND(AVG(가격)) AS 평균가격
FROM cp_greek
"""

result = pysqldf(q)
print(result)​