WIFI

Soyoung Park·2022년 9월 5일
0

TIL python

목록 보기
14/16
#한글 깨짐 방지
import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm

fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 
mpl.font_manager._rebuild()
#라이브러리 임포트
import folium
import pandas as pd
import plotly.express as px
#데이터 준비하기
data = pd.read_csv('경로복사해', encoding='파일보고 넣어 ex) EUC-KR')
data.head()

^ 데이터 정보 확인

^ 누락된 데이터 있는지 확인

^데이터 분석

^ size 확인

^ 위에 size 확인 코드가지고 count 한 것임

^ reset_index하기

^ reset_index 하고 콜롬 추가 이름을 <설치수>로 지정해주기
  위에서 name만 바꿔준 것임.

^reset_index 합계?

^ LGU+, LG U+ 이와같은 것들을 다 같은 형식의 LG U+로 바꾸고 싶지만 
  콜라보 되어있기에 전처리 어렵다. 데이터 왜곡될 가능성 크다.
group_data.loc[group_data.서비스제공사명.str.contains('LG'), '서비스제공사명'] = 'LGU+' #LG들어가있는 모든 것 LGU+로 통칭해라.
group_data.서비스제공사명.unique()

^ LG 들어가 있는 모든 데이터들 LGU+ 하나의 이름으로 합쳐주는 방법

데이터 시각화

^
# 설치시도별 WIFI 설치 현황
px.bar(group_data, x = '설치시도명', y = '설치수')

^
px.histogram(group_data, x = '설치시도명', y = '설치수')

^ histogram

^ histogram

^
px.pie(group_data, names = '설치시도명', values = '설치수')
or 
fig = px.pie(group_data, names = '설치시도명', values = '설치수')
fig.show()


^
colors = ['gold', 'mediumtrurquoise', 'darkorange','lightgreen']
fig = px.pie(group_data, names = '설치시도명', values = '설치수')
fig.update_traces(textposition= 'inside', textinfo='percent+label', hoverinfo='value', textfont_size=20,
                  marker = dict(colors=colors, line=dict(color='#000000', width=2))) 
fig.show()
 hoverinfo='value'
 #hoverinfo 클릭했을 때 정보가 보인다.

^ textinfo='percent+label+value'

^ textinfo='percent'

대전광역시 무료 WIFI 현황 데이터 분석 및 시각화

dj_df = data.loc[data['설치시도명']=='대전광역시']
dj_df.info()

^
# 어떤 목적으로 무료 WIFI 설치 했는지 확인
fig=px.histogram(dj_df, x='설치시군구명', color ='설치시설구분')
fig.show()

^
fig=px.histogram(data, x='설치시도명', color ='설치시설구분')
fig.show()

데이터 이름 통합해주기

^ (1) 데이터 이름 확인하기

^ (2) 
#서민.복지시설, 서민/복지시설,  서민·복지시설, 서민복지시설 -> 서민복지시설

data.loc[data.설치시설구분.str.contains('서민'), '설치시설구분'] ='서민복지시설'
data.설치시설구분.unique()

** however, 이거는 맨 위에 전처리 과정 작업으로 초반에 해줘야 함.

^ 위에 전처리해주고 그래프 다시 해주기

dj_df.isna().sum()
dj_df.설치년월.unique()
# 집계 데이터프레임 만들 때, 기준이 될 수 있는 컬럼을 모두 groupby 하자
# 합쳐서 시각화는 차트에서 제공 해줌
group_dj = dj_df.groupby(by=['설치년월','설치시군구명', '설치시설구분', '서비스제공사명', '관리기관명']).size().reset_index(name='설치수')
group_dj

^ groupby할때 null은 자동적으로 예외시켜준다. 

^
fig = px.histogram(group_dj, x = '설치시군구명', y='설치수', color ='설치시설구분')
fig.show()

^ fig 서비스제공사명

^ fig 관리기관명

^ 
fig = px.pie(group_dj, names = '설치시군구명', values='설치수')
fig.show()

^ fig.update_traces(textposition='inside', textinfo ='percent+label')

^ names 설치시설구분

^ names 서비스제공사명

^ names 관리기관명

내 위치에 가까운 무료 WIFI 찾기

(1) 지도 세팅

# 1) 내 위치 자표 찾기
# 1-1) folium 지도에 click 하면 좌표정보가 popup으로 띄어주고 그걸 확인해서 내 위치 좌표로 사용한다.

# 지도에 ClickForMarker 함수와 LatLngPopup 함수를 적용하여 위치를 Marker 표출
import folium

m = folium.Map(location=[36.478725, 127.288507], zoom_start=14)

m

(2) 좌표값 수동 설정

#ClickForMarker 함수 적용
m.add_child(folium.ClickForMarker(popup='point'))

