SW과정 머신러닝 1015(8)

JongseokLee·2021년 10월 15일
0
post-thumbnail

SW과정 머신러닝 1015(8)

1. 판다스 문법

#분포도 그리기
cine = BoxOffice()
cine.sample()
cine[['salesAmt']] = cine[['salesAmt']].astype('int64') #비트값이 안맞으면 오버플로 발생(오버플로:1000까지가 한계인데 1001이 입력되면 -1000으로 넘어가서 겹쳐짐)
cine[['audiCnt']] = cine[['audiCnt']].astype('int64')

temp = cine.groupby('movieNm').sum()

import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.scatter(temp['salesAmt'],temp['audiCnt'])
plt.title('영화별 총매출액과 총관객수 분포도')
plt.xlabel('총매출')
plt.ylabel('총관객수')
plt.show()

파이차트(데이터가 많으면 그리기가 힘듦)
temp1 = cine.groupby('movieNm').sum() #.sum()함수는 숫자(int,float)로 된것만 찾아서 합계를 내준다.
temp1.sample(2)
temp1.sort_values(by='salesAmt', ascending=False, inplace=True) #기본값 적은 순서로 되어있음(ascending=True) 

temp1 = temp1.iloc[:10]

plt.figure(figsize=(20,5)) #figsize는 가로x세로 사이즈
plt.pie(temp1['salesAmt'],labels=temp1.index, autopct='%.1f%%', shadow=True)
plt.title('총 매출액 top 10')
plt.show()

2. folium

import folium
folium.Map(location=[35.1135704,129.0338768]) #구글지도 위도, 경도 넣기
map.save('map1.html')
map = folium.Map(location=[35.1135704,129.0338768],zoom_start=14)
map

folium.Marker([35.116220, 129.040662],popup='스타벅스').add_to(map) #해당하는 위치에 마커 표시됨(마우스 클릭하면 popup='텍스트' 뜸)
icon = folium.Icon(color='red', icon='bookmark')
folium.Marker([35.114691, 129.040630],tooltip='롯데리아', icon=icon).add_to(map) #팝업은 클릭해야나오고, 툴팁은 마우스만 올려도 나옴
map

lotto = [
    {"store":"담배","loc":[37.62585944357624,127.01847823823798]},   
    {"store":"화곡본마트","loc":[37.54248103738589,126.84414659211494]},   
    {"store":"용꿈돼지꿈","loc":[37.5447438346992,126.95223862043447]},   
    {"store":"일이오마켓","loc":[37.47943673430032,126.98346178441342]},   
    {"store":"여명슈퍼마켓","loc":[37.61432815661055,127.0415039221072]},   
    {"store":"5가로또레드탑","loc":[37.570756251987575,127.00235901546226]},   
    {"store":"복권세상","loc":[35.91885025656432,128.55034430109828]},   
    {"store":"복권전문점","loc":[37.50384327747725,126.71513104367074]},   
    {"store":"인현동지하가판","loc":[37.47627910055104,126.63147671205866]},   
    {"store":"CU(광주서동점)","loc":[35.14814807640179,126.90555219336346]},   
    {"store":"지산로또방","loc":[35.148338888178,126.93203920504686]},   
    {"store":"천사로또방","loc":[37.63618838692431,127.21107884503209]},   
    {"store":"오렌지통신","loc":[37.42889361993242,127.10232604117991]},   
    {"store":"여수복권방","loc":[37.418353650942116,127.12640523182601]},   
    {"store":"둘리복권방","loc":[37.34532813934063,126.73627994929885]},   
    {"store":"금성24시편의점","loc":[37.84401249737699,127.06236893072152]},   
    {"store":"GS25(청주주은점)","loc":[36.60987111587086,127.49134026856717]},   
    {"store":"장미슈퍼","loc":[36.276304155315685,126.90940713047799]},   
    {"store":"장미슈퍼","loc":[36.276304155315685,126.90940713047799]},   
    {"store":"아이24(수송점)","loc":[35.970108052787594,126.7189421934312]},   
    {"store":"탑로또","loc":[34.87844231008963,128.62803523643754]} 
] #리스트 안에 딕셔너리 안에 리스트

x=0 #평균값 구해서 전체 지도 확인하기
y=0
for i in lotto:
    x+=i['loc'][0] #리스트 위치 지정하기
    y+=i['loc'][1]
x = x / len(lotto)
y = y / len(lotto)


map = folium.Map(location=[x,y],zoom_start=8)

for i in lotto:
    folium.Marker([i['loc'][0],i['loc'][1]],tooltip=i['store']).add_to(map)
map

from folium.plugins import MarkerCluster
x=0 #평균값 구해서 전체 지도 확인하기
y=0
for i in lotto:
    x+=i['loc'][0] #리스트 위치 지정하기
    y+=i['loc'][1]
x = x / len(lotto)
y = y / len(lotto)

map = folium.Map(location=[x,y],zoom_start=8)
clu = MarkerCluster().add_to(map) #클러스터 한곳으로 모아주는 역할
for i in lotto:
    folium.Marker([i['loc'][0],i['loc'][1]],tooltip=i['store']).add_to(clu)
    
map

#Geojosn

import json 

