본문 바로가기

환경, 에너지

[EMS] folium, numpy

 

  • folium MarkerCluster : 지도 확대 정도에따라 마커 표시를 그룹으로 출력

from folium.plugins import MarkerCluster

library_map = folium.Map(location = [37.55, 126.98], zoom_start = 12)
mc = MarkerCluster()

for idx, row in df.iterrows() : 
    mc.add_child(
        folium.Marker(location = [row['위도'],row['경도']],
                                  popup = row['시설구분'],
                                  tooltip = row['시설명']
        )
    )

library_map.add_child(mc)
library_map.save('library3.html')

 

  • iterrow() : 한 행을 리스트 형태로 반환,  반복문에서 사용 시 인덱스와 레코드 값을 리턴

 

  • 경기도 인구 지도 시각화 ( 경기도 행정구역 경계 json)

# 경기도의 인구데이터와 위치 정보를 이용하여 지도에 인구 표시
import json

df = pd.read_excel('data/경기도인구데이터.xlsx', index_col = '구분')
df.info()

# 1. 컬럼의 자료형을 문자열형으로 변경
df.columns = df.columns.map(str)
df.columns

# 2. 위치정보 데이터 읽기
geo_data = json.load\
    (open('data/경기도행정구역경계.json', encoding = 'utf-8'))
type(geo_data)

# 3. 지도에 표시하기
g_map = folium.Map(location = [37.55, 126.98], zoom_start = 9)
year = '2017' 
folium.Choropleth(geo_data = geo_data, # 위치 정보를 가진 dict 데이터
                  data = df[year],     
                  columns = [df.index, df[year]],
                  fill_color = 'YlOrRd',
                  fill_opacity = 0.7,
                  line_opacity = 0.3,
                  # ↓색상으로 표시될 데이터의 범위 지정
                  threshold_scale = [10000,100000,200000,300000,400000,500000,600000,700000],
                  key_on = 'feature.properties.name', # 데이터와 지도표시될 지역부분 연결 값 설정      
).add_to(g_map)                                       # json파일 접근 경로, 참조 경로
g_map.save('경기1_'+year+'.html')                     # json파일의 name과 데이터의 구분명이 같아야 연동됨

 

 

  • 미국 실업율 지도 시각화

 

state_geo = 'data/us-states.json' # 파일 위치정보를 가진 문자열, json.load(open)안함
state_unemployment = 'data/US_Unemployment_Oct2012.csv'
state_data = pd.read_csv(state_unemployment) # 지도에 표시할 실업율 데이터

m = folium.Map(location = [48,-102], zoom_start = 3) # 미국지도

folium.Choropleth(
    state_geo, # json 파일 위치. 알아서 읽어옴
    data = state_data,
    columns=['State','Unemployment'],
    key_on = 'feature.id', # 데이터와 지도 연결 
    fill_color = 'YlGn',
    fill_opacity = 0.7,
    line_opacity = 0.2,
    legend_name = 'Unemployment Rate (%)', # 범례
).add_to(m)
m.save('usa1.html')

 


Numpy

- 행렬, 통계 관련 기본 함수, 배열 기능을 제공하는 모듈

 

  • 주요 속성
속성 설명
ndarray.ndim  배열의 차원(축) 수
ndarray.shape 배열의 차원
각 차원에서 배열의 크기를 나타내는 정수의 튜플
매트릭스와 n개의 행과 m개의 열
(n,m).shape 따라서 튜플의 길이는 축의 수 
ndarray.size 배열의 요소 수
ndarray.dtype 요소의 유형 
ndarray.itemsize 각 요소의 크기(바이트)
ndarray.data 배열의 실제 요소를 포함하는 버퍼

 

 

 

  • 배열 생성
   
