칼럼을 인덱스로 -> set_index()
인덱스를 칼럼으로 -> reset_index()
seaborn 에서 그래프 그리는 함수
scatterplot / barplot / countplot / histplot / lineplot / boxplot
relplot(kind = 'line') / displot(histplot과 비슷하다)
#pip install pillow
>>> import PIL
>>> icon = PIL.Image.open('cloud.png')
>>> import numpy as np
img = PIL.Image.new('RGB', icon.size, (255,255,255))
img.paste(icon, icon)
img = np.array(img)
>>> top100 = dfw.groupby('word', as_index = False).agg('count').sort_values('count', ascending = False).head(100)
top100
>>> df1 = top100.set_index("word")
df1
#워드 클라우드 모양을 출력하기 위해서는 데이터 프레임이 딕셔너리 형태로 되어야 한다
-> df.to_dict()
>>> dict_word1 = top100.set_index('word').to_dict()['count']
dict_word1
>>> wc = WordCloud(font_path = 'malgun.ttf', background_color = 'white', mask = img)
>>> img_wc = wc.generate_from_frequencies(dict_word1)
plt.imshow(img_wc)
>>> icon = PIL.Image.open('apple-removebg-preview.png')
>>> img = PIL.Image.new('RGB', icon.size, (255,255,255))
img.paste(icon, icon)
img = np.array(img)
>>> wc = WordCloud(font_path = 'malgun.ttf', background_color = 'white', mask = img)
>>> img_wc = wc.generate_from_frequencies(dict_word1)
plt.imshow(img_wc)
지역별 통계치를 색깔 차이로 표현한 지도를 단계 구분도(choropleth map)라고 한다
단계 구분도를 만들기 위해서는 지역별 위도, 경도 자표가 있는 지도 데이터가 필요하다
>>> import json
>>> geo = json.load(open('SIG.geojson.', encoding = 'utf-8'))
geo #geo는 딕셔너리 형태로 되어있다
#위도, 경도 좌표 출력
>>> geo['features'][0]['geometry']
>>> import pandas as pd
>>> df_pop = pd.read_csv('Population_SIG.csv')
df_pop.head()
>>> df_pop.info()
#행정 구역 코드 데이터 타입 바꾸기
#행정 구역 코드가 문자 타입으로 되어있어야 지도를 만들 수 있다
>>> df_pop['code'] = df_pop['code'].astype(str)
df_pop.info()
>>> pip install folium
>>> import folium
#배경지도 만들기
>>> folium.Map(location = [35.95, 127.7], zoom_start = 8)
#tiles = '' : 지도 종류
>>> folium.Map(location = [35.95, 127.7], zoom_start = 8, tiles = 'cartodb positron')
>>> folium.Map(location = [35.95, 127.7], zoom_start = 8, tiles = 'Stamen Terrain')
>>> folium.Map(location = [35.95, 127.7], zoom_start = 8, tiles = 'Stamen Watercolor')
>>> map_sig = folium.Map(location = [35.95, 127.7], zoom_start = 8, tiles = 'cartodbpositron')
#단계 구분도 만들기
>>> folium.Choropleth(geo_data = geo, data = df_pop, columns = ('code', 'pop'), key_on = 'feature.properties.SIG_CD').add_to(map_sig)
map_sig
#계급 구간 정하기(분위수를 이용해 지역을 나눈다) : bins
>>> bins = list(df_pop["pop"].quantile([0, 0.2, 0.4, 0.6, 0.8, 1]))
bins
#단계 구분도 만들기
>>> folium.Choropleth(geo_data = geo, data = df_pop, columns = ('code', 'pop'),
key_on = 'feature.properties.SIG_CD',
fill_color = 'YlGnBu', #Yellow, Green, Blue
fill_opacity = 1,
line_opacity = 0.5,
bins = bins).add_to(map_sig)
map_sig
quantile()
값을 크기 순으로 나열한 다음 입력한 비율에 해당하는 값인 '분위수'를 구하는 함수
괄호 안에 5가지 계급 구간의 하한값, 상한값을 넣었다 -> [0, 0.2, 0.4, 0.6, 0.8, 1]
folium.Choropleth()
통계치가 가장 작은 값부터 가장 큰 값까지 6개의 일정한 간격으로 계급 구간을 만들어 지역의 색깔을 정해준다
#지도 데이터 준비하기
>>> import json
>>> geo_seoul = json.load(open('EMD_Seoul.geojson', encoding = 'utf-8'))
geo_seoul
#위도, 경도 좌표 출력
>>> geo_seoul['features'][0]['geometry']
#인구 데이터 준비하기
>>> foreigner = pd.read_csv('Foreigner_EMD_Seoul.csv')
foreigner
>>> foreigner.info()
>>> foreigner['code'] = foreigner['code'].astype(str)
#지역을 8개로 나눈다
>>> bins = list(foreigner['pop'].quantile([0, 0.2, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 , 1]))
bins
#배경 지도 만들기
>>> map_seoul = folium.Map(location = [37.56, 127], zoom_start = 11, tiles = 'cartodb positron')
#단계 구분도 만들기
>>> folium.Choropleth(geo_data = geo_seoul, data = foreigner, columns = ('code', 'pop'),
key_on = 'feature.properties.ADM_DR_CD',
fill_color = 'Blues',
nan_fill_color = 'White',
fill_opacity = 1,
line_opacity = 0.5,
bins = bins).add_to(map_seoul)
map_seoul
>>> geo_seoul_sig = json.load(open('SIG_Seoul.geojson', encoding = 'utf-8'))
>>> folium.Choropleth(geo_data = geo_seoul_sig,
fill_opacity = 0, line_weight = 3).add_to(map_seoul)
map_seoul
plotly 패키지로 인터랙티브 그래프 만드는 방법
plotly로 만든 그래프는 마우스 움직임에 반응한다
>>> pip install plotly
>>> import pydataset
>>> mpg = pydataset.data("mpg")
>>> import plotly.express as px
>>> px.scatter(data_frame = mpg, x = 'cty', y = 'hwy', color = 'drv')
#자동차 종류별 빈도 구하기
>>> list(mpg.groupby('class'))
>>> mpg.groupby('class').agg('count')
>>> df = mpg.groupby('class')[['class']].agg('count')
df.rename({'class':'n'}, axis = 1, inplace = True)
df = df.reset_index()
df
>>> px.bar(data_frame = df, x = 'class', y = 'n', color = 'class')
연속된 정수를 넘겨주는 이터레이터(iterater)를 반환한다
>>> range(10)
>>> range(0,10)
>>> range(0,10,2)
>>> range(5,0,-1)
임의 크기로 값을 생성해낼 수 있지만 메모리 사용량은 매우 적다
(값을 가지고 있지 않다)
1차원의 고정된 크기를 가지는 '변경 불가능한' 순차 자료형
>>> a, b = 1, (2,3)
print(a,b)
print(a, ":", b)
1 (2, 3)
1 : (2, 3)
>>> a, (b, c), *d = 1, (2, 3), 4, 5, 7
print(a, ":", b, c)
print(d)
1 : 2 3
[4,5,7]
rest 는 필요없는 값을 무시하기 위해 사용하기도 한다
rest 라는 이름 자체에는 특별한 의미가 없다
불필요한 변수라는 것을 나타내기 위해 '_' 를 사용하는 관습도 있다
>>> a, (b,c), *_ = 1, (2,3), 4, 5, 7
print(a, ":", b, c)
print(_)
1 : 2 3
[4,5,7]
>>> for _ in range(3):
print('hello')
b, a = a, b 와 같은 방법을 사용하여 두 변수의 값을 쉽게 바꿀 수 있다#for 문을 사용하여 li = [1,2,3,4] 출력
>>> li = []
for i in range(4):
i += 1
li.append(i)
print(li)
>>> import random
>>> random.randint(1, 3) #1부터 3까지의 정수 중 랜덤하게 출력
#li의 임의의 자리에 words = ['a','b','c','d','e'] 가 들어가도록
#li = [1,'a',2,3,'b',4 ...]
>>> li = [1,2,3,4]
words = ['a','b','c','d','e']
>>> for word in words:
n = random.randint(0, len(li)) #n : 값을 추가하려는 위치
li.insert(n, word)
li
>>> li.pop(2)
>>> li
>>> lst = ['a','b','a','c']
lst.remove('a')
>>> lst
#in 예약어를 사용해서 리스트에 어떤 값이 있는지 검사할 수 있다
>>> 'a' in lst
>>> 'd' in lst
>>> 'd' not in lst
>>> a = [7,2,5,1,3]
a.sort()
>>> a
#문자열이 들어있는 리스트를 문자열의 길이 순으로 정렬할 수도 있다
>>> b = ['saw', 'small', 'He', 'foxes', 'six']
b.sort(key = len)
>>> b
리스트와 같은 자료형(배열, 튜플, ndarray)은 [] 안에 start:stop 을 지정해서 원하는 크기만큼 잘라낼 수 있다
슬라이스에 다른 순차 자료형을 대입하는 것도 가능하다
>>> seq = [7,2,3,7,5,6,0,1]
seq[3:4] = [6,3]
>>> seq
[7,2,3,6,3,5,6,0,1]
>>> seq[::2]
>>> seq[::-1]
>>> li = ['a','b','c']
list(enumerate(li))
[(0, 'a'), (1, 'b'), (2, 'c')]
#dictionary 형태로 출력하려면
>>> li = ['a','b','c']
dic = {} #또는 d = dict()
for i, j in enumerate(li):
dic[i] = j
dic
{0: 'a', 1: 'b', 2: 'c'}
zip 함수를 사용해서 짝지어진 순차 자료형을 다시 풀어낼 수 있다
이를 이용해서 리스트의 로우를 리스트의 컬럼으로 변환하는 것이 가능하다
>>> pitchers = [('Nolan', 'Ryan'), ('Roger', 'Clemens'), ('Schiling', 'Curt')]
>>> (first_names, last_names) = zip(*pitchers)
>>> first_names
('Nolan', 'Roger', 'Schiling')
>>> last_names
('Ryan', 'Clemens', 'Curt')
>>> a = [i for i in range(10)]
a
>>> b = [i*2 for i in range(10)]
b
#d = {0:0, 1:2, 2:4, 3:6, ...., 9:18} 를 만들어보자
>>> d = dict(zip(a,b))
d
#본질적으로 사전은 2개짜리 튜플로 구성되어 있으므로 dict 함수가 2개짜리 튜플의 리스트를 인자로 받아서 사전을 생성하는 일은 당연하다
#다른 방법
>>> import pandas as pd
>>> df = pd.DataFrame({'A':a, 'B':b})
df
>>> d = dict(zip(df['A'], df['B']))
d
유일한 원소만 담는 정렬되지 않은 자료형 (중복을 제거할 수 있다)
딕셔너리와 유사하지만 값은 없고 key만 가지고 있다고 생각하면 된다
두가지 방법으로 생성할 수 있는데 set 함수(set())를 이용하거나, 중괄호({})를 이용해서 생성할 수 있다
>>> set([2,2,2,1,3,3])
{1,2,3}
>>> {2,2,2,1,3,3}
{1,2,3}
#집합과 random.randint를 사용하여 중복 없이 10개 이상 20개 이하의 정수 뽑기
>>> a = set()
while len(a) < 10:
n = random.randint(1, 20)
a.add(n)
a
>>> a = [1,2,3]
b = []
for i in a:
b.append(i*2)
b
>>> a = [1,2,3]
b = a = [1,2,3]
>>> b
집합과 사전에 대해서도 리스트 표기법과 같은 방식을 적용할 수 있다
dict_comp = {key-expr : value-expr for ~~ in ~ if ~}
set_comp = {expr for ~~ in ~ if ~}
>>> strings = ['a','as','bat','car','dove','python']
>>> [x.upper() for x in strings if len(x) > 2]
['BAT','CAR','DOVE','PYTHON']
>>> a = {len(x) for x in strings}
a
{1,2,3,4,6}
>>> set(map(len, strings))
{1,2,3,4,6}
>>> b = {val : index for index, val in enumerate(strings)}
b
{'a':0,'as':1,'bat':2,'car':3,'dove':4,'python':5}