In [1]:
from __future__ import print_function, division

자료 안내: 여기서 다루는 내용은 아래 사이트의 내용을 참고하여 생성되었음.

https://github.com/rouseguy/intro2stats

안내사항

오늘 다루는 내용은 pandas 모듈의 소개 정도로 이해하고 넘어갈 것을 권장한다.

아래 내용은 엑셀의 스프레드시트지에 담긴 데이터를 분석하여 평균 등을 어떻게 구하는가를 알고 있다면 어렵지 않게 이해할 수 있는 내용이다. 즉, 넘파이의 어레이에 대한 기초지식과 엑셀에 대한 기초지식을 활용하면 내용을 기본적으로 이해할 수 있을 것이다.

좀 더 자세한 설명이 요구된다면 아래 사이트의 설명을 미리 읽으면 좋다(5.2절 내용까지면 충분함). 하지만, 아래 내용을 엑셀의 기능과 비교하면서 먼저 주욱 훑어 볼 것을 권장한다.

http://sinpong.tistory.com/category/Python%20for%20data%20analysis

평균(Average) 구하기

오늘의 주요 예제

미국에서 거래되는 담배(식물)의 도매가격 데이터를 분석하여, 거래된 도매가의 평균을 구한다.

  • 평균값(Mean)
  • 중앙값(Median)
  • 최빈값(Mode)

평균에 대한 보다 자세한 설명은 첨부된 강의노트 참조: GongSu21-Averages.pdf

사용하는 주요 모듈

아래는 통계분석에서 기본적으로 사용되는 모듈들이다.

  • pandas: 통계분석 전용 모듈
    • numpy 모듈을 바탕으로 하여 통계분석에 특화된 모듈임.
    • 마이크로소프트의 엑셀처럼 작동하는 기능을 지원함
  • datetime: 날짜와 시간을 적절하게 표시하도록 도와주는 기능을 지원하는 모듈
  • scipy: 수치계산, 공업수학 등을 지원하는 모듈

팬더스(Pandas) 소개

  • pandas란?
    • 빠르고 쉬운 데이터 분석 도구를 지원하는 파이썬 모듈
    • numpy를 기본적으로 활용함.
  • pandas의 기능
    • 데이터 정렬 등 다양한 연산 기능 지원
    • 강력한 색인 및 슬라이싱 기능
    • 시계열(time series) 기능 지원
    • 결측치(누락된 데이터) 처리
    • SQL과 같은 DB의 관계연산 기능 지원

주의: pandas 모듈의 기능에 대한 보다 자세한 설명은 다음 시간에 다룬다. 여기서는 pandas 모듈을 어떻게 활용하는지에 대한 감을 잡기만 하면 된다.


In [2]:
import numpy as np
import pandas as pd
from datetime import datetime as dt
from scipy import stats

데이터 불러오기 및 처리

오늘 사용할 데이터는 다음과 같다.

  • 미국 51개 주(State)별 담배(식물) 도매가격 및 판매일자: Weed_price.csv

아래 그림은 미국의 주별 담배(식물) 판매 데이터를 담은 Weed_Price.csv 파일를 엑셀로 읽었을 때의 일부를 보여준다. 실제 데이터량은 22899개이며, 아래 그림에는 5개의 데이터만을 보여주고 있다.

  • 주의: 1번줄은 테이블의 열별 목록(column names)을 담고 있다.
  • 열별 목록: State, HighQ, HighQN, MedQ, MedQN, LowQ, LowQN, date

csv 파일 불러오기

  • pandas 모듈의 read_csv 함수 활용
  • read_csv 함수의 리턴값은 DataFrame 이라는 특수한 자료형임
    • 엑셀의 위 그림 모양의 스프레드시트(spreadsheet)라고 생각하면 됨.

언급한 세 개의 csv 파일을 pandas의 read_csv 함수를 이용하여 불러들이자.