array 리스트 , 튜플에서 배열 생성 가능
zeros 0.0으로 이루어진 배열 생성
ones 1.0으로 이루어진 배열 생성. (정수 생성 옵션 dtype=int)
arange 범위까지의 일련의 숫자 배열 생성. 1차원 배열
linspace 범위 내의 숫자를 균일한 간격으로 배열 생성
reshape 원하는 배열로 재생성. 배열 생성을 위한 요소의 개수가 맞아야한다.
nonzero 배열중 0이 아닌 요소의 위치값 반환
random.normal (평균,표준편차,개수) : 정규분포 형태의 난수 생성
random.choice 범위 내 난수 생성 (중복허용 옵션 replace=True )
random. random 난수 발생
random.randint 정수형 난수 리턴
random.default_rng(1) seed값 설정

 

 

 

  • 행/열 기준 합치기, 나누기

- vstack(): 행 기준으로 합치기. 열의 개 수가 같아야함

- vsplit () : 행 기준으로 나누기 

- hstack(): 열 기준으로 합치기. 행의 개수가 같아야함

- hsplit() : 열 기준으로 나누기

 

 

  • 통계함수
max(axis=1) 행 중 최대값
max(axis=0) 열 중 최대값
cumsum(axis=1) 행의 누적 합계
cumsum(axis=0)  열의 누적 합계
argmax(axis=1)
argmin(axis=1)
행 중 최대값/최소값의 인덱스
argmax(axis=0)
argmin(axis=0)
열 중 최대값/최소값의 인덱스

 

 

  • 그 외 함수
flat 배열의 요소들만 리턴
floor 작은 근사 정수
ceil 큰 근사 정수
ravel 1차원 배열로 변경
resize 배열 객체 자체를 변경

 

 

 

  • 배열의 모든 요소를 100으로 변경하기
k = np.random.randint(10,size=(2,12))
k[:] = 100
k[:,:] = 100

# 한개 행의 요소값이 100값을 저장
k[0,:]= 100  

# 한개의 값에 100값을 저장
k[0,0] = 100

 

 

  • 단위 행렬: 대각선(행==열) 셀의 값이 1인 배열
n = np.eye(10,10)
n

#결과
array([[1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

 

 


데이터 전처리 및 시각화 실습

: 지정한 동과 비슷한 인구 구조 비율을 가지고 있는 동 찾기

역삼2동의 인구 구조 비율과 가장 유사한 수내3동

df = pd.read_csv('data/age.csv', encoding = 'cp949', thousands = ',', index_col=0)

# 컬럼명 변경하기
col_name = ['총인구수','연령구간인구수']

for i in range(0,101) :
    col_name.append(str(i)+'세')
df.columns = col_name 
df.columns

# 인구 구조 비율. 모든 컬럼의 값을 총인구수로 나누기
df = df.div(df['총인구수'], axis = 0)

# 데이터값이 커서 그래프 그리기에 부적합한 컬럼 삭제
del df['총인구수'], df['연령구간인구수'] 



# 지정동 = 역삼2동 . 인구 구조 비율 그래프 그리기
name = '역삼2동'
a = df.index.str.contains(name)
df2 = df[a]
df2

# df2.index에서 행정동 코드 제거 (인덱스 지저분해서 정리)
names = list(df2.index)
names[0]= names[0][:names[0].find('(')]
df2.index = names
df2.index

# 행렬 치환해서 그래프
df2.T.plot()



# 비슷한 인구 구조 비율을 가진 동 찾기
# 역삼2동을 제외한 다른 데이터를 저장한 df3 생성

b = list(map(lambda x :not x, a))
df3 = df[b]

mn = 1  # 오차 최대값 초기화.(1을 넘을수없다.)
for label,content in df3.T.items() : 
    s = sum((content - df2.iloc[0])**2) # 현재레코드와 df2 데이터의 오차값의 합
    if s < mn : # 최종적으로 가장 작은 오차값이 담긴다.
        mn = s;
        result = content
        name = result.name
        result.name = name[:name.find('(')]
df2.T.plot()  # 역삼2동 데이터
result.plot() # df2 데이터와 오차값이 가장 적은 데이터
plt.legend()  # 범례 출력

 

진도가 빠른거같은데 기분탓일까

프로젝트 얘기는 갑자기 왜 ... 과제 평가 아니었나요 헝헝 

왜 프로젝트 기간 일주일이나 잡으시는거죠 헝헝헝