반응형

Pandas에서 데이터 분석을 하기 위해 가장 많이 사용하는 것이 DataFrame일 것이다. 

Series를 확장한 것이 DataFrame이라고 이해하면 좀 더 쉽게 다가올 것이라 생각한다. 

기본 속성들을 정리해 보도록 하자.

>> import pandas as pd # pandas 라이브러리를 읽어들임

>> import numpy as np # numpy 라이브러리를 읽어들임


>> df = pd.DataFrame(np.arange(1, 6)) # numpy 배열(1에서 5까지)로부터 data frame을 생성함

>> df = pd.DataFrame(np.array([[70, 71], [90,91]]), columns=['Missoula', 'Philadelphia']) # columns 속성을 사용해 컬럼을 특정할 수 있음.

>> len(df) # 열이 얼마인지 확인하기 위해 len() 함수를 사용함.

>> df.shape # shape 속성으로 DataFrame의 치수(2,2)를 확인할 수 있음.


CSV 파일로부터 DataFrame 만들기

>> sp500 = pd.read_csv('data/sp500.csv', index_col = 'Symbol', usecols=[0,2,3,7]) # read_csv 함수로 이미 data폴더에 존재하는 sp500.csv 파일을 읽어들임. index의 컬럼명을 'Symbol'로 특정하고, 컬럼들 중에서 4개(0,2,3,7)의 특정 컬럼을 읽어들임.

>> sp500.head() # head()로 맨 앞 5개 열의 값들을 미리 볼 수 있음.

>> len(sp500) # 전체 열이 얼마인지 알 수 있음.

>> sp500.shape # sp500(DataFrame)의 치수를 확인할 수 있음.

>> sp500.size # size 속성으로 전체 데이터 크기를 알 수 있음(3컬럼* 전체 열의 수)

>> sp500.index # sp500의 index를 볼 수 있음

>> sp500.columns # sp500의 컬럼들의 이름을 확인해 볼 수 있음

* sp500.csv파일 다운로드


DataFrame 내에서 데이터에 접속하기

>> sp500['Sector'].head() # Sector 컬럼의 데이터들을 보여줌

>> type(sp500['Sector']) # type을 통해 각 컬럼의 구조를 알 수 있음(DataFrame의 단일 컬럼은 Series임)

>> sp500[['Price', 'Book Value']].head() # 2개 컬럼명을 통해 2개 컬럼의 앞 5개 열의 값들을 미리 볼 수 있음
>> sp500.Price # 컬럼명에 스페이스(빈칸)를 포함하고 있지 않다면, 콤마와 컬럼명으로 컬럼 데이터를 읽어들일 수 있음


DataFrame의 열 선택하기

>> sp500.loc['MMM'] # .loc[]를 사용해 index 이름으로 각 열을 읽어들일 수 있음
>> sp500.loc[['MMM', 'MSFT']] # 여러 열을 이름 리스트를 사용해 읽어들일 수도 있음
>> sp500.iloc[[0, 2]] # iloc[]를 사용해 위치에 맞는 각 열을 읽어들일 수 있음
 
>> i1 = sp500.index.get_loc('MMM') 
>> i2 = sp500.index.get_loc('A') # index 특정 이름의 위치를 index.get_loc()를 통해 파악한 후 그 값으로 각 열을 읽을 들일 수 있음
>> sp500.iloc[[i1, i2]]

at[]과 iat[]를 사용해 이름 또는 위치로 스칼라 찾기

>> sp500.at['MMM', 'Price'] # index와 컬럼 이름을 모두 사용해 값을 찾아냄 
>> sp500.iat[0, 1] # 열 0, 컬럼1이라는 위치를 사용해 값을 찾아냄

[] 연산자를 사용해 슬라이싱하기

>> sp500[:5] # 처음 5개 열(0~4)을 읽어들임
>> sp500['ABT' : 'ACN'] # ABT 이름부터 ACN 이름까지의 열들을 읽어들임

부울 선택을 사용해 열 선택하기

>> sp500[sp500.Price < 100] # sp500에서 Price 컬럼의 값이 100보다 작은 열들을 선택함

>> r = sp500[(sp500.Price < 10) & (sp500.Price > 6)]['Price'] # Price 컬럼의 값이 10보다 작고 6보다 큰 경우의 Price 컬럼 값들만 선택함

>> r = sp500[(sp500.Sector == 'Health Care') & (sp500.Price > 100.00)][['Price', 'Sector']] # Health Care 섹터에서 Price가 100보다 큰 Price와 Sector 컬럼 값들을 선택함


DataFrame 조작하기

컬럼명 바꾸기

>> newSP500 = sp500.rename(columns={'Book Value' : 'BookValue'}) # 공백이 있던 컬럼명을 rename() 메서드를 사용해 변경함. 단, 이 방법으로는 변경된 컬럼명을 가진 복사본을 돌려줌.

