[COMPAS 광양시] 현재 설치 되어있는 전기차 충전소에 대해 알아보자!

솜씨좋은장씨

·

2020. 9. 27. 12:31

데이터 분석 활용 시간

2020년 9월 27일 12시  ~ 14시 30분 ( 총 2시간 30분 소요 )

 

사용 데이터

01.광양시_충전기설치현황.csv

19.광양시_법정경계(읍면동).geojson

 

활용 코드 및 내용

필요 라이브러리 import

from shapely.geometry import Point, Polygon
import pandas as pd
import geopandas as gpd
from tqdm import tqdm

데이터 load 하기

- 충전기 설치 현황 정보

# file_list[0] == 01.광양시_충전기설치현황.csv
charge_st_df = pd.read_csv("./data/" + file_list[0])
charge_st_df.head()

- 읍면동 ( 법정경계 ) 정보

# file_list[14] == 19.광양시_법정경계(읍면동).geojson
emd_gdf = gpd.read_file("./data/" + file_list[14])
emd_gdf

- 읍면동 ( 행정경계 ) 정보

# file_list[15] == 20.광양시_행정경계(읍면동).geojson
emd_df_hangjung = gpd.read_file("./data/" + file_list[15])
emd_df_hangjung

충전소의 읍면동 ( 법정경계 ) 정보 확인하기

point_dict = {}

for i in range(len(charge_st_df)):
    point_dict[charge_st_df['충전소명'].iloc[i]] = {}
    
    point_dict[charge_st_df['충전소명'].iloc[i]]['Point'] = Point(charge_st_df['lon'].iloc[i], charge_st_df['lat'].iloc[i])

여기서 주의할 점은 평소에 좌표를 볼때 사용하는 순서인 ( 위도, 경도 ) 즉 ( lat, lon ) 순서로 Point를 만들 경우

within 또는 contains가 제대로 동작하지 않음

-> ( lon, lat ) , ( 경도, 위도 ) 순서로 작성하여야 함

point_dict_keys = list(point_dict.keys())
umd_keys = list(umd_polys.keys())

for key in point_dict_keys:
    for umd_key in umd_keys:
        umd_ploy_lists = umd_polys[umd_key]

        for umd_polygon in umd_ploy_lists:
            if umd_polygon.contains(point_dict[key]['Point']) == True:
                point_dict[key]['umd'] = umd_key
                break
