In [1]:
from __future__ import division, print_function
import numpy as np
import pandas as pd
from datetime import datetime as dt
아래 모양의 어레이를 생성하기 위해 reshape 함수를 이용한다.
In [2]:
a = np.arange(1, 12, 2)
b = a.reshape(3,2)
b
Out[2]:
추가로 아래 코드를 실행하자.
In [3]:
b[2,1] = 3
In [4]:
a
Out[4]:
(2) 위와 같은 현상이 발생하는 이유를 설명하라. (5점)
reshape 함수가 뷰 방식을 따르기 때문이다. 즉, 변수 b에 할당하는 어레이를 메모리를 실제로 조작하여 생성하지 않으면서 기존에 생성된 a에 할당된 어레이를 지켜보면서 필요한 정보만 얻어온다.
(3) 위와 같은 현상을 피하기 위해서는 어떻게 해야 하는지 설명하라. (5점)
아래와 같이 copy 함수를 이용해야 한다.
In [5]:
a = np.arange(1, 12, 2)
b = a.reshape(3,2).copy()
b[2,1] = 3
a
Out[5]:
아래 코드로 생성된 어레이를 이용하는 문제이다.
In [6]:
a = np.arange(6) + np.arange(0, 51, 10)[:, np.newaxis]
a
Out[6]:
a 어레이를 이용하여 예를 들어 아래 모양의 어레이를 생성할 수 있다.
In [7]:
a[2::2, :4:2]
Out[7]:
(1) a 어레이에 인덱싱과 슬라이싱을 이용하여 아래 모양의 어레이를 생성하라. (5점)
$$\left [ \begin{matrix} 20 & 21 & 22 \\ 40 & 41 & 42 \end{matrix} \right ]$$
In [8]:
a[2::2, :3]
Out[8]:
(2) a 어레이에 인덱싱과 슬라이싱을 이용하여 아래 모양의 어레이를 생성하라. (5점)
$$\left [ \begin{matrix} 5 & 15 & 25 & 35 & 45 & 55 \end{matrix} \right ]$$
In [9]:
a[:, 5]
Out[9]:
또는
In [10]:
a[:, 5:].flatten()
Out[10]:
주의: 아래는 다른 값이 나옴
In [11]:
a[5, :]
Out[11]:
(3) 마스크 인덱싱을 사용하여 아래 결과가 나오도록 하라. (10점)
array([ 0, 3, 12, 15, 21, 24, 30, 33, 42, 45, 51, 54])
In [12]:
mask = a % 3 == 0
a[mask]
Out[12]:
또는
In [13]:
a[a % 3 == 0]
Out[13]:
In [14]:
a[(1, 2, 3), (2, 3, 4)]
Out[14]:
(4) 정수 인덱싱을 사용하여 아래 모양의 어레이가 나오도록 하라. (10점)
$$\left [ \begin{matrix} 30 & 32 & 35 \\ 50 & 52 & 55 \end{matrix} \right ]$$
In [15]:
a[3::2, (0, 2, 5)]
Out[15]:
아래와 같이 할 수도 있다.
In [16]:
a[(3, 3, 3, 5, 5, 5), (0, 2, 5, 0, 2, 5)].reshape(2,3)
Out[16]:
또는
In [17]:
b = a[(3, 3, 3, 5, 5, 5), (0, 2, 5, 0, 2, 5)]
b.shape = (2, 3)
b
Out[17]:
아래는 다른 값을 나타냄.
In [18]:
a[[(3, 3, 3), (0, 2, 5)],
[(5, 5, 5), (0, 2, 5)]]
Out[18]:
오늘 사용할 데이터는 다음과 같다.
아래 그림은 미국의 주별 담배(식물) 판매 데이터를 담은 Weed_Price.csv 파일를 엑셀로 읽었을 때의 일부를 보여준다. 실제 데이터량은 22899개이며, 아래 그림에는 5개의 데이터만을 보여주고 있다.
|
(1) 아래 코드를 설명하라. (5점)
In [19]:
prices_pd = pd.read_csv("data/Weed_Price.csv", parse_dates=[-1])
datal 디렉토리에 저장되어 있는 Weed_Price.csv 파일을 불러온다. 단, par_dates=[-1]에 의해 날짜정보는 변형시키지 않은채 그대로 불러온다.
날짜 및 시간에 대한 정보를 일반적으로 시계열 자료형이라 하며 중요한 역할을 수행한다. 따라서 특별한 형식을 갖추도록 하는 게 중요한데 위 예제의 경우는 이미 표준형식으로 지정되어 있기에, 따로 변형을 가하지 않아도 된다.
In [20]:
prices_pd.head()
Out[20]:
(2) 아래 코드를 설명하라. (10점)
In [21]:
prices_pd.sort_values(['State', 'date'], inplace=True)
prices_pd 에 저장된 테이블을 State 이름과, date 날짜 순으로 정렬하라는 명령어이며, 정렬한 결과가 다시 prices_pd 변수에 할당된다.
주의: 먼저 State 기준으로 정렬한 후에, 각 주 별로 date 기준으로 정렬한다.
주의: pandas의 DataFrame 자료형은 가변(mutable)이며, inplace 키워드 인자값이 True 설정되었기에 기존의 테이블에 직접 수정을 가한다.
In [22]:
prices_pd.head()
Out[22]:
기존의 테이블을 수정하지 않은채로 다른 변수에 저장하려면 아래와 같이 실행한다.
prices_pd = pd.read_csv("data/Weed_Price.csv", parse_dates=[-1])
prices_pd_sorted = prices_pd.sort_values(['State', 'date'])
아래 문제의 답을 확인하기 전에 아래 결과를 기억해 두어야 한다.
In [23]:
prices_pd.tail()
Out[23]:
위 테이블은 정렬된 주별, 날짜별로 정리된 테이블의 마지막 5줄을 보여주고 있으며, LowQ 컬럼의 일부 값이 NaN, 즉 결측치로 처리되어 있음에 주의하라.
아래 문제는 그런 결측치를 다른 값으로 채우는 방식에 대해 다루고 있다.
(3) 아래 코드를 설명하라. (5점)
In [24]:
prices_pd.fillna(method='ffill', inplace=True)
테이블에 포함된 결측치(NaN 값)들을 ffill 방식으로 채운다.
아래 실행결과는 테이블의 마지작 5줄의 LowQ 컬럼의 값들이 161.3으로 채워졌는데 그 값이 위쪽 방향으로 가장 가까운 위치에 사용된 값이기 때문이다.
In [25]:
prices_pd.tail()
Out[25]:
(4) 아래 코드를 설명하라. (5점)
In [26]:
california_pd = prices_pd[prices_pd.State == "California"].copy(True)
마스트 인덱싱을 사용하여 주 이름이 California 인 행만 포함된 테이블을 california_pd 변수에 저장한다. 사용된 마스크는 다음과 같다.
prices_pd.State == "California"
주의: copy(True)를 사용하였기에 뷰 방식을 사용하지 않도록 하였다.
In [27]:
california_pd.head()
Out[27]:
(5) 아래 코드를 설명하라. (10점)
In [28]:
ca_sum = california_pd['HighQ'].sum()
ca_count = california_pd['HighQ'].count()
ca_sum / ca_count
Out[28]:
HighQ 컬럼에 포함된 값들의 평균값(mean)을 계산한 결과이다.
(6) 아래 코드를 설명하라. (10점)
In [29]:
def getYear(x):
return x.year
year_col = prices_pd.date.apply(getYear)
prices_pd["year"] = year_col
year_col은 prices_pd에 저장된 테이블의 date 컬럼에서 연도만을 추출한 결과를 Series 자료형으로 갖고 있다.
In [30]:
year_col.head()
Out[30]:
이제 year_col에 저장된 시리즈를 prices_pd 테이블에 year라는 컬럼으로 추가한다.
In [31]:
prices_pd.head()
Out[31]:
(7) 아래 코드를 설명하라. (10점)
In [32]:
price_ca14 = prices_pd[(prices_pd.State=="California") & \
(prices_pd.year==2014)].head()
마스크 인덱싱을 사용하여 California 주에서 2014년도에 거래된 정보들만 추출하여 price_ca14에 저장한다. 사용한 마스크는 다음과 같다.
(prices_pd.State=="California") & (prices_pd.year==2014)
주의: 처음 5줄만 저장된다. 또한 prices_pd에 저장된 테이블이 이전에 State 와 date 기준으로 정렬되어 있다. 따라서 포함된 5줄 모두 Alabama 주에서 2013년에 거래된 데이터이다.
In [33]:
price_ca14
Out[33]: