ㅇ 프로젝트/(Toy)_project

네이버 API를 이용해서 그래픽카드 특가를 노려보자 (2/2)

BrainKimDu 2022. 10. 3. 00:17

import pandas as pd
GPU_info = pd.read_excel("RTX3050.xlsx").fillna("")

이 상태로 끝이났습니다.

데이터를 이리저리 만져야하기 때문에

원본파일이 손상되는 경우가 생깁니다. 그럴때마다 크롤링을 진행할 수 없으니

새로운 파이썬 만들어서 아까 만들어둔 엑셀을 불러옵시다.

 

불러오면 인덱스가 이상하니 우선 리셋하구요,

그리고 unnamed:0 컬럼을 날려버립니다.

del GPU_info["Unnamed: 0"]
GPU_info

그러면 시작하기 좋은 딱 깔끔한 상태가 되었습니다.

 

 

 

 

 

목표 설정

  • 제조사별로 그래픽카드를 조회하고 싶다.
  • 하급모델, 중급모델, 상급모델만 조회하고 싶다.
  • 중고 모델은 필요없다.

 

 

제조사별로 그래픽카드를 조회하고 싶다.

  • count를 이용해서 제조사가 무엇이 있는지 확인해보자.
  • 그럼 그 자료를 데이터프레임으로 저장하면 내가 가진 자료상으로 모든 제조사 목록이 생기는 것이다.

 

 

maker_GPU = ["리드텍", "갤럭시", "PALIT", "EVGA",  "PNY" ,
             "게인워드", "ASUS", "기가바이트", "MSI", 
             "이엠텍", "조텍", "만리", "INNO3D"]

이 정도를 리스트로 만들어 봅시다.

 

처음에 생각했던 방법인데, 아무리 생각해도 데이터를 만들고 나서 활용하기 어려울 것 같다고 생각된다.

실패하는 경험도 보고 싶으면 읽어보고 아님말고

더보기

[Pandas(판다스)] 특정문자 포함하는 행 추출 (tistory.com)

 

[Pandas(판다스)] 특정문자 포함하는 행 추출

df에서 en이라는 컬럼에 a가 들어간는 행 추출 df[df['en'].str.contains('a')] df.query('en.str.contains("a")') 여러 단어중 하나라도 들어가는 행 추출 df[df['en'].str.contains('a|b|c')] # 안될경우 engine..

tmdhhey.tistory.com

 

result_df[result_df['제목'].str.contains('리드텍')]

 

제목에 리드텍이라는 이름이 들어가는 행을 모두 보여주세요.

그러면 이상태에서 제조사를 리드텍으로 바꿔버릴 수 있을까?


이걸 데이터 프레임으로 저장을 해보자

그러면 인덱스를 그대로 가진 상태로 생성된다.

이상태에서 모든 열에 리드텍을 포함하여

merge 시키는 것이다.

 

 

우선 인터넷에 있는 정보를 찾아보니 

[Python] Pandas DataFrame 컬럼 값 조건 변경 (tistory.com)

A.loc[A['제조사']== "", '제조사'] = '리드텍'
A.head(10)

문제는 왜 제목도 같이 바꿔주는 걸까ㅋㅋ

문제는 못찾았지만, 일단 내 계획상에서 제목은 크게 상관이 없다.

merge 할꺼니까 우리는 제조사만 있으면 된다. 무시하고 지나가보자.

자.. 이걸 이제 병합을 해야한다.

어??.. 왜요??

왜 x를 만들어요..

 

인덱스에 맞춰 데이터를 대체하는 방법이 뭐가 있을까 이건 고민으로 남기고 조금 쉬운 방법으로 돌아가자.

 

제조사별로 그래픽카드를 조회하는 방법을 생각해봤는데

아무리 생각해도 이거밖에 없는 것 같다.

 

대부분의 판매자들은 제목에 브랜드명을 적어놓을 수 밖에 없습니다. 이를 이용하는 겁니다.

GPU_info[GPU_info['제목'].str.contains("리드텍")]

해당 코드를 넣으면 리드텍이 들어간 행만 따로 추출을 해버립니다.

 

그러면 이제 for문에

