SQL_Oil Data 가공

안선경·2023년 2월 26일
0

SQL Studuy

목록 보기
7/7
post-thumbnail

  • python을 통해 Mysql를 작업하고 데이터를 가공할 수 있도록 데이터 처리 과정을 학습
import mysql.connector.connect(
	host = ,
    port = ,
    user = ,
    password = ,
  • 해당 문법을 통해 python에서 sql 연결
  • 작업을 위해 두 개의 테이블을 만듦
  • GAS_BRAND는 foreign key를 연결하기 위해 만들고,
  • GAS_STATION은 데이터를 저장할 공간 Table로 생성
  • 콘솔창에서 mysql 접속 후 확인 결과 정상적으로 데이터 생성 완료
  • sql에는 sql 문법을 넣고, val에는 넣을 내용을 입력
sql = "insert into <TableName>(column1, column2...) values(1, 2, 3...)
val = []형태 안에 tuple형태로 저장
cursor.execute(sql, val)
conn.commit()
  • 위에 문법을 통해 tuple안의 내용을 sql에 저장이 가능
  • GAS_BRAND로 사용할 6개의 브랜드 내용을 입력
  • python에서 해당 내용을 select문으로 확인 결과 정상적으로 입력 완료
  • 사이트에서 데이터 추출 과정에서 사용할 함수 생성
  • ','콤마를 삭제하는 함수, 브랜드 명을 브랜드 넘버로 바꾸는 함수, 행정구 이름을 뽑는 함수, 경위도를 생성하는 함수(googlemap 사용)
  • 4개의 함수 정상적으로 작동
  • 1,000 -> 1000
  • SK에너지 -> 1
  • '서울시 강남구 헌릉로 730' -> 강남구
  • '서울시 강남구 헌릉로 730' -> 37...., 127.....

  • 사이트에서 데이터 추출을 위한 서울시 25개 구이름 리스트 생성
  • 각 데이터를 추출후 담을 변수 생성
  • city의 경우 모든 25개 '구'가 서울시이기 때문에 서울로 통일
  • 해당 내용은 TOY_Project의 Oil_DBA에서 사용한 코드를 그대로 사용
  • 해당 사이트 휘발유, 경유, 주소, 부가서비스 정보 등 추출
  • 해당 사이트에서 html 위치를 확인 후 BeautifulSoup을 통해 웹 데이터 추출
for gu_list in tqdm_notebook(gu_name):
    driver.find_element(By.XPATH, '//*[@id="SIGUNGU_NM0"]').send_keys(gu_list)
    req = driver.page_source
    soup = BeautifulSoup(req, "html.parser")
    time.sleep(1)

    
    for num in range(1, int(soup.select_one("#totCnt").get_text())+1):
        time.sleep(1)
        driver.find_element(By.XPATH, f'//*[@id="body1"]/tr[{num}]/td[1]/a').click()
        req = driver.page_source
        soup = BeautifulSoup(req, "html.parser")

        time.sleep(1)

        brand = make_brandId(soup.select("ul > li > label")[23].get_text())
        brand_raw_name.append(soup.select("ul > li > label")[23].get_text())
        name = soup.select_one("#os_nm").get_text()
        city = '서울'
        gu = gu_list
        address = soup.select_one("#rd_addr").get_text()
        gasoline = make_int(soup.select("td > label")[2].get_text()) 
        diesel = make_int(soup.select("td > label")[4].get_text())
        self = 0


        lanlng = make_LatLng(soup.select_one("#rd_addr").get_text())
        lat = lanlng[0]
        lng = lanlng[1]
        
        if str(soup.select_one("#cwsh_yn")).find("off") > 1:
                car_wash = 0
        else:
                car_wash = 1
                           
        if str(soup.select_one("#lpg_yn")).find("off") > 1:
                charging_station = 0
        else:
                charging_station = 1
                        
        if str(soup.select_one("#maint_yn")).find("off") > 1:
                car_maintenance = 0
        else:
                car_maintenance = 1
                    
        if str(soup.select_one("#cvs_yn")).find("off") > 1:
                convenience_store = 0
        else:
                convenience_store = 1
                           
        if str(soup.select_one("#sel24_yn")).find("off") > 1:
               hour = 0
        else:
               hour = 1
        
        sql = "insert into GAS_STATION (brand, name, city, gu, address, gasoline, diesel, self, car_wash, charging_station, car_maintenance, convenience_store, 24_hour, lat, lng) values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
        val = (brand, name, city, gu, address, gasoline, diesel, self, car_wash, charging_station, car_maintenance, convenience_store, hour, lat, lng)
        print(val)
        cursor.execute(sql, val)
        conn.commit()
  • 처음 for문에 서울시 25개의 구 이름을 넣고,
  • 두번째 for문에는 해당 구의 주유소를 하나씩 클릭하며 해당 주유소의 모든 정보를 추출해서 insert sql문법을 사용해 정보를 mysql에 담음
  • python에서 데이터 확인 결과 정상적으로 추출 및 저장 완료
  • 이제 Dataframe 생성을 위해 각 빈 리스트 목록을 생성
  • sql에서 select column1 문법을 통해 column의 데이터를 뽑고 해당 데이터를 리스트에 저장
  • 각 리스트에 저장한 데이터를 DataFrame으로 변환
  • 저장한 Dataframe을 csv파일로 저장
cursor.execute("select id, brand, name, address,
(6371*acos(cos(radians(37.495584))*cos(radians(lat))*
cos(radians(lng)-radians(127.029347))+sin(radians(37.495584))*
sin(radians(lat)))) as distance from GAS_STATION HAVING distance < 1.0")

cursor.fetchall()
  • 해당 경위도에서 반경 1km 이내에 주유소를 검색하는 코드를 입력
  • 해당 코드는 구글링의 결과...진짜 저걸 어떻게 만들었을까 경이롭다...읽어보니 지구의 반지름 길이 어쩌구저쩌구하는데 매우 대단...
  • 서울시 미왕빌딩으로부터 반경 1km이내에 3개의 주유소가 존재하며, 해당 주유소의 데이터
cursor.execute("select id, brand, name, address, gasoline, 
self,24_hour,convenience_store,(6371*acos(cos(radians(37.495584))*
cos(radians(lat))*cos(radians(lng)-radians(127.029347))+
sin(radians(37.495584))*sin(radians(lat)))) as distance 
from GAS_STATION where self = 1 and 24_hour = 
1 and convenience_store = 1 having 
distance <= 12.613106807312574 order by gasoline limit 10")

cursor.fetchall()
  • 해당 경위도로부터 셀프, 24시간 주유소이면서 가격이 싼 순서대로 10개의 주유소 리스트를 작성
  • having문을 사용함으로써 조건을 추가하여 10개의 주유소가 가격이 싸며, 셀프 세차 및 24시간이 가능한 주유소 리스트
profile
상황을 바꿀 수 없다면, 나를 바꾸자

0개의 댓글