Hexo 블로그 about 페이지 생성하기

icarus 테마를 사용하다가 상단의 About이 있지만 경로를 찾지 못해 about 페이지를 만들어봤다.

hexo에서는 특정 경로를 어느 페이지에서든 진입할 수 있게 테마 옵션에서 navbar를 지원한다.

icarus 테마는 기본적으로 about 페이지 경로가 설정되어있지만 _config.theme.yml에서 표시할 장소에 About(text): /about(경로)을 추가한다.

1
2
3
4
5
6
7
8
9
# Page top navigation bar configurations
navbar:
# Navigation menu items
menu:
Home: /
Archives: /archives
Categories: /categories
Tags: /tags
About: /about

이런식으로 menu바 설정을 했으면 해당 URI에 대응할 수 있는 경로를 만들어줘야한다.

source경로 아래에 원하는 경로를 만들어주는 page layout을 이용해서 about 경로를 생성하자.

1
$ hexo new page about

위 명령어가 정상 작동되었으면 /about 경로가 생성되고 그 아래 index.md 파일도 따라 왔을것이다.
index.md가 about에 대한 page로 포스트 작성하듯 원하는 내용을 작성하면된다.

외부링크

Markdown 이미지파일 URL 경로에 띄어쓰기가 있는 경우

Markdown 이미지 삽입 포스팅처럼 md 어법으로 이미지를 삽입하다가 한가지 난관에 부딛혔다.

공백

image url에 공백이 들어간 것.

※ 현재 hexo 랜더러를 kramed로 변경한 상태라 아래처럼 공백도 인식한다.

  • 마찬가지로 hexo 기본 내장 tag 플러그인 어법으로 블로그 포스트는 해결 가능

우린 답을

1
![우린 답을](\images\2111\md url blank\interstellar poster.png)

하지만 ipynb 형식 등 개발환경에서 md 셀을 사용할 때는

jupyter

여전히 발생하는 문제다.

html처럼  를 공백 대신 넣어보기도 하고 cmd 마냥 ""로 묶는 등 코랄을 했지만 markdown 어법으로는 해결하지 못했다.

markdown이 html 어법도 지원하는걸 기억하고 html img 태그로 해결했다.

찾을 것

1
<img src="\images\2111\md url blank\interstellar poster.png" alt="찾을 것">

html 어법을 사용하면 md로 구현 가능한 하이퍼링크 <a href=""></a> tag는 당연하고
가운데 정렬(<center></center>)부터 이미지 크기 변경이 가능한 img 태그 size 요소 등 풍부한 표현이 가능하다.

Hexo 포스트 비공개로 설정하기

UnderBar( _ ) 사용하기

UnderBar( _ )를 title 앞에 붙여주면 hexo에서 private post로 인식하고 배포하지 않는다.
MAE-MSE-RMSE.md: 비공개

_drafts 폴더로 관리

scaffolds 폴더에 new post로 생성되는 포스트의 기본 [layout]을 저장할 수 있다.
_config의 default값은 post로 아래 명령어에 [layout]을 지정하지 않는다면 new post는 post layout으로 생성된다

1
$ hexo new [layout] <title>

draft layout으로 new post를 생성하면 _drafts 폴더에 post가 생성되는데, post title 앞에 UnderBar가 없더라도 private post로 인식된다.
layout을 draft로 지정하면 _drafts 폴더 하위에 new post가 생성된다.

1
$ hexo new draft <title>

외부링크

markdown 수식 넣기

mathjax

Markdown에서는 $x^2$처럼 수식을 사용할 수 있는 mathjax 플러그인이 내장되어있다.

블럭 지정

수식을 사용하기 위해 아래와 같이 식 앞 뒤로 $문자를 넣어줘야한다.

1
$math$

$math$

아래 처럼 $ 문자를 2개 넣는 경우도 있는데,

1
$$math$$

이 경우엔 text 사이에 수식을 삽입하는게 아닌 따로 표현하는 경우에 주로 사용된다.

첨자

수학에서 행의 i번째 속성을 가리키거나 x의 n 제곱을 표현할 때 첨자를 주로 사용한다.

1
$x_i^n$

$x_i^n$

  • 아래첨자: _
  • 위첨자: ^

중괄호

x의 12제곱을 표현하기 위해 단순히 $x^12$만 입력하게 된다면