maker_GPU = ["리드텍", "갤럭시", "PALIT", "EVGA",  "PNY" ,
             "게인워드", "ASUS", "기가바이트", "MSI", 
             "이엠텍", "조텍", "만리", "INNO3D"]

 얘를 넣고 돌리면 제조사별로 조회가 가능합니다.

 

그러나 단점이 존재합니다. 그건 for문에 넣은 후 설명하겠습니다.

GPU_maker = []
for each in maker_GPU:
    GPU_maker.append(GPU_info[GPU_info['제목'].str.contains(each)].fillna(""))
GPU_maker[1]

코드의 가독성은 높아지지만 단점은 제조사를 조회할 때마다

maker_GPU에서 몇번째 자리에 있는지 찾아야 한다는 점입니다.

 

그렇기에 저는 활용성을 위해 for문보다

ctrl C  , ctrl  V 를 사용하기로 하겠습니다.

leadtek = GPU_info[GPU_info['제목'].str.contains("리드텍|leadtek")]
galaxy = GPU_info[GPU_info['제목'].str.contains("갤럭시|galaxy")]
palit = GPU_info[GPU_info['제목'].str.contains("PALIT")]
EVGA = GPU_info[GPU_info['제목'].str.contains("EVGA")]
PNY = GPU_info[GPU_info['제목'].str.contains("PNY")]
Gainward  = GPU_info[GPU_info['제목'].str.contains("게인워드|Gainward")]
ASUS = GPU_info[GPU_info['제목'].str.contains("ASUS|에이수스")]
Gigabyte  = GPU_info[GPU_info['제목'].str.contains("기가바이트|Gigabyte|AORUS")]
MSI= GPU_info[GPU_info['제목'].str.contains("MSI")]
emtek  = GPU_info[GPU_info['제목'].str.contains("이엠텍")]
ZOTAC  = GPU_info[GPU_info['제목'].str.contains("조텍|ZOTAC")]
Manli = GPU_info[GPU_info['제목'].str.contains("만리|Manli")]
INNO3D = GPU_info[GPU_info['제목'].str.contains("INNO3D|이노3D")]

그리고 다양한 검색어를 포함할 수 있어 노가다를 하는게 좋다고 봅니다.

그러면 이제 여러분들은 3050 제조사 이름만 입력하면

짜잔하고 나오는데, 잠시만요.

 

첫부분에 .fillna("") 이걸 추가하고 왔습니다.

완벽합니다.

좋습니다.

 

  • EVGA의 그래픽카드를 저렴한순으로 보여주세요.

손쉽게 볼 수 있습니다. 아 그리고 이엠텍에서 나오는 그래픽카드가 EVGA라고 합니다.

 

한가지 문제가 생겼습니다.

어.. 3050은 상급 하급이 그렇게 중요하게 나누어지지 않는다고 하더라구요.

실제로 상급모델이 그렇게 많이 나오지 않는다고 합니다.

 

 

 

그래서  3070TI의 데이터를 다시 불러오고 오겠습니다.

3070 TI도 있고, Ti도 있고, ti도 있네요. 3개의 경우를 다 불러와서 합쳐버립시다.

결과를 보니까 딱히 문제는 없을 것 같습니다.

result_datas2 = []

for n in range(1, 1000, 100):
    url = giveme_url("shop", "RTX3070ti", n, 100 )
    RTX_result = giveme_code(url)
    result = save_info(RTX_result)
    result_datas2.append(result)
    
result_datas2
result_df = pd.concat(result_datas2)
result_df.reset_index().tail()
result_df.to_excel("RTX3070ti.xlsx", encoding="utf-8")

이렇게 진행을 하고 3070TI 데이터를 불러옵시다.

import pandas as pd
GPU_info70 = pd.read_excel("RTX3070ti.xlsx").fillna("")
GPU_info70.reset_index()
del GPU_info70["Unnamed: 0"]
GPU_info70

