Kaggle_Survey02: Bar 시각화 [plotly]

이전 포스팅들과 동일 과정

1
2
3
4
import pandas as pd
import plotly.graph_objects as go

colors = ['#FF0000','#FFBB00','#ffff00','#00FF00','#0000FF','#9C009C']
1
2
df = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
#df = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")
1
2
3
4
df_ChJp = df[df.Q3.isin(["Japan","China"])]

df_Ch = df_ChJp[df_ChJp.Q3.isin(["China"])]
df_Jp = df_ChJp[df_ChJp.Q3.isin(["Japan"])]
1
2
3
def indiQ_value_counts(dataframe, indi_Qnum):
df = dataframe[indi_Qnum][1:].value_counts()
return df
1
2
df_Jp_age = indiQ_value_counts(df_Jp, 'Q1')
df_Ch_age = indiQ_value_counts(df_Ch, 'Q1')

Age [plotly: Bar]

01에 이어 이번에도 두 나라의 값을 비교할 예정이니 아예 처음부터 데이터를 합쳐서 표현한 그래프를 뽑아내겠다.

1
2
3
4
5
6
7
8
Bar_C = go.Bar(name='China',
x=df_Ch_age.index,
y=df_Ch_age.values
)
Bar_J = go.Bar(name='Japan',
x=df_Jp_age.index,
y=df_Jp_age.values
)
1
2
3
4
5
6
7
8
fig = go.Figure(data=[Bar_C,
Bar_J])

fig.update_layout(title='Age: Japan & China',
xaxis_title="Age", yaxis_title='Counts'
)

fig.show()

Bar1

bar chart에서 stack 형식을 사용하거나 group과 stack을 동시에 사용하지 않는 이상 하나의 plot에 여러 bar data를 넣으면 default는 group 형식으로 뽑힌다.

index 정렬

나이 순으로 출력하고 싶었지만, value_counts 할 때 원본 dataframe의 요소 순서로 index가 들어가버렸다.

그래서 value_counts된 dataframe을 sort_index를 사용해 오름차순 정렬한다.

1
2
df_Ch_sortAge = df_Ch_age.sort_index()
df_Jp_sortAge = df_Jp_age.sort_index()

Bar2

60-69 구간에 더미값 추가

정렬은 문제없어 보였지만 70+와 60-69 순서가 이상하다.

1
df_Ch_sortAge
18-21    206
22-24    274
25-29    159
30-34    109
35-39     39
40-44     14
45-49      8
50-54      1
55-59      2
70+        1
Name: Q1, dtype: int64

아무래도 China에 60-69 구간에 해당하는 value가 없어서 index 추가가 안된거같다.

index가 전부 있는 Japan을 앞 순서로 바꿔도 되겠지만, 그냥 China 60-69 index를 추가하고 임의로 값 0를 넣겠다.

1
2
df_Ch_sortAge.loc['60-69'] = 0
df_Ch_sortAge = df_Ch_sortAge.sort_index()

Bar3

외부링크

Kaggle_Survey01: Pie 시각화 [plotly]

dataset 구조 확인하기

1
2
3
4
import pandas as pd
import plotly.graph_objects as go

colors = ['#FF0000','#FFBB00','#ffff00','#00FF00','#0000FF','#9C009C']
1
2
df = pd.read_csv("https://raw.githubusercontent.com/hangack/project-green/main/Kaggle_Survey-2021/data/kaggle-survey-2021/kaggle_survey_2021_responses.csv", dtype='unicode')
#df = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")

Columns 구조는 문자열에서 특정 값을 뽑아내고 input을 받는 함수 포스트에서 확인했으므로 넘어간다.

비교 대상 선정하기

2021 kaggle_survey 분석을 계속 진행한다.

베이스는 2021년 기준 survey 응답 count 수가 비슷한 일본과 중국을 선정했다.
한국 넣으려다 응답수가 낮아 방향을 바꿨다

kaggle_survey_2021_responses의 모든 row를 사용할 필요 없으므로 Q3(country) 응답에 Jp(Japan), Ch(China)인 요소만 추출한다.