>> sp500.rename(columns = {'Book Value' : 'BookValue'}, inplace=True) # 복사본이 아닌 원본에서 컬럼명을 변경하려면 inplace=True 파라미터를 사용해야 함


[]와 .insert()로 새로운 컬럼 추가하기

>> sp500_copy = sp500.copy() # copy()로 복사본을 만들 수 있음
>> sp500_copy['RoundedPrice'] = sp500.Price.round() # Price 컬럼 값을 반올림한 신규 컬럼 RoundedPrice를 생성함
>> sp500_copy.insert(1, 'RoundedPrice', sp500.Price.round()) # .insert()를 사용해서 동일하게 신규 컬럼을 생성할 수 있음

연결(concatenation)을 사용해 컬럼 추가하기

>> rounded_price = pd.DataFrame({'RoundedPrice' : sp500.Price.round()}) # RoundedPrice 컬럼을 갖고 있는 DataFrame을 생성함
>> concatenated = pd.concat([sp500, rounded_price], axis=1) # y축(axis=1)을 기준으로 해서 두개의 DataFrame을 연결함. 

컬럼 지우기

del 키워드 또는 .pop() 또는 .drop()를 사용해 DataFrame으로부터 컬럼을 삭제할 수 있다. 

>> copy = sp500.copy()
>> del copy['BookValue']

>> copy = sp500.copy()
>> popped = copy.pop('Sector')

>> copy = sp500.copy()
>> afterdrop = copy.drop(['Sector'], axis = 1)



반응형
반응형

Pandas 자료 구조는 Series와 DataFrame을 말한다고 생각하면 된다. 그 정도로 이 두가지에 익숙해지면 pandas를 잘 활용한다고 할 수 있다는 것이다.

1. Series 정의

Series는 pandas의 기본 블록이라고 할 수 있다. 

일련의 객체를 담을 수 있는 1차원 배열과 같은 자료 구조를 나타낸다. 

Series 객체의 문자열 표현은 왼쪽에 색인(index)을 보여주고 오른쪽에 해당 색인의 값(values)을 보여준다. 

즉, Series의 배열과 색인 객체는 각각 values와 index 속성을 통해 얻을 수 있는 것이다.


2. Series 만들기

>> import pandas as pd # 사용할 라이브러리를 불러온다(이미 설치되어 있다고 가정).

>> import numpy as np

Series는 리스트, 딕셔너리, NumPy 함수, 스칼라 값들로부터 만들 수 있다.

>> pd.Series([10, 11, 12, 13, 14])

>> pd.Series(list('abcde'))

>> pd.Series({'Mike': 'Dad', 

'Marcia' : 'Mom',

'Mikael' : 'Son',

'Bleu' : 'Best doggie ever'})

>> pd.Series(np.arange(4, 9))

>> pd.Series(np.linspace(0, 9, 5))


기본적으로 index 속성을 가지고 index를 지정할 수도 있다.

>> s = pd.Series([1, 2, 3, 4], index = ['a', 'b', 'c', 'd'])


3. Series의 속성들

아래 속성들을 가지고 여러 작업을 해 볼 수 있다.

>> s.values # 값을 확인할 수 있다.

>> s.index # 인덱스를 볼 수 있다.

>> len(s) # 아이템 수를 확인할 수 있다.

>> s.size # 위와 동일하게 아이템 수를 확인할 수 있다.

>> s.shape # 아이템 수와 빈값으로 된 두개 값의 튜플로 돌려준다.

>> s.head(n = 3) # 앞의 3열을 미리 볼 수 있다.

>> s.tail(n= 2) # 뒤의 2열을 미리 볼 수 있다.

>> s.take([1, 3]) # 2번째와 4번째 열 등 지정한 특정 열의 아이템을 볼 수 있다(0부터 시작한다).

>> s['a'] # a 레이블의 값을 돌려준다.

>> s.iloc[[0,2]] # 특정 위치의 값을 찾아 돌려준다.

>> s.loc[['a', 'd']] # 특정 레이블의 값을 돌려준다.

  

4. Series를 부분집합으로 나누기

>> s = pd.Series(np.arange(100, 110), index = np.arange(10, 20))

>> s[1:6] # 두번째 값(0부터 시작하기 때문에)부터 5번째 값(맨 마지막 값은 제외)까지 돌려준다.

>> s.iloc[[1, 2, 3, 4, 5]] # 지정한 위치의 값들은 모두 돌려준다.

>> s[1:6:2] # 두번째 값부터 5번째 값 중에서 2씩 건너 뛰어 돌려준다(1, 3, 5번째 값).

>> s[:5] # 첫번째 값부터 네번째 값까지 돌려준다.

>> s[4:] # 다섯번째 값부터 마지막 값까지 돌려준다.