leadtek = GPU_info70[GPU_info70['제목'].str.contains("리드텍|leadtek")]
galaxy = GPU_info70[GPU_info70['제목'].str.contains("갤럭시|galaxy")]
palit = GPU_info70[GPU_info70['제목'].str.contains("PALIT")]
EVGA = GPU_info70[GPU_info70['제목'].str.contains("EVGA")]
PNY = GPU_info70[GPU_info70['제목'].str.contains("PNY")]
Gainward  = GPU_info70[GPU_info70['제목'].str.contains("게인워드|Gainward")]
ASUS = GPU_info70[GPU_info70['제목'].str.contains("ASUS|에이수스")]
Gigabyte  = GPU_info70[GPU_info70['제목'].str.contains("기가바이트|Gigabyte|AORUS")]
MSI= GPU_info70[GPU_info70['제목'].str.contains("MSI")]
emtek  = GPU_info70[GPU_info70['제목'].str.contains("이엠텍")]
ZOTAC  = GPU_info70[GPU_info70['제목'].str.contains("조텍|ZOTAC")]
Manli = GPU_info70[GPU_info70['제목'].str.contains("만리|Manli")]
INNO3D = GPU_info70[GPU_info70['제목'].str.contains("INNO3D|이노3D")]

다시 지정을 하구요.

 

조회를 하면 3070ti로 나옵니다.

갤럭시 3070ti가 50만원? 뭐죠? 

중고 상품이 나오는 군요..

  • 중고 모델은 필요없다. 지워버리자.

갤럭시코리아 GALAX 지포스 RTX 3070 Ti EX WHITE OC D6X 8GB 그래픽카드 리퍼제품 550000

  • 리퍼 모델도 필요없다. 지워버리자.
  • 처음으로 돌아가 리퍼와 중고가 없는 데이터를 만들어버리자.
GPU_info70_nosecond =GPU_info70[~GPU_info70['제목'].str.contains("중고|리퍼", na=False, case=False)]
GPU_info70_nosecond

중고와 리퍼가 없어진 모습

편안..

 

위의 과정을 다시 반복하자..

leadtek = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("리드텍|leadtek")]
galaxy = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("갤럭시|galaxy")]
palit = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("PALIT")]
EVGA = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("EVGA")]
PNY = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("PNY")]
Gainward  = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("게인워드|Gainward")]
ASUS = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("ASUS|에이수스")]
Gigabyte  = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("기가바이트|Gigabyte|AORUS")]
MSI= GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("MSI")]
emtek  = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("이엠텍")]
ZOTAC  = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("조텍|ZOTAC")]
Manli = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("만리|Manli")]
INNO3D = GPU_info70_nosecond[GPU_info70_nosecond['제목'].str.contains("INNO3D|이노3D")]

다시 저렴한 순으로 정렬하면 중고와 리퍼가 사라진 모습을 볼 수 있다.

 

  • 하급모델, 중급모델, 상급모델만 조회하고 싶다.

이번 목표도 노가다가 필요하다. 그리고 시각화까지 해볼까 생각한다.

 

우선 퀘이사존에서 그래픽카드 티어표를 다운받아오려고한다.

제조사별 그래픽카드 티어(등급) 정리표 (최하급~최상급) > 그래픽카드 | 퀘이사존 (quasarzone.com)

 

제조사별 그래픽카드 티어(등급) 정리표 (최하급~최상급)

잘만들어주신 텍스트 정리글이 있어직관성을 더해 그래픽카드 티어 표를 만들어봤습니다.자세한 내용은 아래 블로그…

quasarzone.com

 

 

상급(1티어) 그래픽카드를 분석해보자

 

GPU_info70_tier1= GPU_info70_nosecond[GPU_info70_nosecond['제목'].\
                                    str.contains("STRIX|스트릭스| \
                                                 슈프림|suprim| \
                                                 어로스|AORUS| \
                                                 호프|HOF|AMP|\
                                                 불칸|VULCAN|\
                                                 블랙몬스터|blackmonster|\
                                                 GameRock")]

상급모델만 조회하였다.

상급모델만 저렴한 순으로 정렬하니 현재 조텍 모델이 가장 저렴하다고 나온다. 궁금하니 바로 들어가보자

특가를 하나 찾아내었다. 그러나 퀘이사존을 찾아보니 3070ti 특가는 60~70만원에 거래되고 있었다.

 

중급(2티어) 그래픽카드를 분석해보자

이번엔 중급 모델을 조회해보자.