주의: Weed_Price.csv 파일을 불러들일 때, parse_dates라는 키워드 인자가 사용되었다.

  • parse_dates 키워드 인자: 날짜를 읽어들일 때 다양한 방식을 사용하도록 하는 기능을 갖고 있다.
    • 여기서 값을 [-1]로 준 것은 소스 데이터에 있는 날짜 데이터를 변경하지 말고 그대로 불러오라는 의미이다.
    • 위 엑셀파일에서 볼 수 있듯이, 마지막 열에 포함된 날짜표시는 굳이 변경을 요하지 않는다.

In [3]:
prices_pd = pd.read_csv("data/Weed_Price.csv", parse_dates=[-1])

read_csv 함수의 리턴값은 DataFrame 이라는 자료형이다.


In [4]:
type(prices_pd)


Out[4]:
pandas.core.frame.DataFrame

DataFrame 자료형

자세한 설명은 다음 시간에 추가될 것임. 우선은 아래 사이트를 참조할 수 있다는 정도만 언급함. (5.2절 내용까지면 충분함)

http://sinpong.tistory.com/category/Python%20for%20data%20analysis

DataFrame 자료형과 엑셀의 스프레드시트 비교하기

불러 들인 Weed_Price.csv 파일의 상위 다섯 줄을 확인해보면, 앞서 엑셀파일 그림에서 본 내용과 일치한다. 다만, 행과 열의 목록이 조금 다를 뿐이다.

  • 엑셀에서는 열 목록이 A, B, C, ..., H로 되어 있으며, 소스 파일의 열 목록은 1번 줄로 밀려 있다.
  • 엑셀에서의 행 목록은 1, 2, 3, ... 으로 되어 있다.

하지만 read_csv 파일은 좀 다르게 불러 들인다.

  • 열 목록은 소스 파일의 열 목록을 그대로 사용한다.
  • 행 목록은 0, 1, 2, ... 으로 되어 있다.

데이터 파일의 상위 몇 줄을 불러들이기 위해서는 DataFrame 자료형의 head 메소드를 활용한다. 인자값을 주지 않으면 상위 5줄을 보여준다.


In [5]:
prices_pd.head()


Out[5]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
0 Alabama 339.06 1042 198.64 933 149.49 123 2014-01-01
1 Alaska 288.75 252 260.60 297 388.58 26 2014-01-01
2 Arizona 303.31 1941 209.35 1625 189.45 222 2014-01-01
3 Arkansas 361.85 576 185.62 544 125.87 112 2014-01-01
4 California 248.78 12096 193.56 12812 192.92 778 2014-01-01

인자를 주면 원하는 만큼 보여준다.


In [6]:
prices_pd.head(10)


Out[6]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
0 Alabama 339.06 1042 198.64 933 149.49 123 2014-01-01
1 Alaska 288.75 252 260.60 297 388.58 26 2014-01-01
2 Arizona 303.31 1941 209.35 1625 189.45 222 2014-01-01
3 Arkansas 361.85 576 185.62 544 125.87 112 2014-01-01
4 California 248.78 12096 193.56 12812 192.92 778 2014-01-01
5 Colorado 236.31 2161 195.29 1728 213.50 128 2014-01-01
6 Connecticut 347.90 1294 273.97 1316 257.36 91 2014-01-01
7 Delaware 373.18 347 226.25 273 199.88 34 2014-01-01
8 District of Columbia 352.26 433 295.67 349 213.72 39 2014-01-01
9 Florida 306.43 6506 220.03 5237 158.26 514 2014-01-01

파일이 매우 많은 수의 데이터를 포함하고 있을 경우, 맨 뒷쪽 부분을 확인하고 싶으면 tail 메소드를 활용한다. 사용법은 head 메소드와 동일하다.

아래 명령어를 통해 Weed_Price.csv 파일에 22899개의 데이터가 저장되어 있음을 확인할 수 있다.


In [7]:
prices_pd.tail()


