이번 포스팅에서는 Python의 가장 기본적인 구문법 (Basic Syntax)에 대해서 정리를 해보겠습니다. 

 

이미 Python 잘 쓰고 계신 분은 이번 포스팅 건너뛰시면 되겠습니다.

 

Spyder나 Junpyter Notebook 사용법 소개하면서 이미 간단하게나마 언급했던 내용도 이미 있는데요, 파이썬 기본 구문법을 일괄적으로 정리해본다는 차원에서 중복되더라도 다시 소개해봅니다.

 

 

- (1) 파이썬 식별자 (Python Identifier)

- (2) 파이썬 키워드 (Python Keywords)

- (3) 줄 들여쓰기 (Lines and Indentation)

- (4) 복수 줄 선언문 (Multi-Line Statements)

- (5) 파이썬 인용 (Quotation in Python with hash sign #)

- (6) 부가설명 (Comments in Python)

- (7) 한 개의 줄에 복수 선언문 쓰기 (with semicolon ;)

- (8) Suite 으로 복수의 선언문 묶음 쓰기 (with colon :)

 

 

 

 (1) 파이썬 식별자 (Python Identifier)

 

파이썬의 변수, 함수, 클래스, 모듈, 객체를 정의하기 위해서 사용하는 이름을 파이썬 식별자 (Python Identifier) 라고 합니다.  식별자는 영어 a~z, A~Z로 시작하거나 (_), (__) 같이 한줄 혹은 두줄 밑줄(underscore)과 0~9 숫자, 문자로 만들 수 있습니다. 

 

- 숫자로 시작하는 식별자는 만들 수 없습니다.  (SyntaxError: invalid token)

 

In [1]: 3_var = 10

File "<ipython-input-1-33101349b3ed>", line 1

3_var = 10

^

SyntaxError: invalid token 

 

- 파이썬은 영어 소문자와 대문자를 구분합니다. (var_1VAR_1 은 서로 다르게 인식함)

- 파이썬에서는 관습적으로 클래스(Class)대문자(uppercase letter)로 시작합니다.

- 한개의 밑줄(_)로 시작하는 식별자priviate 함을 의미합니다.  

- 두개의 밑줄(__)로 시작하는 식별자강하게 private 함을 의미합니다.

- 두개의 밑줄로 시작하고 또 두개의 밑줄로 끝나는 식별자는 파이썬 언어에서 정의한 특별한 이름입니다. (예: __init__(self) 메소드)  

 

 

 

 

 (2) 파이썬 키워드 (Python Keywords)

 

파이썬에는 이미 예약이 되어 있어서 변수 이름으로 사용할 수 없는 단어들이 있는데요, 이를 파이썬 키워드라고 합니다.  모두 소문자예요.  파이썬 키워드를 가지고 새로운 변수 객체를 만들려고 하면 아래처럼 SyntaxError가 납니다.

 

In [7]: and = 10

File "<ipython-input-7-97dbaf47599d>", line 1

and = 10

^

SyntaxError: invalid syntax 

 

 

 

 

 

 (3) 줄 들여쓰기 (Lines and Indentation : 4 spaces)

 

파이썬은 R이나 Java 처럼 함수나 클래스 정의할 때 { } 같은 괄호를 사용하지 않습니다. 대신에 줄 들여쓰기 (Indentation)을 사용합니다.  처음에 좀 당황스럽고 과연 코드 가독성이 떨어지지는 않을까 의구심이 드는데요, 써보면 나름 편리합니다. 게다가 Spyder IDE를 사용하면 알아서 들여쓰기를 해주니 편리하게 코딩할 수 있습니다. 암튼, 들여쓰기 이거 파이썬에서는 매우 중요합니다.

 

첫머리를 들여쓰기 할 때 4줄이나 8줄을 사용하는데요, 보통 4줄 들여쓰기를 많이 하는거 같습니다. 저도 그렇고, 제 주변 프로그래밍 하는 분들도 대부분 4줄 들여쓰기를 Spyder에 설정해놓고 쓰곤 합니다.

참고로, Spyder에서 들여쓰기 설정은 아래 경로로 찾아들어가서 설정하면 됩니다.

 

Spyder : Tools > Preferences > Editor > Advanced setting > Indentation characters : 4 spaces

 

 

 

 

커서를 움직여서 스페이스(space)로 들여쓰기와 탭(tab)으로 들여쓰기가 있는데요, 파이썬을 만든 Guido van Rossum 은 스페이스 들여쓰기를 권장하고 있습니다.  뭘 쓰든 상관은 없는데요, 단, 하나의 프로그래밍에 스페이스 들여쓰기와 탭 들여쓰기가 섞여있으면 파이썬이 경고 메시지를 뱉어냅니다.  하나만 골라서 쓰시는게 좋겠습니다.

 

 

같은 코드 덩어리에서 들여쓰기가 서로 다르면 에러가 납니다.  같은 코드 덩어리에서는 같은 위치로 들여쓰기 해야 합니다.

 

 

# good indentation, no error

In [10]: X = 1

    ...:

    ...: if X >= 0:

    ...:     print("X is posivive")

    ...: else:

    ...:     print("X is not positive")

    ...:

    ...:

X is posivive

 

 

# no error, hmm... indentation is not good,

# but, anyway it works because the code block is different

In [11]: if X >= 0:

    ...:     print("X is posivive")

    ...: else:

    ...:         print("X is not positive")

    ...:

    ...:

X is posivive

 

 

# indentation error
# all statements within the same block should be indented the same amount

In [12]: if X >= 0:

    ...:     print("X is posivive")

    ...: else:

    ...:     print("X is not positive")

    ...:         print("X is less than 0") # Indentation Error

    ...:

    ...:

File "<ipython-input-12-c021cffab59f>", line 5

print("X is less than 0")

^

IndentationError: unexpected indent

 

 

 

 

꼭 에러가 나지는 않더라도 들여쓰기를 맞추어서 해주면 가독성이 올라기기 때문에 특히 여러사람이 협업하는 경우라면 부가설명을 붙여주는 것과 함께 들여쓰기를 이쁘게 잘 해주는게 좋습니다.

 

 좋은 들여쓰기 예 (good indentation)

나쁜 들여쓰기 예 (bad indentation) 

 df = DataFrame({'class_1': ['a', 'a', 'b', 'b', 'c'], 
                       'var_1': np.arange(5), 
                       'var_2': np.random.randn(5)}, 
                       index = ['r0', 'r1', 'r2', 'r3', 'r4'])

 df = DataFrame({'class_1': ['a', 'a', 'b', 'b', 'c'], 
       'var_1': np.arange(5), 
       'var_2': np.random.randn(5)}, 
        index = ['r0', 'r1', 'r2', 'r3', 'r4'])

 

 

 

 

 (4) 복수 줄 (Multi-Line Statements with the line continuation character '\')

 

파이썬에서 프로그래밍하다보면 줄이 너무 길어지는 경우가 생겨서 줄 바꾸기를 해주는게 좋겠다 싶을 때가 생기는데요, 이때 '\' 문자 (line continuation character)를 사용해주면 파이썬이 '아, 비록 줄이 바뀌지만 코딩하던거 아직 끝난거 아니구나, 다음 줄도 이전 줄에 이어지는 것이구나'라고 이해를 합니다.

 

 

 

 

단, ( ), [ ], { } 등의 괄호 부호 안에서 쓰는 선언문은 '\' 부호 없이도 그냥 엔터 치고 줄 바꿈 해서 입력해도 알아서 '이전 줄에 이어서 계속 입력하고 있는 거구나' 하고 파이썬이 알아서 해석합니다.

 

 

# not need to use the line continuation character '\' for multi-line statements in case of [ ]

mydata = pd.DataFrame([1, 2, 3,
                                 4, 5, 6,
                                 7, 8, 9])

 

 

 

 

 

 (5) 파이썬 인용 (Quotation in Python with the ' ', " ", ''' ''', """ """)

 

파이썬은 작은 따옴표(' '), 큰 따옴표(" "), 세개 짜리 따옴표 (''' ''' 또는 """ """) 를 가지고 문자열 인용을 합니다. 세개 짜리 따옴표의 경우 2줄 이상의 다수의 줄로 문자열을 나열할 수 있으며, 저 같은 경우 긴 SQL 문을 객체로 만들 때 사용하곤 합니다.

 

 

In [23]: A = 'string A'


In [24]: A

Out[24]: 'string A'


In [25]: B = "string B"


In [26]: B

Out[26]: 'string B'


In [27]: C = """It is a string C. It continues

    ...: as follows. It has the second line."""

    ...:


In [28]: C

Out[28]: 'It is a string C. It continues \nas follows. It has the second line.'

 

 

 

 

 

 (6) 부가설명 (Comments in Python with the hash sign '#')

 

'#' 부호(hash sign)를 쓰면 파이썬은 '#' 이후는 무시해 버립니다.  따라서 파이썬 코드에 부가설명을 달고 싶으면 '#' 부호를 쓴 후에 comments 를 달면 되겠습니다. (이미 다 아시죠? ^^;  R이랑 같습니다.)

 

 

 

 

 (7) 한 줄에 복수개의 선언문 쓰기 (with the semicolon ;)

 

세미콜론 ';' (semicolon)를 사용하면 한 줄에 복수개의 선언문을 나열할 수 있습니다. (이것도 R이랑 같네요)  단, 이때 복수개의 선언문은 code block이면 안되겠습니다.  복수개의 code block을 그룹으로 해서 쓰려면 아래 (8)번 suite 참고하세요.

 

 

# multiple statements on a single line with the semicolon ( ; )

In [34]: var_1 = 10; var_2 = 20; var_3 = 30

    ...:


In [35]: var_1

Out[35]: 10


In [36]: var_2

Out[36]: 20


In [37]: var_3

Out[37]: 30

 

 

 

 

 

 (8) Suite 으로 복수의 선언문 묶음 쓰기 (with colon :)

 

 

 

많은 도움 되었기를 바랍니다.

 

 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

이번 포스팅은 회사에서 > pip install 로 Python 패키지 설치를 하다가 아래와 같은 에러 메지시를 만났을 때 대처 방법에 대한 짧은 글입니다.

 

패키지 설치하려고 하는데 “connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed” 에러 메시지에 맞닥뜨리면 당황스럽습니다.  특히 Python 처음 사용하는 분이라면 더욱더요. 

 

여기서 SSL 은 Secure Sockets Layer 의 약자로서 해킹, 피싱 등으로 부터 소중한 데이터를 지켜주는 것으로 보안(암호화, trusted third party 인증 등...)과 관련이 되어 있습니다. (더 자세히 알고 싶으신 분은 ☞ What is SSL and how does it work?)

 

 

 “connection error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed”

 

 

이때 조치를 취할 수 있는 방법 4가지를 소개하겠습니다.

 

 

방법 1) cmd 창에서 https 대신에 http url을 사용해서 pip install 로 설치

 

pip install --index-url=http://pypi.python.org/simple/ --trusted-host pypi.python.org pythonPackageName

 

[cmd 창 입력 예시 (시각화 패키지 seaborn 설치하려고 했을 때) ]

 

 

 

참고로 HTTPS는 데이터를 안전하게 전송하기 위해서 SSL(Secure Sockets Layer) 과 연동해서 작동합니다. HTTPS 가 SSL 인증 실패 에러를 일으키는 이유이지요. (HTTPS(Secure HyperText Transfer Protocol) works in conjunction with another protocol, Secure Sockets Layer (SSL), to transport data safely... for more details ☞http://www.biztechmagazine.com/article/2007/07/http-vs-https )

 

 

 

 

방법 2) whl 패키지 설치

 

아래 Link 에서 wheel package를 먼저 다운 받은 후에 (Windows OS의 32bit, 64bit 용 패키지)

          http://www.lfd.uci.edu/~gohlke/pythonlibs/

 

          cmd 창에서 아래의 pip install 명령어로 설치하세요.

 

 pip install wheel_package_name.whl

 

 

 

 

방법 3) easy_install

 

 