point_dict
{'LF스퀘어 광양점': {'Point': <shapely.geometry.point.Point at 0x7fae78940cc0>,
  'umd': '광양읍'},
 '광양만권경제자유구역청': {'Point': <shapely.geometry.point.Point at 0x7fae78940b70>,
  'umd': '광양읍'},
 '광양송보파인빌5차아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78940ac8>,
  'umd': '마동'},
 '광양시 모리스모텔': {'Point': <shapely.geometry.point.Point at 0x7fae789490f0>,
  'umd': '광영동'},
 '광양시 백운쇼핑센타': {'Point': <shapely.geometry.point.Point at 0x7fae78949978>,
  'umd': '금호동'},
 '광양시 블루핸즈(광양정비센터)': {'Point': <shapely.geometry.point.Point at 0x7fae789492e8>,
  'umd': '광양읍'},
 '광양시 비치모텔': {'Point': <shapely.geometry.point.Point at 0x7fae78949438>,
  'umd': '진월면'},
 '광양시 포스코 ICT 광양사업소': {'Point': <shapely.geometry.point.Point at 0x7fae78937cc0>,
  'umd': '태인동'},
 '광양시 프라자모텔': {'Point': <shapely.geometry.point.Point at 0x7fae78937f60>,
  'umd': '광영동'},
 '광양시 광양읍사무소': {'Point': <shapely.geometry.point.Point at 0x7fae78937780>,
  'umd': '광양읍'},
 '광양시 광영동주민센터': {'Point': <shapely.geometry.point.Point at 0x7fae78937b70>,
  'umd': '광영동'},
 '광양시 옥곡면사무소': {'Point': <shapely.geometry.point.Point at 0x7fae78937c50>,
  'umd': '옥곡면'},
 '광양읍사무소 앞 주차장': {'Point': <shapely.geometry.point.Point at 0x7fae78937e10>,
  'umd': '광양읍'},
 '광양주공이차아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937390>,
  'umd': '중동'},
 '한국전력광양지사': {'Point': <shapely.geometry.point.Point at 0x7fae78937cf8>,
  'umd': '중동'},
 '광영 근린공원': {'Point': <shapely.geometry.point.Point at 0x7fae78937198>,
  'umd': '광영동'},
 '광영동 가야아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937b00>,
  'umd': '광영동'},
 '구산칠성이편한세상': {'Point': <shapely.geometry.point.Point at 0x7fae78937be0>,
  'umd': '광양읍'},
 '대광로제비앙2차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae789376a0>,
  'umd': '중동'},
 '대신증권앞 주차장': {'Point': <shapely.geometry.point.Point at 0x7fae789375f8>,
  'umd': '중동'},
 '마틴모텔': {'Point': <shapely.geometry.point.Point at 0x7fae78937550>,
  'umd': '광영동'},
 '섬진강휴게소(부산방향)': {'Point': <shapely.geometry.point.Point at 0x7fae789374a8>,
  'umd': '진월면'},
 '섬진강휴게소(순천방향)': {'Point': <shapely.geometry.point.Point at 0x7fae78937400>,
  'umd': '진월면'},
 '쉐보레동광양지점서비스': {'Point': <shapely.geometry.point.Point at 0x7fae78937358>,
  'umd': '태인동'},
 '인동숲주차장': {'Point': <shapely.geometry.point.Point at 0x7fae789372b0>,
  'umd': '광양읍'},
 '중마버스터미널 공영주차장': {'Point': <shapely.geometry.point.Point at 0x7fae789371d0>,
  'umd': '중동'},
 '중마상설시장 주차장': {'Point': <shapely.geometry.point.Point at 0x7fae78937208>,
  'umd': '중동'},
 '호텔자바': {'Point': <shapely.geometry.point.Point at 0x7fae789370f0>,
  'umd': '중동'},
 '홈플러스 광양점': {'Point': <shapely.geometry.point.Point at 0x7fae78937518>,
  'umd': '중동'},
 '마동근린체육공원': {'Point': <shapely.geometry.point.Point at 0x7fae789374e0>,
  'umd': '중동'},
 '광양중마호반리젠시빌': {'Point': <shapely.geometry.point.Point at 0x7fae78937080>,
  'umd': '중동'},
 '태영1차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937978>,
  'umd': '중동'},
 '태영2차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae789372e8>,
  'umd': '중동'},
 '성호2-1차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937668>,
  'umd': '중동'},
 '송보파인빌 6차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937320>,
  'umd': '마동'},
 '송보파인빌 7차 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937278>,
  'umd': '광양읍'},
 '남해오네뜨 아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937a58>,
  'umd': '광양읍'},
 '광양읍 목성 주공아파트': {'Point': <shapely.geometry.point.Point at 0x7fae78937e48>,
  'umd': '광양읍'}}

 

충전기 설치 현황 정보 파일에 읍면동 ( 법정경계 ) column 추가하기

st_names = list(charge_st_df['충전소명'])
umd_infos = []

for st_name in st_names:
    umd_name = point_dict[st_name]['umd']
    
    umd_infos.append(umd_name)
charge_st_df['읍면동 (법정경계)'] = umd_infos

charge_st_df.head()

이전 게시물에서 만들어둔 차량 등록정보 정보를 활용해 차량 등록정보 column 추가하기

charge_st_umd_list = list(charge_st_df['읍면동 (법정경계)'])

car_enroll_infos = []

for umd in charge_st_umd_list:
    car_enroll_info = umd_car_infos[umd]
    
    car_enroll_infos.append(car_enroll_info)
    
charge_st_df['자동차 등록 현황 (법정경계)'] = car_enroll_infos
charge_st_df.head()

각 읍면동 ( 법정경계 ) 별 충전기 개수 확인해보기

umd_station_info_dict = {}

for umd_key in umd_keys:
    umd_station_info_dict[umd_key] = {}
    umd_station_info_dict[umd_key]['충전소명'] = []
    umd_station_info_dict[umd_key]['급속'] = 0
    umd_station_info_dict[umd_key]['완속'] = 0
    umd_station_info_dict[umd_key]['전체'] = 0
    
    