map = folium.Map([36.325161, 128.011698],zoom_start=6)
jsonData = open('HangJeongDong_ver20210701.geojson','r',encoding='utf8').read() #'r'은 읽기모드

jsonData = json.loads(jsonData) #파일에서 읽을거면 load, 파일이 아니면 loads

#jsonData

folium.GeoJson(jsonData).add_to(map)
map

#제주(맵자료 매핑)
import pandas as pd
df = pd.read_csv('jeju.csv', encoding='cp949') #인코딩 utf8 안되면 cp949로 하세요
df.info()
df.shape
df.head(1)
df.drop(columns='Unnamed: 8', inplace=True, axis=1) #dropna는 누락값 삭제, drop은 컬럼 삭제

query = '제주특별자치도 제주시 중앙로7길 15'

def get_geo(query):
    import requests
    REST_API_KEY = 'b2c8a44ae2c65a9b39e5e979d05242c1'
    url = "https://dapi.kakao.com/v2/local/search/keyword.json"
    qs = {
        'query':query,
        'category_group_code':'PO3' #공공기관
    }
    headers = {
        "Authorization": f'KakaoAK {REST_API_KEY}'
        }

    res = requests.get(url,params=qs, headers=headers)
    res = res.json()
    try:
        x = res['documents'][0]['x']
        y = res['documents'][0]['y']
        return y,x
    except:
        return '결과가 없습니다.'
        
query = '제주특별자치도 제주시 신대로 101'
get_geo(query)

df['주소'] = df['주소'].str.split('(').str.get(0).str.strip() #앞쪽꺼를 가져오겠다(첫번째꺼 0) ('(')를 기준으로 앞쪽, strip은 공백제거

df['loc'] = df['주소'].apply(get_geo)

map = folium.Map([33.385460, 126.568527],zoom_start=10)
for index, row in df.iterrows():
    if row['loc'] != '결과가 없습니다.':
        folium.Marker(row['loc'],tooltip=row['읍면동']).add_to(map)
map

map = folium.Map([33.385460, 126.568527],zoom_start=9)
clu = MarkerCluster().add_to(map)
for index, row in df.iterrows():
    if row['loc'] != '결과가 없습니다.':
        folium.Marker(row['loc'],tooltip=row['읍면동']).add_to(clu)
map

map = folium.Map([33.385460, 126.568527],zoom_start=9)
jsondata = open('jeju-m.json','r').read()
#print(jsondata)
jsondata = json.loads(jsondata)
folium.GeoJson(jsondata).add_to(map)
map

df['인구'] = df['일반현황'].str.split('명').str.get(0).str.split('(').str.get(0).str.split('/').str.get(0).str.split('구').str.get(-1).str.strip().astype('int')
df['인구'].dtype #어떤 타입인지 궁금할 때 이거 누르면 됨
#df.drop(columns=['지역', '읍면동', '전화번호', '주소', '청사현황', '자치센터현황', '데이터기준일자', 'loc', '일반현황'], inplace=True, axis=1)

#Jeju, Seogwipo

df['지역'] = df['지역'].replace(['제주시','서귀포시'],['Jeju','Seogwipo'])

df1 = df.groupby(['지역']).sum()
df1

map = folium.Map([33.385460, 126.568527],zoom_start=9)
jsondata = open('jeju-m.json','r').read()
#print(jsondata)
jsondata = json.loads(jsondata)
folium.GeoJson(jsondata,name='geoJson').add_to(map)
folium.Choropleth(geo_data=jsondata, data=df1['인구'], columns=[df1.index,df1.인구],key_on='feature.id').add_to(map)
map

df2=df.groupby(['읍면동']).sum()
map = folium.Map([33.385460, 126.568527],zoom_start=9)
jsondata = open('new_jeju.json','r').read()
jsondata = json.loads(jsondata)
bins=list(df2['인구'].quantile([0,0.1,0.2,0.3,0.4,0.5,0.7,0.8,0.9,1]))
folium.Choropleth(geo_data=jsondata, data=df2['인구'], columns=[df2.index,df2['인구']],key_on='feature.id', 
                  bins=bins, fill_color='YlGnBu',fill_opacity=0.8, legend_name='제주 인구 현황').add_to(map)
map

3. GeoJson

import json

jsonfile = open('HangJeongDong_ver20210701.geojson','r',encoding='utf8').read()

jsondata = json.loads(jsonfile)

type(jsondata)

#jsondata

json_jeju = {'type' : 'FeatureCollection'}
json_pick_list = []
json_dong = []

for idx in jsondata['features']:
    if idx['properties']['sidonm'] == '제주특별자치도':
        #print(idx)
        dong = idx['properties']['adm_nm'].split()[-1].strip()
        #print(dong)
        idx['id']=dong
        json_dong.append(dong)
        json_pick_list.append(idx)
json_jeju['features'] = json_pick_list
json_jeju

f = open('new_jeju.json', 'w', encoding='utf8')
json.dump(json_jeju,f)

4. 용어정리

.str.strip() #앞쪽꺼를 가져오겠다(첫번째꺼 0) ('(')를 기준으로 앞쪽, strip은 공백제거

profile
DataEngineer Lee.

0개의 댓글