easy_install pip==1.2.1
pip install --upgrade pip

 

 

 

 

cmd 창에서 pip(the Preferred Installer Program) 를 사용해서 pip install .... 로 설치하는 대신에 anaconda의 conda install 을 사용해서 설치를 할 수도 있습니다.  SSL verify를 false로 설정해놓아보세요. (이거 어째 좀 위험해보이긴 합니다 -_-;;)

 

방법 4) conda config --set ssl_verify false

 

conda config --set ssl_verify false

conda install pip

conda upgrade pip

 

 

 

참고로요, cmd 창에서 "conda help" 를 치면 conda 로 사용할 수 있는 positional arguments 들에 대한 설명을 볼 수 있습니다.

info, help, list, search, create, install, update, upgrade, remove, uninstall, config, clean, package 등이 있는데요, 아래 화면 캡쳐의 설명을 참고하시거나 직접 cmd 창에 "conda help" 입력해서 확인해보시면 되겠습니다.

 

 

 

 

마지막 참고로요, R 사용자 분이라면요, 회사에서 R 패키지 깔려고 하는데 네트워크 보안 때문에 에러나는 경우는 http://rfriend.tistory.com/177  참고하세요.

 

 

많은 도움 되었기를 바랍니다.

 

 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

그동안 Python NumPy의 단일 배열 unary ufuncs 에 대해서 알아보았습니다.

