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 부분

  1. Jupyter에서 내보낸 모든 이미지 파일을 /assets/images 폴더로 옮긴다.

  2. 적절한 결로에 마크다운으로 이미지 참조를 수정한다. 결로는 중괄호(}) 두개와 쌍따옴표(‘”‘)로 감싼다.

’’’png’’’

/assets/images/ 경로로 되어 있는데, 내 경로는 그냥 /images이다.

  1. 더 긴 차원에서 범례를 갖는 그래프가 표시된다.
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()

png

data_result['CCTV비율'] = data_result['소계'] / data_result['인구수'] * 100
data_result['CCTV비율'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))
plt.show()

png

plt.figure(figsize=(6,6))
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('CCTV')
plt.grid()
plt.show()

png

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()

png

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()

png

Written on March 4, 2018