for i in range(len(charge_st_df)):
    umd = charge_st_df['읍면동 (법정경계)'].iloc[i]
    fast_slow = charge_st_df['급속/완속'].iloc[i]
    
    umd_station_info_dict[umd]['충전소명'].append(charge_st_df['충전소명'].iloc[i])
    
    umd_station_info_dict[umd][fast_slow] += 1
    
    umd_station_info_dict[umd]['전체'] += 1
umd_station_info_dict
{'황금동': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '황길동': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '도이동': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '성황동': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '중군동': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '중동': {'충전소명': ['광양주공이차아파트',
   '한국전력광양지사',
   '대광로제비앙2차 아파트',
   '대신증권앞 주차장',
   '중마버스터미널 공영주차장',
   '중마상설시장 주차장',
   '호텔자바',
   '홈플러스 광양점',
   '마동근린체육공원',
   '광양중마호반리젠시빌',
   '광양중마호반리젠시빌',
   '태영1차 아파트',
   '태영2차 아파트',
   '성호2-1차 아파트'],
  '급속': 10,
  '완속': 4,
  '전체': 14},
 '마동': {'충전소명': ['광양송보파인빌5차아파트', '송보파인빌 6차 아파트'], '급속': 1, '완속': 1, '전체': 2},
 '광영동': {'충전소명': ['광양시 모리스모텔',
   '광양시 프라자모텔',
   '광양시 광영동주민센터',
   '광영 근린공원',
   '광영동 가야아파트',
   '마틴모텔'],
  '급속': 1,
  '완속': 5,
  '전체': 6},
 '태인동': {'충전소명': ['광양시 포스코 ICT 광양사업소', '쉐보레동광양지점서비스'],
  '급속': 0,
  '완속': 2,
  '전체': 2},
 '금호동': {'충전소명': ['광양시 백운쇼핑센타'], '급속': 0, '완속': 1, '전체': 1},
 '광양읍': {'충전소명': ['LF스퀘어 광양점',
   '광양만권경제자유구역청',
   '광양시 블루핸즈(광양정비센터)',
   '광양시 광양읍사무소',
   '광양읍사무소 앞 주차장',
   '구산칠성이편한세상',
   '인동숲주차장',
   '인동숲주차장',
   '송보파인빌 7차 아파트',
   '송보파인빌 7차 아파트',
   '남해오네뜨 아파트',
   '남해오네뜨 아파트',
   '광양읍 목성 주공아파트'],
  '급속': 7,
  '완속': 6,
  '전체': 13},
 '봉강면': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '옥룡면': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '옥곡면': {'충전소명': ['광양시 옥곡면사무소'], '급속': 0, '완속': 1, '전체': 1},
 '진상면': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0},
 '진월면': {'충전소명': ['광양시 비치모텔',
   '섬진강휴게소(부산방향)',
   '섬진강휴게소(부산방향)',
   '섬진강휴게소(순천방향)',
   '섬진강휴게소(순천방향)'],
  '급속': 4,
  '완속': 1,
  '전체': 5},
 '다압면': {'충전소명': [], '급속': 0, '완속': 0, '전체': 0}}

읍면동 ( 법정경계 ) 정보 DataFrame 만들기

umd_names = list(umd_station_info_dict.keys())
charge_st_names = []
fast_list = []
slow_list = []
whole_list = []
car_enroll_list = []

for key in umd_names:
    charge_st_name = " | ".join(umd_station_info_dict[key]['충전소명'])
    
    if charge_st_name == '':
        charge_st_name = None
    charge_st_names.append(charge_st_name)
    
    fast_list.append(umd_station_info_dict[key]['급속'])
    slow_list.append(umd_station_info_dict[key]['완속'])
    whole_list.append(umd_station_info_dict[key]['전체'])
    car_enroll_list.append(umd_car_infos[key])
    
umd_infos_df = pd.DataFrame({"읍면동":umd_names, "충전소 목록":charge_st_names, 
                             "급속 충전소/개":fast_list, "완속 충전소/개":slow_list, "전체 충전소/개":whole_list, 
                             "차량등록현황":car_enroll_list})
                             
umd_infos_df.head()

같은 방법으로 읍면동 ( 행정경계 ) 정보 DataFrame 만들기