>> s[::-1] # 마지막 값에서 첫번째 값까지 거꾸로 돌려준다.

>> s[-4::] # 마지막 4개 값들을 돌려준다.


일련의 날짜 값들을 가지고 작업할 수 있다.

>> dates = pd.date_range('2018-03-01', '2018-03-06')

>> temps1 = pd.Series([20, 22, 25, 30, 23, 27], index = dates)

>> temps2 = pd.Series([10, 15, 13, 19, 13, 17], index = dates)

온도 값 차이를 아래와 같이 다른 변수에 저장할 수 있다.

>> temp_diffs = temps1 - temps2

평균값도 계산 가능하다.

>> temp_diffs.mean() 


5. 불린(Boolean) 선택으로 자료를 찾기

>> s = pd.Series(np.arange(0, 5), index=list('abcde'))

>> logical_results = s >= 3

>> s[logical_results] # logical_results 값이 참(true)인 열들만 돌려준다.

>> s[(s >= 2) & (s < 5)] # s값이 2보다 크거나 같고 5보다 작은 열들을 돌려준다.

>> (s >=0).all() # 참(true)을 돌려준다.

>> (s < 2).any() # 참(true)을 돌려준다.

>> (s < 2).sum() # 조건에 맞는 값들의 합을 돌려준다.


<Source : Learing Pandas Second Edition, Packt>














반응형
반응형

요즘 데이터 분석 공부를 하면서 pandas를 거의 매번 사용하게 된다. 그만큼 파이썬에서는 필수적인 라이브러리가 되었기 때문이 아닐까 한다. 

그럼 가장 기본이 되는 데이터 읽는 방법부터 정리해 보도록 하자.

pandas에서는 위와 같은 명령어를 통해 다양한 파일 형태를 읽어들이고, 쓸 수 있다.

그럼 먼저 가장 많이 사용하는 CSV 파일 읽어들이기를 중심으로 정리해 보도록 하겠다.

 

1. CSV와 텍스트 파일들

보통 데이터는 일반적으로 표 형식으로 사용한다. 한 행에 있는 값이 쉼표로 구분되면 CSV(쉼표로 구분된 값)형식이 된다. 이 형식은 아마 가장 잘 알려져 있고 가장 많이 사용하는 형식일 것이다.

다른 표 형식의 데이터는 공백이나 탭으로 구분할 수도 있으며 일반적으로 다양한 유형의 텍스트 파일(일반적으로 .txt 확장명)에 포함되어 있다. 

이 유형의 파일은 가장 일반적인 데이터 소스이며 쉽게 기록하고 해석할 수 있다.

이와 관련하여 pandas는 이 유형의 파에에 대해 특정 기능 세트를 제공한다.

- read_csv

- read_table

 

2. CSV 또는 텍스트 파일에서 데이터 읽기

>> import pandas as pd

S&P500 지수 데이터를 읽어온다(investing 사이트에서 추출).

각 필드는 심볼과 회사 이름, 사업분야, 사업세부분야로 구분되어 있는 CSV 파일이다(이는 기존에 추출해서 저장함. 어떤 CSV파일이든 상관없음).

>> csv_file = pd.read_csv('data/sp500.csv', names = ['symbol', 'name', 'sector', 'industry'])

여기서 읽어들인 데이터의 컬럼들의 헤더명을 설정하기 위해 names=[]을 사용한다.

>> csv_file

알수도 있지만, CSV 파일에서 데이터를 읽어들이는 다른 방법이 있다. CSV파일은 같은 열의 값이 쉼표로 구분된 표로 만들어진 데이터다. CSV파일은 텍스트 파일로 간주되므로 read_table()함수를 사용할 수도 있다(구분기호를 지정하여).

반응형

>> pd.read_table('data/sp500.csv', sep=',')

위 예에서, 모든 컬럼의 헤더 이름을 names=[]로 정의했다. 만약, 정의하지 않고 그냥 읽어들이면 첫번째 열이 컬럼의 헤더 이름이 된다. 그렇기 때문에 첫번째 열을 헤더로 설정하지 않기 위해서 names=[]로 정의하던지, 컬럼 수를 파악하기 어려울땐 header=None을 사용해서 컬럼들에 0으로 시작하는 기본 이름을 할당해야 한다. 또 하나 주어진 컬럼을 인덱스로 변환해서 계층형 인덱스로 할당하기 위해서는, read_csv()에 index_col 옵션을 추가함으로써 수행할 수 있다.

3. 텍스트 파일을 읽기 위해 RegExp 사용하기

콤마와 세미콜론으로 분리된 경우 말고, 다른 구분기호를 사용한 데이터를 읽어들여야 할 경우도 있다. 이 경우 정규표현식이 우리에게 도움이 된다. 사실 sep 옵션을 사용하여 read_table() 암수에서 정규표현식을 지정할 수 있다.

