Jupyter Notebook을 Jekyll로
Juputer Notebook을 Jekyll로 변경하는 방법
파이썬으로 데이터 주무르기라는 책을 공부 중인데, 여기서 Jupyter Notebook으로 실행한 내용을 Jekyll로 옮기는 방법을 기술함
참조한 사이트
Display Jupyter Notebook with Jekyll
상기 링크에서 설명하는 바에 따르면 Notebook의 File > Download As > Markdown (.md)에서 다운을 받을 수 있다. 다른 방법으로는 ipynb파일을 command line에서 직접적으로 생성할 수 있다.
’'’jupyter nbconvert –to markdown /path/to/example_notebook.ipynb’’’
다음 3, 4항은 마크다운 파일 만드는 것에 대해 이야기하는데, 알고 있으므로 생략한다.
5번항은 jupyter에서 내보낸 마크다운 파일 내용을 새로운 포스트 파일에 붇여 넣는 내용이다.
’'’cat example_notebook.md | tee -a exampleblog/_post/YYYY-MM-DD-example-post.md’’’ |
Modify Markdown Files 부분은 잘 몰라서 생략한다.
##Add an Image in Jekyll 부분
-
Jupyter에서 내보낸 모든 이미지 파일을 /assets/images 폴더로 옮긴다.
-
적절한 결로에 마크다운으로 이미지 참조를 수정한다. 결로는 중괄호(}) 두개와 쌍따옴표(‘”‘)로 감싼다.
’’’’’’
/assets/images/ 경로로 되어 있는데, 내 경로는 그냥 /images이다.
- 더 긴 차원에서 범례를 갖는 그래프가 표시된다.
import os
import sys
os.chdir('/home/park/DataScience/data/')
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf'
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
CCTV_Seoul = pd.read_csv('../data/01. CCTV_in_Seoul.csv', encoding='utf-8')
CCTV_Seoul.head()
CCTV_Seoul.rename(columns={CCTV_Seoul.columns[0] : '구별'}, inplace=True)
pop_Seoul = pd.read_excel('01. population_in_Seoul.xls',
header=2,
usecols = 'B, D, G, J, N',
encoding='utf-8')
pop_Seoul.rename(columns={pop_Seoul.columns[0] : '구별',
pop_Seoul.columns[1] : '인구수',
pop_Seoul.columns[2] : '한국인',
pop_Seoul.columns[3] : '외국인',
pop_Seoul.columns[4] : '고령자'}, inplace=True)
pop_Seoul.drop([0], inplace=True)
pop_Seoul['구별'].unique()
pop_Seoul.drop([26], inplace=True)
pop_Seoul.head()
CCTV_Seoul['최근증가율'] = (CCTV_Seoul['2016년'] + CCTV_Seoul['2015년'] + \
CCTV_Seoul['2014년']) / CCTV_Seoul['2013년도 이전'] * 100
CCTV_Seoul.sort_values(by='최근증가율', ascending=False).head(5)
pop_Seoul['외국인비율'] = pop_Seoul['외국인'] / pop_Seoul['인구수'] * 100
pop_Seoul['고령자비율'] = pop_Seoul['고령자'] / pop_Seoul['인구수'] * 100
pop_Seoul.head()
구별 | 인구수 | 한국인 | 외국인 | 고령자 | 외국인비율 | 고령자비율 | |
---|---|---|---|---|---|---|---|
1 | 종로구 | 162820.0 | 153589.0 | 9231.0 | 25425.0 | 5.669451 | 15.615404 |
2 | 중구 | 133240.0 | 124312.0 | 8928.0 | 20764.0 | 6.700690 | 15.583909 |
3 | 용산구 | 244203.0 | 229456.0 | 14747.0 | 36231.0 | 6.038828 | 14.836427 |
4 | 성동구 | 311244.0 | 303380.0 | 7864.0 | 39997.0 | 2.526635 | 12.850689 |
5 | 광진구 | 372164.0 | 357211.0 | 14953.0 | 42214.0 | 4.017852 | 11.342849 |
import platform
from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False
if platform.system() == 'Darwin':
rc('font', family ='AppleGothic')
elif platform.system() == 'Windows':
path = "c:/Windows/Fonts/malgun.ttf"
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
else:
print("Unknown system... sorry~~~")
Unknown system... sorry~~~
data_result = pd.merge(CCTV_Seoul, pop_Seoul, on = '구별')
data_result.head()
구별 | 소계 | 2013년도 이전 | 2014년 | 2015년 | 2016년 | 최근증가율 | 인구수 | 한국인 | 외국인 | 고령자 | 외국인비율 | 고령자비율 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 강남구 | 2780 | 1292 | 430 | 584 | 932 | 150.619195 | 570500.0 | 565550.0 | 4950.0 | 63167.0 | 0.867660 | 11.072217 |
1 | 강동구 | 773 | 379 | 99 | 155 | 377 | 166.490765 | 453233.0 | 449019.0 | 4214.0 | 54622.0 | 0.929765 | 12.051638 |
2 | 강북구 | 748 | 369 | 120 | 138 | 204 | 125.203252 | 330192.0 | 326686.0 | 3506.0 | 54813.0 | 1.061806 | 16.600342 |
3 | 강서구 | 884 | 388 | 258 | 184 | 81 | 134.793814 | 603772.0 | 597248.0 | 6524.0 | 72548.0 | 1.080540 | 12.015794 |
4 | 관악구 | 1496 | 846 | 260 | 390 | 613 | 149.290780 | 525515.0 | 507203.0 | 18312.0 | 68082.0 | 3.484582 | 12.955291 |
del data_result['2013년도 이전']
del data_result['2014년']
del data_result['2015년']
del data_result['2016년']
data_result.head()
구별 | 소계 | 최근증가율 | 인구수 | 한국인 | 외국인 | 고령자 | 외국인비율 | 고령자비율 | |
---|---|---|---|---|---|---|---|---|---|
0 | 강남구 | 2780 | 150.619195 | 570500.0 | 565550.0 | 4950.0 | 63167.0 | 0.867660 | 11.072217 |
1 | 강동구 | 773 | 166.490765 | 453233.0 | 449019.0 | 4214.0 | 54622.0 | 0.929765 | 12.051638 |
2 | 강북구 | 748 | 125.203252 | 330192.0 | 326686.0 | 3506.0 | 54813.0 | 1.061806 | 16.600342 |
3 | 강서구 | 884 | 134.793814 | 603772.0 | 597248.0 | 6524.0 | 72548.0 | 1.080540 | 12.015794 |
4 | 관악구 | 1496 | 149.290780 | 525515.0 | 507203.0 | 18312.0 | 68082.0 | 3.484582 | 12.955291 |
data_result.set_index('구별', inplace=True)
data_result.head()
소계 | 최근증가율 | 인구수 | 한국인 | 외국인 | 고령자 | 외국인비율 | 고령자비율 | |
---|---|---|---|---|---|---|---|---|
구별 | ||||||||
강남구 | 2780 | 150.619195 | 570500.0 | 565550.0 | 4950.0 | 63167.0 | 0.867660 | 11.072217 |
강동구 | 773 | 166.490765 | 453233.0 | 449019.0 | 4214.0 | 54622.0 | 0.929765 | 12.051638 |
강북구 | 748 | 125.203252 | 330192.0 | 326686.0 | 3506.0 | 54813.0 | 1.061806 | 16.600342 |
강서구 | 884 | 134.793814 | 603772.0 | 597248.0 | 6524.0 | 72548.0 | 1.080540 | 12.015794 |
관악구 | 1496 | 149.290780 | 525515.0 | 507203.0 | 18312.0 | 68082.0 | 3.484582 | 12.955291 |
data_result['소계'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))
plt.show()
data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result['CCTV비율'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))
plt.show()
plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)
fp1
array([1.30916415e-03, 6.45066497e+02])
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)
plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1)
f1 = np.poly1d(fp1)
fx = np.linspace(100000, 700000, 100)
data_result['오차'] = np.abs(data_result['소계'] - f1(data_result['인구수']))
df_sort = data_result.sort_values(by='오차', ascending=False)
df_sort.head()
소계 | 최근증가율 | 인구수 | 한국인 | 외국인 | 고령자 | 외국인비율 | 고령자비율 | CCTV비율 | 오차 | |
---|---|---|---|---|---|---|---|---|---|---|
구별 | ||||||||||
강남구 | 2780 | 150.619195 | 570500.0 | 565550.0 | 4950.0 | 63167.0 | 0.867660 | 11.072217 | 0.487292 | 1388.055355 |
송파구 | 618 | 104.347826 | 667483.0 | 660584.0 | 6899.0 | 72506.0 | 1.033584 | 10.862599 | 0.092587 | 900.911312 |
양천구 | 2034 | 34.671731 | 479978.0 | 475949.0 | 4029.0 | 52975.0 | 0.839413 | 11.036964 | 0.423769 | 760.563512 |
서초구 | 1930 | 63.371266 | 450310.0 | 445994.0 | 4316.0 | 51733.0 | 0.958451 | 11.488308 | 0.428594 | 695.403794 |
용산구 | 1624 | 53.216374 | 244203.0 | 229456.0 | 14747.0 | 36231.0 | 6.038828 | 14.836427 | 0.665020 | 659.231690 |
df_sort['인구수'][0]*1.02
df_sort['소계'][0]*0.98
2724.4
plt.figure(figsize=(14,10))
plt.scatter(data_result['인구수'], data_result['소계'],
c=data_result['오차'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
for n in range(10):
plt.text(df_sort['인구수'][n]*1.000001, df_sort['소계'][n]*1.0000001, df_sort.index[n], fontsize=15)
plt.xlabel('인구수')
plt.ylabel('인구당비율')
plt.colorbar()
plt.grid()
plt.show()
Written on March 4, 2018