Analýza časových řad 1 - manipulace s daty v Pandas

Popis základních funkcí pomocí pro analýzu dat v Pandas.

Info o verzi a notebooku


In [1]:
import datetime

MY_VERSION = 1,0

print('Verze notebooku:', '.'.join(map(str, MY_VERSION)))
print('Poslední aktualizace:', datetime.datetime.now())


Verze notebooku: 1.0
Poslední aktualizace: 2017-07-11 09:59:32.528510

Informace o použitých python modulech


In [2]:
import sys
import datetime
import pandas as pd
import pandas_datareader as pdr
import pandas_datareader.data as pdr_web
import quandl as ql

# Load Quandl API key
import json
with open('quandl_key.json','r') as f:
    quandl_api_key = json.load(f)
ql.ApiConfig.api_key = quandl_api_key['API-key']

print('Verze pythonu:')
print(sys.version)
print('---')
print('Pandas:', pd.__version__)
print('pandas-datareader:', pdr.__version__)
print('Quandl version:', ql.version.VERSION)


Verze pythonu:
3.6.1 |Anaconda custom (64-bit)| (default, May 11 2017, 13:25:24) [MSC v.1900 64 bit (AMD64)]
---
Pandas: 0.20.2
pandas-datareader: 0.4.0
Quandl version: 3.1.0

Series a DataFrame

Knihovna pandas používá k uchovávání a zpracování dat své typy Series a DataFrame.

V případě Series se jedná o 1D označená (labeled) struktura dat jednoho typu. DataFrame je pak 2D označená (labeled) struktura dat různých typů. Jednotlivé sloupce v DataFrame jsou typu Series. Další informace v dokumentaci DataFrame a Series.

Data k analýze


In [3]:
start_date = datetime.datetime(2015, 1, 1)
end_date = datetime.datetime.now()

ES = ql.get("CHRIS/CME_ES1", start_date=start_date, end_date=end_date)
ES.head()


Out[3]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25 6.25 2046.25 1357107.0 2769700.0
2015-01-05 2045.75 2048.25 2009.50 2018.00 30.25 2016.00 2032736.0 2746750.0
2015-01-06 2019.00 2023.50 1984.25 1995.25 21.50 1994.50 2344320.0 2735166.0
2015-01-07 1996.50 2023.75 1995.75 2020.25 25.00 2019.50 1750412.0 2738793.0
2015-01-08 2020.50 2058.50 2020.25 2054.00 35.50 2055.00 1551040.0 2719370.0

In [4]:
SPY = pdr_web.DataReader("NYSEARCA:SPY", 'google', start=start_date, end=end_date)
SPY.head()


Out[4]:
Open High Low Close Volume
Date
2015-01-02 206.38 206.88 204.18 205.43 121465865
2015-01-05 204.17 204.37 201.35 201.72 169632646
2015-01-06 202.09 202.72 198.86 199.82 209151408
2015-01-07 201.42 202.72 200.88 202.31 125346709
2015-01-08 204.01 206.16 203.99 205.90 147217784

Základní práce s daty

Zobrazení prvních n záznamů z DataFrame.


In [5]:
n = 10
#ES.head()
ES.head(n)


Out[5]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25 6.25 2046.25 1357107.0 2769700.0
2015-01-05 2045.75 2048.25 2009.50 2018.00 30.25 2016.00 2032736.0 2746750.0
2015-01-06 2019.00 2023.50 1984.25 1995.25 21.50 1994.50 2344320.0 2735166.0
2015-01-07 1996.50 2023.75 1995.75 2020.25 25.00 2019.50 1750412.0 2738793.0
2015-01-08 2020.50 2058.50 2020.25 2054.00 35.50 2055.00 1551040.0 2719370.0
2015-01-09 2053.75 2062.00 2031.25 2033.50 19.75 2035.25 1907275.0 2717604.0
2015-01-12 2034.50 2048.25 2015.25 2023.75 12.75 2022.50 1614675.0 2678435.0
2015-01-13 2023.75 2051.75 2001.00 2017.50 6.50 2016.00 2489224.0 2677998.0
2015-01-14 2017.25 2019.50 1981.25 2010.25 8.50 2007.50 2506589.0 2702231.0
2015-01-15 2009.75 2027.25 1978.25 1979.75 18.50 1989.00 2259436.0 2701273.0

Zobrazení posledních n záznamů z DataFrame.


In [6]:
n = 10
#ES.tail()
ES.tail(n)


