ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 12-2 사례별 시계열 데이터 계산하기_1
    Do it! 판다스 입문 2022. 6. 26. 18:17

    에볼라 최초 발병일 계산하기

    1. ebola 데이터프레임의 마지막 행과 열을 5개씩만 살펴보겠습니다. ebola 데이터프레임은 데이터가 시간 역순으로 정렬되어 있습니다. 즉, 시간 순으로 데이터를 살펴보려면 데이터프레임의 마지막부터 살펴봐야 합니다.

    print(ebola.iloc[-5:, :5])

                      Date    Day    Cases_Guinea    Cases_Liberia    Cases_SierraLeone
    117    3/27/2014        5                   103.0                      8.0                               6.0
    118    3/26/2014        4                     86.0                    NaN                             NaN
    119    3/25/2014        3                     86.0                    NaN                             NaN
    120    3/24/2014        2                     86.0                    NaN                             NaN
    121    3/22/2014        0                     49.0                    NaN                             NaN

     

    2. 121행에서 볼 수 있듯이 에볼라가 발생하기 시작한 날은 2014년 03월 22일입니다. 다음은 min 메서드를 사용하여 에볼라의 최초 발병일을 찾은 것입니다.

    print(ebola['date_dt'].min( ))
    print(type(ebola['date_dt'].min( )))

    2014-03-22 00:00:00
    <class 'pandas._libs.tslibs.timestamps.Timestamp'>

     

    3. 에볼라의 최초 발병일을 알아냈으니 Date 열에서 에볼라의 최초 발병일을 빼면 에볼라의 진행 정도를 알 수 있습니다.

    ebola['outbreak_d'] = ebola['date_dt'] - ebola['date_dt'].min( )

    print(ebola[['Date', 'Day', 'outbreak_d']].head( ))

                    Date    Day    outbreak_D
    0        1/5/2015    289        289 days
    1        1/4/2015    288        288 days
    2        1/3/2015    287        287 days
    3        1/2/2015    286        286 days
    4    12/31/2014    284        284 days

     

     

     

    파산한 은행의 개수 계산하기

    이번에는 파산한 은행 데이터를 불러와 분기별로 파산한 은행이 얼마나 되는지 계산해 보겠습니다. 그리고 이번에는 그래프로도 시각화해 보겠습니다.

     

    1. 다음은 파산한 은행 데이터 집합을 불러온 것입니다. banks 데이터프레임의 앞부분을 살펴보면 Closing Date, Updated Date 열의 데이터 자료형이 시계열 데이터라는 것을 알 수 있습니다.

    banks = pd.read_csv('../data/banklist.csv')
    print(banks.head( ))

                                                                         Bank Name                  City     ST    CERT    \
    0                          Washington Federal Bank for Savings           Chicago      IL    30570
    1     The Farmers and Merchants State Bank of Argonia            Argonia    KS    17719
    2                                                    Fayette County Bank       Saint Elmo      IL      1802
    3    Guaranty Bank, (d/b/a BestBank in Georgia & Mi. . .       Milwaukee    WI    30003
    4                                                             First NBC Bank    New Orleans    LA    58302

                         Acquiring Institution               Closing Date   Updated Date
    0                               Royal Savings Bank      15-Dec-17        20-Dec-17
    1                                         Conway Bank      13-Oct-17         20-Oct-17
    2                         United Fidelity Bank fsb      26-May-17         26-Jul-17
    3    First-Citizens Bank & Trust Company        5-May-17         26-Jul-17
    4                                         Whitney Bank       28-Apr-17         5-Dec-17

     

    2. Closing Date, Updated Date 열의 데이터 자료형은 문자열입니다. 다음은 read_csv 메서드의 parse_dates 속성을 이용하여 문자열로 저장된 두 열을 datetime 오브젝트로 변환하여 불러온 것입니다.

    banks_no_dates = pd.read_csv('../data/banklist.csv')
    print(banks_no_dates.info( ))

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 555 entries, 0 to 554
    Data columns (total 7 columns):
    Bank Name                    555 non-null object
    ...
    Closing Date                  555 non-null object
    Updated Date                555 non-null object
    dtypes: int64(1), object(6)
    memory usage: 30.4+ KB
    None

    banks = pd.read_csv('../data/banklist.csv', parse_dates=[5, 6])
    print(banks.info( ))

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 555 entries, 0 to 554
    Data columns (total 7 columns):
    Bank Name                    555 non-null object
    ...
    Closing Date                 555 non-null datetime64[ns]
    Updated Date                555 non-null datetime64[ns]
    dtypes: datetime64[ns](2), int64(1), object(4)
    memory usage: 30.4+ KB
    None

     

    3. dt 접근자와 quarter 속성을 이용하면 은행이 파산한 분기를 알 수 있습니다. 다음은 dt 접근자와 year, quarter 속성을 이용하여 은행이 파산한 연도, 분기를 새로운 열로 추가한 것입니다.

    banks['closing_quarter'], banks['closing_year'] = (banks['Closing Date'].dt.quarter, banks['Closing Date'].dt.year)

    print(banks.head( ))

                                                                         Bank Name                  City     ST    CERT    \
    0                          Washington Federal Bank for Savings           Chicago      IL    30570
    1     The Farmers and Merchants State Bank of Argonia            Argonia    KS    17719
    2                                                    Fayette County Bank       Saint Elmo      IL      1802
    3    Guaranty Bank, (d/b/a BestBank in Georgia & Mi. . .       Milwaukee    WI    30003
    4                                                             First NBC Bank    New Orleans    LA    58302

                                      Acquiring Institution   Closing Date   Updated Date
    0                               Royal Savings Bank     2017-12-15       2017-12-20   
    1                                         Conway Bank     2017-10-13       2017-10-20
    2                         United Fidelity Bank fsb      2017-05-26      2017-07-26
    3    First-Citizens Bank & Trust Company     2017-05-05       2017-07-26
    4                                         Whitney Bank     2017-04-28       2017-12-05

         closing_quarter    closing_year
    0                           4                   2017
    1                           4                   2017
    2                           2                   2017
    3                           2                   2017
    4                           2                   2017

     

    4. 이제 연도별로 파산한 은행이 얼마나 되는지 알아볼까요? groupby 메서드를 사용하면 연도별로 파산한 은행의 개수를 구할 수 있습니다.

    closing_year = banks.groupby(['closing_year']).size( )
    print(closing_year)

    closing_year
    2000         2
    2001         4
    2002        11
    2003         3
    ...
    2014       18
    2015         8
    2016         5
    2017         8
    dtype: int64

     

    5. 각 연도별, 분기별로 파산한 은행의 개수도 알아보겠습니다. 다음은 banks 데이터프레임을 연도별로 그룹화한 다음 다시 분기별로 그룹화하여 출력한 것입니다.

    closing_year_q = banks.groupby(['closing_year', 'closing_quarter']).size( )
    print(closing_year_q)

    closing_year   closing_quarter
    2000               4                        2
    2001               1                        1
                           2                        1
                           3                        2
    2002               1                        6
                           2                        2
                           3                        1
                           4                        2
    2003               1                        1
                           2                        1
                           4                        1
    ...
    2017               1                        3
                           2                        3
                           4                        2
    dtype: int64

     

    6. 다음은 과정 5에서 얻은 값으로 그래프를 그린 것입니다.

    import matplotlib.pyplot as plt

    fig, ax = plt.subplots( )
    ax = closing_year.plot( )
    plt.show( )

    fig, ax = plt.subplots( )
    ax = closing_year_q.plot( )
    plt.show( )

     

     

     

    테슬라 주식 데이터로 시간 계산하기

    이번에는 pandas-datareader 라이브러리를 이용하여 주식 데이터를 불러오겠습니다. 이 라이브러리는 지금까지 설치한 적이 없는 라이브러리입니다. 다음을 아나콘다 프롬프트에 입력하여 pandas-datareader 라이브러리를 설치하세요.

    pip install pandas-datareader

     

    1. 다음은 get_data_quanal 메서드에 TSLA라는 문자열을 전달하여 테슬라의 주식 데이터를 내려받은 다음 to_csv 메서드를 사용하여 data 폴더 안에 'tesla_stock_quandl.csv'라는 이름으로 저장한 것입니다.

    pd.core.common.is_list_like = pd.api.types.is_list_like
    import pandas_datareader as pdr

    # tesla에는 데이터프레임이 저장됩니다.
    tesla = pdr.get_data_quandl('TSLA', api_key = '받은 key')
    (https://www/quandl.com에 가입하여 접속 api_key를 생성하여 받은 key에 입력하세요.)

    # tesla에 저장된 데이터프레임을 파일로 저장합니다.
    tesla.to_csv('../data/tesla_stock_quandl.csv')

     

    2. tesla 데이터프레임의 Date 열은 문자열로 저장되어 있습니다. 즉, datetime 오브젝트로 자료형을 변환해야 시간 계산을 할 수 있습니다.

    print(tesla.head( ))

                            Open      High       Low     Close         Volume    ExDividend  \
    Date                                                                 
    2018-03-27   304.00   304.27   277.18   279.18   13696168.0               0.0   
    2018-03-26   307.34   307.59   291.36   304.18    8324639.0               0.0   
    2018-03-23   311.25   311.61   300.45   301.54    6600538.0               0.0   
    2018-03-22   313.89   318.82   308.18   309.10    4914307.0               0.0   
    2018-03-21   310.25   322.44   310.19   316.53    5927881.0               0.0   
      
                     SplitRatio   AdjOpen   AdjHigh   AdjLow   AdjClose     AdjVolume  
    Date                                                                    
    2018-03-27         1.0     304.00     304.27    277.18      279.18   13696168.0  
    2018-03-26         1.0     307.34     307.59    291.36      304.18    8324639.0  
    2018-03-23         1.0     311.25     311.61    300.45      301.54    6600538.0  
    2018-03-22         1.0     313.89     318.82    308.18      309.10    4914307.0  
    2018-03-21         1.0     310.25     322.44    310.19      316.53    5927881.0 

     

    3. Date 열을 Datetime 형으로 변환하려면 read_csv 메서드로 데이터 집합(tesla_stock_quandl.csv)을 불러올 때 parse_dates 인자에 Date 열을 전달하면 됩니다.

    tesla = pd.read_csv('../data/tesla_stock_quandl.csv', parse_dates=[0])
    print(tesla.info())

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1949 entries, 0 to 1948
    Data columns (total 13 columns):
    Date              1949 non-null datetime64[ns]
    ...
    AdjVolume     1949 non-null float64
    dtypes: datetime64[ns](1), float64(12)
    memory usage: 198.0 KB
    None

     

    4. Date 열의 자료형인 datetime 오브젝트로 변환되었습니다. 이제 dt 접근자를 사용할 수 있습니다. 다음은 불린 추출로 2010년 6월이ㅡ 데이터만 추출한 것입니다.

    print(tesla.loc[(tesla.Date.dt.year == 2010) & (tesla.Date.dt.month == 6)])

                          Date   Open        High      Low   Close         Volume   ExDividend     \
    1947   2010-06-30   25.79   30.4192   23.30   23.83   17187100.0               0.0   
    1948   2010-06-29   19.00   25.0000   17.54   23.89   18766300.0               0.0   

                SplitRatio   AdjOpen    AdjHigh   AdjLow   AdjClose     AdjVolume  
    1947              1.0        25.79    30.4192     23.30        23.83   17187100.0  
    1948              1.0        19.00    25.0000     17.54        23.89   18766300.0

     

     

     

     

     

    datetime 오브젝트와 인덱스 - DatetimeIndex

    지금까지의 실습은 대부분 데이터프레임의 행 번호를 인덱스로 사용했지만 datetime 오브젝트를 데이터프레임의 인덱스로 설정하면 원하는 시간의 데이터를 바로 추출할 수 있어 편리합니다. 이번에는 datetime 오브젝트를 인덱스로 지정하는 방법에 대해 알아보겠습니다.

     

     

    datetime 오브젝트를 인덱스로 설정해 데이터 추출하기

    1. 계속해서 테슬라 주식 데이터를 사용하여 실습을 진행하겠습니다. 다음은 Date 열을 tesla 데이터프레임의 인덱스로 지정한 것입니다.

    tesla.index = tesla['Date'] 
    print(tesla.index)

    DatetimeIndex(['2018-03-27', '2018-03-26', '2018-03-23', '2018-03-22',
                   '2018-03-21', '2018-03-20', '2018-03-19', '2018-03-16',
                   '2018-03-15', '2018-03-14',
                   ...
                   '2010-07-13', '2010-07-12', '2010-07-09', '2010-07-08',
                   '2010-07-07', '2010-07-06', '2010-07-02', '2010-07-01',
                   '2010-06-30', '2010-06-29'],
                  dtype='datetime64[ns]', name='Date', length=1949, freq=None)

     

    2. datetime 오브젝트를 인덱스로 지정하면 다음과 같은 방법으로 원하는 시간의 데이터를 바로 추출할 수 있습니다. 다음은 2015년의 데이터를 추출한 것입니다.

    print(tesla['2015'].iloc[:5, :5])

                                   Date      Open          High            Low     Close
    Date                                                    
    2015-12-31  2015-12-31    238.51    243.450    238.3700    240.01
    2015-12-30  2015-12-30    236.60    243.634    235.6707    238.09
    2015-12-29  2015-12-29    230.06    237.720    229.5470    237.19
    2015-12-28  2015-12-28    231.49    231.980    225.5400    228.95
    2015-12-24  2015-12-24    230.56    231.880    228.2800    230.57

     

    3. 다음은 2010년 6월의 데이터를 추출한 것입니다.

    print(tesla['2010-06'].iloc[:, :5])

                                   Date    Open          High      Low  Close
    Date                                               
    2010-06-30  2010-06-30    25.79    30.4192    23.30  23.83
    2010-06-29  2010-06-29    19.00    25.0000    17.54  23.89

     

     

     

     

     

    시간 간격과 인덱스 - TimedeltaIndex

    예를 들어 주식 데이터에서 최초 5일간 수집된 데이터만 살펴보고 싶다면 어떻게 해야 할까요? 이런 경우에는 시간 간격을 인덱스로 지정하여 데이터를 추출하면 됩니다. 이번에는 datetime 오브젝트를 인덱스로 지정하는 것이 아니라 시간 간격을 인덱스로 지정하여 진행하겠습니다.

     

     

    시간 간격을 인덱스로 지정해 데이터 추출하기

    1. Date 열에서 Date 열의 최솟값(2010-06-29)을 빼면 데이터를 수집한 이후에 시간이 얼마나 흘렀는지 알 수 있습니다. 다음은 Date 열에서 Date 열의 최솟값을 뺀 다음 ref_date 열로 추가한 것입니다.

    tesla['ref_date'] = tesla['Date'] - tesla['Date'].min()

    print(tesla.head())

                                   Date     Open      High        Low     Close         Volume   ExDividend  \
    ref_date                                                                              
    2828 days   2018-03-27   304.00   304.27   277.18   279.18   13696168.0               0.0   
    2827 days   2018-03-26   307.34   307.59   291.36   304.18    8324639.0               0.0   
    2824 days   2018-03-23   311.25   311.61   300.45   301.54    6600538.0               0.0   
    2823 days  2018-03-22   313.89   318.82   308.18   309.10    4914307.0               0.0   
    2822 days  2018-03-21   310.25   322.44   310.19   316.53    5927881.0               0.0 
    ...

     

    2. 다음과 같이 ref_date 열을 인덱스로 지정했습니다. 이제 시간 간격(ref_date)을 이용하여 데이터를 추출할 수 있습니다.

    tesla.index = tesla['ref_date']

    print(tesla.iloc[:5, :5])

                                 Date     Open       High       Low     Close
    ref_date                                            
    2828 days  2018-03-27   304.00   304.27   277.18   279.18
    2827 days  2018-03-26   307.34   307.59   291.36   304.18
    2824 days  2018-03-23   311.25   311.61   300.45   301.54
    2823 days  2018-03-22   313.89   318.82   308.18   309.10
    2822 days  2018-03-21   310.25   322.44   310.19   316.53

     

    3. 다음은 데이터를 수집한 이후 최초 5일의 데이터를 추출한 것입니다.

    print(tesla['5 days':].iloc[:5, :5])

                             Date    Open       High      Low   Close
    ref_date                                         
    3 days    2010-07-02   23.00   23.1000   18.71   19.20
    2 days    2010-07-01   25.00   25.9200   20.27   21.96
    1 days    2010-06-30   25.79   30.4192   23.30   23.83
    0 days    2010-06-29   19.00   25.0000   17.54   23.89

     

     

     

     

     

     

    출처 : "판다스 입문"

Designed by Tistory.