Out[7]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
22894 Virginia 364.98 3513 293.12 3079 NaN 284 2014-12-31
22895 Washington 233.05 3337 189.92 3562 NaN 160 2014-12-31
22896 West Virginia 359.35 551 224.03 545 NaN 60 2014-12-31
22897 Wisconsin 350.52 2244 272.71 2221 NaN 167 2014-12-31
22898 Wyoming 322.27 131 351.86 197 NaN 12 2014-12-31

결측치 존재 여부

위 결과를 보면 LowQ 목록에 NaN 이라는 기호가 포함되어 있다. NaN은 Not a Number, 즉, 숫자가 아니다라는 의미이며, 데이터가 애초부터 존재하지 않았거나 누락되었음을 의미한다.

DataFrame의 dtypes

DataFrame 자료형의 dtypes 속성을 이용하면 열별 목록에 사용된 자료형을 확인할 수 있다.

Weed_Price.csv 파일을 읽어 들인 prices_pd 변수에 저장된 DataFrame 값의 열별 목록에 사용된 자료형을 보여준다.

주의:

  • numpy의 array 자료형의 dtype 속성은 하나의 자료형만을 담고 있다.
  • 열별 목록에는 하나의 자료형 값들만 올 수 있다. 즉, 열 하나하나가 넘파이의 array에 해당한다고 볼 수 있다.
  • State 목록에 사용된 object 라는 dtype은 문자열이 저장된 위치를 가리키는 포인터를 의미한다.
    • 문자열의 길이를 제한할 수 없기 때문에 문자열을 어딘가에 저장하고 포인터가 그 위치를 가리키며, 필요에 따라 포인터 정보를 이용하여 저장된 문자열을 확인한다.
  • 마지막 줄에 표시된 "dtype: object"의 의미는 복잡한 데이터들의 자료형이라는 의미로 이해하면 됨.

In [8]:
prices_pd.dtypes


Out[8]:
State             object
HighQ            float64
HighQN             int64
MedQ             float64
MedQN              int64
LowQ             float64
LowQN              int64
date      datetime64[ns]
dtype: object

정렬 및 결측치 채우기

정렬하기

주별로, 날짜별로 데이터를 정렬한다.


In [9]:
prices_pd.sort_values(['State', 'date'], inplace=True)

결측치 채우기

평균을 구하기 위해서는 결측치(누락된 데이터)가 없어야 한다. 여기서는 이전 줄의 데이터를 이용하여 채우는 방식(method='ffill')을 이용한다.

주의: 앞서 정렬을 먼저 한 이유는, 결측치가 있을 경우 가능하면 동일한 주(State), 비슷한 시점에서 거래된 가격을 사용하고자 함이다.


In [10]:
prices_pd.fillna(method='ffill', inplace=True)

정렬된 데이터의 첫 부분은 아래와 같이 알라바마(Alabama) 주의 데이터만 날짜별로 순서대로 보인다.


In [11]:
prices_pd.head()


Out[11]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
20094 Alabama 339.65 1033 198.04 926 147.15 122 2013-12-27
20859 Alabama 339.65 1033 198.04 926 147.15 122 2013-12-28
21573 Alabama 339.75 1036 198.26 929 149.49 123 2013-12-29
22287 Alabama 339.75 1036 198.81 930 149.49 123 2013-12-30
22797 Alabama 339.42 1040 198.68 932 149.49 123 2013-12-31

정렬된 데이터의 끝 부분은 아래와 같이 요밍(Wyoming) 주의 데이터만 날짜별로 순서대로 보인다. 이제 결측치가 더 이상 존재하지 않는다.


In [12]:
prices_pd.tail()


Out[12]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
4997 Wyoming 313.72 148 317.38 226 161.3 13 2015-06-07
5762 Wyoming 313.72 148 317.38 226 161.3 13 2015-06-08
6527 Wyoming 313.72 148 317.38 226 161.3 13 2015-06-09
7343 Wyoming 313.72 148 317.38 226 161.3 13 2015-06-10
8159 Wyoming 313.72 148 317.38 226 161.3 13 2015-06-11