GPU_info70_tier2= GPU_info70_nosecond[GPU_info70_nosecond['제목'].\
                                    str.contains("TUF|KO| \
                                                 트리오|trio| \
                                                 gaming OC| \
                                                 vision OC|EX|\
                                                 XC3|\
                                                 black Edition|\
                                                 gaming pro")]

 

15920원? , 218640원 ?  21만원은 그래픽카드 케이스?를 파는거고

15920원은 사기 같습니다.

 


생각보단 상급, 중급을 조회할 때 모두다 조회되지 않는 것 같습니다.


GPU_info70_nosecond.sort_values(by="가격", ascending=True).to_excel("RTX3070tiee.xlsx", encoding="utf-8")

해당자료를 저장하여 특가가 있을까 확인해봤습니다.

현재  해당 상품이 특가로 보입니다.

잠깐! 네이버쇼핑에서 알려드립니다 :: 네이버쇼핑 (naver.com)

 

잠깐! 네이버쇼핑에서 알려드립니다 :: 네이버쇼핑

네이버쇼핑과 쇼핑몰에서 제공하는 상품정보와 가격은 일치하지 않을 수 있습니다. 네이버쇼핑에 서비스중인 상품의 가격은 쿠폰이 적용된 가격이며, 쇼핑몰 페이지에서 쿠폰을 다운 받으셔야

cr.shopping.naver.com

 

공유를 했더니.. 다 팔려버렸다. ㅋㅋ

 

데이터를 특별하게 가공하고, 통계를 내는 방향으로 계속 접근하였는데 생각보다 복잡합니다.

그냥 내가 정렬하고 찾는게 아직은 더 편하네요.


 

 

 

 

뭔가 더 가지고 놀고 싶은데

3070ti  그래픽카드의 가격분포를 box plot 으로 그려볼까요?

import matplotlib.pyplot as plt

tmp_y = [1]*len(GPU_info70_nosecond["가격"])

plt.figure(figsize=(12,4))
plt.scatter(GPU_info70_nosecond["가격"], tmp_y)
plt.grid()
plt.show()
# 1 = 1000000 으로 보입니다.

 

 

import numpy as np
np.median(GPU_info70_nosecond["가격"])

1000개의 데이터 중 중간값은 940730원입니다.

np.percentile(GPU_info70_nosecond["가격"], 25)
np.percentile(GPU_info70_nosecond["가격"], 75)

25~75% 지점을 구합니다.

iqr = np.percentile(GPU_info70_nosecond["가격"], 75) - np.percentile(GPU_info70_nosecond["가격"], 25) 
iqr

iqr는  이상값 탐지에 필요한 자료입니다. 

q1 = np.percentile(GPU_info70_nosecond["가격"], 25)
q2 = np.median(GPU_info70_nosecond["가격"])
q3 = np.percentile(GPU_info70_nosecond["가격"], 75)
upper_fence = q3 + iqr*1.5
lower_fence = q1 - iqr*1.5
plt.figure(figsize=(12, 4))
plt.scatter(GPU_info70_nosecond["가격"], tmp_y)
plt.axvline(x=q1, color = 'black')
plt.axvline(x=q2, color = 'red')
plt.axvline(x=q3, color = 'black')
plt.axvline(x=upper_fence, color = 'black', ls='dashed')
plt.axvline(x=lower_fence, color = 'black', ls='dashed')
plt.grid()
plt.show()

꽤 인상적이군요.

 

이게 맞는지 한 번 검증하겠습니다.

 

import seaborn as sns
plt.figure(figsize=(12,4))
sns.boxplot(GPU_info70_nosecond["가격"])
plt.grid()
plt.show()

이게 무슨 뜻이냐면 

이게 박스의 경계면입니다.

확실한진 모르겠지만 

3070ti의 가격은 878,222.5 만원 ~ 1,052,700만원 사이에 분포하고 있습니다.

이 분포를 벗어나는 값은 통계상에서 버려지는 것으로 알고 있습니다.

 

저는 이렇게 결론을 내리겠습니다.

3070ti를 79만원보다 아래에 살 수 있다면 특가에 잘 산 것이다. 라고

 

이쯤하죠.