Out[6]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2017-06-26 2432.00 2447.50 2430.00 2435.75 1.0 2436.0 1257593.0 2833023.0
2017-06-27 2435.75 2437.25 2416.50 2417.75 15.5 2420.5 1625794.0 2836678.0
2017-06-28 2417.00 2442.50 2413.75 2438.50 18.0 2438.5 1545009.0 2858564.0
2017-06-29 2442.00 2445.00 2402.25 2421.50 18.5 2420.0 2329022.0 2839741.0
2017-06-30 2420.75 2429.75 2415.00 2421.50 1.0 2421.0 1614299.0 2839900.0
2017-07-03 2422.00 2436.50 2421.50 2423.75 4.0 2425.0 750433.0 2839439.0
2017-07-05 2423.75 2432.25 2419.25 2428.50 3.0 2428.0 1276362.0 2829039.0
2017-07-06 2428.00 2430.50 2405.25 2408.50 19.5 2408.5 1590195.0 2829632.0
2017-07-07 2409.25 2425.00 2407.50 2423.25 14.0 2422.5 1249140.0 2824775.0
2017-07-10 2423.00 2430.00 2419.25 2423.75 2.0 2424.5 849888.0 2820247.0

Zobrazeních několik statistických informací ke každému sloupci v DataFrame.


In [7]:
ES.describe()


Out[7]:
Open High Low Last Change Settle Volume Previous Day Open Interest
count 634.000000 634.000000 634.000000 634.000000 622.000000 634.000000 6.340000e+02 6.340000e+02
mean 2131.245268 2143.106073 2118.942823 2132.467271 12.139068 2132.361041 1.569805e+06 2.716763e+06
std 140.748036 137.199780 144.493437 140.825822 12.032738 140.846903 6.798696e+05 4.413645e+05
min 1824.500000 1824.500000 1802.500000 1825.500000 0.250000 1824.500000 4.253600e+04 6.073450e+05
25% 2049.187500 2062.125000 2035.500000 2050.562500 3.500000 2049.812500 1.191213e+06 2.717589e+06
50% 2097.750000 2105.750000 2086.125000 2097.375000 8.500000 2097.750000 1.459640e+06 2.832262e+06
75% 2185.062500 2191.312500 2178.875000 2185.500000 17.687500 2185.812500 1.814158e+06 2.921934e+06
max 2447.750000 2451.500000 2434.000000 2447.500000 100.250000 2447.500000 5.569912e+06 3.137489e+06

Uložení dat v DataFrame do .csv souboru


In [8]:
ES.to_csv('data/es.csv')

Načtení dat z .csv souboru


In [9]:
#data = pd.read_csv('data/es.csv')
data = pd.read_csv('data/es.csv', header=0, index_col='Date', parse_dates=True)
data.head(3)


Out[9]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25 6.25 2046.25 1357107.0 2769700.0
2015-01-05 2045.75 2048.25 2009.50 2018.00 30.25 2016.00 2032736.0 2746750.0
2015-01-06 2019.00 2023.50 1984.25 1995.25 21.50 1994.50 2344320.0 2735166.0

Informace o indexu a sloupcích daného DataFrame


In [10]:
data.index


Out[10]:
DatetimeIndex(['2015-01-02', '2015-01-05', '2015-01-06', '2015-01-07',
               '2015-01-08', '2015-01-09', '2015-01-12', '2015-01-13',
               '2015-01-14', '2015-01-15',
               ...
               '2017-06-26', '2017-06-27', '2017-06-28', '2017-06-29',
               '2017-06-30', '2017-07-03', '2017-07-05', '2017-07-06',
               '2017-07-07', '2017-07-10'],
              dtype='datetime64[ns]', name='Date', length=634, freq=None)

In [11]:
data.columns


Out[11]:
Index(['Open', 'High', 'Low', 'Last', 'Change', 'Settle', 'Volume',
       'Previous Day Open Interest'],
      dtype='object')

Výběr určitých dat z DataFrame

Indexace

Základní výběr dat z DataFrame lze dělat pomocí indexace.


In [12]:
# výběr posledních 10 záznamů ze sloupce Last, výsledek je typu Series
vyber = data['Last'][-10:]
vyber


Out[12]:
Date
2017-06-26    2435.75
2017-06-27    2417.75
2017-06-28    2438.50
2017-06-29    2421.50
2017-06-30    2421.50
2017-07-03    2423.75
2017-07-05    2428.50
2017-07-06    2408.50
2017-07-07    2423.25
2017-07-10    2423.75
Name: Last, dtype: float64

Výběr podle popisu (label-based) a pozice (positional)

Pro získání dat podle popisu pandas používá funkce loc. Např. 2017, nebo 2016-11-01 zadáme jako argument:


In [13]:
data.loc['2016-11-01']