1
2
3
4
df_ChJp = df[df.Q3.isin(["Japan","China"])]

df_Ch = df_ChJp[df_ChJp.Q3.isin(["China"])]
df_Jp = df_ChJp[df_ChJp.Q3.isin(["Japan"])]

Gender [plotly: Pie]

일단 간단히 비교할 수 있는 Gender(Q2)와 Age(Q1) 중 Q2를 Pie 그래프로 시각화할 예정이다.

간단한 Pie 그래프를 사용할 예정이고, 간단한 그래프인 만큼 pie 요소 option을 만질 여지가 많다.
따라서 express가 아닌 graph_objects 모듈로 작업했다.

plotly.graph_objects.Pie를 사용해서 만든 그래프를 Figure 형식으로 지정하고 fig_j 객체에 저장한다.

아래 코드는 필수 요소인 lablesvalues만 넣은 결과다.

1
2
3
4
5
6
7
fig_j = go.Figure(data=[go.Pie(labels=df_Jp['Q2'][1:].value_counts().index, 
values=df_Jp['Q2'][1:].value_counts().values
)
]
)

fig_j.show()

Pie1

대응하는 value_counts 함수 만들기

앞으로 많은 그래프를 그려낼거고 df_Jp['Q2'][1:].value_counts() 형식이 반복된다.

df_Jp['Q2'][1:].value_counts()을 객체로 만들어서 넣어도 되겠지만, 이번 작업에서 사용할 df은 df_Jp&df_Ch 2개로 dataframe 객체의 변동이 있고, 칼럼명도 Q1,Q2로 변동이 있다.
위 조건에 부합하는 간단한 함수 하나 만들겠다.

1
2
3
def indiQ_value_counts(dataframe, indi_Qnum):
df = dataframe[indi_Qnum][1:].value_counts()
return df
1
2
df_Jp_gen = indiQ_value_counts(df_Jp, 'Q2')
df_Ch_gen = indiQ_value_counts(df_Ch, 'Q2')

subplots: 그래프 figure 합치기

japan과 china 함수를 각각의 figure로 보기엔 불편하다.
subplost를 이용해 하나의 fig로 합칠 예정이다.

1
from plotly.subplots import make_subplots
1
2
3
4
5
6
7
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values
)
1
2
3
4
5
6
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.show()

Pie1

text, color 커스텀

커스텀 색상이나 타이틀 등 텍스트를 넣어 간단한 시각적 커스텀을 입혀보자

1
2
3
4
5
6
7
8
9
10
11
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values,
title='Japan',
textinfo ='label,percent'
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values,
title='China',
textinfo ='label,percent'
)
1
2
3
4
5
6
7
8
9
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.update_layout(title_text='Gender')
fig.update_traces(marker=dict(colors=colors[1:]))

fig.show()

Pie1

시각 요소 커스텀

Trace의 title이 Pie 외부에 위치하는게 맘에들지 않는 부분을 수정하기 위해 시각 효과에서 legend를 제거하는 등 각종 요소 값을 변경한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pie_J = go.Pie(labels=df_Jp_gen.index, 
values=df_Jp_gen.values,
# pull=[0,0,0.2,0.2,0.2], ## 중앙에서 n% 떨어진 위치 할당
title='Japan',
textinfo ='label,percent',
hole=0.3
)

Pie_C = go.Pie(labels=df_Ch_gen.index,
values=df_Ch_gen.values,
# pull=[0,0,0.2,0.2,0.2],
title='China',
textinfo ='label,percent',
hole=0.3
)
1
2
3
4
5
6
7
8
9
10
11
12
13
fig = make_subplots(rows=1, cols=2,specs=[[{"type": "domain"},{"type": "domain"}]])

fig.add_trace(Pie_J,row=1,col=1)
fig.add_trace(Pie_C,row=1,col=2)

fig.update_layout(title_text='Gender',
# showlegend=False, ## ledend(lable 목록) 시각적으로 제거
margin=dict(t=0, b=0, l=0, r=0)
)
fig.update_traces(marker=dict(colors=colors[1:]))


fig.show()

외부링크