데이터 분석하기: 평균(Average)

캘리포니아 주를 대상으로해서 담배(식물) 도매가의 평균(average)을 구해본다.

평균값(Mean)

  • 평균값 = 모든 값들의 합을 값들의 개수로 나누기
    • $X$: 데이터에 포함된 값들을 대변하는 변수
    • $n$: 데이터에 포함된 값들의 개수
    • $\Sigma\, X$: 데이터에 포함된 모든 값들의 합
$$\text{평균값}(\mu) = \frac{\Sigma\, X}{n}$$

먼저 마스크 인덱스를 이용하여 캘리포니아 주의 데이터만 추출해야 한다.


In [13]:
california_pd = prices_pd[prices_pd.State == "California"].copy(True)

캘리포니아 주에서 거래된 첫 5개의 데이터를 확인해보자.


In [14]:
california_pd.head(20)


Out[14]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
20098 California 248.77 12021 193.44 12724 193.88 770 2013-12-27
20863 California 248.74 12025 193.44 12728 193.88 770 2013-12-28
21577 California 248.76 12047 193.55 12760 193.60 772 2013-12-29
22291 California 248.82 12065 193.54 12779 193.80 773 2013-12-30
22801 California 248.76 12082 193.54 12792 193.80 773 2013-12-31
4 California 248.78 12096 193.56 12812 192.92 778 2014-01-01
769 California 248.67 12125 193.56 12836 192.80 779 2014-01-02
1483 California 248.67 12141 193.57 12853 192.67 782 2014-01-03
2248 California 248.65 12155 193.59 12884 192.67 782 2014-01-04
3013 California 248.68 12176 193.63 12902 192.67 782 2014-01-05
3778 California 248.68 12189 193.57 12918 192.79 783 2014-01-06
4543 California 248.64 12212 193.51 12945 192.91 784 2014-01-07
5308 California 248.63 12243 193.53 12955 192.91 784 2014-01-08
6073 California 248.58 12256 193.54 12980 192.89 785 2014-01-09
6838 California 248.56 12270 193.50 13001 192.67 786 2014-01-10
7654 California 248.54 12278 193.50 13013 192.67 786 2014-01-11
8470 California 248.47 12289 193.51 13025 192.88 788 2014-01-12
9235 California 248.45 12301 193.46 13039 192.88 788 2014-01-13
10000 California 248.41 12312 193.39 13059 192.88 788 2014-01-14
10765 California 248.48 12326 193.38 13080 192.88 789 2014-01-15

HighQ 열 목록에 있는 값들의 총합을 구해보자.

주의: sum() 메소드 활용을 기억한다.


In [15]:
ca_sum = california_pd['HighQ'].sum()
ca_sum


Out[15]:
110173.87999999998

HighQ 열 목록에 있는 값들의 개수를 확인해보자.

주의: count() 메소드 활용을 기억한다.


In [16]:
ca_count = california_pd['HighQ'].count()
ca_count


Out[16]:
449

이제 캘리포니아 주에서 거래된 HighQ의 담배가격의 평균값을 구할 수 있다.


In [17]:
# 캘리포니아 주에서 거래된 상품(HighQ) 담배(식물) 도매가의 평균값
ca_mean = ca_sum / ca_count
ca_mean


Out[17]:
245.3761247216035

중앙값(Median)

캘리포니아 주에서 거래된 HighQ의 담배가격의 중앙값을 구하자.

  • 중앙값 = 데이터를 크기 순으로 정렬하였을 때 가장 가운데에 위치한 수
    • 데이터의 크기 n이 홀수일 때: $\frac{n+1}{2}$번 째 위치한 데이터
    • 데이터의 크기 n이 짝수일 때: $\frac{n}{2}$번 째와 $\frac{n}{2}+1$번 째에 위치한 데이터들의 평균값

여기서는 데이터의 크기가 449로 홀수이다.


In [18]:
ca_count


Out[18]:
449