[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식들은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.

  • \d - 숫자와 매치, [0-9]와 동일한 표현식이다.
  • \D - 숫자가 아닌 것과 매치, [^0-9]와 동일한 표현식이다.
  • \s - whitespace 문자와 매치, [ \t\n\r\f\v]와 동일한 표현식이다. 맨 앞의 빈 칸은 공백문자(space)를 의미한다.
  • \S - whitespace 문자가 아닌 것과 매치, [^ \t\n\r\f\v]와 동일한 표현식이다.
  • \w - 문자+숫자(alphanumeric)와 매치, [a-zA-Z0-9]와 동일한 표현식이다.
  • \W - 문자+숫자(alphanumeric)가 아닌 문자와 매치, [^a-zA-Z0-9]와 동일한 표현식이다.

<정규표현식 출처 : 점프 투 파이썬 https://wikidocs.net/4308>

skiprows 옵션을 사용하면 원하는 모든 행을 제외할 수 있다. 이 옵션을 사용할 때 주의할 사항이 있다. 첫번째부터 다섯 줄을 제외시키려면 skiprow=5라고 써야 하지만, 다섯번째 줄만 제외하려면 skiprows =[5]라고 써야 한다.

 

4. 텍스트 파일에서 일부분만 읽어들이기

대용량 파일을 처리하거나 이러한 파일의 일부에만 관심이 있는 경우 파일을 부분(청크)으로 읽어야 한다. 이는 반복을 적용하기 위한 것이고 전체 파일을 파싱하는데 관심이 없기 때문이다. 

예를 들어, 파일의 일부분만 읽으려는 경우 구문 분석을 할 줄수를 명시적으로 지정할 수 있다.

>> pd.read_csv('test.csv', skiprows=[2], nrows=3, header=None)

       0    1    2    3      4

0     1    5    2    3   cat

1     2    7    8    5   dog

2     2    2    8    3 duck

nrows 옵션은 읽을 파일의 행 수를 말한다. 대용량 파일을 읽는 데 유용하다.

 

<Source : Python Data Analytics, Apress>

 

 

반응형
반응형

pandas로 데이터 분석을 실행함에 있어, 어떻게 절차를 구분하는 것이 좋을지 정리해 놓은 글이 있어 번역해 보았다. 

특히 Pandas로 실행하고 있기 때문에 향후 pandas의 각 기능에 대해 정리해 보려고 한다.

먼저, 오늘은 데이터에서 필요한 정보를 만들어내는 7단계에 대해 간략히 정리하도록 하겠다.

데이터 분석 프로세스




1. 개념화(Ideation)

첫단계는 알아내고 싶은 것이 무엇인지 밝히는 것이다. 

이것은 우리가 하고 싶은 것이 무엇인지 생각해 보고 증명하기 위한 개념화에 대한 것이다. 개념은 일반적으로 지식을 바탕으로 결정을 내리기 위해 사용할 수 있는 데이터 패턴에 대한 가설과 관련이 있다. 

이러한 결정은 비즈니스 차원에서 이루어 지지만 과학 및 연구 분야에서도 발생한다. 

그럼 데이터를 통해 우리가 내리는 결정의 종류는 어떤 것이 있을까? 다음과 같은 것을 많이 요청한다고 본다.

- 어떤 일이 왜 일어났는가?

- 과거 데이터를 사용해서 미래를 예측할 수 있는가?

- 앞으로 어떻게 운영을 최적화할 수 있을까?

위 목록이 개념화를 정의하려는 노력에 있어 많은 부분을 차지할 것이라 생각한다. 

위와 같은 질문에 대한 답변을 얻기 위해 문제와 관련된 데이터를 수집하고 이해해야 하는 것이다. 여기에는 어떤 데이터가 조사될 것인지, 연구의 이점이 무엇인지, 데이터를 어떻게 얻을 것인지, 성공 기준이 무엇인지, 최종적으로 정보가 어떻게 전달될 것인지를 정의해야 하는 지를 포함한다.

Pandas 자체는 개념을 보조하기 위한 도구를 제공하지는 않는다. 그러나 Pandas 사용에 대한 이해와 기술을 습득하면 Pandas가 아이디어를 공식화하는 데 어떻게 도움을 주는지 자연스럽게 알게될 것이다.


2. 검색(Retrieval)

아이디어가 있으면 가설을 뒷받침할 데이터를 찾아야 한다. 

이 데이터는 조직 내에서 또는 외부 데이터 공급자로부터 가져올 수 있다. 이 데이터는 일반적으로 보관된 데이터로 제공되거나 실시간으로 제공될 수 있다.

데이터를 작성했거나 조직 내에서 가져온 경우에도 원시 데이터는 종종 매우 불완전하다. 원시 데이터는 데이터가 혼란스럽거나 다양한 형식일 수 있으며 오류가 있을 수 있음을 의미한다. 분석 지원과 관련하여 불완전할 수 있으며 수동으로 개선해야 할 수도 있다.

세상에는 무료 데이터가 아주 많다. 많은 데이터는 무료가 아니며 실제로는 상당한 금액의 비용을 요구한다. 일부는 공개 API에서 무료로 사용할 수 있으며 다른 일부는 구독으로 사용할 수도 있다. 비용을 지불한 데이터는 종종 더 클린하지만 종종 그렇지 않을 수도 있음을 알아야 한다.

데이터가 불완전하거나 클린할 경우 모두 pandas는 다양한 출처의 데이터를 검색할 수 있는 견고하고 사용하기 쉬운 도구 집합을 제공하며 다양한 형식을 지원한다. pandas는 데이터를 검색할 뿐만 아니라 다른 툴이나 프로그래밍 언어에서 필요할 수 있는 복잡한 코딩을 수동으로 생성할 필요없이 pandas 데이터 구조를 통해 데이터의 초기 구조화 기능을 제공한다.


3. 준비(Preparation)

준비 중에 원시 데이터를 탐색할 준비가 된다. 이 준비 과정은 매우 흥미로운 과정이다. 데이터가 품질과 관련된 문제로 가득차 있는 경우가 매우 빈번하기 때문이다. 이러한 품질 문제를 처리하는 데 많은 시간을 할애할 가능성이 높다(종종 매우 아까운 시간).

왜 시간을 많이 할애해야 할까?

- 데이터가 단순히 잘못되어 있다

- 데이터 세트의 일부가 누락되어 있다

- 분석에 적합한 측정 값을 사용하여 데이터가 표현되지 않았다

- 데이터가 분석에 적합하지 않은 형식이다

- 데이터가 분석에 적합하지 않은 세부 수준에 있다

- 필요한 모든 필드가 단일 소스에서 제공되는 것이 아니다

- 데이터 표현이 공급자에 따라 다르다


4. 탐색(Exploration)

탐색에는 대화식으로 데이터를 작은 여러 조각들로 분해한 후 다양한 시각으로 볼 수 있게 함으로써 신속하게 살펴보는 것을 포함한다. 

탐색은 다음과 같은 다양한 테스크를 포함한다.

- 변수가 서로 어떻게 관련되어 있는지 조사

- 데이터 배포 방법 결정

- 특이점 찾아서 제외시키기

- 빠른 시각화 만들기

- 보다 영구적으로 상세한 모델링 프로세스를 지원할 수 있도록 새로운 데이터 표현이나 모델을 신속하게 생성

탐색은 pandas의 위대한 강점 중 하나다. 탐색은 대부분의 프로그래밍 언어에서 수행할 수 있지만 pandas가 얼마나 탐색적 노력을 수월하게 하는지가 관건일 것이다.

IPython 및 / 또는 Jupyter 노트북의 REPL (read-eval-print-loop) 특성과 함께 사용하면 pandas는 매우 자유로운 탐색 환경을 만든다. pandas 구문의 표현력을 통해 복잡한 데이터 조작 구조를 간략하게 설명할 수 있으며 데이터를 처리할 때 수행한 모든 작업 결과가 즉각적인 검사를 통해 표시될 수 있다. 이를 통해 프로그램을 다시 컴파일하여 재실행하지 않고 방금 수행한 작업의 유효성을 신속하게 판별할 수 있다.


5. 모델링(Modeling)

모델링 단계에서 탐색 중에 발견된 발견을 공식화하여 데이터 내에 포함된 원하는 의미를 얻는 데 필요한 단계와 데이터 구조를 명시적으로 설명한다. 이 모델은 원시 데이터에서 정보와 결론까지 얻을 수 있는 코드 단계 뿐 아니라 두 데이터 구조의 조합이다.

모델링 프로세스는 데이터 탐색을 통해 분석을 지원하는 데 필요한 변수를 선택하고 분석 프로세스에 대한 입력 변수를 구성한다. 모델을 실행하며 모델이 원래의 가정을 얼마나 잘 지원하는지를 결정하는지 확인하는 반복 프로세스라고 할 수 있다. 데이터 구조의 공식 모델링을 포함할 수 있지만 통계, 기계 학습 및 운영 연구와 같은 다양한 분석 도메인의 기술을 결합할 수도 있다.

이를 촉진하기 위해 pandas는 광범위한 데이터 모델링 기능을 제공한다. 데이터 탐색으로부터 한발 더 나아가, DataFrame에서 데이터 모델을 형식화하고, 이 모델들을 간결하게 만들어 주는 절차를 확보해 주는 단계라고 할 수 있다. 파이썬 기반을 통해, 처음부터 마지막 프로세스까지 자동화하는 프로그램을 생성하는 파워를 사용할 수 있다. 즉, 작성한 모델은 실행 가능한 것이다.

분석적 관점에서 pandas는 다양한 유형의 문제에 대한 목표를 달성할 수 있는 기술 통계에 대한 통합 지원과 같은 몇 가지 기능을 제공한다. 그리고 pandas는 파이썬 기분이기 때문에 고급 분석 기능이 필요하다면 광범위한 파이썬 라이브러리와 쉽게 통합될 수 있다.


6. 프리젠테이션(Presentation)

이 프로세스의 마지막에서 두번째 단계는 결과를 다른 사람들에게, 일반적으로 보고서나 프리젠테이션 형태로 제시하는 것이다. 설득력있고 철저한 솔루션 설명을 만들고 싶을 때, 바로 이용할 수 있다. 

Jupyter Notebook은 pandas 분석을 위한 프리젠테이션을 작성하는 강력한 도구다. 이 노트북은 코드를 실행하고 응용 프로그램의 여러 지점에서 주석을 달고 실행을 설명하기 위한 다양한 마크다운 기능을 제공한다. 또한 이 도구는 코드, 스타일이 지정된 텍스트, 그래픽과 함께 시각적으로 풍부한 매우 효과적인 실행 가능한 프리젠테이션을 만들 수 있다.


7. 재생산(Reproduction)

중요한 연구는 연구를 공유하고 재현할 수 있게 만들어야 한다. 다른 연구자가 실혐과 결과를 재현할 수 없다면 어떤 것을 증명하지 못했다고 할 수 있기 때문이다.

다행스럽게도 pandas와 파이썬을 사용함으로써 분석을 쉽게 재현할 수 있다. pandas 코드를 구동하는 파이썬 코드와 데이터를 공유함으로써 가능하다.

또한, Jupyter Notebook은 다른 사람들과 쉽게 공유할 수 있는 방법으로 코드와 응용 프로그램을 패키징하는 편리한 방법을 제공한다.


<Source : Learning pandas Second Edition, Packt>


반응형
반응형

요즘 파이썬을 공부하면서 조금 지쳐버린 것 같습니다. 

Udacity 공부 진도도 맞추지 못하고 있고, 하루에 1시간 이상 코딩을 하기로 했는데, 쉽게 되질 않습니다.

그래서, 다시 마음을 잡기 위해 제 자신에게 물어 봅니다.

파이썬으로 대체 무엇을 만들려고 하는가? 입니다. 바로 머리 속에 떠오르질 않습니다. 

그건 구체화된 목표가 없기 때문이 아닌가 싶구요. 


그래서, 파이썬으로 할 수 있는 일이 무엇인지 구글링해 봅니다.


대부분 동일한 내용으로 포스팅하고 있더라구요.

- 시스템 유틸리티 제작

- GUI 프로그래밍

- 웹 프로그래밍

- 데이터 분석

- 사물인터넷(IOT에 적당한 라즈베리파이 등)

- 봇 개발

- Crawler

- 빅데이터 분석

- AI(머신러닝-딥러닝) 구현

그럼, 왜 100여종이 넘는 프로그래밍 언어 중에서 많은 사람들이 

파이썬을 왜 배우는 걸까요? 


일단 직관적인 문법을 갖고 있고, 배우기 쉽다는 점을 듭니다.

그리고, 무료지만 강력하고, 빠른 개발속도, 강력한 커뮤니티, 풍부한 라이브러리를 가지고 있다는 장점을 꼽습니다. 

이런 장점을 바탕으로 빠른 프로토타입을 만드는데 유리하다는 점이 린 스타트업으로 새롭게 무언가를 해보려는 사람들에게 가장 잘 어울리는 언어로 부상한 것이 아닌가 싶습니다.


이렇게 정리하다 보니, 문득 디지털 노마드가 되고 싶은 저 자신에게 묻게 됩니다. 

넌 파이썬으로 무엇을 하려고 하니?

요즘 지치고 힘든 이유가 AI(머신러닝, 딥러닝 등)에 대한 글만 집중해서 보다보니 길을 잃어서 그런 것은 아닌지 자문합니다.

그리고, 다시 옷깃을 다잡아 봅니다, 이 정체기를 견뎌내야 한다고 믿으며...


그럼, 이 시기를 어떻게 보내야 할까?

정체의 시간을 그냥 흘려보내지 말아야 한다고, 기다리면서 반발짝이라도 앞으로 꾸준히 나아가야 하지 않을까요...

그리고, 지속적인 자기계발이 필요하다고... 이 분야의 전문가가 되기 위해 꾸준히 연구하고 내 것으로 만들기 위해 정리하는 작업을 언제나 우선순위에 두어야 한다는 것입니다.

마지막으로, 제가 앞으로 디지털 노마드로 살아가기 위해서는, 미래의 먹거리(상품)을 만들어야 하고 비즈니스로(돈이 되게) 풀어내야 한다는 점을 잊지 말아야겠습니다.


지금까지의 사회생활을 돌아보니, 

대학 때는 문학을 공부하였고, 컴퓨터는 중학교때부터 다루었지만, 지금처럼 프로래밍에 대해 고민해 본 적은 없었던 것 같습니다. 

이제, 직장 생활도 18년이나 되었고, 이 생활을 정리할 시기가 오리라는 것도 알고 있습니다. 

제2의 인생에 대한 준비, 제가 하고 싶은 일에 적극적으로 투자하는 인생을 만들어 나가야 하는 시기인 것입니다. 


꾸준히 자기 계발을 한다고 했는데, 정말 앞서가는 다른 분들에 비하면 아직 한참 먼 것 같습니다. 

묵묵히 겸손하게 한 걸음씩 앞으로 나아가도록 하겠습니다.

반응형
반응형

Numpy란?

데이터 과학을 공부하기 위해서는 수치 배열 데이터를 다루는데 능숙해지는 것이 필요합니다. 

파이썬에서는 Numpy(넘파이)와 Pandas(판다스)를 통해 수치 배열 데이터를 잘 다룰 수 있다고 생각합니다. 그렇다면 이 두개의 라이브러리에 익숙해지는 것이 필요하겠지요?

오늘은 Numpy에 대한 기초 내용을 정리해 보도록 하겠습니다.


1. Numpy 특징

벡터, 메트릭스, 고수준의 배열은 과학계산 컴퓨팅에 있어 필수 도구라 할 수 있습니다. 
입력 값 세트를 통해 계산이 반복될 때, 배열로 데이터를 나타내는 것이 자연스럽고 장점이 많습니다.

파이썬 과학계산 환경에서, 배열을 다루기 좋은 구조를 제공하는 라이브러리가 Numpy입니다. 
Numpy의 핵심 기능은 C로 구현되어 있습니다. 
그래서 배열을 계산하고 처리하는데 효율적인 기능들을 제공하고, 속도 또한 빠릅니다. 

첫 눈에 보기에 Numpy 배열은 파이썬 리스트 데이터 구조와 유사해 보입니다. 
하지만 중요한 차이점은 파이썬 리스트는 다양한 객체를 담을 수 있는 컨테이너인데 반해 Numpy 배열은 동일한 자료형만 담을 수 있다는 점입니다.

하지만, Numpy에는 고수준의 데이터 분석 기능을 제공하지는 않습니다. 
그러므로, 나중에 Pandas 같은 도구를 사용해 데이터 분석을 수행하는 것이 효과적입니다. 

2. 인스톨

아나콘다와 같은 패키지를 설치했을 경우에는 numpy가 함께 설치가 될 것입니다. 
별도로 설치할 경우에 통상 pip를 사용해서 아래와 같이 설치합니다. 

> pip install numpy

pip는 파이썬 패키지를 설치할 때 가장 많이 사용하는 툴입니다. 

3. 라이브러리 읽어들이기

# Numpy 읽어들이기
>>> import numpy as np

4. Numpy 배열과 for 루프 속도 비교

위 jupyter에서 실행한 결과를 보면, 대략 25배 이상 처리 속도 차이가 나는 것을 알 수 있습니다.  


5. 배열 만들기와 속성으로 배열 정보 알아보기 

Numpy에 대해 기초 정보를 정리해보려고 했는데, 오늘은 여기까지만 해야 할 것 같습니다. 

다음에는 Numpy의 배열, 스칼라 간 연산 및 색인, 슬라이싱, 수학 및 통계 메서드를 정리해 보도록 하겠습니다.





반응형
반응형

BeautifulSoup으로 웹 크롤링


웹 페이지 html은 태그, 요소, 속성 등의 구성요소를 사용해 구조적으로 웹페이지를 표시합니다. 

이런 구조화된 문서를 효율적으로 파싱해서 원하는 정보를 찾을 수 있는데, 파이썬 기본 모듈을 사용해도 되지만, Beautifulsoup을 사용하면 더욱 손쉽게 파싱할 수 있습니다.   


1. BeautifulSoup4 설치

파이썬에 기본 설치되는 라이브러리가 아니기 때문에, BeautifulSoup은 별도로 설치해야 합니다.

명령어는 다음과 같습니다.

(리눅스) sudo apt-get install python-bs4

(맥) pip install beautifulsoup4 또는 easy_install beautifulsoup4


2. virtualenv 환경에 대해

라이브러리를 프로젝트 단위로 구분해서 관리하면, 나중에 환경폴더 전체를 다른 컴퓨터로 옮기기가 매우 쉽습니다. 따라서, virtualenv 가상 환경을 사용하는 것이 매우 편리하다는 점을 언급하고 싶습니다. 

pyenv와 virtualenv는 구글링해 보면 설정하는 법이 나와 있으니 참고하면 될 것 입니다.


3. 기본 사용 예제

>>> from urllib.request import urlopen

>>> from bs4 import BeautifulSoup

>>> html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")

>>> soup = BeautifulSoup(html, 'html.parser')

>>> nameList = soup.find_all('span', {'class':'green'})

>>> for name in nameList:

             print(name.get_text())

jupyter notebook에서 실행해본 결과!


위 사용 예제(참조:파이썬으로 웹 크롤러 만들기)에서, 몇가지 주석을 달아봅니다. 

먼저, {'class':'green'}은 class_ = 'green'으로 변경해서 사용할 수 있습니다. class가 예약어이기 때문에, class_로 표시해야 제대로 처리됩니다.

get_text()는 현재 문서에서 모든 태그를 제거하고 텍스트만 들어 있는 문자열을 반환합니다. 

예를 들어, 하이퍼링크, 문단, 기타 태그가 여럿 들어 있는 텍스트 블록에 사용하면 태그 없는 텍스트만 남기 때문에, 가장 마지막에 원하는 텍스트를 얻을 때 사용하는 것이 좋습니다.

BeautifulSoup를 사용해서 웹페이지를 크롤링하다 보니, re도 많이 사용해야 하더군요. 그리고, 웹페이지 구조를 파악하는 것도 익숙해져야 하구요. 


가끔 웹페이지 크롤링한 예제를 올려보도록 하겠습니다. 

참고) https://www.crummy.com/software/BeautifulSoup/bs4/doc/