Out[13]:
Open                             2123.50
High                             2129.50
Low                              2091.00
Last                             2102.00
Change                             16.25
Settle                           2103.75
Volume                        2248261.00
Previous Day Open Interest    2977889.00
Name: 2016-11-01 00:00:00, dtype: float64

In [14]:
vyber = data.loc['2017']
print(vyber.head(5))
print(vyber.tail(5))


               Open     High      Low     Last  Change   Settle     Volume  \
Date                                                                         
2017-01-03  2240.75  2259.50  2239.50  2252.50   16.25  2252.50  1787898.0   
2017-01-04  2252.75  2267.25  2251.00  2264.50   11.75  2264.25  1385650.0   
2017-01-05  2264.50  2266.00  2254.00  2265.00     NaN  2264.25  1312627.0   
2017-01-06  2264.25  2277.00  2258.25  2270.75    7.25  2271.50  1542214.0   
2017-01-09  2271.25  2275.25  2263.50  2264.25    6.50  2265.00  1019957.0   

            Previous Day Open Interest  
Date                                    
2017-01-03                   2787056.0  
2017-01-04                   2799661.0  
2017-01-05                   2804829.0  
2017-01-06                   2807328.0  
2017-01-09                   2815455.0  
               Open     High      Low     Last  Change  Settle     Volume  \
Date                                                                        
2017-07-03  2422.00  2436.50  2421.50  2423.75     4.0  2425.0   750433.0   
2017-07-05  2423.75  2432.25  2419.25  2428.50     3.0  2428.0  1276362.0   
2017-07-06  2428.00  2430.50  2405.25  2408.50    19.5  2408.5  1590195.0   
2017-07-07  2409.25  2425.00  2407.50  2423.25    14.0  2422.5  1249140.0   
2017-07-10  2423.00  2430.00  2419.25  2423.75     2.0  2424.5   849888.0   

            Previous Day Open Interest  
Date                                    
2017-07-03                   2839439.0  
2017-07-05                   2829039.0  
2017-07-06                   2829632.0  
2017-07-07                   2824775.0  
2017-07-10                   2820247.0  

Pro získání dat podle pozice pandas používá funkce iloc. Např. 20, nebo 43 zadáme jako argument:


In [15]:
# zobrazí řádek 20
print(data.iloc[20])
# zobrazí řádky 0,1,2,3,4 a sloupce 0,1,2,3
data.iloc[[0,1,2,3,4], [0,1,2,3]]


Open                             1990.50
High                             2018.50
Low                              1973.75
Last                             2015.25
Change                             28.50
Settle                           2017.00
Volume                        2035431.00
Previous Day Open Interest    2740382.00
Name: 2015-02-02 00:00:00, dtype: float64
Out[15]:
Open High Low Last
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25
2015-01-05 2045.75 2048.25 2009.50 2018.00
2015-01-06 2019.00 2023.50 1984.25 1995.25
2015-01-07 1996.50 2023.75 1995.75 2020.25
2015-01-08 2020.50 2058.50 2020.25 2054.00

Více v podrobné dokumentaci Indexing and Selecting Data.

Úprava datového vzorku časové řady

Náhodný vzorek dat

Vzorek náhodných dat lze získat pomocí funkce sample. Dokumentace k DataFrame.sample.


In [16]:
# Vzorek 20 řádků
sample = data.sample(20)
sample


Out[16]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2016-09-15 2121.75 2151.50 2114.75 2144.00 24.75 2145.00 396046.0 830710.0
2016-08-31 2175.75 2176.25 2159.50 2168.50 5.75 2169.50 1840324.0 2947680.0
2016-07-05 2099.75 2104.75 2072.50 2084.50 13.50 2082.75 1858691.0 2964059.0
2016-03-09 1981.75 1994.00 1978.00 1989.25 8.00 1989.00 1736155.0 2931226.0
2016-03-24 2028.00 2030.25 2012.25 2030.25 0.25 2028.50 1519099.0 2811251.0
2016-01-06 2010.75 2013.25 1970.50 1986.75 25.75 1986.00 2214380.0 2562248.0
2015-08-04 2090.50 2096.25 2081.50 2082.75 8.00 2083.00 1327794.0 2669093.0
2016-02-08 1876.25 1884.50 1821.75 1851.00 23.25 1852.00 2667662.0 2998346.0
2015-02-26 2110.50 2114.75 2101.50 2109.75 0.25 2110.00 1163745.0 2861642.0
2017-03-29 2353.00 2359.75 2348.75 2356.75 5.50 2357.00 1146485.0 2879278.0
2017-03-16 2382.50 2392.00 2376.75 2383.00 1.00 2382.75 373164.0 833123.0
2016-05-10 2054.00 2079.75 2048.00 2077.00 23.25 2077.50 1400565.0 2786287.0
2017-03-13 2370.75 2375.25 2368.00 2374.50 3.25 2375.00 1037046.0 2005262.0
2016-08-24 2185.75 2187.75 2168.75 2175.25 10.25 2175.00 1498544.0 2940595.0
2017-05-10 2391.75 2397.00 2387.50 2394.75 2.00 2395.25 992071.0 3005154.0
2015-02-04 2040.50 2049.25 2022.75 2024.00 12.00 2030.00 1696234.0 2714102.0
2017-04-13 2338.75 2345.00 2324.00 2327.50 13.25 2327.50 1574295.0 2864722.0
2015-08-12 2080.75 2085.25 2046.50 2082.75 4.50 2084.25 2357389.0 2736342.0
2016-06-13 2089.25 2098.25 2075.75 2076.00 17.50 2078.75 1220867.0 1991154.0
2017-05-18 2355.00 2375.00 2344.50 2363.75 6.00 2363.50 2446565.0 3043738.0