따라서 중앙값은 $\frac{\text{ca_count}-1}{2}$번째에 위치한 값이다.

주의: 인덱스는 0부터 출발한다. 따라서 중앙값이 하나 앞으로 당겨진다.


In [19]:
ca_highq_pd = california_pd.sort_values(['HighQ'])
ca_highq_pd.head()


Out[19]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
19027 California 241.84 18419 187.90 21965 188.6 1229 2015-05-26
19741 California 241.85 18450 187.90 21993 188.6 1231 2015-05-27
8011 California 241.87 18066 188.86 21561 188.6 1212 2015-05-11
8827 California 241.87 18073 188.89 21584 188.6 1213 2015-05-12
18313 California 241.88 18398 187.85 21949 188.6 1228 2015-05-25

인덱스 로케이션 함수인 iloc 함수를 활용한다.

주의: iloc 메소드는 인덱스 번호를 사용한다. 위 표에서 보여주는 인덱스 번호는 Weed_Price.csv 파일을 처음 불러왔을 때 사용된 인덱스 번호이다. 하지만 ca_high_pd 에서는 참고사항으로 사용될 뿐이며, iloc 함수에 인자로 들어가는 인덱스는 다시 0부터 세는 것으로 시작한다. 따라서 아래 코드처럼 기존의 참고용 인덱스를 사용하면 옳은 답을 구할 수 없다.


In [20]:
# 캘리포니아에서 거래된 상품(HighQ) 담배(식물) 도매가의 중앙값
ca_median = ca_highq_pd.HighQ.iloc[int((ca_count-1)/ 2)]
ca_median


Out[20]:
245.31

최빈값(Mode)

캘리포니아 주에서 거래된 HighQ의 담배가격의 최빈값을 구하자.

  • 최빈값 = 가장 자주 발생한 데이터

주의: value_counts() 메소드 활용을 기억한다.


In [21]:
# 캘리포니아 주에서 가장 빈번하게 거래된 상품(HighQ) 담배(식물)의 도매가
ca_mode = ca_highq_pd.HighQ.value_counts().index[0]
ca_mode


Out[21]:
245.05000000000001

연습문제

연습

지금까지 구한 평균값, 중앙값, 최빈값을 구하는 함수가 이미 DataFrame과 Series 자료형의 메소드로 구현되어 있다.

아래 코드들을 실행하면서 각각의 코드의 의미를 확인하라.


In [22]:
california_pd.mean()


Out[22]:
HighQ       245.376125
HighQN    14947.073497
MedQ        191.268909
MedQN     16769.821826
LowQ        189.783586
LowQN       976.298441
dtype: float64

In [23]:
california_pd.mean().HighQ


Out[23]:
245.3761247216035

In [24]:
california_pd.median()


Out[24]:
HighQ       245.31
HighQN    15037.00
MedQ        191.57
MedQN     16793.00
LowQ        188.60
LowQN       982.00
dtype: float64

In [25]:
california_pd.mode()