# 위도/경도 팝업 활성화 시키도록 적용 -> 지도를 탐색해서 좌표값 찾는데 도움
m.add_child(folium.LatLngPopup())

(3) 도로명 주소 좌표값으로 변환받기

^
# Latitude:36.478725
# Longitude: 127.288507

#1-2) 도로명 주소 -> 좌표 값으로 변환
from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
  geo = geolocoder.geocode(address)
  crd = {"lat": str(geo.latitude), "lng": str(geo.longitude)}

  return crd


crd = geocoding('대전 서구 대덕대로 319')
print(type(crd))
print(crd['lat'])
print(crd['lng'])

myhome = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=14)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(myhome)
myhome

^ 도로명 주소 지정해주고 지도 표시해주기

^ 
from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
  geo = geolocoder.geocode(address)
  crd = {"lat": str(geo.latitude), "lng": str(geo.longitude)}

  return crd

address = input('도로명 주소를 입력하세요.')
crd = geocoding(address)
print(crd['lat'])
print(crd['lng'])

myhome = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=14)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(myhome)
myhome

^ 도로명 주소 받아 지도 표시해주기

질문함:
if 사용자가 도로명 주소 가 아닌 다른 거 입력했을 때 try except 를 사용해 오류임을 표시할 수 있음.
이 경우에는 address 부터 아래 끝까지 try except 안에 넣어줘야함.

(4) 거리

^ tuple형태로 맞춰준 것임.

^
# 2) 나랑 가장 가까운 WIFI 찾기
from geopy.distance import geodesic #거리를 계산해주는 친구

# 2-1) 무료 WIFI 위치 정보 가져오기
my_wifi = pd.DataFrame(columns=['설치시군구명','설치시설구분','위도', '경도', '거리']) #거리 콜롬 없는거 새로 만들어줌
myhome = (36.478725, 127.3866)  #tuple형태

for n in data.index:
  wifi_loc = (data.loc[n, '위도'], data.loc[n, '경도']) #tuple형태

  #my_wifi dataframe에 담기
  my_wifi.loc[n] = [data.loc[n, '설치시군구명'], data.loc[n, '설치시설구분'], data.loc[n, '위도'], data.loc[n, '경도'], geodesic(myhome, wifi_loc).kilometers]
                                                                
my_wifi.head()

^
# myhome과 가장 가까운 WIFI top 10 뽑기
my_wifi =my_wifi.sort_values(by=['거리']).head(10)
my_wifi

(5) 지도 시각화

^
# 3) 지도 시각화
my_map = folium.Map(location=[36.448262,127.423692], zoom_start=14)

for n in my_wifi.index:
  folium.Marker([my_wifi.loc[n, '위도'], my_wifi.loc[n, '경도']],
                popup='<pre >' +my_wifi.loc[n, '설치시설구분']+'</pre>',
                icon=folium.Icon(icon ='wifi', prefix ='fa')).add_to(my_map)

folium.Marker([36.3511, 127.3866], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(my_map)

my_map

일당백 활동

^ 주어진 오늘의 미션

사용자에게 도로명 주소를 입력받아 마커를 표시하고 그 위치에 가장 가까운 WIFI 10 곳 하나의 셀에 입력

import folium


from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
  geo = geolocoder.geocode(address)
  crd = {"lat": float(geo.latitude), "lng": float(geo.longitude)}

  return crd

address = input('도로명 주소를 입력하세요.')
crd = geocoding(address)
from geopy.distance import geodesic


my_wifi = pd.DataFrame(columns=['설치시군구명','설치시설구분','위도', '경도', '거리'])

keypoint = address.split(' ')[0]
data = data.loc[data.설치시도명.str.contains(keypoint)] # 많은 데이터 중 지역 설정

for n in data.index:
  wifi_loc = (data.loc[n, '위도'], data.loc[n, '경도']) 

  my_wifi.loc[n] = [data.loc[n, '설치시군구명'], data.loc[n, '설치시설구분'], data.loc[n, '위도'], data.loc[n, '경도'], geodesic((crd['lat'], crd['lng']), wifi_loc).kilometers]


my_wifi =my_wifi.sort_values(by=['거리']).head(10)
my_wifi

my_map = folium.Map(location= [crd['lat'], crd['lng']], zoom_start=14)

for n in my_wifi.index:
  folium.Marker([my_wifi.loc[n, '위도'], my_wifi.loc[n, '경도']],
                popup='<pre >' +my_wifi.loc[n, '설치시설구분']+'</pre>',
                icon=folium.Icon(icon ='wifi', prefix ='fa')).add_to(my_map)

folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(my_map)

my_map

^ head(10) 집 주위 10개의 와이파이 보여주었는지 확인

특정 지역의 데이터만 뽑게하기 코드

keypoint = address.split(' ')[0]
data = data.loc[data.설치시도명.str.contains(keypoint)]

0개의 댓글