7、時間序列繪圖
pandas時間序列的繪圖功能在日期格式化方面比matplotlib原生的要好。
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt import datetime as dt from pandas import Series,DataFrame from datetime import datetime from dateutil.parser import parse import time from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd import pytz #下面兩個參數,一個是解析日期形式,一個是將第一列作為行名 close_px_all = pd.read_csv('E:\\stock_px.csv',parse_dates = True,index_col = 0) print close_px_all.head(),'\n' close_px = close_px_all[['AAPL','MSFT','XOM']] close_px = close_px.resample('B',fill_method = 'ffill') print close_px.head() #注意下面的索引方式即可 close_px['AAPL'].plot() close_px.ix['2009'].plot() close_px['AAPL'].ix['01-2011':'03-2011'].plot() #季度型頻率的數據會用季度標記進行格式化,這種事情手工的話會很費力……(真是有道理……) appl_q = close_px['AAPL'].resample('Q-DEC',fill_method = 'ffill') appl_q.ix['2009':].plot() #作者說交互方式右鍵按住日期會動態展開或收縮,實際自己做,沒效果…… plt.show() >>> AA AAPL GE IBM JNJ MSFT PEP SPX XOM 1990-02-01 4.98 7.86 2.87 16.79 4.27 0.51 6.04 328.79 6.12 1990-02-02 5.04 8.00 2.87 16.89 4.37 0.51 6.09 330.92 6.24 1990-02-05 5.07 8.18 2.87 17.32 4.34 0.51 6.05 331.85 6.25 1990-02-06 5.01 8.12 2.88 17.56 4.32 0.51 6.15 329.66 6.23 1990-02-07 5.04 7.77 2.91 17.93 4.38 0.51 6.17 333.75 6.33 AAPL MSFT XOM 1990-02-01 7.86 0.51 6.12 1990-02-02 8.00 0.51 6.24 1990-02-05 8.18 0.51 6.25 1990-02-06 8.12 0.51 6.23 1990-02-07 7.77 0.51 6.33 [Finished in 37.5s]
下面是作出的幾張圖:
8、移動窗口函數
在移動窗口(可以帶有指數衰減權數)上計算的各種統計函數也是一類常見於時間序列的數組變換。作者將其稱為移動窗口函數(moving window function),其中還包括那些窗口不定長的函數(如指數加權移動平均)。跟其他統計函數一樣,移動窗口函數也會自動排除缺失值。這樣的函數通常需要指定一些數量的非NA觀測值。
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt import datetime as dt from pandas import Series,DataFrame from datetime import datetime from dateutil.parser import parse import time from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd import pytz #rolling_mean是其中最簡單的一個。它接受一個TimeSeries或DataFrame以及一個window(表示期數) close_px_all = pd.read_csv('E:\\stock_px.csv',parse_dates = True,index_col = 0) print close_px_all.head(),'\n' close_px = close_px_all[['AAPL','MSFT','XOM']] close_px = close_px.resample('B',fill_method = 'ffill') close_px.AAPL.plot() pd.rolling_mean(close_px.AAPL,250).plot() plt.show() #默認情況下,諸如rolling_mean這樣的涵涵素需要指定數量的非NA觀測值。可以修改該行為以解決缺失數據的問題,其實, #在時間序列開始處尚不足窗口期的那些數據就是個特例(也就是前250期均線值是沒有的) #看一下下面的圖 #有個參數是min_periods,文檔中說的是窗口中應該有值的最小的序列標號,可是如果是250期的標准差值,250之前怎么會有數呢?。。。難道是自動轉換了周期? #YES!確實是這樣,min_periods是指自這個標號開始,計算前面所有數的std,比如min_periods = 10時,計算前10個數的,min_periods = 20時,計算前20個數的,知道min_periods = 250為止,這就是所謂的“指定的非NA觀測值” close_px.AAPL.plot() appl_std250 = pd.rolling_std(close_px.AAPL,250,min_periods = 10) print appl_std250[:15] appl_std250.plot() plt.show() >>> AA AAPL GE IBM JNJ MSFT PEP SPX XOM 1990-02-01 4.98 7.86 2.87 16.79 4.27 0.51 6.04 328.79 6.12 1990-02-02 5.04 8.00 2.87 16.89 4.37 0.51 6.09 330.92 6.24 1990-02-05 5.07 8.18 2.87 17.32 4.34 0.51 6.05 331.85 6.25 1990-02-06 5.01 8.12 2.88 17.56 4.32 0.51 6.15 329.66 6.23 1990-02-07 5.04 7.77 2.91 17.93 4.38 0.51 6.17 333.75 6.33 1990-02-01 NaN 1990-02-02 NaN 1990-02-05 NaN 1990-02-06 NaN 1990-02-07 NaN 1990-02-08 NaN 1990-02-09 NaN 1990-02-12 NaN 1990-02-13 NaN 1990-02-14 0.148189 1990-02-15 0.141003 1990-02-16 0.135454 1990-02-19 0.130502 1990-02-20 0.128690 1990-02-21 0.124108 Freq: B [Finished in 4.6s]
要計算擴展窗口平均(expanding window mean),可以將擴展窗口看作一個特殊的窗口,其長度與時間序列一樣,但只需一期或多期即可計算一個值。
#通過rolling_mean定義擴展平均 expanding_mean = lambda x:rolling_mean(x,len(x),min_periods = 1) #對DataFrame調用rolling_mean(以及其他類似函數)會將轉換應用到所有列上 #下面的logy是將縱坐標顯示為科學計數法,暫時搞不懂怎么變換的 mean_60 = pd.rolling_mean(close_px,60).plot() mean_60 = pd.rolling_mean(close_px,60).plot(logy = True) #print mean_60[(len(mean_60) - 20):len(mean_60)] plt.show() ''' ts = pd.Series(range(10), index=pd.date_range('1/1/2000', periods=10)) #ts = np.exp(ts.cumsum()) print ts print np.log(ts) ts.plot(logy=True) plt.show() '''
-
指數加權函數
另一種使用固定大小窗口及相等權數觀測值的方法是,定義一個衰減因子(decay factor)常量,以便使近期的觀測值擁有更大的權數。衰減因子的定義方式有很多,比較流行的是使用時間間隔(span),它可以使結果兼容於窗口大小等於時間間隔的簡單移動窗口函數。
fig,axes = plt.subplots(nrows = 2,ncols = 1,sharex = True,sharey = True,figsize = (12,7)) aapl_px = close_px.AAPL['2005':'2009'] ma60 = pd.rolling_mean(aapl_px,60,min_periods = 50) ewma60 = pd.ewma(aapl_px,span = 60) aapl_px.plot(style = 'k-',ax = axes[0]) ma60.plot(style = 'k--',ax = axes[0]) aapl_px.plot(style = 'k-',ax = axes[1]) ewma60.plot(style = 'k--',ax = axes[1]) axes[0].set_title('Simple MA') axes[1].set_title('Exponentially-weighted MA') plt.show()
-
二元移動窗口函數
有些統計運算(如相關系數和協方差)需要在兩個時間序列上執行。比如,金融分析師常常對某只股票對某個參數(如標普500指數)的相關系數感興趣。我們可以通過計算百分比變化並使用rolling_corr的方式得到該結果。
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt import datetime as dt from pandas import Series,DataFrame from datetime import datetime from dateutil.parser import parse import time from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd import pytz #rolling_mean是其中最簡單的一個。它接受一個TimeSeries或DataFrame以及一個window(表示期數) close_px_all = pd.read_csv('E:\\stock_px.csv',parse_dates = True,index_col = 0) print close_px_all.head(),'\n' close_px = close_px_all[['AAPL','MSFT','XOM']] spx_px = close_px_all['SPX'] print spx_px #下面是將spx_px數據后移一位,減1是將數據減1,當然后面的是先除,再減1 #print spx_px.shift(1) - 1 spx_rets = spx_px / spx_px.shift(1) - 1 #看一下,下面的函數是跟上面的一樣,作者是為了展示函數才這么寫的 #spx_rets_pct_change = spx_px.pct_change() #print spx_rets_pct_change[:10] print spx_rets[:10],'\n' returns = close_px.pct_change() print returns[:10] corr = pd.rolling_corr(returns.AAPL,spx_rets,125,min_periods = 100) corr.plot() plt.show() >>> AA AAPL GE IBM JNJ MSFT PEP SPX XOM 1990-02-01 4.98 7.86 2.87 16.79 4.27 0.51 6.04 328.79 6.12 1990-02-02 5.04 8.00 2.87 16.89 4.37 0.51 6.09 330.92 6.24 1990-02-05 5.07 8.18 2.87 17.32 4.34 0.51 6.05 331.85 6.25 1990-02-06 5.01 8.12 2.88 17.56 4.32 0.51 6.15 329.66 6.23 1990-02-07 5.04 7.77 2.91 17.93 4.38 0.51 6.17 333.75 6.33 1990-02-01 328.79 1990-02-02 330.92 1990-02-05 331.85 1990-02-06 329.66 1990-02-07 333.75 1990-02-08 332.96 1990-02-09 333.62 1990-02-12 330.08 1990-02-13 331.02 1990-02-14 332.01 1990-02-15 334.89 1990-02-16 332.72 1990-02-20 327.99 1990-02-21 327.67 1990-02-22 325.70 ... 2011-09-26 1162.95 2011-09-27 1175.38 2011-09-28 1151.06 2011-09-29 1160.40 2011-09-30 1131.42 2011-10-03 1099.23 2011-10-04 1123.95 2011-10-05 1144.03 2011-10-06 1164.97 2011-10-07 1155.46 2011-10-10 1194.89 2011-10-11 1195.54 2011-10-12 1207.25 2011-10-13 1203.66 2011-10-14 1224.58 Name: SPX, Length: 5472 1990-02-01 NaN 1990-02-02 0.006478 1990-02-05 0.002810 1990-02-06 -0.006599 1990-02-07 0.012407 1990-02-08 -0.002367 1990-02-09 0.001982 1990-02-12 -0.010611 1990-02-13 0.002848 1990-02-14 0.002991 Name: SPX AAPL MSFT XOM 1990-02-01 NaN NaN NaN 1990-02-02 0.017812 0.000000 0.019608 1990-02-05 0.022500 0.000000 0.001603 1990-02-06 -0.007335 0.000000 -0.003200 1990-02-07 -0.043103 0.000000 0.016051 1990-02-08 -0.007722 0.000000 0.003160 1990-02-09 0.037613 0.019608 0.003150 1990-02-12 -0.007500 0.000000 -0.023548 1990-02-13 0.015113 0.000000 0.001608 1990-02-14 -0.007444 0.000000 -0.004815 [Finished in 50.8s]
假如現在想同時計算多只股票與標普的相關系數。只需傳入一個TimeSeries和一個DataFrame,rolling_corr就會自動計算TimeSeries與DataFrame各列的相關系數。
corr = pd.rolling_corr(returns,spx_rets,125,min_periods = 100)
corr.plot()
plt.show()
-
用戶自定義的移動窗口函數
rolling_apply函數使你能夠在移動窗口上應用自己設計的數組函數。唯一的要求就是:該函數要能從數組的各個片段中產生單個值。比如,當用rolling_quantile計算樣本分位數時,可能對樣本中特定值的百分等級感興趣。
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt import datetime as dt from pandas import Series,DataFrame from datetime import datetime from dateutil.parser import parse import time from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd import pytz from scipy.stats import percentileofscore #rolling_mean是其中最簡單的一個。它接受一個TimeSeries或DataFrame以及一個window(表示期數) close_px_all = pd.read_csv('E:\\stock_px.csv',parse_dates = True,index_col = 0) close_px = close_px_all[['AAPL','MSFT','XOM']] returns = close_px.pct_change() #這里的percentileofscore是指,0.02在x中的位置是x中的百分比
#AAPL %2回報率的百分等級
score_at_2percent = lambda x:percentileofscore(x,0.02) result = pd.rolling_apply(returns.AAPL,250,score_at_2percent) result.plot() plt.show()
9、性能和內存使用方面的注意事項
TimeSeries和Period都是以64位整數表示的(即NumPy的datetime64數據類型)。也就是說,對於每個數據點,其時間戳需要占用8字節內存。因此,含有一百萬個float64數據點的時間序列需要占用大約16MB的內存空間。由於pandas會盡量在多個時間序列之間共享索引,所以創建現有時間序列的視圖不會占用更多內存。此外,低頻率索引(日以上)會被存放在一個中心緩存中,所以任何固定頻率的索引都是該日期緩存的視圖。所以。如果你有一個很大的低頻率時間序列,索引所占用的內存空間將不會很大。
性能方面,pandas對數據對齊(兩個不同索引的ts1 + ts2的幕后工作)和重采樣運算進行了高度優化。下面這個例子將一億個數據點聚合為OHLC:
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import matplotlib.pyplot as plt import datetime as dt from pandas import Series,DataFrame from datetime import datetime from dateutil.parser import parse import time from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd import pytz rng = pd.date_range('1/1/2000',periods = 10000000,freq = '10ms') ts = Series(np.random.randn(len(rng)),index = rng) print ts,'\n' print ts.resample('15min',how = 'ohlc'),'\n' #下面測試一下代碼運行時間,下面運行不成功 #%timeit ts.resample('15min',how = 'ohlc') #換句話說,聚合的頻率越高,耗費時間越多,但是,但是仍然是非常高效的 >>> 2000-01-01 00:00:00 -0.681229 2000-01-01 00:00:00.010000 -1.231560 2000-01-01 00:00:00.020000 0.437656 2000-01-01 00:00:00.030000 2.134065 2000-01-01 00:00:00.040000 0.264029 2000-01-01 00:00:00.050000 -2.273143 2000-01-01 00:00:00.060000 1.519468 2000-01-01 00:00:00.070000 -0.052764 2000-01-01 00:00:00.080000 1.329301 2000-01-01 00:00:00.090000 -1.078996 2000-01-01 00:00:00.100000 -1.121855 2000-01-01 00:00:00.110000 -0.157845 2000-01-01 00:00:00.120000 0.453539 2000-01-01 00:00:00.130000 0.043068 2000-01-01 00:00:00.140000 0.378264 ... 2000-01-02 03:46:39.850000 -0.444970 2000-01-02 03:46:39.860000 0.296446 2000-01-02 03:46:39.870000 -1.051884 2000-01-02 03:46:39.880000 0.612868 2000-01-02 03:46:39.890000 0.682818 2000-01-02 03:46:39.900000 0.375605 2000-01-02 03:46:39.910000 -0.843553 2000-01-02 03:46:39.920000 -0.861029 2000-01-02 03:46:39.930000 0.349835 2000-01-02 03:46:39.940000 0.231722 2000-01-02 03:46:39.950000 -0.268164 2000-01-02 03:46:39.960000 -1.537572 2000-01-02 03:46:39.970000 -0.634842 2000-01-02 03:46:39.980000 -1.110032 2000-01-02 03:46:39.990000 0.071214 Freq: 10L, Length: 10000000 open high low close 2000-01-01 00:00:00 -0.681229 -0.681229 -0.681229 -0.681229 2000-01-01 00:15:00 -1.231560 4.113992 -4.589095 -0.241367 2000-01-01 00:30:00 1.171302 4.593611 -4.329438 -0.099641 2000-01-01 00:45:00 -0.720612 4.432697 -4.658295 -2.278497 2000-01-01 01:00:00 0.119403 4.259349 -4.922511 1.899723 2000-01-01 01:15:00 1.168395 4.351551 -4.087221 -0.124419 2000-01-01 01:30:00 1.888486 4.288424 -4.540685 0.337621 2000-01-01 01:45:00 0.263643 4.412893 -4.362212 -1.125978 2000-01-01 02:00:00 1.398256 4.301166 -4.140143 0.693118 2000-01-01 02:15:00 -0.307263 4.353092 -4.417690 -1.647730 2000-01-01 02:30:00 1.028139 4.727692 -4.089063 0.242530 2000-01-01 02:45:00 0.857454 3.946653 -4.745711 0.270212 2000-01-01 03:00:00 -0.925215 4.544331 -4.261408 -0.616690 2000-01-01 03:15:00 -0.008779 3.958481 -4.016185 -1.055645 2000-01-01 03:30:00 0.649988 4.939031 -4.446418 0.118234 2000-01-01 03:45:00 -0.533717 4.685563 -4.205492 0.731999 2000-01-01 04:00:00 0.511450 4.483055 -3.945226 -0.814555 2000-01-01 04:15:00 0.372549 4.449327 -4.087508 0.786998 2000-01-01 04:30:00 -1.015505 4.750429 -4.111374 0.955857 2000-01-01 04:45:00 -0.450577 4.155395 -4.628542 0.621572 2000-01-01 05:00:00 0.629534 4.144105 -4.302083 1.567992 2000-01-01 05:15:00 0.843481 4.092661 -4.509020 -0.997818 2000-01-01 05:30:00 1.026566 4.004000 -4.330091 -0.745961 2000-01-01 05:45:00 0.523910 4.286510 -4.147153 -0.334644 2000-01-01 06:00:00 1.481702 4.437908 -4.198872 0.309824 2000-01-01 06:15:00 -0.530256 4.551381 -4.218254 0.112050 2000-01-01 06:30:00 -1.224188 4.245407 -4.198838 0.973066 2000-01-01 06:45:00 0.114000 4.286166 -4.070633 -1.024489 2000-01-01 07:00:00 -2.148906 4.198777 -4.213584 2.137635 2000-01-01 07:15:00 2.716069 4.308833 -4.432955 0.196065 2000-01-01 07:30:00 -0.902512 4.315467 -4.376366 -1.944492 2000-01-01 07:45:00 0.978385 4.482707 -4.343861 -0.161608 2000-01-01 08:00:00 0.028728 4.334193 -4.995541 -1.409060 2000-01-01 08:15:00 0.254613 3.944059 -4.263927 1.022247 2000-01-01 08:30:00 -2.153415 4.282622 -4.681402 0.133295 2000-01-01 08:45:00 0.361382 4.332683 -4.124674 -1.810247 2000-01-01 09:00:00 0.218621 4.087920 -4.878364 -0.247444 2000-01-01 09:15:00 1.541770 4.709500 -4.100887 0.263939 2000-01-01 09:30:00 0.302456 4.072987 -4.402301 -0.695389 2000-01-01 09:45:00 0.758779 4.854449 -4.292967 -0.098260 2000-01-01 10:00:00 -1.033195 4.412930 -4.319737 -1.078443 2000-01-01 10:15:00 -0.702287 4.687409 -4.242148 0.108918 2000-01-01 10:30:00 2.040476 4.167678 -4.069875 -0.271023 2000-01-01 10:45:00 -1.719918 4.414900 -4.003430 0.178522 2000-01-01 11:00:00 -2.003960 4.681189 -4.407995 -1.532938 2000-01-01 11:15:00 2.071234 4.691175 -4.203442 -0.000271 2000-01-01 11:30:00 -0.335169 4.577745 -4.383428 -0.356682 2000-01-01 11:45:00 0.837294 4.158462 -4.667864 -1.214194 2000-01-01 12:00:00 -0.593185 4.491041 -4.229999 -0.906558 2000-01-01 12:15:00 -0.757815 4.283729 -4.824929 0.461968 2000-01-01 12:30:00 -0.627753 4.465840 -4.382329 1.758057 2000-01-01 12:45:00 -0.582081 4.248387 -5.043421 -1.665271 2000-01-01 13:00:00 -0.232743 4.151332 -4.197010 -1.040030 2000-01-01 13:15:00 -0.099233 4.065889 -4.025087 0.400879 2000-01-01 13:30:00 0.560333 4.441687 -4.372460 -1.212408 2000-01-01 13:45:00 0.442710 4.105972 -4.284578 -0.756200 2000-01-01 14:00:00 1.280060 4.613177 -4.435858 0.793312 2000-01-01 14:15:00 0.849877 4.445931 -4.143685 -1.522613 2000-01-01 14:30:00 1.084148 4.750917 -4.196053 0.154898 2000-01-01 14:45:00 1.055437 4.320318 -4.673456 1.022639 2000-01-01 15:00:00 0.708564 4.573142 -4.251478 -0.420195 2000-01-01 15:15:00 -2.163962 4.332879 -4.207693 0.909637 2000-01-01 15:30:00 0.316790 4.269409 -4.110165 0.698051 2000-01-01 15:45:00 -0.811775 4.356382 -4.576847 1.465054 2000-01-01 16:00:00 -0.000181 4.101318 -4.549553 -0.161170 2000-01-01 16:15:00 0.293171 4.565994 -4.279151 0.574916 2000-01-01 16:30:00 1.284430 4.438795 -4.384199 -0.357597 2000-01-01 16:45:00 0.922512 4.270791 -4.365019 -0.089139 2000-01-01 17:00:00 -1.434599 4.216443 -4.599743 -0.993626 2000-01-01 17:15:00 -2.289424 4.447081 -4.129147 -0.770931 2000-01-01 17:30:00 0.235515 4.122913 -3.901979 1.107505 2000-01-01 17:45:00 0.121232 4.316179 -4.294560 -0.325761 2000-01-01 18:00:00 1.406108 4.909856 -4.380683 -1.371316 2000-01-01 18:15:00 -0.330192 4.092084 -4.433832 0.451967 2000-01-01 18:30:00 0.069717 4.602332 -4.814984 1.041939 2000-01-01 18:45:00 -2.441102 4.077937 -4.477974 -0.284751 2000-01-01 19:00:00 1.117306 4.669111 -4.433551 1.887700 2000-01-01 19:15:00 0.482482 4.545320 -4.231923 2.098973 2000-01-01 19:30:00 0.146878 4.230201 -4.738262 0.260756 2000-01-01 19:45:00 0.491376 5.230373 -5.069700 -0.936606 2000-01-01 20:00:00 -1.075473 4.701905 -4.245575 2.898905 2000-01-01 20:15:00 1.728790 4.291821 -4.145234 -0.735600 2000-01-01 20:30:00 0.680025 4.509368 -4.176570 0.346777 2000-01-01 20:45:00 -0.603546 4.479395 -4.033444 1.901963 2000-01-01 21:00:00 -0.893833 4.472098 -4.658866 0.026791 2000-01-01 21:15:00 -0.571074 4.066533 -4.773198 0.719510 2000-01-01 21:30:00 -1.109575 4.377526 -4.154108 -0.419939 2000-01-01 21:45:00 -1.109197 4.244968 -4.476610 0.625287 2000-01-01 22:00:00 -0.500703 4.204465 -4.695903 -0.205293 2000-01-01 22:15:00 -0.474312 4.278451 -4.261542 -0.605803 2000-01-01 22:30:00 -0.929173 4.679216 -4.243371 -0.389516 2000-01-01 22:45:00 0.625107 4.588921 -3.944369 0.051261 2000-01-01 23:00:00 0.223470 4.300131 -4.556017 0.411957 2000-01-01 23:15:00 2.834194 4.669853 -4.894633 -0.172413 2000-01-01 23:30:00 0.271214 4.468473 -4.059279 -0.144921 2000-01-01 23:45:00 1.005364 4.311476 -4.373045 -0.532617 2000-01-02 00:00:00 -0.177777 4.288976 -4.784412 1.279124 2000-01-02 00:15:00 1.767240 4.268321 -4.964638 0.978593 2000-01-02 00:30:00 0.874845 4.114844 -4.735220 0.755658 2000-01-02 00:45:00 0.139810 4.480646 -4.530709 1.861165 2000-01-02 01:00:00 -1.633137 4.237701 -4.465151 1.502397 2000-01-02 01:15:00 0.497876 4.056503 -4.348021 -0.019043 2000-01-02 01:30:00 0.183521 4.369899 -4.264499 0.725734 2000-01-02 01:45:00 -0.365043 4.257799 -4.003001 -0.197835 2000-01-02 02:00:00 1.389697 4.463931 -4.166211 1.310472 2000-01-02 02:15:00 -0.829049 4.360859 -5.347301 -0.719968 2000-01-02 02:30:00 -0.257339 4.156498 -4.481656 0.804225 2000-01-02 02:45:00 -0.112207 4.238031 -4.277917 -1.851001 2000-01-02 03:00:00 1.024404 4.315122 -4.296867 1.567366 2000-01-02 03:15:00 1.506557 4.440672 -4.429984 -1.569164 2000-01-02 03:30:00 0.292707 4.088439 -3.877321 -0.169247 2000-01-02 03:45:00 -1.838429 4.056206 -4.687052 0.679375 2000-01-02 04:00:00 0.469589 3.651325 -3.386148 0.071214 [Finished in 2.6s]