Out[25]:
State HighQ HighQN MedQ MedQN LowQ LowQN date
0 California 245.03 18462.0 192.93 22012.0 188.6 998.0 2013-12-27
1 NaN 245.05 18466.0 NaN 22016.0 NaN NaN 2013-12-28
2 NaN NaN 18468.0 NaN 22025.0 NaN NaN 2013-12-29
3 NaN NaN 18491.0 NaN NaN NaN NaN 2013-12-30
4 NaN NaN NaN NaN NaN NaN NaN 2013-12-31
5 NaN NaN NaN NaN NaN NaN NaN 2014-01-01
6 NaN NaN NaN NaN NaN NaN NaN 2014-01-02
7 NaN NaN NaN NaN NaN NaN NaN 2014-01-03
8 NaN NaN NaN NaN NaN NaN NaN 2014-01-04
9 NaN NaN NaN NaN NaN NaN NaN 2014-01-05
10 NaN NaN NaN NaN NaN NaN NaN 2014-01-06
11 NaN NaN NaN NaN NaN NaN NaN 2014-01-07
12 NaN NaN NaN NaN NaN NaN NaN 2014-01-08
13 NaN NaN NaN NaN NaN NaN NaN 2014-01-09
14 NaN NaN NaN NaN NaN NaN NaN 2014-01-10
15 NaN NaN NaN NaN NaN NaN NaN 2014-01-11
16 NaN NaN NaN NaN NaN NaN NaN 2014-01-12
17 NaN NaN NaN NaN NaN NaN NaN 2014-01-13
18 NaN NaN NaN NaN NaN NaN NaN 2014-01-14
19 NaN NaN NaN NaN NaN NaN NaN 2014-01-15
20 NaN NaN NaN NaN NaN NaN NaN 2014-01-16
21 NaN NaN NaN NaN NaN NaN NaN 2014-01-17
22 NaN NaN NaN NaN NaN NaN NaN 2014-01-18
23 NaN NaN NaN NaN NaN NaN NaN 2014-01-19
24 NaN NaN NaN NaN NaN NaN NaN 2014-01-20
25 NaN NaN NaN NaN NaN NaN NaN 2014-01-21
26 NaN NaN NaN NaN NaN NaN NaN 2014-01-22
27 NaN NaN NaN NaN NaN NaN NaN 2014-01-23
28 NaN NaN NaN NaN NaN NaN NaN 2014-01-24
29 NaN NaN NaN NaN NaN NaN NaN 2014-01-25
... ... ... ... ... ... ... ... ...
419 NaN NaN NaN NaN NaN NaN NaN 2015-05-13
420 NaN NaN NaN NaN NaN NaN NaN 2015-05-14
421 NaN NaN NaN NaN NaN NaN NaN 2015-05-15
422 NaN NaN NaN NaN NaN NaN NaN 2015-05-16
423 NaN NaN NaN NaN NaN NaN NaN 2015-05-17
424 NaN NaN NaN NaN NaN NaN NaN 2015-05-18
425 NaN NaN NaN NaN NaN NaN NaN 2015-05-19
426 NaN NaN NaN NaN NaN NaN NaN 2015-05-20
427 NaN NaN NaN NaN NaN NaN NaN 2015-05-21
428 NaN NaN NaN NaN NaN NaN NaN 2015-05-22
429 NaN NaN NaN NaN NaN NaN NaN 2015-05-23
430 NaN NaN NaN NaN NaN NaN NaN 2015-05-24
431 NaN NaN NaN NaN NaN NaN NaN 2015-05-25
432 NaN NaN NaN NaN NaN NaN NaN 2015-05-26
433 NaN NaN NaN NaN NaN NaN NaN 2015-05-27
434 NaN NaN NaN NaN NaN NaN NaN 2015-05-28
435 NaN NaN NaN NaN NaN NaN NaN 2015-05-29
436 NaN NaN NaN NaN NaN NaN NaN 2015-05-30
437 NaN NaN NaN NaN NaN NaN NaN 2015-05-31
438 NaN NaN NaN NaN NaN NaN NaN 2015-06-01
439 NaN NaN NaN NaN NaN NaN NaN 2015-06-02
440 NaN NaN NaN NaN NaN NaN NaN 2015-06-03
441 NaN NaN NaN NaN NaN NaN NaN 2015-06-04
442 NaN NaN NaN NaN NaN NaN NaN 2015-06-05
443 NaN NaN NaN NaN NaN NaN NaN 2015-06-06
444 NaN NaN NaN NaN NaN NaN NaN 2015-06-07
445 NaN NaN NaN NaN NaN NaN NaN 2015-06-08
446 NaN NaN NaN NaN NaN NaN NaN 2015-06-09
447 NaN NaN NaN NaN NaN NaN NaN 2015-06-10
448 NaN NaN NaN NaN NaN NaN NaN 2015-06-11

449 rows × 8 columns


In [26]:
california_pd.mode().HighQ