Kaggle_Survey00: dtype Warning 해결하기 [pandas]

1
import pandas as pd
1
2
3
4
5
#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 = pd.read_csv("../input/kaggle-survey-2021/kaggle_survey_2021_responses.csv")
E:\Sadness\anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3165: DtypeWarning: Columns (0,195,201,285,286,287,288,289,290,291,292) have mixed types.Specify dtype option on import or set low_memory=False.
has_raised = await self.run_ast_nodes(code_ast.body, cell_name,

cvs datasat을 불러오는데 위와 같이 DtypeWarning 이라는 경고가 출력되었다.

DtypeWarning 해결하기

filterwarnings

경고 그 자체가 원하는 작업은 아니지만 문제가 발생하지 않는 이상 user는 경고를 무시해도 상관없다.

권장하지 않지만 거슬린다면 warnings 모듈의 경고 필터 ignore를 사용해 경고 출력을 무시할 수 있다.

1
2
from warnings import filterwarnings
filterwarnings('ignore')

low_memory

하지만 근본적인 해결은 아니므로 terminal이 제안한 방식인 low_memory=False 를 넣어 해결할 수 있다.

1
df = pd.read_csv("csv url", low_memory=False)

위 방식은 각 column마다 data type을 추측하는 방식으로 옵션명(낮은 메모리)처럼 작업량이 data 크기에 비례해 증가한다.

방대한 데이터를 처리해야되서 Dtype 추측 방식이 부담된다면?

dtype 형식 지정

불러올 file의 문자 형식을 알고 있다면 dtype을 지정해 warning을 해결하고 memory 가용량도 줄일 수 있다.

1
df = pd.read_csv("csv url", dtype='unicode')

외부링크

문자열에서 특정 값을 뽑아내고 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

외부 링크

기억이 안날 때는 응애..

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되는 걸 확인할 수 있다.

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

Jupyter 경로 변경

주피터 노트북 혹은 주피터 랩의 기본 경로가 Users에 적용되어있고 간단한 설정으로 경로를 바꿀 수 없기에 메모를 남긴다.

주피터 설정을 변경하기 위해서는 구성을 변경할 수 있는 파일인 config 파일이 필요하다.
하지만 이 congif 파일은 기본적으로 설치되어있지 않기에 아래와 같이 cmd 창에서 jupyter 명령어로 세팅 방식이 적힌 config 파일을 생성해주는걸 권장한다.

1
> jupyter notebook --generate-config

config 생성

그러면 user 경로 .jupyter 디렉토리에 jupyter_notebook_config.py 파일이 생성된다.

jupyter_notebook_config.py

버전마다 다르지만 에디터를 이용해 385번줄에 있는

1
# c.NotebookApp.notebook_dir = ''

c.NotebookApp.notebook_dir

의 주석 처리를 제거하고 원하는 경로를 입력한다.

이 때, 경로는 리눅스 방식으로 변경해야되니 역슬래쉬(\)로 경로가 복사되었다면 슬래쉬(/)로 변경하거나 컴퓨터에게 특수문자임을 인식시키기 위해 역슬래쉬를 2번(\\) 입력한다.

1
c.NotebookApp.notebook_dir = 'E:/Fear/Univ/Big_data/Training/Github/Codding-base/Python/Python-jupyter'

혹은
1
c.NotebookApp.notebook_dir = 'E:\\Fear\\Univ\\Big_data\\Training\\Github\\Codding-base\\Python\\Python-jupyter'

경로 입력

이걸로 주피터 path 경로는 변경되었으나 Jupyter Notebook의 바로가기 path도 설정해야 notebook을 열었을 때 config에서 설정한 path 경로를 참조할 수 있다.
Jupyter Notebook 경로

notebook 설정을 열어서 아래 두 경로를 지워 config 설정을 참조하도록 바꿔준다.

1
2
대상: ~ "%USERPROFILE%/"
시작위치: %HOMEPATH%

path 변경

지정한 경로에서 잘 열리지만 path 내부에서만 작업하므로 작업환경에서 가장 편한 path를 설정하는걸 권장한다.

외부링크

ipynb 사용하기; Jupyter & Google Colab

IPython Notebook은 python 코딩과 html을 지원하고 수식까지 표현 가능한 markdown 텍스트 박스를 동시에 사용해 가독성을 올리기 위해 제안된 방식이다.

Jupyter

기본적으로 로컬환경에서 사용가능한 Jupyter 시리즈가 있다.
아나콘다
주피터는 아나콘다를 설치하면 따라오는 소프트웨어로 아나콘다 설치 방법 포스트를 참조하자.

ipynb 단축키는 커멘트 팔렛트에서 확인 및 수정할 수 있다.

자주 사용되는 단축키는

  • ctrl+m & m
  • d & d
  • tab
    등 다양하게 있으니 기호에 맞춰 설정하자.

Google Colab

온라인 환경에선 다양한 플렛폼이 ipynb 환경을 지원하지만 접근성이 좋고 작업 리소스까지 지원해주며 저장공간 연동까지 가능한 Google Colab이 대표적이다.
Google 플렛폼이므로 당연히 google drive 연동을 지원하고, Github 업로드도 가능하다.

유저 작업환경 사양이 좋지않다면 Colab에서 지원하는 하드웨어 가속기를 사용해서 저사양 GPU(혹은 TPU)를 대여할 수 있다.

수정 - 노트 설정

추가로 ipynb는 ‘Kaggle Notebook’ 등 다양한 플랫폼에서 작업 가능하다.

Matplotlib의 pyplot과 pyplot.subplots

Matplotlibmatlab 수치해석 프로그램을 python 기반 작업공간에서 다양한 작업을 하기 위해 개발된 외부 라이브러리다.
이 라이브러리에서 그래프를 그리는 방식은 크게 2종류가 있는데, 간편하게 사용할 수 있는 pyplot가 첫번째다. 두번째 방식은 객체지향형 모듈에 좀 복잡한 객체 생성을 거쳐야하지만 다양한 설정 및 한 그래프 공간에 여러 축을 표현할 수 있는 pyplot.subplots가 있다.

Matplotlib 튜토리얼

pyplot API

pyplot 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd       ## pandas 라이브러리

f1 = "E:\\Fear\\Univ\\4-2\\대기정보전산학\\실습\\co2.csv"
f2 = "E:\\Fear\\Univ\\4-2\\대기정보전산학\\실습\\1880-2019.csv"

data1 = pd.read_csv(f1, engine='python')

styr = 1900
edyr = 2014+1 # [이상:미만] 이므로 2014 -> 2015

year = data1['year'] ### ['year'] -> year 열만 읽어낸다.
conc = data1['data_mean_global']

time = year[styr:edyr]
co2 = conc[styr:edyr]

print(co2)
## [n번째 줄] [co2값]

print(co2.head(3)) ## 위에서 n개
print(co2.tail(3)) ## 아래서 n개
1900    295.674998
1901    296.006998
1902    296.324997
1903    296.653997
1904    296.953996
           ...    
2010    388.717029
2011    390.944015
2012    393.015993
2013    395.724979
2014    397.546977
Name: data_mean_global, Length: 115, dtype: float64
1900    295.674998
1901    296.006998
1902    296.324997
Name: data_mean_global, dtype: float64
2012    393.015993
2013    395.724979
2014    397.546977
Name: data_mean_global, dtype: float64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np        ## numpy 라이브러리

data2 = np.genfromtxt(f2, encoding='utf8',dtype=None,delimiter=',',names=('year','value'), skip_header=5)
## 변수 / 인코딩 / 혼합 데이터 : dtype=None / 값 사이 구분 / 열 이름 지정 / 머릿말 생략 열 수

size=len(data2)

print(size)

for i in range(0,size):
t = data2['year'][i] ## year 열의 i번째 값을 t에 저장
if t == 1900:
styr = i
elif t == 2015:
edyr = i
i=i+1

print(styr)
print(edyr)

temp = data2['value'][styr:edyr]

print(temp)
140
20
135
[-0.07 -0.15 -0.25 -0.37 -0.46 -0.28 -0.21 -0.38 -0.43 -0.44 -0.4  -0.44
 -0.34 -0.32 -0.14 -0.09 -0.32 -0.39 -0.3  -0.25 -0.23 -0.16 -0.24 -0.25
 -0.24 -0.18 -0.07 -0.17 -0.18 -0.32 -0.11 -0.06 -0.13 -0.26 -0.11 -0.16
 -0.12 -0.01 -0.02  0.01  0.16  0.27  0.11  0.1   0.28  0.18 -0.01 -0.04
 -0.05 -0.07 -0.15  0.    0.04  0.13 -0.1  -0.13 -0.18  0.07  0.12  0.08
  0.05  0.09  0.1   0.12 -0.14 -0.07 -0.01  0.   -0.03  0.1   0.06 -0.07
  0.03  0.19 -0.06  0.01 -0.07  0.21  0.12  0.23  0.28  0.32  0.19  0.36
  0.17  0.16  0.24  0.38  0.39  0.29  0.45  0.39  0.24  0.28  0.34  0.47
  0.32  0.51  0.65  0.44  0.43  0.57  0.62  0.64  0.58  0.67  0.64  0.62
  0.54  0.65  0.73  0.58  0.64  0.67  0.74]

설정값이 적은 pyplot에선 아래와 같이 기본형태가 정해진 matplotlib를 로드해서 사용한다.

1
2
%matplotlib notebook  
## matplotlib 그림툴 로드
1
2
3
4
5
6
import matplotlib.pyplot as plt

plt.plot(time,co2,'b') ## 'matplotlib named color' 참고
plt.xlabel('Year')
plt.ylabel('CO₂concentration') ## 한글 유니코드, 특수문자 모두 사용가능
plt.show()
<IPython.core.display.Javascript object>

1
plt.close()
1
2
3
4
plt.plot(time,temp,'r')
plt.xlabel('Year')
plt.ylabel('Global Mean Surface Temperature')
plt.show()
<IPython.core.display.Javascript object>

1
plt.close()

pylot.subplots (객체지향 API)

pylot.subplots 예제1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fig, ax1 = plt.subplots()   ## matplotlib.pyplot.subplots 참고
ax2 = ax1.twinx() ## 축을 하나 더 추가하기 위한 함수 twinx

ax1.set_ylabel('GMST anomaly (C)') ##
ax1.set_xlabel('Year') ## 라벨 지정
ax2.set_ylabel('CO₂(ppm)') ##

line1 = ax1.plot(time, temp, color='crimson', label='Global temperature anomaly',linewidth = 1.5)
line2 = ax2.plot(time, co2, color='limegreen', label='CO₂concentration',linewidth = 2.)

lines = line1 + line2 ## 두 장의 line 그림을 합친 변수
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left') ## loc 'location' ## matplotlin.axes.Axes.legend 참고


plt.show
<IPython.core.display.Javascript object>

<function matplotlib.pyplot.show(block=None)>
1
plt.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fig, ax1 = plt.subplots() 
ax2 = ax1.twinx()

ax1.set_ylabel('GMST anomaly (C)')
ax1.set_xlabel('Year')
ax2.set_ylabel('CO₂(ppm)')
ax1.set_ylim([-0.46,0.72]) ## 범위 조정
ax2.set_ylim([280,390]) ##
ax1.set_xlim([1900,2014])

line1 = ax1.plot(time, temp, color='crimson', label='Global temperature anomaly',linewidth = 1.5)
line2 = ax2.plot(time, co2, color='limegreen', label='CO₂concentration',linewidth = 2.)

lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left')


plt.show
<IPython.core.display.Javascript object>

<function matplotlib.pyplot.show(block=None)>
1
plt.close()

파이썬 라이브러리 math와 numpy

파이썬 모듈 기초

내장 라이브러리 Math

파이썬에는 기본적으로 수학 관련 작업을 위해 자주 사용되는 Math 내장 라이브러리가 존재한다.

1
2
3
4
import math    # math 라이브러리를 불러오는 명령어.
''' 라이브러리 명령어는 [라이브러리명(혹은 as로 지정한 임의의 명칭)].[명령어]로 사용할 수 있으며.
명령어 자동완성(혹은 명령어 목록)은 tap 키로 사용 및 확인 가능하다.
'''

math 라이브러리는 수학 연산을 도와주는 라이브러리로 삼각함수부터 1~N까지 값을 곱해주는 factorial 함수 등 다양한 작업이 가능한 기본 함수들을 제공한다.

1
2
print(math.cos( (300 / 180) * math.pi ))
print(math.factorial(4))
0.5000000000000001
24

파이썬에서 기본적으로 제공하는 List 형식의 행은 사용할 수 있으나 Math 라이브러리가 추가해주는 method 및 상수는 기본적인 식과 pi 등의 상수 뿐으로 다차원 연산으로 인해 행렬이 필요한 vector나 선형대수 등의 작업 형식에 대해선 복잡해지는 불편함이 있다.

외부 라이브러리 Numpy

위 문제를 해결해주는 라이브러리가 C언어 기반으로 만들어진 Numpy 외부 라이브러리로 작업 공간에서 행렬 형식의 변수를 사용할 수 있게 도와준다.

numpy 명령어 튜토리얼

1
2
import numpy as np
print(np.__version__)
1.20.1

python 모듈

모듈

함수나 변수를 모아 놓은 파이썬 파일 (파일명(.py) = 모듈명
다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 나든 파이썬 파일
여러 모듈을 묶어서 편리하게 관리하기 위해 패키지(디렉토리) 안에 넣어둘 수 있다.
패키지 내부 모듈 안의 특정 함수를 사용하기 위해서는 ‘패키지.모듈명.특정함수명’ 형태로 사용한다.
불러들이는 명령어 : import

아래의 matplotlib는 외부 모듈로 cmd 창을 통해 따로 다운받아야한다.

1
2
3
4
import matplotlib.pyplot as plt   # matplotlib (패키지)  pyplot (모듈)      # A as B  -> 변수 A를 B로 설정
#여기서 plt는 object 이다. / object(객체)는 .을 찍을 수 있다.

plt.plot([1,2,3,4])
[<matplotlib.lines.Line2D at 0x23bdd9b5880>]

그래프 예시

1
2
3
4
5
6
# import '모듈 이름' : 모듈 불러오는 명령어

import math # math 는 객체 - . 을 찍을 수 있다.
# 수학 작업을 할 때 : math library(파이썬 내장) 혹은 numpy library(외부 다운로드)
n = math.factorial(5)
print(n)
120
1
2
3
4
5
6
7
%%writefile my_module.py
my_variable = 10
def my_factorial(n) :
x=1
for i in range(1,n+1):
x=x*i
return(x)
Overwriting my_module.py
1
2
import my_module as math_lib        ## 원하는 이름으로 변경
print(math_lib.my_variable)
10
1
2
3
4
5
# from '모듈 이름' import '함수 이름' : factorial 함수만 import

from math import factorial ## math.factorial -> factorial
n = factorial(5)/factorial(3)
print(n)
20.0
1
2
3
4
5
6
7
8
9
10
11
12
# 여러 함수를 import

from math import (factorial, acos, pi, sin)
n = factorial(3) + acos(1)
print(n)


# 모든 함수를 import, * : 모든 것

from math import *
n = sqrt(5) + fabs(-12.5) ## sqrt : 루트 / fabs : 절대값
print(n)
6.0
14.73606797749979

모듈 만들기

1
2
3
4
5
6
7
%%writefile mod1.py

def add(x,y):
return x+y

def sub(x,y):
return x-y
Overwriting mod1.py
1
2
3
import mod1
i = mod1.add(3,4)
print(i)
7
1
2
3
from mod1 import *
i = add(3,4)
print(i)
7
1
2
i = mod1.sub(4,2)
print(i)
2
1
2
3
4
5
6
7
8
%%writefile mod2.py

PI = 3.141592

def add(x,y):
return x+y

# 모듈에 변수 포함 가능
Overwriting mod2.py
1
2
import mod2
print(mod2.PI)
3.141592