These implementations are for learning purposes. They may be less efficient than the implementations in the Python standard library. Use Jupyter Notebook & PyCharm Community Edition.
- : 벡터 및 행렬 계산에 편의를 제공하는 라이브러리로 pandas,matplotlib의 기본 base library
- : 고유하게 정의된 자료 구조를 활용해서 빅데이터 분석 가능
- : numpy와 pasndas를 통해 얻은 데이터 분석결과를 시각화 해주는 라이브러리
- : matplotlib을 기반으로 하는 Python데이터 시각화 라이브러리로 매력적이고 정보를 제공하는 통계 그래픽을 그리기 위한 높은 수준의 인터페이스를 제공
-
python
version 3 -
pandas
version or later -
numpy
version 1.15.4 or later -
matplotlib
version 3.0.2 or later -
seaborn
version 0.9.0 or later -
pandas
version 0.23.4 or later -
scikit-learn
0.20.2 or later -
jupyter
version 1.0.0 or later -
statsmodels
version 0.9.0 or later -
konlpy
version 0.5.1 or later -
JPype1
version 0.7.0 or later -
pytagcloud
version 0.3.5 or later -
simplejson
version 3.16.0 or later
conda create --name mincloud python=3
conda install pandas jupyter seaborn scikit-learn statsmodels
conda info --envs
Collecting package metadata: done
Solving environment: done
## Package Plan ##
environment location: C:\Users\mincloud\Anaconda3
added / updated specs:
- jupyter
- pandas
- scikit-learn
- seaborn
- statsmodels
The following packages will be downloaded:
package | build
---------------------------|--------------------------------
ca-certificates-2018.03.07 | 0 155 KB
certifi-2018.4.16 | py36_0 143 KB
conda-4.6.14 | py36_0 2.1 MB
openssl-1.0.2o | h8ea7d77_0 5.4 MB
------------------------------------------------------------
Total: 7.8 MB
The following packages will be SUPERSEDED by a higher-priority channel:
ca-certificates anaconda --> pkgs/main
certifi anaconda --> pkgs/main
conda anaconda --> pkgs/main
openssl anaconda --> pkgs/main
> git clone https://github.com/mincloud1501/Python.git
- Install the environment for this hands-on by running:
> cd Python/
> conda activate mincloud
> python -m ipykernel install --name mincloud --user
> jupyter notebook --port=8888
run_and_pass = 'Shift + Enter'
run_and_add_cell = 'Alt + Enter'
run_and_stay = 'Ctrl + Enter'
recommendations = 'Tab'
docstrings = 'Shift + Tab'
add_hashtag = 'Ctrl + /'
add_cell = 'b'
delete_cell = 'dd'
- 페이스북 (http://www.facebook.com) 가입
- 페이스북 개발자 페이지(http://developer.facebook.com) 계정 생성
- Facebook API 사용등록 및 신규 app 생성
- 대시보드에서
App ID
와Secret Code
확인
- 네이버 개발자 페이지(https://developers.naver.com) 에서 오픈API 이용 신청에서 검색 API 추가
- 웹 서비스 URL (http://localhost) 등록
Client ID
와Client Secret
확인
- deck.gl offers an extensive catalog of pre-packaged visualization "layers", including ScatterplotLayer, ArcLayer, TextLayer, GeoJsonLayer, etc.
- Uber 에서 만든 자바스크립트 공간 데이터 시각화 라이브러리며, pydeck 은 이 라이브러리를 파이썬에서도 쓸 수 있도록 만든 패키지
- 대용량 데이터도 거뜬하게 렌더링할 수 있으며, 렌더링이 좀 버거울 수도 있는 일부 레이어는 GPU 연산을 제공한다.
$npm install deck.gl
- 다른 채널에서 다른 geo package를 설치하면 종속성 충돌이 발생할 수 있으므로, 새로운 환경에서 geopandas 설치 권고
$conda create -n geo_env
$conda activate geo_env
$conda config --env --add channels conda-forge
$conda config --env --set channel_priority strict
$conda install python=3 geopandas
- Pydeck library is a set of Python bindings for making spatial visualizations with deck.gl, optimized for a Jupyter Notebook environment.
$pip install pydeck
- Jupyter notebook server에 설치하면, widget extension을 사용할 수 있다.
$jupyter nbextension install --sys-prefix --symlink --overwrite --py pydeck
$jupyter nbextension enable --sys-prefix --py pydeck
- 레이어를 지도 위에 올릴 때, 항상 이 클래스를 통해서 만든다.
pdk.Layer
type = "미리 정의된 레이어 타입",
id = "이 레이어의 아이디 (optional)",
data = "pandas.DataFrame 또는 geojson url",
)
- folium이나 mapboxgl에서도 흔히 볼 수 있는 파라미터들로 렌더링 시, 초기화 뷰에 대한 설정이다.
pdk.ViewState(
longitude = "중심 경도 (default 0)",
latitude = "중심 위도 (default 0)",
zoom = "줌 레벨 (default 0)",
pitch = (default 0),
bearing = (default 0),
**kwargs,
)
- 생성된 Layer, View Info, Map Style 등 모든 요소를 모아 출력시킬 수 있는 클래스
- mapboxgl 과 비교되는 가장 큰 장점으로 Layer를 쌓을 땐, layers 리스트에 추가하면 된다.
pdk.Deck(
layers=[],
views=[{"controller": true, "type": "MapView"}],
map_style='mapbox://styles/mapbox/dark-v9',
mapbox_key=None,
initial_view_state={"bearing": 0, "latitude": 0.0, "longitude": 0.0, "maxZoom": 20, "minZoom": 0, "pitch": 0, "zoom": 1},
width='100%',
height=500,
tooltip=True,
)
import pydeck as pdk
# 2014 locations of car accidents in the UK
UK_ACCIDENTS_DATA = ('https://raw.githubusercontent.com/uber-common/'
'deck.gl-data/master/examples/3d-heatmap/heatmap-data.csv')
# Define a layer to display on a map
layer = pdk.Layer(
'HexagonLayer',
UK_ACCIDENTS_DATA,
get_position='[lng, lat]',
auto_highlight=True,
elevation_scale=50,
pickable=True,
elevation_range=[0, 3000],
extruded=True,
coverage=1)
# Set the viewport location
view_state = pdk.ViewState(
longitude=-1.415,
latitude=52.2323,
zoom=6,
min_zoom=5,
max_zoom=15,
pitch=40.5,
bearing=-27.36)
# Render
r = pdk.Deck(layers=[layer], initial_view_state=view_state)
r.to_html('demo.html')
# Jupyter 환경 밖에서 실행 시
r.to_html('demo.html', notebook_display=False)
- pydeck은
shapely.geometry.multipolygon
형태를 읽지 못하므로 항상 geometry에 연속된 포인트들을 갖는 리스트 값이 있어야 한다.
def multipolygon_to_coordinates(x):
lon, lat = x[0].exterior.xy
return [[x, y] for x, y in zip(lon, lat)]
df['coordinates'] = df['geometry'].apply(multipolygon_to_coordinates)
del df['geometry']
- pydeck 을 이용하여 각 데이터를 Choropleth로 시각화 할 수 있다. pydeck에서는 Choropleth로 부르지 않고 PolygonLayer라고 한다. (sample_older_seoul.ipynb)
// Make layer
layer = pdk.Layer(
'PolygonLayer', // 사용할 Layer 타입
df, // 시각화에 쓰일 데이터프레임
get_polygon='coordinates', // geometry 정보를 담고있는 컬럼 이름
get_fill_color='[0, 255*정규화인구, 0]', // 각 데이터 별 rgb 또는 rgba 값 (0~255)
pickable=True, // 지도와 interactive 한 동작 on
auto_highlight=True // 마우스 오버(hover) 시 박스 출력
)
// Set the viewport location
center = [126.986, 37.565]
view_state = pdk.ViewState(
longitude=center[0],
latitude=center[1],
zoom=10
)
// Render
r = pdk.Deck(layers=[layer], initial_view_state=view_state)
r.show()
- HeatmapLayer를 이용하여 Point들의 밀집도를 한 눈에 파악 가능하다. (sample_toilet_seoul.ipynb)
layer = pdk.Layer(
'HeatmapLayer',
df,
get_position='[lng, lat]'
)
center = [126.986, 37.565]
view_state = pdk.ViewState(
longitude=center[0],
latitude=center[1],
zoom=10
)
r = pdk.Deck(layers=[layer], initial_view_state=view_state)
r.show()
- 추적을 수집하려면 Stackdriver 내보내기와 OpenCensus 추적기 패키지를 가져와야 한다. 또한 애플리케이션은 Stackdriver 내보내기와 추적기를 인스턴스화해야 한다.
- Stackdriver 내보내기는 애플리케이션 기본 사용자 인증 정보를 통해 인증되며, 코드를 GCP(Google Cloud Platform)에서 실행한다면 프로젝트 ID는 생략해도 된다.
- google cloud의 어느 project에 있는 Stack Driver와 연결할지를
PROJECT_ID
환경 변수에 Project명을 지정해주면 된다.
export PROJECT_ID="zipkin-proxy"
> pip install google-api-python-client
- Create the exporters in code
- Run the code:
python main_test.py
(Running on http://127.0.0.1:5000/) - Viewing your traces:
https://console.cloud.google.com/traces/traces
[main.py]
import argparse
import random
import time
from flask import Flask, redirect, url_for
# [START trace_setup_python_configure]
from opencensus.ext.stackdriver import trace_exporter as stackdriver_exporter
import opencensus.trace.tracer
def initialize_tracer(project_id):
exporter = stackdriver_exporter.StackdriverExporter(
project_id=project_id
)
tracer = opencensus.trace.tracer.Tracer(
exporter=exporter,
sampler=opencensus.trace.tracer.samplers.AlwaysOnSampler()
)
return tracer
# [END trace_setup_python_configure]
app = Flask(__name__)
@app.route('/', methods=['GET'])
def root():
return redirect(url_for('index'))
# [START trace_setup_python_quickstart]
@app.route('/index.html', methods=['GET'])
def index():
tracer = app.config['TRACER']
tracer.start_span(name='index')
# Add up to 1 sec delay, weighted toward zero
time.sleep(random.random() ** 2)
result = "Tracing requests"
tracer.end_span()
return result
# [END trace_setup_python_quickstart]
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
'--project_id', help='Project ID you want to access.', required=True)
args = parser.parse_args()
tracer = initialize_tracer(args.project_id)
app.config['TRACER'] = tracer
app.run()
[main_test.py]
import os
import main
def test_index():
project_id = os.environ['GCLOUD_PROJECT']
main.app.testing = True
main.app.config['TRACER'] = main.initialize_tracer(project_id)
client = main.app.test_client()
resp = client.get('/index.html')
assert resp.status_code == 200
assert 'Tracing requests' in resp.data.decode('utf-8')
def test_redirect():
project_id = os.environ['GCLOUD_PROJECT']
main.app.testing = True
main.app.config['TRACER'] = main.initialize_tracer(project_id)
client = main.app.test_client()
resp = client.get('/')
assert resp.status_code == 302
assert '/index.html' in resp.headers.get('location', '')
https://openapi.sk.com/
에 가입 후 Project 생성하여, API(무료) 구매
- Tmap Open API를 사용하려면 키(Project Key)를 발급 받아야 한다.
select the API serveces > get your own API key
- VScode에서
Preview on Web Server
설치 후Ctrl+Hhift+L
로 아래 Code 실행 (index.html
)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>simpleMap</title>
<script src="https://apis.openapi.sk.com/tmap/jsv2?version=1&appkey=발급받은 Appkey"></script>
<script type="text/javascript">
// 페이지가 로딩이 된 후 호출하는 함수입니다.
function initTmap(){
// map 생성
// Tmapv2.Map을 이용하여, 지도가 들어갈 div, 넓이, 높이를 설정합니다.
var map = new Tmapv2.Map("map_div", { // 지도가 생성될 div
width : "100%", // 지도의 넓이
height : "400px" // 지도의 높이
});
}
</script>
</head>
<body onload="initTmap()"><!-- 맵 생성 실행 -->
<div id="map_div"></div>
</body>
</html>
- Marker Cluster를 사용하는 example
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>simpleMap</title>
<script
src="https://apis.openapi.sk.com/tmap/jsv2?version=1&appkey=발급받은 Appkey"></script>
<script type="text/javascript">
var map;
// 페이지가 로딩이 된 후 호출하는 함수입니다.
function initTmap(){
// map 생성
// Tmap.map을 이용하여, 지도가 들어갈 div, 넓이, 높이를 설정합니다.
map = new Tmapv2.Map("map_div", {
center : new Tmapv2.LatLng(37.566481622437934, 126.98502302169841), // 지도 초기 좌표
width : "100%", // map의 width 설정
height : "400px" // map의 height 설정
});
map.setZoom(16);
var lat = 37.566681;
var lng = 126.978453;
var markers1 = [];
for (var i = 0; i < 5; i++) {
for (var j = 0; j < 5; j++) {
var marker = new Tmapv2.Marker({
position: new Tmapv2.LatLng(lat + (j * 0.001), lng + (i * 0.001)),
label: 'cluster',
map: map
});
markers1.push(marker);
}
}
// 마커클러스터 등록
markerCluster = new Tmapv2.extension.MarkerCluster({
markers: markers1, // 마커들이 담긴 배열
map: map // 지도 객체
});
};
</script>
</head>
<body onload="initTmap()"><!-- 맵 생성 실행 -->
<div id="map_div"></div>
</body>
</html>
- Geo Coding 및 명칭(POI)통합 검색을 사용하는 example (
geocoding.html
)
See the Category.