Out[26]:
0      245.03
1      245.05
2         NaN
3         NaN
4         NaN
5         NaN
6         NaN
7         NaN
8         NaN
9         NaN
10        NaN
11        NaN
12        NaN
13        NaN
14        NaN
15        NaN
16        NaN
17        NaN
18        NaN
19        NaN
20        NaN
21        NaN
22        NaN
23        NaN
24        NaN
25        NaN
26        NaN
27        NaN
28        NaN
29        NaN
        ...  
419       NaN
420       NaN
421       NaN
422       NaN
423       NaN
424       NaN
425       NaN
426       NaN
427       NaN
428       NaN
429       NaN
430       NaN
431       NaN
432       NaN
433       NaN
434       NaN
435       NaN
436       NaN
437       NaN
438       NaN
439       NaN
440       NaN
441       NaN
442       NaN
443       NaN
444       NaN
445       NaN
446       NaN
447       NaN
448       NaN
Name: HighQ, Length: 449, dtype: float64

In [27]:
california_pd.HighQ.mean()


Out[27]:
245.3761247216035

In [28]:
california_pd.HighQ.median()


Out[28]:
245.31

In [29]:
california_pd.HighQ.mode()


Out[29]:
0    245.03
1    245.05
dtype: float64

연습

캘리포니아 주에서 2013년, 2014년, 2015년에 거래된 HighQ의 담배(식물) 도매가격의 평균을 각각 구하라.

힌트: california_pd.iloc[0]['date'].year

견본답안1

2014년에 거래된 도매가의 평균값을 아래와 같이 계산할 수 있다.

  • sum 변수: 2014년도에 거래된 도매가의 총합을 담는다.
  • count 변수: 2014년도의 거래 횟수를 담는다.

In [30]:
sum = 0
count = 0

for index in np.arange(len(california_pd)):
    if california_pd.iloc[index]['date'].year == 2014:
        sum += california_pd.iloc[index]['HighQ']
        count += 1
sum/count


Out[30]:
245.8942307692308

견본답안2

아래와 같은 방식을 이용하여 인덱스 정보를 구하여 슬라이싱 기능을 활용할 수도 있다. 슬라이싱을 활용하여 연도별 평균을 구하는 방식은 본문 내용과 동일한 방식을 따른다.


In [31]:
years = np.arange(2013, 2016)
year_starts = [0]

for yr in years:
    for index in np.arange(year_starts[-1], len(california_pd)):
        if california_pd.iloc[index]['date'].year == yr:
            continue
        else:
            year_starts.append(index)
            break

year_starts


Out[31]:
[0, 5, 369]

year_starts에 담긴 숫자들의 의미는 다음과 같다.

  • 0번줄부터 2013년도 거래가 표시된다.

  • 5번줄부터 2014년도 거래가 표시된다.

  • 369번줄부터 2015년도 거래가 표시된다.


In [32]:
california_pd.iloc[4]


Out[32]:
State              California
HighQ                  248.76
HighQN                  12082
MedQ                   193.54
MedQN                   12792
LowQ                    193.8
LowQN                     773
date      2013-12-31 00:00:00
Name: 22801, dtype: object

In [33]:
california_pd.iloc[5]


Out[33]:
State              California
HighQ                  248.78
HighQN                  12096
MedQ                   193.56
MedQN                   12812
LowQ                   192.92
LowQN                     778
date      2014-01-01 00:00:00
Name: 4, dtype: object

In [34]:
california_pd.iloc[368]


Out[34]:
State              California
HighQ                  243.96
HighQN                  16501
MedQ                   189.38
MedQN                   19140
LowQ                    188.6
LowQN                    1094
date      2014-12-31 00:00:00
Name: 22852, dtype: object

In [35]:
california_pd.iloc[369]


Out[35]:
State              California
HighQ                  243.96
HighQN                  16512
MedQ                   189.35
MedQN                   19151
LowQ                    188.6
LowQN                    1096
date      2015-01-01 00:00:00
Name: 55, dtype: object