반응형
반응형

파이썬에서 CSV파일 읽고 쓰기

파이썬에서 파일로 된 데이터를 처리하는 일은 매우 빈번하게 일어난다. 그 중에서 CSV형태가 가장 일반적일 것이다.  

파이썬 공식 문서에는 CSV(Comma Separated Values)라 불리는 포멧은 스프레드시트와 데이터베이스에서 가장 많이 임포트(import)하고 엑스포트(export)하는 포멧이라고 정의되어 있다.

공식 문서에 나와 있는 CSV에 대해 간략히 정리해 보면 아래와 같다.

물론 앞으로 계속 발전하면서 업데이트 되겠지만 말이다.

'CSV 표준'이라는 것은 사실 없다고 할 수 있다. 즉, 이 포멧은 서로 다른 어플리케이션에서 읽고 쓰는 방식을 통해 기능적으로 미묘한 차이를 갖는다고 할 수 있다. 

이러한 차이점들은 다양한 소스들로부터 CSV 파일을 처리하는 것을 어렵게?(귀찮게) 만든다. 

하지만, 경계기호(delimiters)와 인용 부호가 다르더라도, 전체 포멧은 단일 모듈로 쓰거나 읽을 때 충분히 유사하게 동작하기 때문에 기본적으로 읽고 쓰는 것은 매우 유사하다고 생각한다. 