(http://rfriend.tistory.com/300, http://rfriend.tistory.com/301)

 

이번 포스팅에서는 그동안 배웠던 unary ufuncs 들을 요리조리 조합하고 응용하는 한가지 예를 들어보겠습니다.

 

- 절대값을 구하는 함수 np.abs(x)

- 배열 원소의 부호를 판별하는 np.sign(x) 함수

- 배열의 1개 이상의 원소가 참(True) 인지 평가하는 np.any(x) 함수

 

를 이용해서 특이값, 이상치(outlier)를 탐색하고, indexing해서 다른 값으로 대체하는 방법을 소개하겠습니다.

 

 

먼저 numpy, pandas, matplotlib.pyplot 모듈을 불러오고, 평균이 0, 표준편차가 1인 정규분포로 부터 난수 10,000만개를 생성해보겠습니다.

 

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: import matplotlib.pyplot as plt

   ...:


In [2]: np.set_printoptions(precision=2)

   ...:

   ...: # setting random seed number

   ...: np.random.seed(10)

   ...:

   ...: # random number 10000 ~ N(0, 1)

   ...: mu, sigma = 0, 1

   ...: x = pd.DataFrame(mu + sigma*np.random.randn(10000))

 

 

 

 

다음으로 dexcribe() 메서드를 사용해서 x의 기술통계량을 알아보고, 히스토그램으로 분포를 살펴보겠습니다. min과 max 값을 보면 평균 0을 중심으로 해서 -3 (-3 sigma)과 +3 (+3 sigma)을 벗어나는 관측치가 있음을 알 수 있습니다.

 

 

# checking descriptive statistics and histogram

In [3]: x.describe()

Out[3]:

0

count 10000.000000

mean 0.005102

std 0.989713

min -3.621639

25% -0.652208

50% 0.013111

75% 0.675040

max 3.691489


In [4]: plt.hist(x)

Out[4]:

(array([ 15., 139., 583., 1626., 2733., 2679., 1606., 497.,

107., 15.]),

array([-3.62, -2.89, -2.16, ..., 2.23, 2.96, 3.69]),

<a list of 10 Patch objects>)

 

 

 

 

 

정규분포를 띠는 데이터셋의 경우 평균으로 부터 +3 sigma, -3 sigma 를 벗어나는 데이터의 경우 전체 데이터셋 중 99%가 존재하는 구간을 벗어나는 특이값, 이상값(outlier)로 간주할 수 있습니다.

 

이번 예제에서 x는 평균이 '0'이고 표준편차가 '1'인 정규분포를 따르므로, np.abs(x)와 any(1) 함수를 조합해서 사용하면 1만개의 관측치를 가지는 x로부터 +- 3 sigma를 벗어나는 특이값만 쏙 빼올 수 있습니다.  count() 메소드로 특이값 개수도 세볼 수 있구요.

 

 

# indexing outlier rows over mu + 3sigma, less mu - 3 sigma

In [5]: x[(np.abs(x) > 3).any(1)]

   ...:

Out[5]:

0

412 -3.204401

1036 -3.317669

1558 -3.112645

2190 3.609161

3948 3.454845

4912 -3.372347

5016 -3.393109

5158 3.193371

5618 3.177053

5750 3.158873

6135 3.077068

6303 3.142285

6689 -3.621639

6760 3.027240

6986 -3.303552

7353 -3.214030

7892 3.561219

8281 3.691489

9179 3.286370

9335 3.503309

 

# counting the number of outliers

In [6]: x[(np.abs(x) > 3).any(1)].count()

Out[6]:

0 20

dtype: int64

 

 

 

 

이번에는 np.sign(x) 함수를 곁들여 사용하여 +- 3 sigma를 벗어나는 관측치값을 모두 +-3 으로 대체해보겠습니다. (즉, +3 sigma보다 큰 특이값은 +3으로 대체, -3 sigma 보다 작은 특이값은 -3으로 대체) 

 

x.describe()로 요약통계량을 살펴보니 min -3, max 3으로 바뀌었지요? 히스토그램도 -3 ~ +3 까지 분포로 바뀌었구요.

 

 

In [7]: x[np.abs(x) > 3] = np.sign(x)*3


In [8]: x[(np.abs(x) >= 3).any(1)]

Out[8]:

0

412 -3.0

1036 -3.0

1558 -3.0

2190 3.0

3948 3.0

4912 -3.0

5016 -3.0

5158 3.0

5618 3.0

5750 3.0

6135 3.0

6303 3.0

6689 -3.0

6760 3.0

6986 -3.0

7353 -3.0

7892 3.0

8281 3.0

9179 3.0

9335 3.0


In [9]: x.describe()

Out[9]:

0

count 10000.000000

mean 0.004968

std 0.987624

min -3.000000

25% -0.652208

50% 0.013111

75% 0.675040

max 3.000000


In [10]: plt.hist(x)

Out[10]:

(array([ 76., 292., 755., 1554., 2269., 2299., 1648., 762.,

277., 68.]),

array([-3. , -2.4, -1.8, ..., 1.8, 2.4, 3. ]),

<a list of 10 Patch objects>)

 

 

 

통계 분포 방법 외에 특이값 찾는 방법이 서너가지 더 있는데요, 그건 다음번에 기회 될 때 별도로 포스팅을 하겠습니다. (언제가 될지는 기약 못하겠네요. ^^;)

 

많은 도움 되었기를 바랍니다.

 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

요즘 하도 바빠서 포스팅 못한지 거의 3주째 되어가는것 같네요. ㅜ_ㅜ

게다가 올해 초부터는 Python 연재한다고 R 포스팅은 후순위로 밀려버렸네요. ㅠ_ㅠ

 

오랜만에 R 데이터전처리 영역에서 사용하는 간단한 팁 하나 포스팅하겠습니다.

 

R에서는 '#' 이후의 문자는 모두 무시해버립니다.  있어도 없는 척, 모른 척 해버리는 것이지요. 그래서 '#'을 사용해서 부연설명, 주석을 달면 유용합니다.

 

그런데 말입니다 ('그것이 알고 싶다' 사회자 목소리 버전으로다가.... 자못 심각...-_-;),

 

외부 데이터셋을 read.table() 함수를 사용해서 R로 읽어들이려고 하는데요, 그 외부 데이터셋에 하필이면 '#'이 들어가 있는 겁니다. 아래의 예제 데이터셋처럼 말이지요.  첫번째 행(row)은 변수 이름 (header)이구요, 네번째와 다섯번째 행에 파란색으로 표신된 '#' 부호가 보이시지요? 

 

부가설명을 달기 위한 목적으로 '#'을 썼을 수도 있구요, '#'이 특정 코드값의 하나여서 사용했을 수도 있구요, 입력 실수로 '#'을 썼을 수도 있구요, 이유야 여러가지가 있을 수 있겠습니다.

 

 

[ 원소로 '#' 부호가 들어가 있는 데이터셋 예시]

 

 

 

* 위 예제 데이터셋(comment_char.txt) 첨부 =>   comment_char.txt

 

 

 

위와 같이 데이터셋의 원소로 '#' 문자가 포함된 외부 데이터셋을 read.txt() 함수를 사용해서 읽어들이려고 하면 아래와 같이 '#'이 들어있는 행의 원소의 갯수가 모자란다는 Error 메시지가 뜹니다.

 

"Error in scan line 3 did not have 5 elements"

 

 

> # If dataset contains '#' character, then an error will be raised
> # with a message as follows : "line xx did not have xx elements"
> aa <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE)
Error in scan(file = file, what = what, sep = sep, 
quote = quote, dec = dec, : line 3 did not have 5 elements

 

 

 

 

이때 fill = TRUE 옵션을 사용해주면 일단 원소가 모자라서 아예 불러들이지 못하는 오류는 피해갈 수 있기는 합니다.  하지만 아래에 aa 라는 이름으로 외부 데이터를 불어와서 만든 데이터프레임을 열어보면 '#'부터 해서 '#' 이후의 원소들은 전부 'NA'로 결측값 처리 되었음을 알 수 있습니다.

 

 

> # Every elements after '#' will be 'NA' because R interprete '#' as a comment character
> aa <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE, 
+                  fill = TRUE)

 

 

 

 

 

 

만약 '#'을 무시하지 않고 그냥 일반 문자열(string)으로, 문자형(character type)으로 인식해서 있는 그대로 불어들이고 싶다면, 그래서 '#' 뿐만 아니라 '#' 이후의 데이터들도 정상적으로 전부 다 불러읽어오고 싶을 때면 comment.char = "" 옵션을 추가해주면 됩니다.  이러면 fill = TRUE 옵션을 별도로 사용하지 않아도 정상적으로 '#'을 포함하고 있는 데이터셋도 잘 불러들일 수 있습니다.  위의 'aa' 데이터셋(fill = TRUE)과 아래의 'bb' 데이터셋(comment.char = "")을 비교해보시면 쉽게 이해하실 수 있을 겁니다.

 

 

> # It will turn off the interpretaton of comments '#'
> bb <- read.table("C:/Users/Administrator/Documents/comment_char.txt", 
+                  sep = ",", 
+                  header = TRUE, 
+                  stringsAsFactors = FALSE, 
+                  comment.char = "")

 

 

 

 

 

많은 도움 되었기를 바랍니다. ^^

 

 

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend


티스토리 툴바