$x^12$처럼 문자 1개만 위첨자로 처리된다.
이를 해결해주는 문법이 중괄호( { } )다.

1
$x^{12}$

$x^{12}$

단, 중괄호를 mathjax에서 하나의 문자열로 처리하기 위해 사용되므로 중괄호를 사용하는 식에서는 escape(\)로 문법 인식이 아닌 문자 인식으로 바꿔줘야한다.

1
$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

Hexo: 중괄호를 표현하기 위해선 \를 중첩 사용한다.
hexo 수식 사용하기

1
$x_5 = [[\\{(x_1)+x_2\\}+x_3]+x_4]$

$x_5 = [[\{(x_1)+x_2\}+x_3]+x_4]$

행렬 형식

2속성만 넣을 경우

1
$$v{x \choose 0}$$

기본 형식 array행렬 & 괄호 크기 변경

1
2
3
4
5
6
7
$$
X\Bigg\{
\begin{array}{c}
x_{1}\\
x_{2}
\end{array}
$$

P-matrix

1
2
3
4
5
6
7
8
9
10
11
$$
L=
\begin{pmatrix}
b_1 & b_2 & b_3 & \cdots & b_{n-1}& b_n\\
s_1 & 0 & 0 & \cdots & 0 & 0\\
0 & s_2 & 0 & \cdots & 0 & 0\\
0 & 0 & s_3 & \cdots & 0 & 0\\
\vdots&\vdots&\vdots& \ddots & \vdots &\vdots\\
0 & 0 & 0 & \cdots & s_{n-1}& 0\\
\end{pmatrix}
$$

B-matrix

1
2
3
4
5
\begin{bmatrix}
2 & 1 &-1\\
1 & 0 & 5\\
-1 & 3 &-2
\end{bmatrix}

행렬에 세로 줄 넣기

1
2
3
4
5
6
7
8
9
$$
\left[
\begin{array}{ccc|c}
2 & 1 &-1 & 3\\
1 & 0 & 5 & 1\\
-1 & 3 &-2 & 0
\end{array}
\right]
$$

V-matrix

1
2
3
4
5
6
7
$$
\begin{vmatrix}
a & b\\
c & d
\end{vmatrix}
=ad-bc
$$

연립 방정식

1
2
3
4
5
6
7
$$
\begin{cases}
v_1 = 3i+2k\\
v_2 = 2j+k\\
v_3 = i+j+k
\end{cases}
$$

특수문자

수식에서 사용되는 곱셈 나눗셈부터 pi ohm과 같은 특수문자를 삽입하기 위해선 중괄호 경우처럼 \를 사용해야한다.

1
2
3
4
5
$$
(\hat i\cdot\hat i)\div n \\
= \frac{\vert\hat i\vert\times\vert\hat i\vert cos\theta}{n}\\
= \frac{\vert\hat i\vert^2\times 1}{n} = \frac 1n
$$

특수문자는 굉장히 다양하므로 삽입하고자 하는 문자를 LaTex(혹은 Mathjax) 검색어에 붙여 검색하자.

Hexo blog markdown 수식 표현 mathjax

분명 MarkDown math tutorial대로 수식을 작성하고 Ipython notebook에서도 정상적으로 출력되는걸 확인했지만,
Hexo post는 아래처럼 읽어내지를 못한다.
으아악 아니야!

Hexo plugin 설치

다른 블로그 모듈을 사용하는 방법도 있지만, Hexo를 설치했으니 그대로 사용하기 위해 우선 구글링으로 해결해본다.
검색 결과 hexo에서 사용하는 랜더링 모듈에 수식표현 문법이 포함되어 있지 않아서 발생하는 문제였다.

기본 renderer 교체

Hexo의 기본 renderer인 marked를 제거하고 mathjax를 지원하는 kramed로 교체한다.

1
2
$ npm uninstall hexo-renderer-marked --save
$ npm install hexo-renderer-kramed --save

설치가 완료되면 ..\node_modules\hexo-renderer-kramed\lib\renderer.js에서 formatText 함수의 반환값을 변경해준다.

1
2
3
4
5
6
// Change inline math rule
function formatText(text) {
// Fit kramed's rule: $$ + \1 + $$
return text;
// return text.replace(/`\$(.*?)\$`/g, '$$$$$1$$$$'); // (: default)
}

mathjax 설치

kramed 랜더러에 설정값을 넣어줄 mathjax 랜더러를 설치한다.

1
$ npm install hexo-renderer-mathjax --save

마찬가지로 ..\node_modules\hexo-renderer-mathjax\mathjax.html에서 스크립트 source url을 교체한다.

1
2
3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<!-- <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> --> <!--: default -->

Mathjax 활성

이제 사용하고 있는 _config.theme.yml에서 mathjax를 활성화 시켜주면된다.

1
2
3
mathjax:
enable: true
# mathjax: false # : default

markdown 문법을 사용할 예정이라 문법 추가 설정은 하지 않는다.

예제

오…

외부링크

평가지표 RMSE와 MAE, MSE

DATA

Row(행)가 $n$개 있는 dataframe에서;
실측 값에 대한 dataframe의 column(열)을 $Y$로 봤을 때,

$Y$는 다음과 같은 원소의 집합이 된다.

모델링 결과 등 $Y$에 대한 추정값의 집합이 $\hat{Y}$다.

평가 지표

실측값$Y$와 추정값$\hat Y$가 있으니 두 값의 차이인 오차(error: $\Delta y_i = y_i-\hat{y_i}$)가 발생한다.
$\Delta y_i$를 여러 방식으로 가공해서 측정값의 신뢰도를 보여주는게 평가 지표다.

다양한 평가지표 중 RMSE에 관해 공부할 것이며, MSE, MAE는 RMSE와 매우 유사한 형태를 가진다.

MAE(Mean Absolute Error): 평균 절대 오차

$\Delta y_i$의 절대값을 모두 더한 값의 평균이다.

MSE(Mean Squared Error): 평균 제곱 오차

$\Delta y_i$의 제곱을 모두 더한 값의 평균이다.

RMSE(Root Mean Square Error): 평균 제곱근 오차

$\Delta y_i$의 제곱을 모두 더한 값의 평균에 Root를 씌운 형태로 $\sqrt{MSE}=RMSE$다.

특징

위 세 지표는 모두 오차 그 자체인 $y_i-\hat{y_i}$를 포함해 값이 낮을수록 좋은 추정모델임을 의미한다.
단, 실측값과 추정값의 차에 지나치게 의존하는 경향을 보여 $3-1=2$와 $100-102=2$ 모두 동일한 평가로 보여진다.

위 세 지표는 오차 자체에 의존하는 만큼 직관적인 지표가 나와 대중에게 설명하기 좋다.
MAE로 예를 들자면, 600과 620의 차는 20이므로 20의 예측 오류가 발생했다고 설명할 수 있다.

MSE의 경우 오차 제곱하기 때문에 $\vert error\vert<1$일 경우 error값은 작아지고 반대의 경우 커지는 왜곡이 발생한다.
RMSE에서는 MSE에 Root를 씌웠기 때문에 MSE만큼의 왜곡은 발생하지 않는다.

python

간단한 예시로 아래의 $Y_1$과 $Y_2$ python 예제가 있다.

MAE

1
2
3
4
5
6
7
8
9
10
import numpy as np

def mean_absolute_error(y_true, y_pred):

error = 0
for yt, yp in zip(y_true, y_pred):
error = error + np.abs(yt-yp)

mae = error / len(y_true)
return mae

MSE

1
2
3
4
5
6
7
8
9
10
import numpy as np

def mean_squared_error(y_true, y_pred):

error = 0
for yt, yp in zip(y_true, y_pred):
error = error + (yt - yp) ** 2

mse = error / len(y_true)
return mse

RMSE

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

def root_rmse_squared_error(y_true, y_pred):
error = 0

for yt, yp in zip(y_true, y_pred):
error = error + (yt - yp) ** 2

mse = error / len(y_true)
rmse = np.round(np.sqrt(mse), 3)
return rmse
1
2
3
4
5
y1_true = [400, 300, 800]
y1_pred = [380, 320, 777]

y2_true = [400, 300, 800, 900]
y2_pred = [380, 320, 777, 600]
1
2
3
print("MAE:", mean_absolute_error(y1_true, y1_pred))
print("MSE:", mean_squared_error(y1_true, y1_pred))
print("RMSE:", root_rmse_squared_error(y1_true, y1_pred))
MAE: 21.0
MSE: 443.0
RMSE: 21.048
1
2
3
print("MAE:", mean_absolute_error(y2_true, y2_pred))
print("MSE:", mean_squared_error(y2_true, y2_pred))
print("RMSE:", root_rmse_squared_error(y2_true, y2_pred))
MAE: 90.75
MSE: 22832.25
RMSE: 151.103

오차값이 20~30 사이에서 놀다가 $\Delta y=300$인 이상값이 하나 들어가면서 지표가 지나치게 커짐을 확인할 수 있다.
마찬가지로 MSE와 RMSE의 왜곡 차이도 확연히 드러난다.

git bash 연동 및 연동해제

Git Bash: GitHub 연동

github와 컴퓨터를 연동해주는 터미널인 git bash를 이용하기 위해 우선 git bash에 연동시킬 user명과 계정을 확인시켜줄 필요가 있다.

1
2
$ git config --global user.name "user name"
$ git config --global user.email email@mail.com

위 명령어를 입력하고서 계정 연동이 필요한 작업을 하게되면 웹 브라우저 혹은 code를 통한 인증을 요구한다.
GitHub 연동

Git Bash: 연동해제

일반적으로 GitHub 관리는 개인 컴퓨터에서 진행하겠지만, 예외적으로 외부 컴퓨터에서 작업하게될 경우가 있을 수 있다.
이런 경우 로그아웃을 해야하지만, 웹 페이지도 아닌 로컬에 입력된 정보에 연동을 끊는 방법이 필요하다.

자격증명제거

[제어판] - [사용자 계정] - [자격 증명 관리] - [Windows 자격 증명] 순으로 진입하면 Git~ 으로 연동된 자격 증명을 확인 할 수 있다.
window 자격증명

자격 증명 [제거]를 클릭하면 Git Bash에서 연동은 우선 해제된다.

하지만 문제가 하나 남게되는데, 첫 연동 이후엔 연동 정보가 캐쉬되어 이메일 추가 인증을 요구하지 않는다.

자격 증명을 제거한 다음 hithub 엑세스에 사용한 웹 브라우저의 캐쉬를 삭제하면 다음 연동 때 cookie로 남긴 데이터가 없기 때문에 추가 인증을 요구한다.
쿠키 제거

외부에서 로그인 했을 경우엔 시크릿 모드를 쓰거나 발자취를 지우는게 보안상 중요.

문자열에서 특정 값을 뽑아내고 input을 받는 함수

Kaggle Survey Data Transformation

2021 Kaggle Machine Learning & Data Science Survey 에서 질문지를 나누는 작업 중 여러 part로 다수의 칼럼명을 가진 question number 부분의 칼럼명을 뽑아내는 함수를 찾았고, 이 함수에 대응할 수 있으며 질문의 A,B type을 특정해낼 수 있는 input 함수를 짜봤다.

데이터 칼럼명 나누기

1
2
3
4
5
import numpy as np
import pandas as pd

from warnings import filterwarnings
filterwarnings('ignore')

우선 모든 Question 칼럼명을 추출해낸다.
물론 데이터를 나누는 작업 전에 나눌 데이터와 데이터 명을 학습해야한다.
kaggle_survey_2021_responses.csv의 칼럼명 형식은 다음과 같다.

  • 'Q'(num1)
  • 'Q'(num1)'_Part_'(num2)
  • 'Q'(num1)'_'(type)'_Part_'(num2)

각각을 Question, sub_Qustion, type_Qustion(sub 포함)으로 볼 수 있다.

1
2
3
4
#df = pd.read_csv("D:/_Bdata/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")
df = pd.read_csv("E:/Fear/Univ/Big_data/Training/Github/Codding-base-Python/Python/Python-jupyter/Kaggle Survey - 2021 Analysis - Plotly/kaggle_survey_2021_responses.csv")
df_col_name = df.columns[1:]
df_col_name
Index(['Q1', 'Q2', 'Q3', 'Q4', 'Q5', 'Q6', 'Q7_Part_1', 'Q7_Part_2',
       'Q7_Part_3', 'Q7_Part_4',
       ...
       'Q38_B_Part_3', 'Q38_B_Part_4', 'Q38_B_Part_5', 'Q38_B_Part_6',
       'Q38_B_Part_7', 'Q38_B_Part_8', 'Q38_B_Part_9', 'Q38_B_Part_10',
       'Q38_B_Part_11', 'Q38_B_OTHER'],
      dtype='object', length=368)

문자열을 인식해서 input 값을 특정해주는 함수 만들기

questions_count에 대응할 수 있는 input 함수를 짜낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def input_num():
print("input Question no.: ")
Qnum = input()
Qnum_subQ = [s for s in df_col_name if "Q"+Qnum+"_" in s]

if Qnum_subQ == []:
return "Q"+Qnum+" has not part_Q"

Question_type = None
if [s for s in Qnum_subQ if ("A"or"B") in s]:
print("input Q"+Qnum+"'s type")
Question_type = input().upper()

if Qnum_subQ:
print("input Q"+Qnum+"'s last part no.: ")
part_num = input()


return questions_count(Qnum,part_num,Question_type)

위 함수는
Question number(Qnum)을 입력받은 뒤 이전에 정의한 칼럼명을 추출해 낸 df_col_name 객체내에서 "Q"+Qnum+"_" 문자열이 있는 sub_Question 형식을 찾아낸다.

Data Transformation에서 얻어낸 코드는 Qnum 만 있는 경우에 대한 작업이 없으므로 이 경우는 line6 조건문에서 함수를 종료한다.

line 9의 if문에선 'A' or 'B' 문자가 들어있는 문자열을 list에서 식별해 해당하는 경우엔 Question_type 객체에 type을 입력 받게 되는 조건문을 작성했다.
이 때, upper() 함수를 이용해 소문자로 입력받아도 대문자로 자동변환되게 설정했다.

line 14의 조건문은 sub Question의 마지막 열을 입력받는 조건문으로 사용자가 ‘kaggle_survey’에서 직접 확인해서 input 값을 정해야한다.

칼럼명 리스트로 뽑아내기

Data Transformation에서 가져온 코드로, 원하는 sub_Question들을 뽑아낼 수 있는 함수다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def questions_count(question_num, part_num, Question_type = False):
part_questions = []

if Question_type in ["A","B"]:
part_questions = ['Q'+question_num+"_"+Question_type+"_Part_"+str(j) for j in range(1,int(part_num))]
part_questions.append("Q"+question_num+"_"+Question_type+"_OTHER")
else:
part_questions = ['Q'+question_num+'_Part_'+str(j) for j in range(1,int(part_num))]
part_questions.append('Q'+question_num+'_OTHER')

categories = []
counts = []
for i in part_questions:
category = df[i].value_counts().index[0]
val = df[i].value_counts()[0]
categories.append(category)
counts.append(val)

combined_df = pd.DataFrame()
combined_df['Category'] = categories
combined_df['Count'] = counts

combined_df = combined_df.sort_values(['Count'], ascending = False)
return combined_df

part_question List를 만들어서 칼럼명을 저장하는데, Question_type이 입력되었을 경우와 아닌경우로 조건문이 나뉜다.

  • type이 있는 경우: "Q(num)_(type)_Part_(part_num)"
  • type이 없는 경우: "Q(num)_Part_(part_num)"

csv 파일을 보면 알 수 있지만, sub_qustion의 마지막 칼럼은 Q(num)_OTHER로 구성된다.
위 예외에 대응하기 위해 append함수를 이용해서 list에 Q(num)_OTHER 값을 추가한다.

남은 작업은 기존 df에서 칼럼명과 칼럼에 응답한 합을 구하기 위해value_counts함수의 indexvalues를 사용해서 만든 dataframe을 반환하면 Data Transformation 작업이 끝난다.

1
input_num()
input Question no.: 
1





'Q1 has not part_Q'
1
input_num()
input Question no.: 
7
input Q7's last part no.: 
12
Category Count
0 Python 21860
2 SQL 10756
4 C++ 5535
1 R 5334
5 Java 4769
3 C 4709
6 Javascript 4332
10 MATLAB 2935
11 Other 2575
9 Bash 2216
7 Julia 305
8 Swift 242
1
input_num()
input Question no.: 
27
input Q27's type
a
input Q27's last part no.: 
11
Category Count
0 Amazon Web Services (AWS) 3721
2 Google Cloud Platform (GCP) 3142
1 Microsoft Azure 2450
3 IBM Cloud / Red Hat 572
4 Oracle Cloud 454
7 VMware Cloud 390
10 Other 337
5 SAP Cloud 290
6 Salesforce Cloud 275
8 Alibaba Cloud 259
9 Tencent Cloud 172

외부 링크

기억이 안날 때는 응애..

Markdown 하이퍼링크 이미지 넣기

URL 넣기

URL 단순 입력

단순히 표현하고 싶은 url을 붙여넣으면 아래처럼 해당 text가 url로 링크된다.
엘든링? https://en.bandainamcoent.eu/elden-ring/elden-ring

1
엘든링? https://en.bandainamcoent.eu/elden-ring/elden-ring

URL 삽입

하지만 아래처럼 url 뒤로 띄어쓰기가 없을 경우 < , >로 묶어줘야 정확한 URL 표시가 가능하다.
엘든링 https://en.bandainamcoent.eu/elden-ring/elden-ring엘?든링

1
엘든링 <https://en.bandainamcoent.eu/elden-ring/elden-ring>엘?든링

텍스트 하이퍼링크

특정 텍스트에 URL을 링크하는 text href를 사용하고 싶을 경우엔 [text](URL) 형식으로 작성하면 된다.

엘?든?링?

1
[엘?든?링?](https://en.bandainamcoent.eu/elden-ring/elden-ring)

URL 참조

하나의 URL을 여러번 사용해야할 때 참조 URL을 익혀두면 편하다.

엘든링엘든링?엘?든?링엘?
든?
링?

엘든링!
22년 2월 25일 대발매

1
2
3
4
5
6
7
[엘든링][ER][엘든링?][ER][엘?든?링][ER][엘?
든?
링?][ER]
[엘든링!][ER]
[22년 2월 25일 대발매][ER]

[ER]: https://en.bandainamcoent.eu/elden-ring/elden-ring

이미지 삽입

이미지 삽입은 Href 형식 앞에 !를 붙여 ![alt](URL)로 작성한다.

Elden Ring

1
![Elden Ring](https://p325k7wa.twic.pics/high/elden-ring/elden-ring/00-page-setup/eldenring_new.png?twic=v1/cover=800x267/step=10/quality=80)

이미지 하이퍼링크

그럼 이미지에 링크를 넣는 방법은 어떻게 해야할까?

이미지 표현문을 [ , ]로 묶어 text 처럼 표현하고 그 뒤에 href를 작성하면 된다.
ex) [![alt](URL)](Href)

엘든링 보러가기

1
[![엘든링 보러가기](https://p325k7wa.twic.pics/high/elden-ring/elden-ring/00-page-setup/eldenring_new.png?twic=v1/cover=800x267/step=10/quality=80)](https://en.bandainamcoent.eu/elden-ring/elden-ring)

Hexo local image 삽입하기

참조

Jupyter ModuleNotFound 에러 (feat.plotly)

0. 모듈 에러 확인

Plotly를 외부 컴퓨터에서 잘 사용하다가 집에서 모듈을 설치하기 위해 plotly에서 안내된 install 명령어 대로 설치하고 jupyter로 사용하려니 아래와 같이

1
ModuleNotFoundError: No module named 'plotly'

오류를 뱉어내더라.

cmd에서 plotly를 확인해도 깔려 있는데, 막상 로컬 소프트인 jupyter에서 사용하려니 경로를 못 찾아가는 느낌이라 주피터 path 경로 문제인가 했었다.

구글링해서 내린 결론은 일반 cmd로 모듈을 다운받으면 python에 대한 모듈로 다운받는게 문제였다.

“jupyter는 파이썬 아니냐?”
하겠지만 jupyter에서 import로 참조되는 모듈들은 Anaconda 설치 경로에서 참조되기 때문에 python에 모듈을 설치하는 경우는 아무 의미 없는 작업이된다.

1. Anaconda Prompt

결국 로컬 jupyter에서 외부 모듈을 적용시키기 위해선 anaconda 경로로 설치할 필요가 있고, 많은 방법 중 하나가 Anaconda Prompt다.

아나콘다 경로 혹은 시작화면 앱 찾기에서 Anaconda Prompt를 실행하고

2. plotly 설치

Plotly 설치를 Anaconda prompt에서 진행한다.

1
> pip install plotly==5.3.1

3. Jupyter 모듈 오류 해결

anaconda 로컬 소프트인 jupyter notebook에서 정상적으로 import되는 걸 확인할 수 있다.

그렇다면 구글, 당신이 신이란거야?