Získání měsíčního vzorku dat z denního

Funkce resample umožňuje flexibilní konverzi frekvence dat jako funkce asfreq, ale i další. Více v dokumentaci k resample a dokumentaci asfreq.


In [17]:
prumer = data.resample('M').mean()
prumer.head()


Out[17]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-31 2025.362500 2041.100000 2004.412500 2022.412500 19.650000 2022.012500 1.910757e+06 2.711896e+06
2015-02-28 2071.815789 2083.671053 2062.618421 2078.302632 9.855263 2078.013158 1.424934e+06 2.780075e+06
2015-03-31 2077.761364 2088.375000 2063.943182 2076.375000 14.545455 2075.943182 1.273409e+06 2.505545e+06
2015-04-30 2087.071429 2097.154762 2075.428571 2089.083333 9.662500 2088.571429 1.329260e+06 2.676171e+06
2015-05-31 2107.450000 2117.075000 2096.725000 2108.537500 10.475000 2108.237500 1.218398e+06 2.725017e+06

In [18]:
mesicni = data.asfreq("M", method="bfill")
mesicni.head()


Out[18]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-31 1990.50 2018.50 1973.75 2015.25 28.50 2017.00 2035431.0 2740382.0
2015-02-28 2104.00 2115.50 2100.50 2114.25 11.25 2114.00 1069024.0 2866335.0
2015-03-31 2074.75 2076.75 2056.25 2057.75 14.75 2060.75 1595256.0 2632578.0
2015-04-30 2098.25 2102.00 2070.25 2083.00 20.00 2079.00 2024833.0 2720143.0
2015-05-31 2107.00 2117.75 2100.25 2111.50 3.25 2109.25 1337694.0 2766529.0

Vypočítání volatility EOD dat

Se sloupci DataFramu můžu bezproblému aritmeticky počítat. Pro získání volatility jednotlivých denních záznamů, odečtu jednoduše sloupec low od sloupce high a výsledek vložím do sloupce ATR.


In [19]:
data['ATR_1'] = data.High - data.Low
data.head()


Out[19]:
Open High Low Last Change Settle Volume Previous Day Open Interest ATR_1
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25 6.25 2046.25 1357107.0 2769700.0 28.50
2015-01-05 2045.75 2048.25 2009.50 2018.00 30.25 2016.00 2032736.0 2746750.0 38.75
2015-01-06 2019.00 2023.50 1984.25 1995.25 21.50 1994.50 2344320.0 2735166.0 39.25
2015-01-07 1996.50 2023.75 1995.75 2020.25 25.00 2019.50 1750412.0 2738793.0 28.00
2015-01-08 2020.50 2058.50 2020.25 2054.00 35.50 2055.00 1551040.0 2719370.0 38.25

Smazání sloupce

Smazat sloupce lze pomocí klíčového slova del.


In [20]:
del data['ATR_1']
data.head()


Out[20]:
Open High Low Last Change Settle Volume Previous Day Open Interest
Date
2015-01-02 2055.00 2067.25 2038.75 2046.25 6.25 2046.25 1357107.0 2769700.0
2015-01-05 2045.75 2048.25 2009.50 2018.00 30.25 2016.00 2032736.0 2746750.0
2015-01-06 2019.00 2023.50 1984.25 1995.25 21.50 1994.50 2344320.0 2735166.0
2015-01-07 1996.50 2023.75 1995.75 2020.25 25.00 2019.50 1750412.0 2738793.0
2015-01-08 2020.50 2058.50 2020.25 2054.00 35.50 2055.00 1551040.0 2719370.0