csv 모듈은 CSV 포멧에서 표 데이터를 읽고 쓰기 위한 클래스를 실행한다. 쉽게 말하자면, 엑셀에서 사용하는 스프레드시트 형태의 포멧으로 처리된다고 생각하면 된다.

csv 모듈의 reader와 writer 객체는 순차적으로 읽기와 쓰기를 행한다. 

또한, DictReader와 DictWriter 클래스를 사용해 딕셔너리 폼에서 데이터를 읽고 쓸 수 있다. 

그럼, reader와 writer, DictReader, DictWriter의 기본적인 사용법을 정리해 보자. (아래 예시는 파이썬 3.5이상을 기준으로 함)


1. csv.reader

>>> import csv

>>> with open('file.csv', 'r') as f:

               reader_csv = csv.reader(f, delimiter=',')

               for row in reader_csv:

                    print (row)


2. csv.writer

>>> import csv

>>> with open('file.csv', 'w') as f:

               writer = csv.writer(f, delimiter=',')

               writer.writerow(['love']*3 + ['banana'])

               writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])


3. csv.DictReader

>>> import csv

>>> with open('names.csv') as f:

               reader = csv.DictReader(f)

               for row in reader:

                    print(row['first_name'], row['last_name'])


4. csv.DictWriter

>>> import csv

>>> with open('names.csv, 'w') as f:

               fieldnames =['first_name', 'last_name']

               writer = csv.DictWriter(f, fieldnames=fieldnames)

               writer.writeheader()

               writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

               writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})

               writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})


참고) https://docs.python.org/3/library/csv.html


udacity에서 분석해 보았던 titanic-data.csv 파일, 읽고 쓰는게 문제가 아니라 각 필드별로 분석하는게 노가다... 





반응형

+ Recent posts