diff --git a/.coveragerc b/.coveragerc index ed8e83316..0110508e8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -10,6 +10,7 @@ omit=*__init__* # Ensure we exclude any files in .local */.local/* branch=True +disable_warnings = no-data-collected [report] partial_branches=True diff --git a/.pylintrc b/.pylintrc index 4974dfb5d..0ad9a8e0a 100644 --- a/.pylintrc +++ b/.pylintrc @@ -44,7 +44,15 @@ disable=I, duplicate-code, superfluous-parens, abstract-class-little-used, - too-few-public-methods + too-few-public-methods, + RP0401, + RP0801, + RP0101 + +# Disabled messages: +# RP0401 - External dependencies tree +# RP0801 - Duplication table +# RP0101 - Statistics by type table # Notes: # abstract-class-not-used: see http://www.logilab.org/ticket/111138 diff --git a/.travis.yml b/.travis.yml index 371f181a2..86a14399c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ git: # command to run scripts script: - pylint mlfinlab --rcfile=.pylintrc -f text - - python -m unittest discover - bash coverage after_success: - codecov diff --git a/coverage b/coverage index 188b0bf03..3ae7b1ebd 100755 --- a/coverage +++ b/coverage @@ -3,13 +3,12 @@ echo "----Running Code Coverage----" # Remove multiprocessing coverage files in case a previous combine wasn't performed -rm .coverage.* rm -fR cover/ # Remove the main coverage file (.coverage) coverage erase # Discover and run all tests -coverage run --concurrency=multiprocessing ./scripts/run_tests.py discover -v +coverage run --concurrency=multiprocessing -m unittest discover coverage combine res_combine=$? diff --git a/docs/source/codependence/codependence_marti.rst b/docs/source/codependence/codependence_marti.rst new file mode 100644 index 000000000..f82f93777 --- /dev/null +++ b/docs/source/codependence/codependence_marti.rst @@ -0,0 +1,205 @@ +.. _implementations-codependence_marti: + +.. note:: + The following implementations and documentation closely follow the work of Gautier Marti: + `Some contributions to the clustering of financial time series and applications to credit default swaps `_. + +===================== +Codependence by Marti +===================== + +The work mentioned above introduces a new approach of representing the random variables that splits apart dependency and +distribution without losing any information. It also contains a distance metric between two financial time series based +on a novel approach. + +According to the author's classification: + +"Many statistical distances exist to measure the dissimilarity of two random variables, and therefore two i.i.d. random +processes. Such distances can be roughly classified in two families: + + 1. distributional distances, [...] which focus on dissimilarity between probability distributions and quantify divergences + in marginal behaviours, + + 2. dependence distances, such as the distance correlation or copula-based kernel dependency measures [...], + which focus on the joint behaviours of random variables, generally ignoring their distribution properties. + +However, we may want to be able to discriminate random variables both on distribution and dependence. This can be +motivated, for instance, from the study of financial assets returns: are two perfectly correlated random variables +(assets returns), but one being normally distributed and the other one following a heavy-tailed distribution, similar? +From risk perspective, the answer is no [...], hence the propounded distance of this article". + +.. Tip:: + Read the original work to understand the motivation behind creating the novel technique deeper and check the reference + papers that prove the above statements. + +Spearman’s Rho +============== + +Following the work of Marti: + +"[The Pearson correlation coefficient] suffers from several drawbacks: +- it only measures linear relationship between two variables; +- it is not robust to noise +- it may be undefined if the distribution of one of these variables have infinite second moment. + +More robust correlation coefficients are copula-based dependence measures such as Spearman’s rho: + +.. math:: + \rho_{S}(X, Y) &= 12 E[F_{X}(X), F_{Y}(Y)] - 3 \\ + &= \rho(F_{X}(X), F_{Y}(Y)) + +and its statistical estimate: + +.. math:: + \hat{\rho}_{S}(X, Y) = 1 - \frac{6}{T(T^2-1)}\sum_{t=1}^{T}(X^{(t)}- Y^{(t)})^2 + +where :math:`X` and :math:`Y` are univariate random variables, :math:`F_{X}(X)` is the cumulative distribution +function of :math:`X` , :math:`X^{(t)}` is the :math:`t` -th sorted observation of :math:`X` , and :math:`T` is the +total number of observations". + +Our method is a wrapper for the scipy spearmanr function. For more details about the function and its parameters, +please visit `scipy documentation `_. + +Implementation +############## + +.. py:currentmodule:: mlfinlab.codependence.gnpr_distance + +.. autofunction:: spearmans_rho + +Generic Parametric Representation (GPR) distance +================================================ + +Theoretically, Marty defines the distance :math:`d_{\Theta}` between two random variables as: + +" Let :math:`\theta \in [0, 1]` . Let :math:`(X, Y) \in \nu^{2}` , where :math:`\nu` is the space of all continuous +real-valued random variables. Let :math:`G = (G_{X}, G_{Y})` , where :math:`G_{X}` and :math:`G_{Y}` are respectively +:math:`X` and :math:`Y` marginal cdfs. We define the following distance + +.. math:: + d_{\Theta}^{2}(X, Y) = \Theta d_{1}^{2}(G_{X}(X), G_{Y}(Y)) + (1 - \Theta) d_{0}^{2}(G_{X}, G_{Y}) + +where + +.. math:: + d_{1}^{2}(G_{X}(X), G_{Y}(Y)) = 3 \mathbb{E}[|G_{X}(X) - G_{Y}(Y)|^{2}] + +and + +.. math:: + d_{0}^{2}(G_{X}, G_{Y}) = \frac{1}{2} \int_{R} (\sqrt{\frac{d G_{X}}{d \lambda}} - + \sqrt{\frac{d G_{Y}}{d \lambda}})^{2} d \lambda " + +For two Gaussian random variables, the distance :math:`d_{\Theta}` is therefore defined by Marti as: + +" Let :math:`(X, Y)` be a bivariate Gaussian vector, with :math:`X \sim \mathcal{N}(\mu_{X}, \sigma_{X}^{2})` , +:math:`Y \sim \mathcal{N}(\mu_{Y}, \sigma_{Y}^{2})` and :math:`\rho (X,Y)` . We obtain, + +.. math:: + d_{\Theta}^{2}(X, Y) = \Theta \frac{1 - \rho_{S}}{2} + (1 - \Theta) (1 - + \sqrt{\frac{2 \sigma_{X} \sigma_{Y}}{\sigma_{X}^{2} + \sigma_{Y}^{2}}} e^{ - + \frac{1}{4} \frac{(\mu_{X} - \mu_{Y})^{2}}{\sigma_{X}^{2} + \sigma_{Y}^{2}}}) " + +The use of this distance is referenced as the generic parametric representation (GPR) approach. + +From the paper: + +"GPR distance is a fast and good proxy for distance :math:`d_{\Theta}` when the first two moments :math:`\mu` +and :math:`{\sigma}` predominate. Nonetheless, for datasets which contain heavy-tailed distributions, +GPR fails to capture this information". + +.. Tip:: + The process of deriving this definition as well as a proof that :math:`d_{\Theta}` is a metric is present in the work: + `Some contributions to the clustering of financial time series and applications to credit default swaps `_. + + +Implementation +############## + +.. autofunction:: gpr_distance + +Generic Non-Parametric Representation (GNPR) distance +===================================================== + +The statistical estimate of the distance :math:`\tilde{d}_{\Theta}` working on realizations of the i.i.d. random variables +is defined by the author as: + +" Let :math:`(X^{t})_{t=1}^{T}` and :math:`(Y^{t})_{t=1}^{T}` be :math:`T` realizations of real-valued random variables +:math:`X, Y \in \nu` respectively. An empirical distance between realizations of random variables can be defined by + +.. math:: + \tilde{d}_{\Theta}^{2}((X^{t})_{t=1}^{T}, (Y^{t})_{t=1}^{T}) \stackrel{\text{a.s.}}{=} + \Theta \tilde{d}_{1}^{2} + (1 - \Theta) \tilde{d}_{0}^{2} + +where + +.. math:: + \tilde{d}_{1}^{2} = \frac{3}{T(T^{2} - 1)} \sum_{t = 1}^{T} (X^{(t)} - Y^{(t)}) ^ {2} + +and + +.. math:: + \tilde{d}_{0}^{2} = \frac{1}{2} \sum_{k = - \infty}^{+ \infty} (\sqrt{g_{X}^{h}(hk)} - \sqrt{g_{Y}^{h}(hk)})^{2} + +:math:`h` being here a suitable bandwidth, and +:math:`g_{X}^{h}(x) = \frac{1}{T} \sum_{t = 1}^{T} \mathbf{1}(\lfloor \frac{x}{h} \rfloor h \le X^{t} < +(\lfloor \frac{x}{h} \rfloor + 1)h)` being a density histogram estimating dpf :math:`g_{X}` from +:math:`(X^{t})_{t=1}^{T}` , :math:`T` realization of a random variable :math:`X \in \nu` ". + +The use of this distance is referenced as the generic non-parametric representation (GNPR) approach. + +As written in the paper: + +" To use effectively :math:`d_{\Theta}` and its statistical estimate, it boils down to select a particular value for +:math:`\Theta` . We suggest here an exploratory approach where one can test + + (i) distribution information (θ = 0), + + (ii) dependence information (θ = 1), and + + (iii) a mix of both information (θ = 0,5). + +Ideally, :math:`\Theta` should reflect the balance of dependence and distribution information in the data. +In a supervised setting, one could select an estimate :math:`\hat{\Theta}` of the right balance :math:`\Theta^{*}` +optimizing some loss function by techniques such as cross-validation. Yet, the lack of a clear loss function makes +the estimation of :math:`\Theta^{*}` difficult in an unsupervised setting". + +Implementation +############## + +.. autofunction:: gnpr_distance + +Examples +======== + +The following example shows how the above functions can be used: + +.. code-block:: + + import pandas as pd + from mlfinlab.codependence import spearmans_rho, gpr_distance, gnpr_distance + + # Getting the dataframe with time series of returns + data = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates = [0]) + + element_x = 'SPY' + element_y = 'TLT' + + # Calculating the Spearman's rho coefficient between two time series + rho = spearmans_rho(data[element_x], data[element_y]) + + # Calculating the GPR distance between two time series with both + # distribution and dependence information + gpr_dist = gpr_distance(data[element_x], data[element_y], theta=0.5) + + # Calculating the GNPR distance between two time series with dependence information only + gnpr_dist = gnpr_distance(data[element_x], data[element_y], theta=1) + +Research Notebooks +################## + +The following research notebook can be used to better understand the codependence metrics described above. + +* `Codependence by Marti`_ + +.. _`Codependence by Marti`: https://github.com/hudson-and-thames/research/blob/master/Codependence/Codependence%20by%20Marti/codependence_by_marti.ipynb \ No newline at end of file diff --git a/docs/source/codependence/codependence_matrix.rst b/docs/source/codependence/codependence_matrix.rst new file mode 100644 index 000000000..b7239061d --- /dev/null +++ b/docs/source/codependence/codependence_matrix.rst @@ -0,0 +1,47 @@ +.. _codependence-codependence_matrix: + +=================== +Codependence Matrix +=================== + +The functions in this part of the module are used to generate dependence and distance matrices using the codependency and +distance metrics described previously. + +1. **Dependence Matrix** function is used to compute codependences between elements in a given dataframe of elements + using various codependence metrics like Mutual Information, Variation of Information, Distance Correlation, + Spearman's Rho, GPR distance, and GNPR distance. + +2. **Distance Matrix** function can be used to compute a distance matrix from a given codependency matrix using + distance metrics like angular, squared angular and absolute angular. + +.. note:: + + MlFinLab makes use of these functions in the clustered feature importance and portfolio optimization modules. + +Implementation +============== + +.. py:currentmodule:: mlfinlab.codependence.codependence_matrix +.. autofunction:: get_dependence_matrix +.. autofunction:: get_distance_matrix + + +Example +======= + +.. code-block:: + + import pandas as pd + from mlfinlab.codependence import get_dependence_matrix, get_distance_matrix + + # Import dataframe of returns for assets in a portfolio + asset_returns = pd.read_csv(DATA_PATH, index_col='Date', parse_dates=True) + + # Calculate distance correlation matrix + distance_corr = get_dependence_matrix(asset_returns, dependence_method='distance_correlation') + + # Calculate Pearson correlation matrix + pearson_corr = asset_returns.corr() + + # Calculate absolute angular distance from a Pearson correlation matrix + abs_angular_dist = absolute_angular_distance(pearson_corr) diff --git a/docs/source/codependence/correlation_based_metrics.rst b/docs/source/codependence/correlation_based_metrics.rst new file mode 100644 index 000000000..d609c0dca --- /dev/null +++ b/docs/source/codependence/correlation_based_metrics.rst @@ -0,0 +1,190 @@ +.. _codependence-correlation_based_metrics: + +.. note:: + The following implementations and documentation, closely follows the lecture notes from Cornell University, by Marcos Lopez de Prado: + `Codependence (Presentation Slides) `_. + +========================= +Correlation-Based Metrics +========================= + +Distance Correlation +==================== + +**Distance correlation** can capture not only linear association but also non-linear variable dependencies which Pearson correlation can not. +It was introduced in 2005 by Gábor J. Szekely and is described in the work +`"Measuring and testing independence by correlation of distances". `_ +It is calculated as: + +.. math:: + \rho_{dist}[X, Y] = \frac{dCov[X, Y]}{\sqrt{dCov[X, X]dCov[Y,Y}} + +Where :math:`dCov[X, Y]` can be interpreted as the average Hadamard product of the doubly-centered Euclidean distance matrices of +:math:`X, Y`. (`Cornell lecture slides, p.7 `_) + +Values of distance correlation fall in the range: + +.. math:: + 0 \leq \rho_{dist}[X, Y] \leq 1 + +Distance correlation is equal to zero if and only if the two variables are independent (in contrast to Pearson correlation +that can be zero even if the variables are dependant). + +.. math:: + \rho_{dist}[X, Y] = 0 \Leftrightarrow X \perp Y + +As shown in the figure below, distance correlation captures the nonlinear relationship. + +.. image:: images/distance_correlation.png + :scale: 70 % + :align: center + +The numbers in the first line are Pearson correlation values and the values in the second line are Distance correlation values. +This figure is from `"Introducing the discussion paper by Székely and Rizzo" `_ +by Michale A. Newton. It provides a great overview for readers. + +Implementation +############## + +.. py:currentmodule:: mlfinlab.codependence.correlation + +.. autofunction:: distance_correlation + +Standard Angular Distance +========================= + +**Angular distance** is a slight modification of the Pearson correlation coefficient which satisfies all distance metric conditions. +This measure is known as the angular distance because when we use *covariance* as an *inner product*, we can interpret correlation as :math:`cos\theta`. + +A proof that angular distance is a true metric can be found in the work by Lopez de Prado +`Building Diversified Portfolios that Outperform Out-of-Sample: `_ + +"Angular distance is a linear multiple of the Euclidean distance between the vectors :math:`\{X, Y\}` after z-standardization, +hence it inherits the true-metric properties of the Euclidean distance." + +According to Lopez de Prado: + +"The [standard angular distance] metric deems more distant two random variables with negative correlation than two random +variables with positive correlation". + +"This property makes sense in many applications. For example, we may wish to build a **long-only portfolio**, where holdings +in negative-correlated securities can only offset risk, and therefore should be treated as different for diversification purposes". + +Formula used to calculate standard angular distance: + +.. math:: + d_\rho[X, Y] = \sqrt{\frac{1}{2}(1-\rho[X,Y])} + +where :math:`\rho[X,Y]` is Pearson correlation between the vectors :math:`\{X, Y\}` . + +Values of standard angular distance fall in the range: + +.. math:: + d_\rho[X, Y] \in [0, 1] + +.. figure:: images/angular_distance.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Angular Distance + + The angular distance satisfies all the conditions of a true metric, (Lopez de Prado, 2020.) + +Implementation +############## + +.. autofunction:: angular_distance + +Absolute Angular Distance +========================= + +This modification of angular distance uses an absolute value of Pearson correlation in the formula. + +This property assigns small distance to elements that have a high negative correlation. According to Lopez de Prado, this +is useful because "in **long-short portfolios**, we often prefer to consider highly negatively-correlated securities as similar, +because the position sign can override the sign of the correlation". + +Formula used to calculate absolute angular distance: + +.. math:: + d_{|\rho|}[X, Y] = \sqrt{1-|\rho[X,Y]|} + +where :math:`\rho[X,Y]` is Pearson correlation between the vectors :math:`\{X, Y\}` . + +Values of absolute angular distance fall in the range: + +.. math:: + d_{|\rho|}[X, Y] \in [0, 1] + +.. figure:: images/modified_angular_distance.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Modified Angular Distance + + In some financial applications, it makes more sense to apply a modified definition of angular distance, such that the + sign of the correlation is ignored, (Lopez de Prado, 2020) + +Implementation +############## + +.. autofunction:: absolute_angular_distance + +Squared Angular Distance +========================= + +Squared angular distance uses the squared value of Pearson correlation in the formula and has similar properties to absolute +angular distance. The only difference is that a higher distance is assigned to the elements that have a small absolute correlation. + +Formula used to calculate squared angular distance: + +.. math:: + d_{\rho^2}[X, Y] = \sqrt{1-{\rho[X,Y]}^2} + +where :math:`\rho[X,Y]` is Pearson correlation between the vectors :math:`\{X, Y\}` . + +Values of squared angular distance fall in the range: + +.. math:: + d_{\rho^2}[X, Y] \in [0, 1] + +.. figure:: images/modified_angular_distance.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Modified Angular Distance + +Implementation +############## + +.. autofunction:: squared_angular_distance + +Examples +======== + +The following examples show how the described above correlation-based metrics can be used on real data: + + +.. code-block:: + + import pandas as pd + from mlfinlab.codependence import distance_correlation, angular_distance, + absolute_angular_distance, squared_angular_distance + + # Import dataframe of returns for assets in a portfolio + asset_returns = pd.read_csv(DATA_PATH, index_col='Date', parse_dates=True) + + asset1 = 'SPY' + asset2 = 'TLT' + + # Calculate distance correlation between chosen assets + distance_corr = distance_correlation(asset_returns[asset1], asset_returns[assets2]) + + # Calculate angular distance between chosen assets + angular_dist = angular_distance(asset_returns[asset1], asset_returns[assets2]) + + # Calculate absolute angular distance between chosen assets + angular_dist = absolute_angular_distance(asset_returns[asset1], asset_returns[assets2]) + + # Calculate squared angular distance between chosen assets + angular_dist = squared_angular_distance(asset_returns[asset1], asset_returns[assets2]) diff --git a/docs/source/implementations/codependence_images/abs.png b/docs/source/codependence/images/abs.png similarity index 100% rename from docs/source/implementations/codependence_images/abs.png rename to docs/source/codependence/images/abs.png diff --git a/docs/source/implementations/codependence_images/angular_distance.png b/docs/source/codependence/images/angular_distance.png similarity index 100% rename from docs/source/implementations/codependence_images/angular_distance.png rename to docs/source/codependence/images/angular_distance.png diff --git a/docs/source/implementations/codependence_images/distance_correlation.png b/docs/source/codependence/images/distance_correlation.png similarity index 100% rename from docs/source/implementations/codependence_images/distance_correlation.png rename to docs/source/codependence/images/distance_correlation.png diff --git a/docs/source/implementations/codependence_images/entropy_relation_diagram.png b/docs/source/codependence/images/entropy_relation_diagram.png similarity index 100% rename from docs/source/implementations/codependence_images/entropy_relation_diagram.png rename to docs/source/codependence/images/entropy_relation_diagram.png diff --git a/docs/source/implementations/codependence_images/independent.png b/docs/source/codependence/images/independent.png similarity index 100% rename from docs/source/implementations/codependence_images/independent.png rename to docs/source/codependence/images/independent.png diff --git a/docs/source/implementations/codependence_images/linear.png b/docs/source/codependence/images/linear.png similarity index 100% rename from docs/source/implementations/codependence_images/linear.png rename to docs/source/codependence/images/linear.png diff --git a/docs/source/implementations/codependence_images/modified_angular_distance.png b/docs/source/codependence/images/modified_angular_distance.png similarity index 100% rename from docs/source/implementations/codependence_images/modified_angular_distance.png rename to docs/source/codependence/images/modified_angular_distance.png diff --git a/docs/source/implementations/codependence_images/squared.png b/docs/source/codependence/images/squared.png similarity index 100% rename from docs/source/implementations/codependence_images/squared.png rename to docs/source/codependence/images/squared.png diff --git a/docs/source/codependence/information_theory_metrics.rst b/docs/source/codependence/information_theory_metrics.rst new file mode 100644 index 000000000..b6c697f44 --- /dev/null +++ b/docs/source/codependence/information_theory_metrics.rst @@ -0,0 +1,236 @@ +.. _codependence-information_theory_metrics: + +.. note:: + The following implementations and documentation, closely follows the lecture notes from Cornell University, by Marcos Lopez de Prado: + `Codependence (Presentation Slides) `_. + +========================== +Information Theory Metrics +========================== + +We can gauge the codependence from the information theory perspective. In information theory, (Shannon’s) entropy is a +measure of information (uncertainty). As described in the `Cornell lecture slides, p.13 `_ +, entropy is calculated as: + +.. math:: + H[X] = -\sum\limits_{x \in S_{X}}p[x]log[p[x]] + +Where :math:`X` is a discrete random variable that takes a value :math:`x` from the set :math:`S_{X}` with probability +:math:`p[x]` . + +In short, we can say that entropy is the expectation of the amount of information when we sample from a particular probability +distribution or the number of bits to transmit to the target. So, if there is a correspondence between random variables, +the correspondence will be reflected in entropy. For example, if two random variables are associated, the amount of +information in the joint probability distribution of the two random variables will be less than the sum of the information +in each random variable. This is because knowing a correspondence means knowing one random variable can reduce uncertainty +about the other random variable. + +.. math:: + H[X+Y] = H[X] + H[Y], X \bot Y + + +This module presents two ways of measuring correspondence: + +1. Mutual Information +2. Variation of Information + + +The following figure highlights how we can view the relationships of various information measures associated with correlated variables +:math:`X` and :math:`Y` through the below figure. (`Cornell lecture slides, p.24 `_) + +.. figure:: images/entropy_relation_diagram.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Entropy Relational Diagram + + The correspondence between joint entropy, marginal entropies, conditional entropies, mutual information and variation of information (Lopez de Prado, 2020) + +Mutual Information +================== + +According to Lopez de Prado: "**Mutual Information** is defined as the decrease in uncertainty (or informational gain) +in :math:`X` that results from knowing the value of :math:`Y`. Mutual information is not a metric as it doesn't satisfy +the triangle inequality". The properties of non-negativity and symmetry are satisfied. Mutual information is calculated as: + + +.. math:: + \begin{align*} + I[X, Y]=& H[X] - H[X|Y]\\ + =& H[X] + H[Y] - H[X,Y]\\ + =& \sum\limits_{x \in S_{X}} \sum\limits_{y \in S_{Y}}p[x,y]log[\frac{p[x,y]}{p[x]p[y]}]\\ + \end{align*} + +Mutual information has a grouping property: + +.. math:: + + I[X, Y, Z] = I[X, Y] + I[(X, Y), Z] + +where :math:`(X, Y)` is a joint distribution of :math:`X` and :math:`Y` . + +It can also be normalized using a known upper boundary: + +.. math:: + + I[X, Y] \le min\{H[X] + H[Y]\} + +Implementation +############## + +.. py:currentmodule:: mlfinlab.codependence.information + +.. autofunction:: get_mutual_info + + +Variation of Information +======================== + +According to Lopez de Prado: "**Variation of Information** can be interpreted as the uncertainty we expect in one variable +if we are told the value of another". The variation of information is a true metric and satisfies the axioms from the introduction. + +.. math:: + \begin{align*} + VI[X,Y]=& H[X|Y] + H[Y|X]\\ + =& H[X] + H[Y]-2I[X,Y]\\ + =& 2H[X,Y]-H[X]-H[Y]\\ + \end{align*} + +The upper bound of Variation of information is not firm as it depends on the sizes of the population which is problematic +when comparing variations of information across different population sizes, as described in +`Cornell lecture slides, p.21 `_ + +Implementation +############## + +.. autofunction:: variation_of_information_score + + +Discretization +============== + +Both mutual information and variation of information are using random variables that are discrete. To use these tools for +continuous random variables the discretization approach can be used. + +For the continuous case, we can quantize the values to estimate :math:`H[X]`. Following the `Cornell lecture slides, p.26 `_ : + +.. math:: + \begin{align*} + H[X] =& \int_{\infty}^{\infty}f_{X}[x]log[f_{X}[x]]dx\\ + \: \approx& -\sum\limits_{i=1}^{B_{X}}f_{X}[x_{i}]log[f_{X}[x_{i}]]\Delta_{x}\\ + \end{align*} + +where the observed values :math:`\{x\}` are divided into :math:`B_{X}` bins of equal size :math:`\Delta_{X}`, +:math:`\Delta_{X} = \frac{max\{x\} - min\{x\}}{B_{X}}` , and :math:`f_{X}[x_{i}]` is the frequency of observations +within the i-th bin. + +So, the discretized estimator of entropy is: + +.. math:: + \hat{H}[X]=-\sum\limits_{i=1}^{B_{X}}\frac{N_{i}}{N}log[\frac{N_{i}}{N}]log[\Delta_{X}] + +where :math:`N_{i}` is the number of observations within the i-th bin, :math:`N = \sum_{i=1}^{B_{X}}N_{i}` . + +From the above equations, the size of the bins should be chosen. The results of the entropy estimation will depend on the +binning. The works by `Hacine-Gharbi et al. (2012) `_ and +`Hacine-Gharbi and Ravier (2018) `_ present optimal binning +for marginal and joint entropy. + +This optimal binning method is used in the mutual information and variation of information functions. + +Implementation +############## + +.. autofunction:: get_optimal_number_of_bins + + +Examples +======== + +The following example highlights how the various metrics behave under various variable dependencies: + +1. Linear +2. Squared +3. :math:`Y = abs(X)` +4. Independent variables + +.. code-block:: + + import numpy as np + import matplotlib.pyplot as plt + + from mlfinlab.codependence import distance_correlation, get_mutual_info, variation_of_information_score + from ace import model # ace package is used for max correlation estimation + + def max_correlation(x: np.array, y: np.array) -> float: + """ + Get max correlation using ace package. + """ + + x_input = [x] + y_input = y + ace_model = model.Model() + ace_model.build_model_from_xy(x_input, y_input) + return np.corrcoef(ace_model.ace.x_transforms[0], ace_model.ace.y_transform)[0][1] + + state = np.random.RandomState(42) + x = state.normal(size=1000) + y_1 = 2 * x + state.normal(size=1000) / 5 # linear + y_2 = x ** 2 + state.normal(size=1000) / 5 # squared + y_3 = abs(x) + state.normal(size=1000) / 5 # Abs + # independent + y_4 = np.random.RandomState(0).normal(size=1000) * np.random.RandomState(5).normal(size=1000) + + for y, dependency in zip([y_1, y_2, y_3, y_4], ['linear', 'squared', 'y=|x|', 'independent']): + text = "Pearson corr: {:0.2f} " + \ + "\nNorm.mutual info: {:0.2f} " + \ + "\nDistance correlation: {:0.2f} " + \ + "\nInformation variation: {:0.2f} " + \ + "\nMax correlation: {:0.2f}" + + text = text.format(np.corrcoef(x, y)[0, 1], + get_mutual_info(x, y, normalize=True), + distance_correlation(x, y), + variation_of_information_score(x, y, normalize=True), + max_correlation(x, y)) + + # Plot relationships + fig, ax = plt.subplots(figsize=(8,7)) + props = dict(boxstyle='round', facecolor='wheat', alpha=0.5) + ax.text(0.05, 0.95, text, transform=ax.transAxes, fontsize=14, verticalalignment='top', bbox=props) + plt.title(dependency) + ax.plot(x, y, 'ro') + plt.savefig('{}.png'.format(dependency)) + + +.. figure:: images/linear.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Linear Codependence + + Linear + +.. figure:: images/squared.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Squared Codependence + + Squared + +.. figure:: images/abs.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: Absolute Codependence + + Absolute + +.. figure:: images/independent.png + :scale: 70 % + :align: center + :figclass: align-center + :alt: No Relationship + + Indepedent diff --git a/docs/source/codependence/introduction.rst b/docs/source/codependence/introduction.rst new file mode 100644 index 000000000..2906dcf0c --- /dev/null +++ b/docs/source/codependence/introduction.rst @@ -0,0 +1,41 @@ +.. _codependence-introduction: + +============ +Introduction +============ + +This module includes implementations of codependence metrics. According to Lopez de Prado: + +"Two random variables are codependent when knowing the value of one helps us determine the value of the other. +This should not be confounded with the notion of causality." + +Pearson correlation coefficient is the most famous and widely used measure of codependence, however, it has some drawbacks. + +.. warning:: + + Pearson correlation suffers from 3 major drawbacks: + + 1) It captures linear effects, but if two variables have strong non-linear dependency (squared or abs for example) Pearson correlation won't find any pattern between them. + 2) Correlation is not a distance metric: it does not satisfy non-negativity and subadditivity conditions. + 3) Financial markets have non-linear patterns, which Pearson correlation fails to capture. + +Pearson correlation is not the only way of measuring codependence. There are alternative and more modern measures of codependence, +which are described in the parts of this module. + +.. note:: + For some methods in this module, it’s discussed whether they are true metrics. + According to Arkhangel'skii, A. V. and Pontryagin, L. S. (1990), **General Topology I**: + A metric on a set :math:`X` is a function (called a distance): + + .. math:: + d: X \times X \rightarrow [0,+ \infty) ; x, y, z \in X + + for which the following three axioms are satisfied: + + 1. :math:`d(x, y) = 0 \iff x = y` — identity of indiscernibles; + + 2. :math:`d(x,y) = d(y,x)` — symmetry; + + 3. :math:`d(x,y) \le d(x,z) + d(z,y)` — triangle inequality; + + and these imply :math:`d(x,y) \ge 0` — non-negativity. \ No newline at end of file diff --git a/docs/source/getting_started/datasets.rst b/docs/source/getting_started/datasets.rst index d92f53bc2..7491a8513 100644 --- a/docs/source/getting_started/datasets.rst +++ b/docs/source/getting_started/datasets.rst @@ -42,7 +42,7 @@ ETF prices ########## .. py:currentmodule:: mlfinlab.datasets.load_datasets -.. autofunction:: load_dollar_bar_sample +.. autofunction:: load_stock_prices The data set consists of close prices for: EEM, EWG, TIP, EWJ, EFA, IEF, EWQ, EWU, XLB, XLE, XLF, LQD, XLK, XLU, EPP, FXI, VGK, VPL, SPY, TLT, BND, CSJ, DIA starting from 2008 till 2016. It can be used to test and validate portfolio diff --git a/docs/source/implementations/backtesting.rst b/docs/source/implementations/backtesting.rst index 555197e82..07471f40e 100644 --- a/docs/source/implementations/backtesting.rst +++ b/docs/source/implementations/backtesting.rst @@ -142,6 +142,7 @@ The method returns np.array of minimum average monthly returns by the method as method is [Bonferroni, Holm, BHY, Average]. .. autoclass:: CampbellBacktesting + :noindex: :members: __init__, profit_hurdle Example diff --git a/docs/source/implementations/codependence.rst b/docs/source/implementations/codependence.rst deleted file mode 100644 index 26a71a013..000000000 --- a/docs/source/implementations/codependence.rst +++ /dev/null @@ -1,355 +0,0 @@ -.. _implementations-codependence: - -.. note:: - The following implementations and documentation, closely follows the lecture notes notes from Cornell University, by Marcos Lopez de Prado: - `Codependence (Presentation Slides) `_. - - -============ -Codependence -============ - -Pearson correlation coefficient is the most famous and widely used measure of codependence, however, there are some drawbacks. - -.. warning:: - - Pearson correlation suffers from 3 major drawbacks: - - 1) It captures linear effects, but if two variables have strong non-linear dependency (squared or abs for example) Pearson correlation won't find any pattern between them. - 2) Correlation is not a distance metric: it does not satisfy non-negativity and subadditivity conditions. - 3) Financial market have non-linear patterns and correlations fails to capture them. - -However, Pearson correlation is not the only way of measuring codependence. There are alternative and more modern measures of codependence, such -such as those introduced in information theory. - - -Correlation-Based Metrics -########################### - -Distance Correlation -******************** - -**Distance Correlation** can capture not only linear association but also non-linear variable dependencies which Pearson correlation can not. -It was introduced in 2005 by Gábor J. Szekely. (`wikipedia `_) - -.. math:: - \rho_{dist}[X, Y] = \frac{dCov[X, Y]}{\sqrt{dCov[X, X]dCov[Y,Y}} - -Where :math:`dCov[X, Y]` can be interpreted as the average Hadamard product of the doubly-centered Euclidean distance matrices of -:math:`X, Y`. (`Cornell lecture slides, p.7 `_) - -Then - -.. math:: - 0 \leq \rho_{dist}[X, Y] \leq 1 - - -| Unlike Pearson's correlation, when the value is zero, we can say the two variables are independent. - -.. math:: - \rho_{dist}[X, Y] = 0 \Leftrightarrow X \perp Y - - -| As shown in the figure below, Distance Correlation captures the nonlinear relationship. - -.. image:: codependence_images/distance_correlation.png - :scale: 70 % - :align: center - - -The numbers in the first line are Pearson correlation values and the values in the second line are Distance correlation values. -This figure is from `Introducing the discussion paper by Székely and Rizzo `_ -by Michale A. Newton. It provides a great overview for readers. - -Implementation -============== - -.. py:currentmodule:: mlfinlab.codependence.correlation - -.. autofunction:: distance_correlation - - -Angular Distance -***************** - -**Angular Distance** is a slight modification of the correlation coefficient which satisfies all distance metric conditions. -This measure is known as the angular distance because when we use *covariance* as *inner product*, we can interpret correlation as :math:`cos\theta`. - -It is a metric, because it is a linear multiple of the Euclidean distance between the vectors :math:`X, Y` (after standardization) -(`Cornell lecture slides, p.10 `_). - -There are three types of angular distance: standard, absolute and squared. - -Standard -======== - -.. figure:: codependence_images/angular_distance.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Angular Distance - - The angular distance satisfies all the conditions of a true metric, (Lopez de Prado, 2020.) - - -.. autofunction:: angular_distance - -.. math:: - d_\rho[X, Y] = \sqrt{\frac{1}{2}(1-\rho[X,Y])} - -.. math:: - d_\rho \in [0, 1] - - -Absolute and Squared -==================== - -.. figure:: codependence_images/modified_angular_distance.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Modified Angular Distance - - In some financial applications, it makes more sense to apply a modified definition of angular distance, such that the - sign of the correlation is ignored, (Lopez de Prado, 2020) - -**Absolute** - -.. math:: - d_{|\rho|}[X, Y] = \sqrt{1-|\rho[X,Y]|} - -.. autofunction:: absolute_angular_distance - -| - -**Squared** - -.. math:: - d_{\rho^2}[X, Y] = \sqrt{1-{\rho[X,Y]}^2} - -.. autofunction:: squared_angular_distance - - ----- - -Information Theory Metrics -########################## - -We can gauge the codependence from the information theory perspective. In information theory, (Shannon’s) entropy is a -measure of information (uncertainty). - -.. math:: - H[X] = -\sum\limits_{x \in S_{X}}p[x]log[p[x]] - -In short, we can say that entropy is the expectation of the amount of information when we sample from a particular probability distribution or the number of bits to transmit to the target. -So, If there is correspondence between random variables, the correspondence will be reflected in entropy. For example, if two random variables are associated, -the amount of information in the joint probability distribution of the two random variables will be less than the sum of the information in each random variable. -This is because knowing a correspondence means knowing one random variable can reduce uncertainty about the other random variable. - -.. math:: - H[X+Y] = H[X] + H[Y], X \bot Y - - -Here, we have two ways of measuring correspondence: - -1. Mutual Information -2. Variation of Information - - -The following figure highlights how we can view the relationships of various information measures associated with correlated variables -:math:`X` and :math:`Y` through below figure. (`Cornell lecture slides, p.24 `_) - -.. figure:: codependence_images/entropy_relation_diagram.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Entropy Relational Diagram - - The correspondence between joint entropy, marginal entropies, conditional entropies, mutual information and variation of information (Lopez de Prado, 2020) - -Mutual Information -****************** - -Mutual Information is defined as the decrease in uncertainty (or informational gain) in X that results from knowing the value of Y. -Mutual information is not a metric and needs to be normalized. (`Cornell lecture slides, p.18 `_) - -.. math:: - \begin{align*} - I[X, Y]=& H[X] - H[X|Y]\\ - =& H[X]+H[Y]-H[X,Y]\\ - =& \sum\limits_{x \in S_{X}} \sum\limits_{y \in S_{Y}}p[x,y]log[\frac{p[x,y]}{p[x]p[y]}]\\ - \end{align*} - -.. py:currentmodule:: mlfinlab.codependence.information - -.. autofunction:: get_mutual_info - - -Variation of Information -************************ - -Variation of Information can be interpreted as the uncertainty we expect in one variable if we are told the value of another. -Variation of information is a metric because it satisfies non-negativity, symmetry, and triangle inequality axioms. - -.. math:: - \begin{align*} - VI[X,Y]=& H[X|Y] + H[Y|X]\\ - =& H[X] + H[Y]-2I[X,Y]\\ - =& 2H[X,Y]-H[X]-H[Y]\\ - \end{align*} - -.. autofunction:: variation_of_information_score - - -Discretization -************** - -Throughout the above section, we have assumed that random variables were discrete. - -For the continuous case, we can quantize the values and estimate :math:`H[X]`, and apply the same concepts on the binned observations. -(`Cornell lecture slides, p.26 `_) - -.. math:: - \begin{align*} - H[X] =& \int_{\infty}^{\infty}f_{X}[x_{i}]logf_{X}[x]dx\\ - \: &\approx-\sum\limits_{i=1}^{B_{X}}f_{X}[x_{i}]logf_{X}[x_{i}]\\ - \end{align*} - -.. math:: - \hat{H}[X]=-\sum\limits_{i=1}^{B_{X}}\frac{N_{i}}{N}log[\frac{N_{i}}{N}]log[\Delta_{x}] - -As you can see from these equations, we need to choose the binning carefully because results may be biased. -There are optimal binning depends on entropy case(marginal, joint). -You can optimal number of bins for discretization through below method. -This function is need for using methods for getting information based codependence. - -.. autofunction:: get_optimal_number_of_bins - - -Examples -######## - -The following example highlights how the various metrics behave under various variable dependencies: - -1. Linear -2. Squared -3. Y = abs(X) -4. Independent variables - -.. code-block:: - - import numpy as np - import matplotlib.pyplot as plt - - from mlfinlab.codependece import distance_correlation, get_mutual_info, variation_of_information_score - from ace import model # ace package is used for max correlation estimation - - def max_correlation(x: np.array, y: np.array) -> float: - """ - Get max correlation using ace package. - """ - - x_input = [x] - y_input = y - ace_model = model.Model() - ace_model.build_model_from_xy(x_input, y_input) - return np.corrcoef(ace_model.ace.x_transforms[0], ace_model.ace.y_transform)[0][1] - - state = np.random.RandomState(42) - x = state.normal(size=1000) - y_1 = 2 * x + state.normal(size=1000) / 5 # linear - y_2 = x ** 2 + state.normal(size=1000) / 5 # squared - y_3 = abs(x) + state.normal(size=1000) / 5 # Abs - # independent - y_4 = np.random.RandomState(0).normal(size=1000) * np.random.RandomState(5).normal(size=1000) - - for y, dependency in zip([y_1, y_2, y_3, y_4], ['linear', 'squared', 'y=|x|', 'independent']): - text = "Pearson corr: {:0.2f} " + \ - "\nNorm.mutual info: {:0.2f} " + \ - "\nDistance correlation: {:0.2f} " + \ - "\nInformation variation: {:0.2f} " + \ - "\nMax correlation: {:0.2f}" - - text = text.format(np.corrcoef(x, y)[0, 1], - get_mutual_info(x, y, normalize=True), - distance_correlation(x, y), - variation_of_information_score(x, y, normalize=True), - max_correlation(x, y)) - - # Plot relationships - fig, ax = plt.subplots(figsize=(8,7)) - props = dict(boxstyle='round', facecolor='wheat', alpha=0.5) - ax.text(0.05, 0.95, text, transform=ax.transAxes, fontsize=14, verticalalignment='top', bbox=props) - plt.title(dependency) - ax.plot(x, y, 'ro') - plt.savefig('{}.png'.format(dependency)) - - -.. figure:: codependence_images/linear.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Linear Codependence - - Linear - -.. figure:: codependence_images/squared.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Squared Codependence - - Squared - -.. figure:: codependence_images/abs.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: Absolute Codependence - - Absolute - -.. figure:: codependence_images/independent.png - :scale: 70 % - :align: center - :figclass: align-center - :alt: No Relationship - - Indepedent - - -Codependence Matrix -################### - -This module consists two functions that generate the following: - -1. **Dependence Matrix** to compute dependence of a given matrix using various codependence method like Mutual Information, - Variation of Information and Distance Correlation. -2. **Distance Matrix** can used to compute distance of a given matrix using various metrics like angular, squared - angular and absolute angular. - -.. note:: - - MlFinLab makes use of these functions in the clustered feature importance. - -Implementation -************** - -.. py:currentmodule:: mlfinlab.codependence.codependence_matrix -.. autofunction:: get_dependence_matrix -.. autofunction:: get_distance_matrix - - -Example -******* - -.. code-block:: - - import pandas as pd - from mlfinlab.codependence.codependence_matrix import (get_dependence_matrix, - get_distance_matrix) - - X = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates = [0]) - - dep_matrix = get_dependence_matrix(X, dependence_method='distance_correlation') - dist_matrix = get_distance_matrix(dep_matrix, distance_metric='angular') diff --git a/docs/source/implementations/feature_clusters.rst b/docs/source/implementations/feature_clusters.rst index 98b17cb51..264577ff7 100644 --- a/docs/source/implementations/feature_clusters.rst +++ b/docs/source/implementations/feature_clusters.rst @@ -41,7 +41,7 @@ if the silhouette scores clearly indicate that features belong to their respecti Implementation ************** -This module creates clustered subsets of features described in the presentation slides: `Clustered Feature Importance `_ +This module creates clustered subsets of features described in the presentation slides: `Clustered Feature Importance `__ by Marcos Lopez de Prado. .. py:currentmodule:: mlfinlab.clustering.feature_clusters @@ -65,8 +65,10 @@ The example will generate 4 clusters by Hierarchical Clustering for given specif feat_subs = get_feature_clusters(X, dependence_metric='information_variation', distance_metric='angular', linkage_method='singular', n_clusters=4) + Research Notebook ***************** + The for better understanding of its implementations see the notebook on Clustered Feature Importance. .. _Clustered Feature Importance: https://github.com/hudson-and-thames/research/blob/master/Advances%20in%20Financial%20Machine%20Learning/Feature%20Importance/Cluster_Feature_Importance.ipynb diff --git a/docs/source/implementations/feature_importance.rst b/docs/source/implementations/feature_importance.rst index f0dbf7b46..142c87d37 100644 --- a/docs/source/implementations/feature_importance.rst +++ b/docs/source/implementations/feature_importance.rst @@ -36,42 +36,41 @@ An example showing how to use various feature importance functions: .. code-block:: - import pandas as pd - from sklearn.ensemble import RandomForestClassifier - from sklearn.metrics import accuracy_score, log_loss + import pandas as pd + from sklearn.ensemble import RandomForestClassifier + from sklearn.metrics import accuracy_score, log_loss - from mlfinlab.ensemble import SequentiallyBootstrappedBaggingClassifier - from mlfinlab.feature_importance import (mean_decrease_impurity, mean_decrease_accuracy, single_feature_importance, plot_feature_importance) - from mlfinlab.cross_validation import PurgedKFold, ml_cross_val_score + from mlfinlab.ensemble import SequentiallyBootstrappedBaggingClassifier + from mlfinlab.feature_importance import (mean_decrease_impurity, mean_decrease_accuracy, single_feature_importance, plot_feature_importance) + from mlfinlab.cross_validation import PurgedKFold, ml_cross_val_score - X_train = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates = [0]) - y_train = pd.read_csv('y_FILE_PATH.csv', index_col=0, parse_dates = [0]) - triple_barrier_events = pd.read_csv('BARRIER_FILE_PATH', index_col=0, parse_dates = [0, 2]) - price_bars = pd.read_csv('PRICE_BARS_FILE_PATH', index_col=0, parse_dates = [0, 2]) + X_train = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates=[0]) + y_train = pd.read_csv('y_FILE_PATH.csv', index_col=0, parse_dates=[0]) + triple_barrier_events = pd.read_csv('BARRIER_FILE_PATH', index_col=0, parse_dates=[0, 2]) + price_bars = pd.read_csv('PRICE_BARS_FILE_PATH', index_col=0, parse_dates=[0, 2]) - triple_barrier_events = triple_barrier_events.loc[X.index, :] # Take only train part - price_events = price_events[(price_events.index >= X.index.min()) & (price_events.index <= X.index.max())] + triple_barrier_events = triple_barrier_events.loc[X_train.index, :] # Take only train part - cv_gen = PurgedKFold(n_splits=4, samples_info_sets=triple_barrier_events.t1) + cv_gen = PurgedKFold(n_splits=4, samples_info_sets=triple_barrier_events.t1) - base_est = RandomForestClassifier(n_estimators=1, criterion='entropy', bootstrap=False, - class_weight='balanced_subsample') - clf = SequentiallyBootstrappedBaggingClassifier(base_estimator=base_est, samples_info_sets=triple_barrier_events.t1, - price_bars=price_bars, oob_score=True) - clf.fit(X_train, y_train) + base_est = RandomForestClassifier(n_estimators=1, criterion='entropy', bootstrap=False, + class_weight='balanced_subsample') + clf = SequentiallyBootstrappedBaggingClassifier(base_estimator=base_est, samples_info_sets=triple_barrier_events.t1, + price_bars=price_bars, oob_score=True) + clf.fit(X_train, y_train) - oos_score = ml_cross_val_score(clf, X_train, y_train, cv_gen=cv_gen, sample_weight_train=None, scoring=accuracy_score).mean() + oos_score = ml_cross_val_score(clf, X_train, y_train, cv_gen=cv_gen, sample_weight_train=None, scoring=accuracy_score).mean() - mdi_feature_imp = mean_decrease_impurity(clf, X_train.columns) - mda_feature_imp = mean_decrease_accuracy(clf, X_train, y_train, cv_gen, scoring=log_loss) - sfi_feature_imp = single_feature_importance(clf, X_train, y_train, cv_gen, scoring=accuracy_score) + mdi_feature_imp = mean_decrease_impurity(clf, X_train.columns) + mda_feature_imp = mean_decrease_accuracy(clf, X_train, y_train, cv_gen, scoring=log_loss) + sfi_feature_imp = single_feature_importance(clf, X_train, y_train, cv_gen, scoring=accuracy_score) - plot_feature_importance(mdi_feat_imp, oob_score=clf.oob_score_, oos_score=oos_score, - save_fig=True, output_path='mdi_feat_imp.png') - plot_feature_importance(mda_feat_imp, oob_score=clf.oob_score_, oos_score=oos_score, - save_fig=True, output_path='mda_feat_imp.png') - plot_feature_importance(sfi_feat_imp, oob_score=clf.oob_score_, oos_score=oos_score, - save_fig=True, output_path='sfi_feat_imp.png') + plot_feature_importance(mdi_feature_imp, oob_score=clf.oob_score_, oos_score=oos_score, + save_fig=True, output_path='mdi_feat_imp.png') + plot_feature_importance(mda_feature_imp, oob_score=clf.oob_score_, oos_score=oos_score, + save_fig=True, output_path='mda_feat_imp.png') + plot_feature_importance(sfi_feature_imp, oob_score=clf.oob_score_, oos_score=oos_score, + save_fig=True, output_path='sfi_feat_imp.png') The following are the resulting images from the MDI, MDA, and SFI feature importances respectively: @@ -135,46 +134,45 @@ Example ******* .. code-block:: - import pandas as pd - from sklearn.tree import DecisionTreeClassifier - from sklearn.ensemble import BaggingClassifier - from sklearn.metrics import accuracy_score, log_loss - from sklearn.model_selection._split import KFold - - from mlfinlab.util.generate_dataset import get_classification_data - from mlfinlab.feature_importance import (mean_decrease_impurity, mean_decrease_accuracy, - plot_feature_importance) - from mlfinlab.cross_validation import ml_cross_val_score - from mlfinlab.clustering.feature_clusters import get_feature_clusters - - # Create Clusters - X, y = get_classification_data(n_features=40, n_informative=5, n_redundant=30, - n_samples=1000, sigmaStd=.1) - feature_clusters = get_feature_clusters(X, dependence_metric='linear', n_clusters=None) - - # Fit model - clf_base=DecisionTreeClassifier(criterion='entropy', max_features=1, class_weight='balanced', - min_weight_fraction_leaf=0) - clf=BaggingClassifier(base_estimator=clf_base, n_estimators=1000, max_features=1.0, - max_samples=1.0, oob_score=True) - fit=clf.fit(X,y) - - # Score model - cvGen = KFold(n_splits=10) - oos_score = ml_cross_val_score(clf, X, y, cv_gen=cv_gen, sample_weight_train=None, - scoring=accuracy_score).mean() - - # Feature Importance - clustered_mdi = mean_decrease_impurity(clf, X_train.columns, - clustered_subsets=feature_clusters) - clustered_mda = mean_decrease_accuracy(clf, X_train, y_train, cv_gen, - clustered_subsets=feature_clusters, scoring=log_loss) - - # Plot - plot_feature_importance(clustered_mdi, oob_score=clf.oob_score_, oos_score=oos_score, - save_fig=True, output_path='clustered_mdi.png') - plot_feature_importance(clustered_mda, oob_score=clf.oob_score_, oos_score=oos_score, - save_fig=True, output_path='clustered_mda.png') + from sklearn.tree import DecisionTreeClassifier + from sklearn.ensemble import BaggingClassifier + from sklearn.metrics import accuracy_score, log_loss + from sklearn.model_selection._split import KFold + + from mlfinlab.util.generate_dataset import get_classification_data + from mlfinlab.feature_importance import (mean_decrease_impurity, mean_decrease_accuracy, + plot_feature_importance) + from mlfinlab.cross_validation import ml_cross_val_score + from mlfinlab.clustering.feature_clusters import get_feature_clusters + + # Create Clusters + X, y = get_classification_data(n_features=40, n_informative=5, n_redundant=30, + n_samples=1000, sigma=.1) + feature_clusters = get_feature_clusters(X, dependence_metric='linear', n_clusters=None) + + # Fit model + clf_base = DecisionTreeClassifier(criterion='entropy', max_features=1, class_weight='balanced', + min_weight_fraction_leaf=0) + clf = BaggingClassifier(base_estimator=clf_base, n_estimators=1000, max_features=1.0, + max_samples=1.0, oob_score=True) + fit = clf.fit(X, y) + + # Score model + cv_gen = KFold(n_splits=10) + oos_score = ml_cross_val_score(clf, X, y, cv_gen=cv_gen, sample_weight_train=None, + scoring=accuracy_score).mean() + + # Feature Importance + clustered_mdi = mean_decrease_impurity(clf, X.columns, + clustered_subsets=feature_clusters) + clustered_mda = mean_decrease_accuracy(clf, X, y, cv_gen, + clustered_subsets=feature_clusters, scoring=log_loss) + + # Plot + plot_feature_importance(clustered_mdi, oob_score=clf.oob_score_, oos_score=oos_score, + save_fig=True, output_path='clustered_mdi.png') + plot_feature_importance(clustered_mda, oob_score=clf.oob_score_, oos_score=oos_score, + save_fig=True, output_path='clustered_mda.png') The following are the resulting images from the Clustered MDI & Clustered MDA feature importances respectively: @@ -243,6 +241,7 @@ Example .. code-block:: + import pandas as pd from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor from mlfinlab.feature_importance import RegressionModelFingerprint @@ -255,17 +254,17 @@ Example reg = RandomForestRegressor(n_estimators=10, random_state=42) reg.fit(X, y) - reg_fingerpint = RegressionModelFingerprint() + reg_fingerprint = RegressionModelFingerprint() reg_fingerprint.fit(reg, X, num_values=20, pairwise_combinations=[('CRIM', 'ZN'), ('RM', 'AGE'), ('LSTAT', 'DIS')]) - reg_fingerpint.fit() # Fit the model + reg_fingerprint.fit() # Fit the model # Get linear non-linear effects and pairwise effects - linear_effect, non_linear_effect, pair_wise_effect = reg_fingerpint.get_effects() + linear_effect, non_linear_effect, pair_wise_effect = reg_fingerprint.get_effects() # Plot the results - fig = reg_fingerpint.plot_effects() + fig = reg_fingerprint.plot_effects() fig.show() diff --git a/docs/source/implementations/labeling_excess_median.rst b/docs/source/implementations/labeling_excess_median.rst new file mode 100644 index 000000000..5458cab71 --- /dev/null +++ b/docs/source/implementations/labeling_excess_median.rst @@ -0,0 +1,100 @@ +.. _implementations-labeling_excess_median: + +================== +Excess Over Median +================== + +Labeling according to excess over median is a labeling method used in the following paper `Zhu, M., Philpotts, F. and +Stevenson, M., 2012. The benefits of tree-based models for stock selection. +Journal of Asset Management, 13(6), pp.437-448. `_ + +In this method, a cross-sectional dataset of close prices of many different stocks are used, which is converted to +returns. The median return at each time index is calculated and used as a proxy for market return. The median return is +then subtracted from each observation's return to find the numerical excess return over median. If desired, the +numerical values can be converted to categorical values according to the sign of the excess return. The labels can then +be used in training regression and classification models. + +At time :math:`t`: + +.. math:: + :nowrap: + + \begin{gather*} + P_t = \{p_{t,0}, p_{t,1}, \dots, p_{t,n}\} \\ + + R_t = \{r_{t,0}, r_{t,1}, \dots, r_{t,n}\} \\ + + m_t = median(R_t) \\ + + L(R_t) = \{r_{t,0} - m_t, r_{t,1} - m_t, \dots, r_{t,n} - m_t\} + \end{gather*} + + +If categorical rather than numerical labels are desired: + +.. math:: + \begin{equation} + \begin{split} + L(r_{t,n}) = \begin{cases} + -1 &\ \text{if} \ \ r_{t,n} - m_t < 0\\ + 0 &\ \text{if} \ \ r_{t,n} - m_t = 0\\ + 1 &\ \text{if} \ \ r_{t,n} - m_t > 0\\ + \end{cases} + \end{split} + \end{equation} + +If desired, the user can specify a resampling period to apply to the price data prior to calculating returns. The user can +also lag the returns to make them forward-looking. In the paper by Zhu et al., the authors use monthly forward-looking labels. + + +.. figure:: labeling_images/distribution_over_median_monthly_forward.png + :scale: 100 % + :align: center + :figclass: align-center + :alt: Distribution Over Median + + Distribution of monthly forward stock returns. This is the labeling method used in the paper by Zhu et al. + +Implementation +############## + +.. py:currentmodule:: mlfinlab.labeling.excess_over_median + +.. automodule:: mlfinlab.labeling.excess_over_median + :members: + +Example +######## +Below is an example on how to create labels of excess over median from real data. + +.. code-block:: + + import pandas as pd + import yfinance as yf + from mlfinlab.labeling import excess_over_median + + # Import price data + tickers = "AAPL MSFT AMZN GOOG" + data = yf.download(tickers, start="2019-01-01", end="2020-05-01", group_by="ticker") + data = data.loc[:, (slice(None), 'Adj Close')] + data.columns = data.columns.droplevel(1) + + # Get returns over median numerically + numerical = excess_over_median(prices=data, binary=False, resample_by=None, lag=False) + + # Get returns over median as a categorical label + binary = excess_over_median((prices=data, binary=True, resample_by=None, lag=False) + + # Get monthly forward-looking returns + monthly_forward = excess_over_median((prices=data, binary=True, resample_by='M', lag=True) + + + +Research Notebooks +################## + +The following research notebooks can be used to better understand labeling excess over median. + +* `Excess Over Median Example`_ + +.. _`Excess Over Median Example`: https://github.com/hudson-and-thames/research/blob/master/Labelling/Labels%20Excess%20Over%20Median/Excess%20Over%20Median.ipynb diff --git a/docs/source/implementations/labeling_fixed_time_horizon.rst b/docs/source/implementations/labeling_fixed_time_horizon.rst index 82c68a534..062c9d1db 100644 --- a/docs/source/implementations/labeling_fixed_time_horizon.rst +++ b/docs/source/implementations/labeling_fixed_time_horizon.rst @@ -7,13 +7,13 @@ Fixed Horizon Method Fixed horizon labels is a classification labeling technique used in the following paper: `Dixon, M., Klabjan, D. and Bang, J., 2016. Classification-based Financial Markets Prediction using Deep Neural Networks. `_ -Fixed time horizon is a common method used in labeling financial data, usually applied on time bars. The forward rate of return relative -to :math:`t_0` over time horizon :math:`h` is calculated as follows (M.L. de Prado, Advances in Financial Machine Learning, 2018): +Fixed time horizon is a common method used in labeling financial data, usually applied on time bars. The rate of return relative +to :math:`t_0` over time horizon :math:`h`, assuming that returns are lagged, is calculated as follows (M.L. de Prado, Advances in Financial Machine Learning, 2018): .. math:: r_{t0,t1} = \frac{p_{t1}}{p_{t0}} - 1 -Where :math:`t_1 = t_0 + h` is the time bar index after a fixed horizon of :math:`h` ticks have passed, and :math:`p_{t0}, p_{t1}` +Where :math:`t_1` is the time bar index after a fixed horizon has passed, and :math:`p_{t0}, p_{t1}` are prices at times :math:`t_0, t_1`. This method assigns a label based on comparison of rate of return to a threshold :math:`\tau` .. math:: @@ -27,24 +27,36 @@ are prices at times :math:`t_0, t_1`. This method assigns a label based on compa \end{split} \end{equation} +To avoid overlapping return windows, rather than specifying :math:`h`, the user is given the option of resampling the returns to +get the desired return period. Possible inputs for the resample period can be found `here. +`_. +Optionally, returns can be standardized by scaling by the mean and standard deviation of a rolling window. If threshold is a pd.Series, +**threshold.index and prices.index must match**; otherwise labels will fail to be returned. If resampling +is used, the threshold must match the index of prices after resampling. This is to avoid the user being forced to manually fill +in thresholds. The following shows the distribution of labels for standardized returns on closing prices of SPY in the time period from Jan 2008 to July 2016 -using a 20 day rolling window for the standard deviation. +using a 20-day rolling window for the standard deviation. -.. image:: labeling_images/fixed_horizon_labels_example.png +.. figure:: labeling_images/fixed_horizon_labels_example.png :scale: 100 % :align: center + :figclass: align-center + :alt: fixed horizon example + + Distribution of labels on standardized returns on closing prices of SPY. Though time bars are the most common format for financial data, there can be potential problems with over-reliance on time bars. Time bars exhibit high seasonality, as trading behavior may be quite different at the open or close versus midday; thus it will not be informative to apply the same threshold on a non-uniform distribution. Solutions include applying the fixed horizon method to tick or volume bars instead of time bars, using data sampled at the same time every day (e.g. closing prices) or inputting a dynamic threshold -as a pd.Series corresponding to the times in the dataset. +as a pd.Series corresponding to the timestamps in the dataset. However, the fixed horizon method will always fail to capture information +about the path of the prices [Lopez de Prado, 2018]. .. tip:: **Underlying Literature** - The following sources describes this method in more detail: + The following sources describe this method in more detail: - **Advances in Financial Machine Learning, Chapter 3.2** *by* Marcos Lopez de Prado (p. 43-44). - **Machine Learning for Asset Managers, Chapter 5.2** *by* Marcos Lopez de Prado (p. 65-66). @@ -64,17 +76,26 @@ Below is an example on how to use the Fixed Horizon labeling technique on real d .. code-block:: import pandas as pd + import numpy as np + from mlfinlab.labeling import fixed_time_horizon - # Import price data + # Import price data. data = pd.read_csv('../Sample-Data/stock_prices.csv', index_col='Date', parse_dates=True) - ticker = 'SPY' + custom_threshold = pd.Series(np.random.random(len(data)), index = data.index) + + # Create labels. + labels = fixed_time_horizon(prices=data, threshold=0.01, lag=True) + + # Create labels with a dynamic threshold. + labels = fixed_time_horizon(prices=data, threshold=custom_threshold, lag=True) - # Create labels - labels = fixed_time_horizon(close=data[ticker], threshold=0.01, look_forward=1) + # Create labels with standardization. + labels = fixed_time_horizon(prices=data, threshold=1, lag=True, standardized=True, window=5) - # Create labels with standardization - labels = fixed_time_horizon(close=data[ticker], threshold=1, look_forward=1, standardized=True, window=5) + # Create labels after resampling weekly with standardization. + labels = fixed_time_horizon(prices=data, threshold=1, resample_by='W', lag=True, + standardized=True, window=4) Research Notebook diff --git a/docs/source/implementations/labeling_images/MSFT_Return_vs_Benchmark.png b/docs/source/implementations/labeling_images/MSFT_Return_vs_Benchmark.png new file mode 100644 index 000000000..08fcf6e13 Binary files /dev/null and b/docs/source/implementations/labeling_images/MSFT_Return_vs_Benchmark.png differ diff --git a/docs/source/implementations/labeling_images/Raw_returns_distribution.png b/docs/source/implementations/labeling_images/Raw_returns_distribution.png new file mode 100644 index 000000000..843ce4662 Binary files /dev/null and b/docs/source/implementations/labeling_images/Raw_returns_distribution.png differ diff --git a/docs/source/implementations/labeling_images/distribution_over_median_monthly_forward.png b/docs/source/implementations/labeling_images/distribution_over_median_monthly_forward.png new file mode 100644 index 000000000..3ada868f9 Binary files /dev/null and b/docs/source/implementations/labeling_images/distribution_over_median_monthly_forward.png differ diff --git a/docs/source/implementations/labeling_raw_return.rst b/docs/source/implementations/labeling_raw_return.rst new file mode 100644 index 000000000..92be58180 --- /dev/null +++ b/docs/source/implementations/labeling_raw_return.rst @@ -0,0 +1,86 @@ +.. _implementations-labeling_raw_return: + +=========== +Raw Returns +=========== + +Labeling data by raw returns is the most simple and basic method of labeling financial data for machine learning. Raw returns can +be calculated either on a simple or logarithmic basis. Using returns rather than prices is usually preferred for financial time series +data because returns are usually stationary, unlike prices. This means that returns across different assets, or the same asset +at different times, can be directly compared with each other. The same cannot be said of price differences, since the magnitude of the +price change is highly dependent on the starting price, which varies with time. + +The simple return for an observation with +price :math:`p_t` at time :math:`t` relative to its price at time :math:`t-1` is as follows: + +.. math:: + r_t = \frac{p_{t}}{p_{t-1}} - 1 + +And the logarithmic return is: + +.. math:: + r_t = log(p_t) - log(p_{t-1}) + +The label :math:`L_t` is simply equal to :math:`r_t`, or to the sign of :math:`r_t`, if binary labeling is desired. + + .. math:: + \begin{equation} + \begin{split} + L_{t} = \begin{cases} + -1 &\ \text{if} \ \ r_t < 0\\ + 0 &\ \text{if} \ \ r_t = 0\\ + 1 &\ \text{if} \ \ r_t > 0 + \end{cases} + \end{split} + \end{equation} + +If desired, the user can specify a resampling period to apply to the price data prior to calculating returns. The user +can also lag the returns to make them forward-looking. + +The following shows the distribution of logarithmic daily returns on Microsoft stock during the time period between January +2010 and May 2020. + +.. figure:: labeling_images/Raw_returns_distribution.png + :scale: 90 % + :align: center + :figclass: align-center + :alt: raw returns image + + Distribution of logarithmic returns on MSFT. + +Implementation +############## + +.. py:currentmodule:: mlfinlab.labeling.raw_return +.. automodule:: mlfinlab.labeling.raw_return + :members: + +Example +######## +Below is an example on how to use the raw returns labeling method. + +.. code-block:: + + import pandas as pd + from mlfinlab.labeling import raw_return + + # Import price data + data = pd.read_csv('../Sample-Data/stock_prices.csv', index_col='Date', parse_dates=True) + + # Create labels numerically based on simple returns + returns = raw_returns(prices=data, lag=True) + + # Create labels categorically based on logarithmic returns + returns = raw_returns(prices=data, binary=True, logarithmic=True, lag=True) + + # Create labels categorically on weekly data with forward looking log returns. + returns = raw_returns(prices=data, binary=True, logarithmic=True, resample_by='W', lag=True) + +Research Notebook +################# + +The following research notebook can be used to better understand the raw return labeling technique. + +* `Raw Return Example`_ + +.. _`Raw Return Example`: https://github.com/hudson-and-thames/research/blob/master/Labelling/Labels%20Raw%20Return/Raw%20Return.ipynb diff --git a/docs/source/implementations/labeling_vs_benchmark.rst b/docs/source/implementations/labeling_vs_benchmark.rst new file mode 100644 index 000000000..96e53912e --- /dev/null +++ b/docs/source/implementations/labeling_vs_benchmark.rst @@ -0,0 +1,109 @@ +.. _implementations-labeling_vs_benchmark: + +========================= +Return Versus Benchmark +========================= +Labeling versus benchmark is featured in the paper `Evaluating multiple classifiers for stock price direction prediction, by Ballings et al., +2015. `_ In this paper, the authors label yearly forward +stock returns against a predetermined benchmark, and use that labeled data to compare the performance of several machine +learning algorithms in predicting long term price movements. + +Labeling against benchmark is a simple method of labeling financial data in which time-indexed returns are labeled according to +whether they exceed a set value. The benchmark can be either a constant value, or a pd.Series of values with an index matching +that of the returns. The labels can be the numerical value of how much each observation's return exceeds the benchmark, or the sign +of the excess. + +At time :math:`t`, given that price of a stock is :math:`p_{t, n}`, benchmark is :math:`B_t` and return is: + +.. math:: + r_{t,n} = \frac{p_{t,n}}{p_{t-1,n}} - 1 + +Note that :math:`B_t` is a scalar value corresponding to the benchmark at time :math:`t`, while :math:`B` is the vector of all benchmarks +across all timestamps. The labels are: + +.. math:: + L(r_{t,n}) = r_{t,n} - B_t + +If categorical labels are desired: + + .. math:: + \begin{equation} + \begin{split} + L(r_{t, n}) = \begin{cases} + -1 &\ \text{if} \ \ r_{t,n} < B_t\\ + 0 &\ \text{if} \ \ r_{t,n} = B_t\\ + 1 &\ \text{if} \ \ r_{t,n} > B_t\\ + \end{cases} + \end{split} + \end{equation} + +The simplest method of labeling is just returning the sign of the return. However, sometimes it is desirable to quantify the return +compared to a benchmark to better contextualize the returns. This is commonly done by using the mean or median of multiple stocks in the market. +However, that data may not always be available, and sometimes the user might wish a specify a constant or more custom benchmark to compare +returns against. Note that these benchmarks are unidirectional only. If the user would like a benchmark that captures the absolute value of the +returns, then the fixed horizon method should be used instead. + +If desired, the user can specify a `resampling period `_ +to apply to the price data prior to calculating returns. The user can also lag the returns to make them forward-looking. +In the paper by Ballings et al., the authors use yearly forward returns, and compare them to benchmark values +of 15%, 25%, and 35%. + +The following shows the returns for MSFT stock during March-April 2020, compared to the return of SPY as a benchmark during +the same time period. Green dots represent days when MSFT outperformed SPY, and red dots represent days when MSFT underperformed +SPY. + +.. figure:: ./labeling_images/MSFT_Return_vs_Benchmark.png + :scale: 90 % + :align: center + :figclass: align-center + :alt: labeling vs benchmark + + Comparison of MSFT return to SPY return. + +.. tip:: + **Underlying Literature** + + This labeling method is sourced from the following: + - Chapter 5.5.1 of **Machine Learning for Factor Investing**, *by* Coqueret, G. and Guida, T. (2020). + + +Implementation +############## + +.. py:currentmodule:: mlfinlab.labeling.return_vs_benchmark +.. automodule:: mlfinlab.labeling.return_vs_benchmark + :members: + +Example +######## +Below is an example on how to use the return over benchmark labeling technique on real data. + +.. code-block:: + + import pandas as pd + from mlfinlab.labeling import return_vs_benchmark + + # Import price data. + data = pd.read_csv('../Sample-Data/stock_prices.csv', index_col='Date', parse_dates=True) + + # Get returns in SPY to be used as a benchmark. + spy_returns = data['SPY'].pct_change() + + # Create labels using SPY as a benchmark. + numerical_labels = return_vs_benchmark(prices=data, benchmark=spy_returns) + + # Create labels categorically. + binary_labels = return_vs_benchmark(prices=data, benchmark=spy_returns, binary=True) + + # Label yearly forward returns, with the benchmark being an 25% increase in price. + yearly_labels = return_vs_benchmark(prices=data, benchmark=0.25, binary=True, resample_by='Y', + lag=True) + +Research Notebook +################# + +The following research notebook can be used to better understand the return against benchmark labeling technique. + +* `Return Over Benchmark Example`_ + +.. _`Return Over Benchmark Example`: https://github.com/hudson-and-thames/research/blob/master/Labelling/Labeling%20vs%20Benchmark/Labeling%20vs%20Benchmark.ipynb diff --git a/docs/source/implementations/onc.rst b/docs/source/implementations/onc.rst index 97f27d8c0..d1842ead6 100644 --- a/docs/source/implementations/onc.rst +++ b/docs/source/implementations/onc.rst @@ -121,3 +121,12 @@ An example showing how the ONC algorithm is used can be seen below: # Output of the ONC algorithm with 10 simulations for each number of clusters tested assets_corr_onc, clusters, silh_scores = onc.get_onc_clusters(assets_corr, repeat=10) + +Research Notebooks +################## + +The following research notebooks can be used to better understand the Optimal Number of Clusters algorithm. + +* `Optimal Number of Clusters Example`_ + +.. _`Optimal Number of Clusters Example`: https://github.com/hudson-and-thames/research/blob/master/Clustering/ONC/Optimal_Number_of_Clusters.ipynb diff --git a/docs/source/index.rst b/docs/source/index.rst index 146d03d7b..da2d0479b 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -271,12 +271,22 @@ This project is licensed under an all rights reserved licence. implementations/data_structures implementations/filters - implementations/codependence implementations/frac_diff implementations/structural_breaks implementations/microstructural_features +.. toctree:: + :maxdepth: 2 + :caption: Codependence + :hidden: + + codependence/introduction + codependence/correlation_based_metrics + codependence/information_theory_metrics + codependence/codependence_marti + codependence/codependence_matrix + .. toctree:: :maxdepth: 2 :caption: Labelling @@ -286,6 +296,9 @@ This project is licensed under an all rights reserved licence. implementations/labeling_trend_scanning implementations/labeling_tail_sets implementations/labeling_fixed_time_horizon + implementations/labeling_excess_median + implementations/labeling_raw_return + implementations/labeling_vs_benchmark .. toctree:: :maxdepth: 2 diff --git a/docs/source/portfolio_optimisation/critical_line_algorithm.rst b/docs/source/portfolio_optimisation/critical_line_algorithm.rst index 416554be6..8187c21a9 100644 --- a/docs/source/portfolio_optimisation/critical_line_algorithm.rst +++ b/docs/source/portfolio_optimisation/critical_line_algorithm.rst @@ -137,6 +137,7 @@ Implementation We provide great flexibility to the users in terms of the input data - they can either pass their own pre-calculated input matrices/dataframes or leave it to us to calculate them. A quick reference on common input parameters which you will encounter throughout the portfolio optimization module: + * :py:mod:`asset_prices`: Dataframe/matrix of historical raw asset prices **indexed by date**. * :py:mod:`asset_returns`: Dataframe/matrix of historical asset returns. This will be a :math:`TxN` matrix where :math:`T` is the time-series and :math:`N` refers to the number of assets in the portfolio. * :py:mod:`expected_asset_returns`: List of expected returns per asset i.e. the mean of historical asset returns. This refers to the parameter :math:`\mu` used in portfolio optimization literature. For a portfolio of 5 assets, ``expected_asset_returns = [0.45, 0.56, 0.89, 1.34, 2.4]``. diff --git a/docs/source/portfolio_optimisation/hierarchical_clustering_asset_allocation.rst b/docs/source/portfolio_optimisation/hierarchical_clustering_asset_allocation.rst index cbf3fce20..73bb25e49 100644 --- a/docs/source/portfolio_optimisation/hierarchical_clustering_asset_allocation.rst +++ b/docs/source/portfolio_optimisation/hierarchical_clustering_asset_allocation.rst @@ -119,6 +119,7 @@ weight of the :math:`i^{th}` cluster calculated in Step-3. .. tip:: |h4| Underlying Literature |h4_| This implementation is based on the following two papers written by Thomas Raffinot. + * `Hierarchical Clustering based Asset Allocation `_ * `Hierarchical Equal Risk Contribution `_ * `Gap Index Paper `_ @@ -144,6 +145,7 @@ Implementation We provide great flexibility to the users in terms of the input data - they can either pass their own pre-calculated input matrices/dataframes or leave it to us to calculate them. A quick reference on common input parameters which you will encounter throughout the portfolio optimisation module: + * :py:mod:`asset_prices`: Dataframe/matrix of historical raw asset prices **indexed by date**. * :py:mod:`asset_returns`: Dataframe/matrix of historical asset returns. This will be a :math:`TxN` matrix where :math:`T` is the time-series and :math:`N` refers to the number of assets in the portfolio. * :py:mod:`expected_asset_returns`: List of expected returns per asset i.e. the mean of historical asset returns. This refers to the parameter :math:`\mu` used in portfolio optimisation literature. For a portfolio of 5 assets, ``expected_asset_returns = [0.45, 0.56, 0.89, 1.34, 2.4]``. diff --git a/docs/source/portfolio_optimisation/hierarchical_risk_parity.rst b/docs/source/portfolio_optimisation/hierarchical_risk_parity.rst index c69076d7e..c917784a7 100644 --- a/docs/source/portfolio_optimisation/hierarchical_risk_parity.rst +++ b/docs/source/portfolio_optimisation/hierarchical_risk_parity.rst @@ -92,6 +92,7 @@ Implementation We provide great flexibility to the users in terms of the input data - they can either pass their own pre-calculated input matrices/dataframes or leave it to us to calculate them. A quick reference on common input parameters which you will encounter throughout the portfolio optimisation module: + * :py:mod:`asset_prices`: Dataframe/matrix of historical raw asset prices **indexed by date**. * :py:mod:`asset_returns`: Dataframe/matrix of historical asset returns. This will be a :math:`TxN` matrix where :math:`T` is the time-series and :math:`N` refers to the number of assets in the portfolio. * :py:mod:`expected_asset_returns`: List of expected returns per asset i.e. the mean of historical asset returns. This refers to the parameter :math:`\mu` used in portfolio optimisation literature. For a portfolio of 5 assets, ``expected_asset_returns = [0.45, 0.56, 0.89, 1.34, 2.4]``. diff --git a/docs/source/portfolio_optimisation/mean_variance.rst b/docs/source/portfolio_optimisation/mean_variance.rst index dbe4c1c0e..13e7a7175 100644 --- a/docs/source/portfolio_optimisation/mean_variance.rst +++ b/docs/source/portfolio_optimisation/mean_variance.rst @@ -59,6 +59,7 @@ formulated as follows, & \text{s.t.} & & \sum_{i=1}^{n}w_{i} = 1 \\ &&& \mu^Tw = \mu_t \\ \end{align*} + where :math:`w` refers to the set of weights for the portfolio assets, :math:`\sum` is the covariance matrix of the assets, :math:`\mu` is the expected asset returns and :math:`\mu_t` represents the target portfolio return of the investor. Note that this represents a very basic (and a specific) use-case of portfolio allocation where the investor wants to minimse the portfolio risk @@ -407,6 +408,7 @@ Implementation We provide great flexibility to the users in terms of the input data - they can either pass their own pre-calculated input matrices/dataframes or leave it to us to calculate them. A quick reference on common input parameters which you will encounter throughout the portfolio optimization module: + * :py:mod:`asset_prices`: Dataframe/matrix of historical raw asset prices **indexed by date**. * :py:mod:`asset_returns`: Dataframe/matrix of historical asset returns. This will be a :math:`TxN` matrix where :math:`T` is the time-series and :math:`N` refers to the number of assets in the portfolio. * :py:mod:`expected_asset_returns`: List of expected returns per asset i.e. the mean of historical asset returns. This refers to the parameter :math:`\mu` used in portfolio optimization literature. For a portfolio of 5 assets, ``expected_asset_returns = [0.45, 0.56, 0.89, 1.34, 2.4]``. diff --git a/docs/source/portfolio_optimisation/risk_metrics.rst b/docs/source/portfolio_optimisation/risk_metrics.rst index 591d6c367..d355848e9 100644 --- a/docs/source/portfolio_optimisation/risk_metrics.rst +++ b/docs/source/portfolio_optimisation/risk_metrics.rst @@ -149,7 +149,7 @@ Below is an example of how to use the package functions to calculate risk metric .. code-block:: import pandas as pd - from mlfinlab.labeling import RiskMetrics + from mlfinlab.portfolio_optimization import RiskMetrics # Import dataframe of returns for assets in a portfolio assets_returns = pd.read_csv(DATA_PATH, index_col='Date', parse_dates=True) diff --git a/mlfinlab/bet_sizing/ch10_snippets.py b/mlfinlab/bet_sizing/ch10_snippets.py index 2f6939d46..6ab87a857 100644 --- a/mlfinlab/bet_sizing/ch10_snippets.py +++ b/mlfinlab/bet_sizing/ch10_snippets.py @@ -27,7 +27,7 @@ def get_signal(prob, num_classes, pred=None): """ # Get signals from predictions. if prob.shape[0] == 0: - return pd.Series() + return pd.Series(dtype='float64') # 1) Generate signals from multinomial classification (one-vs-rest). bet_sizes = (prob - 1/num_classes) / (prob * (1 - prob))**0.5 @@ -85,7 +85,7 @@ def mp_avg_active_signals(signals, molecule): :param molecule: (list) Indivisible tasks to be passed to 'mp_pandas_obj', in this case a list of datetimes. :return: (pandas.Series) The averaged bet size sub-series. """ - out = pd.Series() + out = pd.Series(dtype='float64') for loc in molecule: df0 = (signals.index.to_numpy() <= loc)&((loc < signals['t1'])|pd.isnull(signals['t1'])) act = signals[df0].index diff --git a/mlfinlab/clustering/onc.py b/mlfinlab/clustering/onc.py index 7c679f350..8c40ad2e2 100644 --- a/mlfinlab/clustering/onc.py +++ b/mlfinlab/clustering/onc.py @@ -57,12 +57,12 @@ def _cluster_kmeans_base(corr_mat: pd.DataFrame, max_num_clusters: int = 10, rep # Distance matrix distance = ((1 - corr_mat.fillna(0)) / 2.0) ** 0.5 - silh = pd.Series() + silh = pd.Series(dtype='float64') # Get optimal num clusters for _ in range(repeat): for num_clusters in range(2, max_num_clusters + 1): - kmeans_ = KMeans(n_clusters=num_clusters, n_jobs=1, n_init=1) + kmeans_ = KMeans(n_clusters=num_clusters, n_init=1) kmeans_ = kmeans_.fit(distance) silh_ = silhouette_samples(distance, kmeans_.labels_) stat = (silh_.mean() / silh_.std(), silh.mean() / silh.std()) @@ -115,11 +115,12 @@ def cluster_kmeans_top(corr_mat: pd.DataFrame, repeat: int = 10) -> Union[pd.Dat """ # pylint: disable=no-else-return - max_num_clusters = corr_mat.shape[1] - 1 + max_num_clusters = min(corr_mat.drop_duplicates().shape[0], corr_mat.drop_duplicates().shape[1]) - 1 corr1, clusters, silh = _cluster_kmeans_base(corr_mat, max_num_clusters=max_num_clusters, repeat=repeat) # Get cluster quality scores - cluster_quality = {i: np.mean(silh[clusters[i]]) / np.std(silh[clusters[i]]) for i in clusters.keys()} + cluster_quality = {i: float('Inf') if np.std(silh[clusters[i]]) == 0 else np.mean(silh[clusters[i]]) / + np.std(silh[clusters[i]]) for i in clusters.keys()} avg_quality = np.mean(list(cluster_quality.values())) redo_clusters = [i for i in cluster_quality.keys() if cluster_quality[i] < avg_quality] diff --git a/mlfinlab/codependence/__init__.py b/mlfinlab/codependence/__init__.py index 0697bc666..35f0ad0c9 100644 --- a/mlfinlab/codependence/__init__.py +++ b/mlfinlab/codependence/__init__.py @@ -7,3 +7,4 @@ from mlfinlab.codependence.information import (get_mutual_info, get_optimal_number_of_bins, \ variation_of_information_score) from mlfinlab.codependence.codependence_matrix import (get_dependence_matrix, get_distance_matrix) +from mlfinlab.codependence.gnpr_distance import (spearmans_rho, gpr_distance, gnpr_distance) diff --git a/mlfinlab/codependence/codependence_matrix.py b/mlfinlab/codependence/codependence_matrix.py index 9d0b515fb..b9646fdcf 100644 --- a/mlfinlab/codependence/codependence_matrix.py +++ b/mlfinlab/codependence/codependence_matrix.py @@ -1,6 +1,6 @@ """ This implementation lets user generate dependence and distance matrix based on the various methods of Information -Codependence described in Cornell lecture notes: Codependence: +Codependence described in Cornell lecture notes on Codependence: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes """ @@ -9,16 +9,24 @@ from mlfinlab.codependence.information import variation_of_information_score, get_mutual_info from mlfinlab.codependence.correlation import distance_correlation - +from mlfinlab.codependence.gnpr_distance import spearmans_rho, gpr_distance, gnpr_distance # pylint: disable=invalid-name -def get_dependence_matrix(df: pd.DataFrame, dependence_method: str) -> pd.DataFrame: + +def get_dependence_matrix(df: pd.DataFrame, dependence_method: str, theta: float = 0.5, + bandwidth: float = 0.01) -> pd.DataFrame: """ - This function returns a dependence matrix for the given method of dependence method. - :param df: (pd.DataFrame) of features. - :param dependence_method: (str) the algorithm to be use for generating dependence_matrix, either - 'information_variation' or 'mutual_information' or 'distance_correlation'. - :return: (pd.DataFrame) Dependence_matrix. + This function returns a dependence matrix for elements given in the dataframe using the chosen dependence method. + + List of supported algorithms to use for generating the dependence matrix: ``information_variation``, + ``mutual_information``, ``distance_correlation``, ``spearmans_rho``, ``gpr_distance``, ``gnpr_distance``. + + :param df: (pd.DataFrame) Features. + :param dependence_method: (str) Algorithm to be use for generating dependence_matrix. + :param theta: (float) Type of information being tested in the GPR and GNPR distances. Falls in range [0, 1]. + (0.5 by default) + :param bandwidth: (float) Bandwidth to use for splitting observations in the GPR and GNPR distances. (0.01 by default) + :return: (pd.DataFrame) Dependence matrix. """ # Get the feature names. features_cols = df.columns.values @@ -27,36 +35,33 @@ def get_dependence_matrix(df: pd.DataFrame, dependence_method: str) -> pd.DataFr # Defining the dependence function. if dependence_method == 'information_variation': - dep_function = variation_of_information_score + dep_function = lambda x, y: variation_of_information_score(x, y, normalize=True) elif dependence_method == 'mutual_information': - dep_function = get_mutual_info + dep_function = lambda x, y: get_mutual_info(x, y, normalize=True) elif dependence_method == 'distance_correlation': dep_function = distance_correlation + elif dependence_method == 'spearmans_rho': + dep_function = spearmans_rho + elif dependence_method == 'gpr_distance': + dep_function = lambda x, y: gpr_distance(x, y, theta=theta) + elif dependence_method == 'gnpr_distance': + dep_function = lambda x, y: gnpr_distance(x, y, theta=theta, bandwidth=bandwidth) else: - raise ValueError(f"{dependence_method} is not a valid method. Use either 'information_variation'\ - or 'mutual_information' or 'distance_correlation'.") - - # Generating the dependence_matrix for the defined method. - if dependence_method != 'distance_correlation': - dependence_matrix = np.array([ - [ - dep_function(np_df[i], np_df[j], normalize=True) if j < i else - 0.5 * dep_function(np_df[i], np_df[j], normalize=True) if j == i else # Leave diagonal elements as 0.5 to later double them to 1 - 0 # Make upper triangle 0 to fill it later on - for j in range(n) - ] - for i in range(n) - ]) - else: - dependence_matrix = np.array([ - [ - dep_function(np_df[i], np_df[j]) if j < i else - 0.5 * dep_function(np_df[i], np_df[j]) if j == i else # Leave diagonal elements as 0.5 to later double them to 1 - 0 # Make upper triangle 0 to fill it later on - for j in range(n) - ] - for i in range(n) - ]) + raise ValueError(f"{dependence_method} is not a valid method. Please use one of the supported methods \ + listed in the docsting.") + + # Generating the dependence_matrix + dependence_matrix = np.array([ + [ + dep_function(np_df[i], np_df[j]) if j < i else + # Leave diagonal elements as 0.5 to later double them to 1 + 0.5 * dep_function(np_df[i], np_df[j]) if j == i else + 0 # Make upper triangle 0 to fill it later on + for j in range(n) + ] + for i in range(n) + ]) + # Make matrix symmetrical dependence_matrix = dependence_matrix + dependence_matrix.T @@ -70,12 +75,16 @@ def get_dependence_matrix(df: pd.DataFrame, dependence_method: str) -> pd.DataFr def get_distance_matrix(X: pd.DataFrame, distance_metric: str = 'angular') -> pd.DataFrame: """ - Apply distance operator to a dependence matrix. + Applies distance operator to a dependence matrix. + + This allows to turn a correlation matrix into a distance matrix. Distances used are true metrics. + + List of supported distance metrics to use for generating the distance matrix: ``angular``, ``squared_angular``, + and ``absolute_angular``. :param X: (pd.DataFrame) Dataframe to which distance operator to be applied. - :param distance_metric: (str) The distance operator to be used for generating the distance matrix. - The methods that can be applied are: 'angular', 'squared_angular' and 'absolute_angular'. - :return: (pd.DataFrame) Distance matrix + :param distance_metric: (str) The distance metric to be used for generating the distance matrix. + :return: (pd.DataFrame) Distance matrix. """ if distance_metric == 'angular': distfun = lambda x: ((1 - x).round(5) / 2.) ** .5 @@ -84,6 +93,7 @@ def get_distance_matrix(X: pd.DataFrame, distance_metric: str = 'angular') -> pd elif distance_metric == 'squared_angular': distfun = lambda x: ((1 - x ** 2).round(5) / 2.) ** .5 else: - raise ValueError(f'{distance_metric} is a unknown distance metric') + raise ValueError(f'{distance_metric} is a unknown distance metric. Please use one of the supported methods \ + listed in the docsting.') return distfun(X).fillna(0) diff --git a/mlfinlab/codependence/correlation.py b/mlfinlab/codependence/correlation.py index ff5c8e10a..119ff161a 100644 --- a/mlfinlab/codependence/correlation.py +++ b/mlfinlab/codependence/correlation.py @@ -12,24 +12,40 @@ def angular_distance(x: np.array, y: np.array) -> float: """ - Returns angular distance between two vectors. Angular distance is a slight modification of correlation which + Returns angular distance between two vectors. Angular distance is a slight modification of Pearson correlation which satisfies metric conditions. - :param x: (np.array) X vector. - :param y: (np.array) Y vector. + Formula used for calculation: + + Ang_Distance = (1/2 * (1 - Corr))^(1/2) + + Read Cornell lecture notes for more information about angular distance: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. + + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector. :return: (float) Angular distance. """ + corr_coef = np.corrcoef(x, y)[0][1] return np.sqrt(0.5 * (1 - corr_coef)) def absolute_angular_distance(x: np.array, y: np.array) -> float: """ - Returns a modification of angular distance where absolute value of correlation coefficient is used. + Returns absolute angular distance between two vectors. It is a modification of angular distance where the absolute + value of the Pearson correlation coefficient is used. + + Formula used for calculation: + + Abs_Ang_Distance = (1/2 * (1 - abs(Corr)))^(1/2) + + Read Cornell lecture notes for more information about absolute angular distance: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. - :param x: (np.array) X vector - :param y: (np.array) Y vector - :return: (float) Absolute angular distance + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector. + :return: (float) Absolute angular distance. """ corr_coef = np.corrcoef(x, y)[0][1] @@ -38,11 +54,19 @@ def absolute_angular_distance(x: np.array, y: np.array) -> float: def squared_angular_distance(x: np.array, y: np.array) -> float: """ - Returns a modification of angular distance where square of correlation coefficient is used. + Returns squared angular distance between two vectors. It is a modification of angular distance where the square of + Pearson correlation coefficient is used. - :param x: (np.array) X vector - :param y: (np.array) Y vector - :return: (float) Squared angular distance + Formula used for calculation: + + Squared_Ang_Distance = (1/2 * (1 - (Corr)^2))^(1/2) + + Read Cornell lecture notes for more information about squared angular distance: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. + + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector. + :return: (float) Squared angular distance. """ corr_coef = np.corrcoef(x, y)[0][1] @@ -51,12 +75,21 @@ def squared_angular_distance(x: np.array, y: np.array) -> float: def distance_correlation(x: np.array, y: np.array) -> float: """ - Distance correlation captures both linear and non-linear dependencies. - Distance correlation coefficient is described in https://en.wikipedia.org/wiki/Distance_correlation + Returns distance correlation between two vectors. Distance correlation captures both linear and non-linear + dependencies. + + Formula used for calculation: + + Distance_Corr[X, Y] = dCov[X, Y] / (dCov[X, X] * dCov[Y, Y])^(1/2) + + dCov[X, Y] is the average Hadamard product of the doubly-centered Euclidean distance matrices of X, Y. + + Read Cornell lecture notes for more information about distance correlation: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. - :param x: (np.array) X vector - :param y: (np.array) Y vector - :return: (float) Distance correlation coefficient + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector. + :return: (float) Distance correlation coefficient. """ x = x[:, None] diff --git a/mlfinlab/codependence/gnpr_distance.py b/mlfinlab/codependence/gnpr_distance.py new file mode 100644 index 000000000..f23513a77 --- /dev/null +++ b/mlfinlab/codependence/gnpr_distance.py @@ -0,0 +1,106 @@ +""" +Implementation of distance using the Generic Non-Parametric Representation approach from "Some contributions to the +clustering of financial time series and applications to credit default swaps" by Gautier Marti +https://www.researchgate.net/publication/322714557 +""" +import numpy as np +from scipy.stats import spearmanr + +# pylint: disable=invalid-name + +def spearmans_rho(x: np.array, y: np.array) -> float: + """ + Calculates a statistical estimate of Spearman's rho - a copula-based dependence measure. + + Formula for calculation: + rho = 1 - (6)/(T*(T^2-1)) * Sum((X_t-Y_t)^2) + + It is more robust to noise and can be defined if the variables have an infinite second moment. + This statistic is described in more detail in the work by Gautier Marti + https://www.researchgate.net/publication/322714557 (p.54) + + This method is a wrapper for the scipy spearmanr function. For more details about the function and its parameters, + please visit scipy documentation + https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.spearmanr.html + + :param x: (np.array/pd.Series) X vector + :param y: (np.array/pd.Series) Y vector (same number of observations as X) + :return: (float) Spearman's rho statistical estimate + """ + + # Coefficient calculationS + rho, _ = spearmanr(x, y) + + return rho + +def gpr_distance(x: np.array, y: np.array, theta: float) -> float: + """ + Calculates the distance between two Gaussians under the Generic Parametric Representation (GPR) approach. + + According to the original work https://www.researchgate.net/publication/322714557 (p.70): + "This is a fast and good proxy for distance d_theta when the first two moments ... predominate". But it's not + a good metric for heavy-tailed distributions. + + Parameter theta defines what type of information dependency is being tested: + - for theta = 0 the distribution information is tested + - for theta = 1 the dependence information is tested + - for theta = 0.5 a mix of both information types is tested + + With theta in [0, 1] the distance lies in range [0, 1] and is a metric. (See original work for proof, p.71) + + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector (same number of observations as X). + :param theta: (float) Type of information being tested. Falls in range [0, 1]. + :return: (float) Distance under GPR approach. + """ + + # Calculating the GPR distance + distance = theta * (1 - spearmans_rho(x, y)) / 2 + \ + (1 - theta) * (1 - ((2 * x.std() * y.std()) / (x.std()**2 + y.std()**2))**(1/2) * + np.exp(- (1 / 4) * (x.mean() - y.mean())**2 / (x.std()**2 + y.std()**2))) + + return distance**(1/2) + +def gnpr_distance(x: np.array, y: np.array, theta: float, bandwidth: float = 0.01) -> float: + """ + Calculates the empirical distance between two random variables under the Generic Non-Parametric Representation + (GNPR) approach. + + Formula for the distance is taken from https://www.researchgate.net/publication/322714557 (p.72). + + Parameter theta defines what type of information dependency is being tested: + - for theta = 0 the distribution information is tested + - for theta = 1 the dependence information is tested + - for theta = 0.5 a mix of both information types is tested + + With theta in [0, 1] the distance lies in the range [0, 1] and is a metric. (See original work for proof, p.71) + + :param x: (np.array/pd.Series) X vector. + :param y: (np.array/pd.Series) Y vector (same number of observations as X). + :param theta: (float) Type of information being tested. Falls in range [0, 1]. + :param bandwidth: (float) Bandwidth to use for splitting the X and Y vector observations. (0.01 by default) + :return: (float) Distance under GNPR approach. + """ + + # Number of observations + num_obs = x.shape[0] + + # Calculating the d_1 distance + dist_1 = 3 / (num_obs * (num_obs**2 - 1)) * (np.power(x - y, 2).sum()) + + # Creating the proper bins + min_val = min(x.min(), y.min()) + max_val = max(x.max(), y.max()) + + # Creating a grid and histograms + bins = np.arange(min_val, max_val + bandwidth, bandwidth) + hist_x = np.histogram(x, bins)[0] / num_obs + hist_y = np.histogram(y, bins)[0] / num_obs + + # Calculating the d_0 distance + dist_0 = np.power(hist_x**(1/2) - hist_y**(1/2), 2).sum() / 2 + + # Calculating the GNPR distance + distance = theta * dist_1 + (1 - theta) * dist_0 + + return distance**(1/2) diff --git a/mlfinlab/codependence/information.py b/mlfinlab/codependence/information.py index 964ed7602..e17e72ad1 100644 --- a/mlfinlab/codependence/information.py +++ b/mlfinlab/codependence/information.py @@ -1,6 +1,6 @@ """ -Implementations of mutual info and variation of information (VI) codependence measures from Cornell lecture slides: -https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes +Implementations of mutual information (I) and variation of information (VI) codependence measures from Cornell +lecture slides: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes """ import numpy as np import scipy.stats as ss @@ -11,16 +11,20 @@ def get_optimal_number_of_bins(num_obs: int, corr_coef: float = None) -> int: """ - Get optimal number of bins for discretization based on number of observations + Calculates optimal number of bins for discretization based on number of observations and correlation coefficient (univariate case). - The algorithm is described in https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes (p.26) + Algorithms used in this function were originally proposed in the works of Hacine-Gharbi et al. (2012) + and Hacine-Gharbi and Ravier (2018). They are described in the Cornell lecture notes: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes (p.26) :param num_obs: (int) Number of observations. :param corr_coef: (float) Correlation coefficient, used to estimate the number of bins for univariate case. :return: (int) Optimal number of bins. """ - if corr_coef is None or abs(corr_coef - 1) <= 1e-4: # Univariate case + + # Univariate case + if corr_coef is None or abs(corr_coef - 1) <= 1e-4: z = (8 + 324 * num_obs + 12 * (36 * num_obs + 729 * num_obs ** 2) ** .5) ** (1 / 3.) bins = round(z / 6. + 2. / (3 * z) + 1. / 3) @@ -32,14 +36,20 @@ def get_optimal_number_of_bins(num_obs: int, corr_coef: float = None) -> int: def get_mutual_info(x: np.array, y: np.array, n_bins: int = None, normalize: bool = False) -> float: """ - Get mutual info score for x and y described in - https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes (p.16). - - :param x: (np.array) X vector - :param y: (np.array) Y vector - :param n_bins: (int) Number of bins for discretization, if None get number of bins based on correlation coefficient. - :param normalize: (bool) True to normalize the result to [0, 1]. - :return: (float) Mutual info score. + Returns mutual information (I) between two vectors. + + This function uses the discretization with the optimal bins algorithm proposed in the works of + Hacine-Gharbi et al. (2012) and Hacine-Gharbi and Ravier (2018). + + Read Cornell lecture notes for more information about the mutual information: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. + + :param x: (np.array) X vector. + :param y: (np.array) Y vector. + :param n_bins: (int) Number of bins for discretization, if None the optimal number will be calculated. + (None by default) + :param normalize: (bool) Flag used to normalize the result to [0, 1]. (False by default) + :return: (float) Mutual information score. """ if n_bins is None: @@ -57,13 +67,19 @@ def get_mutual_info(x: np.array, y: np.array, n_bins: int = None, normalize: boo def variation_of_information_score(x: np.array, y: np.array, n_bins: int = None, normalize: bool = False) -> float: """ - Get Variantion of Information (VI) score for X and Y described in - https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes (p.19). + Returns variantion of information (VI) between two vectors. + + This function uses the discretization using optimal bins algorithm proposed in the works of + Hacine-Gharbi et al. (2012) and Hacine-Gharbi and Ravier (2018). + + Read Cornell lecture notes for more information about the variation of information: + https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3512994&download=yes. - :param x: (np.array) X vector - :param y: (np.array) Y vector - :param n_bins: (int) Number of bins for discretization, if None get number of bins based on correlation coefficient. - :param normalize: (bool) True to normalize the result to [0, 1]. + :param x: (np.array) X vector. + :param y: (np.array) Y vector. + :param n_bins: (int) Number of bins for discretization, if None the optimal number will be calculated. + (None by default) + :param normalize: (bool) True to normalize the result to [0, 1]. (False by default) :return: (float) Variation of information score. """ diff --git a/mlfinlab/cross_validation/cross_validation.py b/mlfinlab/cross_validation/cross_validation.py index 0c13a5f76..407af91af 100644 --- a/mlfinlab/cross_validation/cross_validation.py +++ b/mlfinlab/cross_validation/cross_validation.py @@ -129,7 +129,8 @@ def ml_cross_val_score( .. code-block:: python cv_gen = PurgedKFold(n_splits=n_splits, samples_info_sets=samples_info_sets, pct_embargo=pct_embargo) - scores_array = ml_cross_val_score(classifier, X, y, cv_gen, sample_weight=None, scoring=accuracy_score) + scores_array = ml_cross_val_score(classifier, X, y, cv_gen, sample_weight_train=sample_train, + sample_weight_score=sample_score, scoring=accuracy_score) :param classifier: (ClassifierMixin) A sk-learn Classifier object instance. :param X: (pd.DataFrame) The dataset of records to evaluate. diff --git a/mlfinlab/data_structures/base_bars.py b/mlfinlab/data_structures/base_bars.py index 396c32764..85b74effc 100644 --- a/mlfinlab/data_structures/base_bars.py +++ b/mlfinlab/data_structures/base_bars.py @@ -201,8 +201,8 @@ def _assert_csv(test_batch: pd.DataFrame): try: pd.to_datetime(test_batch.iloc[0, 0]) except ValueError: - print('csv file, column 0, not a date time format:', - test_batch.iloc[0, 0]) + raise ValueError('csv file, column 0, not a date time format:', + test_batch.iloc[0, 0]) def _update_high_low(self, price: float) -> Union[float, float]: """ @@ -384,8 +384,8 @@ def _extract_bars(self, data: Tuple[dict, pd.DataFrame]) -> list: self.bars_thresholds.append(dict(self.thresholds)) # Check expression for possible bar generation - if np.abs(self.thresholds['cum_theta']) > self.thresholds['exp_num_ticks'] * np.abs( - self.thresholds['expected_imbalance']): + if (np.abs(self.thresholds['cum_theta']) > self.thresholds['exp_num_ticks'] * np.abs( + self.thresholds['expected_imbalance']) if ~np.isnan(self.thresholds['expected_imbalance']) else False): self._create_bars(date_time, price, self.high_price, self.low_price, list_bars) diff --git a/mlfinlab/ensemble/sb_bagging.py b/mlfinlab/ensemble/sb_bagging.py index 2b7223fc3..cadc7d224 100644 --- a/mlfinlab/ensemble/sb_bagging.py +++ b/mlfinlab/ensemble/sb_bagging.py @@ -9,9 +9,10 @@ import numpy as np from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor -from sklearn.ensemble.bagging import BaseBagging, BaggingClassifier, BaggingRegressor +from sklearn.ensemble import BaggingClassifier, BaggingRegressor +from sklearn.ensemble._bagging import BaseBagging +from sklearn.ensemble._base import _partition_estimators from sklearn.base import ClassifierMixin, RegressorMixin -from sklearn.ensemble.base import _partition_estimators from sklearn.utils.random import sample_without_replacement from sklearn.utils import indices_to_mask from sklearn.metrics import accuracy_score, r2_score @@ -453,8 +454,9 @@ def _set_oob_score(self, X, y): "This probably means too few estimators were used " "to compute any reliable oob estimates.") - oob_decision_function = (predictions / - predictions.sum(axis=1)[:, np.newaxis]) + oob_decision_function = np.divide(predictions, predictions.sum(axis=1)[:, np.newaxis], + out=np.zeros_like(predictions), + where=predictions.sum(axis=1)[:, np.newaxis] != 0) oob_score = accuracy_score(y, np.argmax(predictions, axis=1)) self.oob_decision_function_ = oob_decision_function diff --git a/mlfinlab/feature_importance/importance.py b/mlfinlab/feature_importance/importance.py index 3050aa936..51dcefd9b 100644 --- a/mlfinlab/feature_importance/importance.py +++ b/mlfinlab/feature_importance/importance.py @@ -139,7 +139,7 @@ def mean_decrease_accuracy(model, X, y, cv_gen, clustered_subsets=None, sample_w if sample_weight_score is None: sample_weight_score = np.ones((X.shape[0],)) - fold_metrics_values, features_metrics_values = pd.Series(), pd.DataFrame(columns=X.columns) + fold_metrics_values, features_metrics_values = pd.Series(dtype='float64'), pd.DataFrame(columns=X.columns) # Generating a numpy random state object for the given random_state rs_obj = np.random.RandomState(seed=random_state) # Clustered feature subsets will be used for CFI if clustered_subsets exists else will operate on the single column as MDA diff --git a/mlfinlab/features/fracdiff.py b/mlfinlab/features/fracdiff.py index 04267dda2..bcc164086 100644 --- a/mlfinlab/features/fracdiff.py +++ b/mlfinlab/features/fracdiff.py @@ -86,7 +86,7 @@ def frac_diff(series, diff_amt, thresh=0.01): output_df = {} for name in series.columns: series_f = series[[name]].fillna(method='ffill').dropna() - output_df_ = pd.Series(index=series.index) + output_df_ = pd.Series(index=series.index, dtype='float64') for iloc in range(skip, series_f.shape[0]): loc = series_f.index[iloc] @@ -182,7 +182,7 @@ def frac_diff_ffd(series, diff_amt, thresh=1e-5): # 2.2) compute fractionally differenced series for each stock for name in series.columns: series_f = series[[name]].fillna(method='ffill').dropna() - temp_df_ = pd.Series(index=series.index) + temp_df_ = pd.Series(index=series.index, dtype='float64') for iloc1 in range(width, series_f.shape[0]): loc0 = series_f.index[iloc1 - width] loc1 = series.index[iloc1] diff --git a/mlfinlab/labeling/__init__.py b/mlfinlab/labeling/__init__.py index 0cd8eeb83..d8d437d5f 100644 --- a/mlfinlab/labeling/__init__.py +++ b/mlfinlab/labeling/__init__.py @@ -7,3 +7,6 @@ from mlfinlab.labeling.trend_scanning import trend_scanning_labels from mlfinlab.labeling.tail_sets import TailSetLabels from mlfinlab.labeling.fixed_time_horizon import fixed_time_horizon +from mlfinlab.labeling.excess_over_median import excess_over_median +from mlfinlab.labeling.raw_return import raw_return +from mlfinlab.labeling.return_vs_benchmark import return_over_benchmark diff --git a/mlfinlab/labeling/excess_over_median.py b/mlfinlab/labeling/excess_over_median.py new file mode 100644 index 000000000..6151425c9 --- /dev/null +++ b/mlfinlab/labeling/excess_over_median.py @@ -0,0 +1,53 @@ +""" +Return in excess of median method. + +Described in "The benefits of tree-based models for stock selection", Zhu et al. (2012). Data labeled this way can be +used in regression and classification models to predict stock returns over market. +""" +import numpy as np + + +def excess_over_median(prices, binary=False, resample_by=None, lag=True): + """ + Return in excess of median labeling method. Sourced from "The benefits of tree-based models for stock selection" + Zhu et al. (2012). + + Returns a DataFrame containing returns of stocks over the median of all stocks in the portfolio, or returns a + DataFrame containing signs of those returns. In the latter case, an observation may be labeled as 0 if it itself is + the median. + + :param prices: (pd.DataFrame) Close prices of all stocks in the market that are used to establish the median. + Returns on each stock are then compared to the median for the given timestamp. + :param binary: (bool) If False, the numerical value of excess returns over median will be given. If True, then only + the sign of the excess return over median will be given (-1 or 1). A label of 0 will be given if + the observation itself is the median. According to Zhu et al., categorical labels can alleviate + issues with extreme outliers present with numerical labels. + :param resample_by: (str) If not None, the resampling period for price data prior to calculating returns. 'B' = per + business day, 'W' = week, 'M' = month, etc. Will take the last observation for each period. + For full details see `here. + `_ + :param lag: (bool) If True, returns will be lagged to make them forward-looking. + :return: (pd.DataFrame) Numerical returns in excess of the market median return, or sign of return depending on + whether binary is False or True respectively. + """ + # Apply resample, if applicable. + if resample_by is not None: + prices = prices.resample(resample_by).last() + + # Get return per period. + if lag: + returns = prices.pct_change(periods=1).shift(-1) + else: + returns = prices.pct_change(periods=1) + + # Calculate median returns for each period as market return. + market_return = returns.median(axis=1) + + # Calculate excess over market (median) return. + returns_over_median = returns.sub(market_return, axis=0) + + # If binary is true, returns sign of the return over median instead of the value. + if binary: + returns_over_median = returns_over_median.apply(np.sign) + + return returns_over_median diff --git a/mlfinlab/labeling/fixed_time_horizon.py b/mlfinlab/labeling/fixed_time_horizon.py index 82e0ba3a5..7893d5361 100644 --- a/mlfinlab/labeling/fixed_time_horizon.py +++ b/mlfinlab/labeling/fixed_time_horizon.py @@ -1,67 +1,75 @@ """ -Chapter 3.2 Fixed-Time Horizon Method, in Advances in Financial Machine Learning, by M. L. de Prado +Chapter 3.2 Fixed-Time Horizon Method, in Advances in Financial Machine Learning, by M. L. de Prado. Work "Classification-based Financial Markets Prediction using Deep Neural Networks" by Dixon et al. (2016) describes how labeling data this way can be used in training deep neural networks to predict price movements. """ import warnings -import numpy as np import pandas as pd -def fixed_time_horizon(close, threshold=0, look_forward=1, standardized=False, window=None): +def fixed_time_horizon(prices, threshold=0, resample_by=None, lag=True, standardized=False, window=None): """ - Fixed-Time Horizon Labelling Method + Fixed-Time Horizon Labeling Method. Originally described in the book Advances in Financial Machine Learning, Chapter 3.2, p.43-44. - Returns 1 if return for a period is greater than the threshold, -1 if less, and 0 if in between. If no threshold is + Returns 1 if return is greater than the threshold, -1 if less, and 0 if in between. If no threshold is provided then it will simply take the sign of the return. - :param close: (pd.Series) Close prices over fixed horizons (usually time bars, but can be any format as long as - index is timestamps) for a stock ticker. - :param threshold: (float or pd.Series) When the abs(change) is larger than the threshold, it is labelled as 1 or -1. - If change is smaller, it's labelled as 0. Can be dynamic if threshold is pd.Series. If threshold is - a series, threshold.index must match close.index. If threshold is negative, then the directionality - of the labels will be reversed. If no threshold is given, then the sign of the observation is - returned. - :param look_forward: (int) Number of ticks to look forward when calculating future return rate. (1 by default) - If n is the numerical value of look_forward, the last n observations will return a label of NaN - due to lack of data to calculate the forward return in those cases. + :param prices: (pd.Series or pd.DataFrame) Time-indexed stock prices used to calculate returns. + :param threshold: (float or pd.Series) When the absolute value of return exceeds the threshold, the observation is + labeled with 1 or -1, depending on the sign of the return. If return is less, it's labeled as 0. + Can be dynamic if threshold is inputted as a pd.Series, and threshold.index must match prices.index. + If resampling is used, the index of threshold must match the index of prices after resampling. + If threshold is negative, then the directionality of the labels will be reversed. If no threshold + is provided, it is assumed to be 0 and the sign of the return is returned. + :param resample_by: (str) If not None, the resampling period for price data prior to calculating returns. 'B' = per + business day, 'W' = week, 'M' = month, etc. Will take the last observation for each period. + For full details see `here. + `_ + :param lag: (bool) If True, returns will be lagged to make them forward-looking. :param standardized: (bool) Whether returns are scaled by mean and standard deviation. :param window: (int) If standardized is True, the rolling window period for calculating the mean and standard deviation of returns. - :return: (pd.Series) -1, 0, or 1 denoting whether return for each tick is under/between/greater than the threshold. - The final look_forward number of observations will be labeled np.nan. Index is same as index of - close. + :return: (pd.Series or pd.DataFrame) -1, 0, or 1 denoting whether the return for each observation is + less/between/greater than the threshold at each corresponding time index. First or last row will be + NaN, depending on lag. """ - # Calculate returns - forward_return = close.pct_change(periods=look_forward).shift(-look_forward) + # Apply resample period, if applicable. + if resample_by is not None: + prices = prices.resample(resample_by).last() - # Warning if look_forward is greater than the length of the series. - if look_forward >= len(forward_return): - warnings.warn('look_forward period is greater than the length of the Series. All labels will be NaN.', - UserWarning) + # Calculate returns. + if lag: + returns = prices.pct_change(1).shift(-1) + else: + returns = prices.pct_change(1) - # Adjust by mean and stdev, if desired. Assert that window must exist if standardization is on. Warning if window is - # too large. + # If threshold is pd.Series, its index must patch prices.index; otherwise labels will fail to return. + if isinstance(threshold, pd.Series): + assert threshold.index.equals(prices.index), "prices.index and threshold.index must match! If prices are " \ + "resampled, the threshold index must match the resampled prices " \ + "index." + + # Adjust by mean and stdev, if desired. Assert that window must exist if standardization is on. Warning if window + # is too large. if standardized: - # Error handling - assert isinstance(window, int), "when standardized is True, window must be int" - if window >= len(forward_return): + assert isinstance(window, int), "When standardized is True, window must be int." + if window >= len(returns): warnings.warn('window is greater than the length of the Series. All labels will be NaN.', UserWarning) - # Apply standardisation - mean = forward_return.rolling(window=window).mean() - stdev = forward_return.rolling(window=window).std() - forward_return -= mean - forward_return /= stdev + # Apply standardization. + mean = returns.rolling(window=window).mean() + stdev = returns.rolling(window=window).std() + returns -= mean + returns /= stdev - # Apply labeling otherwise - conditions = [forward_return > threshold, (forward_return <= threshold) & (forward_return >= -threshold), - forward_return < -threshold] - choices = [1, 0, -1] - labels = np.select(conditions, choices, default=np.nan) + # Apply labeling. + labels = returns.copy() # Copy returns so labels aren't all 0 when threshold => 1. + labels[returns.lt(-threshold, axis=0)] = -1 + labels[returns.gt(threshold, axis=0)] = 1 + labels[(returns.ge(-threshold, axis=0)) & (returns.le(threshold, axis=0))] = 0 - return pd.Series(labels, index=close.index) + return labels diff --git a/mlfinlab/labeling/labeling.py b/mlfinlab/labeling/labeling.py index 2a5eaba59..9d160dc9b 100644 --- a/mlfinlab/labeling/labeling.py +++ b/mlfinlab/labeling/labeling.py @@ -47,12 +47,15 @@ def apply_pt_sl_on_t1(close, events, pt_sl, molecule): # pragma: no cover else: stop_loss = pd.Series(index=events.index) # NaNs + out['pt'] = pd.Series(dtype=events.index.dtype) + out['sl'] = pd.Series(dtype=events.index.dtype) + # Get events for loc, vertical_barrier in events_['t1'].fillna(close.index[-1]).iteritems(): closing_prices = close[loc: vertical_barrier] # Path prices for a given trade cum_returns = (closing_prices / close[loc] - 1) * events_.at[loc, 'side'] # Path returns - out.loc[loc, 'sl'] = cum_returns[cum_returns < stop_loss[loc]].index.min() # Earliest stop loss date - out.loc[loc, 'pt'] = cum_returns[cum_returns > profit_taking[loc]].index.min() # Earliest profit taking date + out.at[loc, 'sl'] = cum_returns[cum_returns < stop_loss[loc]].index.min() # Earliest stop loss date + out.at[loc, 'pt'] = cum_returns[cum_returns > profit_taking[loc]].index.min() # Earliest profit taking date return out @@ -95,7 +98,7 @@ def add_vertical_barrier(t_events, close, num_days=0, num_hours=0, num_minutes=0 # Snippet 3.3 -> 3.6 page 50, Getting the Time of the First Touch, with Meta Labels def get_events(close, t_events, pt_sl, target, min_ret, num_threads, vertical_barrier_times=False, - side_prediction=None): + side_prediction=None, verbose=True): """ Advances in Financial Machine Learning, Snippet 3.6 page 50. @@ -117,6 +120,7 @@ def get_events(close, t_events, pt_sl, target, min_ret, num_threads, vertical_ba :param vertical_barrier_times: (pd.Series) A pandas series with the timestamps of the vertical barriers. We pass a False when we want to disable vertical barriers. :param side_prediction: (pd.Series) Side of the bet (long/short) as decided by the primary model + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.DataFrame) Events -events.index is event's starttime -events['t1'] is event's endtime @@ -132,7 +136,7 @@ def get_events(close, t_events, pt_sl, target, min_ret, num_threads, vertical_ba # 2) Get vertical barrier (max holding period) if vertical_barrier_times is False: - vertical_barrier_times = pd.Series(pd.NaT, index=t_events) + vertical_barrier_times = pd.Series(pd.NaT, index=t_events, dtype=t_events.dtype) # 3) Form events object, apply stop loss on vertical barrier if side_prediction is None: @@ -152,10 +156,11 @@ def get_events(close, t_events, pt_sl, target, min_ret, num_threads, vertical_ba num_threads=num_threads, close=close, events=events, - pt_sl=pt_sl_) + pt_sl=pt_sl_, + verbose=verbose) for ind in events.index: - events.loc[ind, 't1'] = first_touch_dates.loc[ind, :].dropna().min() + events.at[ind, 't1'] = first_touch_dates.loc[ind, :].dropna().min() if side_prediction is None: events = events.drop('side', axis=1) diff --git a/mlfinlab/labeling/raw_return.py b/mlfinlab/labeling/raw_return.py new file mode 100644 index 000000000..b454aef8a --- /dev/null +++ b/mlfinlab/labeling/raw_return.py @@ -0,0 +1,49 @@ +""" +Labeling Raw Returns. + +Most basic form of labeling based on raw return of each observation relative to its previous value. +""" + +import numpy as np + + +def raw_return(prices, binary=False, logarithmic=False, resample_by=None, lag=True): + """ + Raw returns labeling method. + + This is the most basic and ubiquitous labeling method used as a precursor to almost any kind of financial data + analysis or machine learning. User can specify simple or logarithmic returns, numerical or binary labels, a + resample period, and whether returns are lagged to be forward looking. + + :param prices: (pd.Series or pd.DataFrame) Time-indexed price data on stocks with which to calculate return. + :param binary: (bool) If False, will return numerical returns. If True, will return the sign of the raw return. + :param logarithmic: (bool) If False, will calculate simple returns. If True, will calculate logarithmic returns. + :param resample_by: (str) If not None, the resampling period for price data prior to calculating returns. 'B' = per + business day, 'W' = week, 'M' = month, etc. Will take the last observation for each period. + For full details see `here. + `_ + :param lag: (bool) If True, returns will be lagged to make them forward-looking. + :return: (pd.Series or pd.DataFrame) Raw returns on market data. User can specify whether returns will be based on + simple or logarithmic return, and whether the output will be numerical or categorical. + """ + # Apply resample, if applicable. + if resample_by is not None: + prices = prices.resample(resample_by).last() + + # Get return per period. + if logarithmic: # Log returns + if lag: + returns = np.log(prices).diff().shift(-1) + else: + returns = np.log(prices).diff() + else: # Simple returns + if lag: + returns = prices.pct_change(periods=1).shift(-1) + else: + returns = prices.pct_change(periods=1) + + # Return sign only if categorical labels desired. + if binary: + returns = returns.apply(np.sign) + + return returns diff --git a/mlfinlab/labeling/return_vs_benchmark.py b/mlfinlab/labeling/return_vs_benchmark.py new file mode 100644 index 000000000..7bab45187 --- /dev/null +++ b/mlfinlab/labeling/return_vs_benchmark.py @@ -0,0 +1,55 @@ +""" +Return in excess of a given benchmark. + +Chapter 5, Machine Learning for Factor Investing, by Coqueret and Guida, (2020). + +Work "Evaluating multiple classifiers for stock price direction prediction" by Ballings et al. (2015) uses this method +to label yearly returns over a predetermined value to compare the performance of several machine learning algorithms. +""" +import numpy as np +import pandas as pd + + +def return_over_benchmark(prices, benchmark=0, binary=False, resample_by=None, lag=True): + """ + Return over benchmark labeling method. Sourced from Chapter 5.5.1 of Machine Learning for Factor Investing, + by Coqueret, G. and Guida, T. (2020). + + Returns a Series or DataFrame of numerical or categorical returns over a given benchmark. The time index of the + benchmark must match those of the price observations. + + :param prices: (pd.Series or pd.DataFrame) Time indexed prices to compare returns against a benchmark. + :param benchmark: (pd.Series or float) Benchmark of returns to compare the returns from prices against for labeling. + Can be a constant value, or a Series matching the index of prices. If no benchmark is given, then it + is assumed to have a constant value of 0. + :param binary: (bool) If False, labels are given by their numerical value of return over benchmark. If True, + labels are given according to the sign of their excess return. + :param resample_by: (str) If not None, the resampling period for price data prior to calculating returns. 'B' = per + business day, 'W' = week, 'M' = month, etc. Will take the last observation for each period. + For full details see `here. + `_ + :param lag: (bool) If True, returns will be lagged to make them forward-looking. + :return: (pd.Series or pd.DataFrame) Excess returns over benchmark. If binary, the labels are -1 if the + return is below the benchmark, 1 if above, and 0 if it exactly matches the benchmark. + """ + # Apply resample, if applicable. + if resample_by is not None: + prices = prices.resample(resample_by).last() + + # Check that index of benchmark matches index of prices, if benchmark is a pd.Series. + if isinstance(benchmark, pd.Series): + assert prices.index.equals(benchmark.index), "Index of returns and benchmark do not match. If resampling is " \ + "used, index of benchmark must match index of resampled data./" \ + + # Get returns from prices. + if lag: + returns = prices.pct_change(periods=1).shift(-1) + else: + returns = prices.pct_change(periods=1) + + # Subtract the benchmark from returns. + over_benchmark = returns.sub(benchmark, axis=0) + + if binary: + over_benchmark = over_benchmark.apply(np.sign) + return over_benchmark diff --git a/mlfinlab/labeling/trend_scanning.py b/mlfinlab/labeling/trend_scanning.py index 521a3c7c3..324d3d057 100644 --- a/mlfinlab/labeling/trend_scanning.py +++ b/mlfinlab/labeling/trend_scanning.py @@ -78,7 +78,7 @@ def trend_scanning_labels(price_series: pd.Series, t_events: list = None, look_f t_values_array.append(None) labels = pd.DataFrame({'t1': t1_array, 't_value': t_values_array}, index=t_events) - labels.loc[:, 'ret'] = price_series.loc[labels.t1].values / price_series.loc[labels.index].values - 1 - labels['bin'] = np.sign(labels.t_value) + labels.loc[:, 'ret'] = price_series.reindex(labels.t1).values / price_series.reindex(labels.index).values - 1 + labels['bin'] = labels.t_value.apply(np.sign) return labels diff --git a/mlfinlab/microstructural_features/entropy.py b/mlfinlab/microstructural_features/entropy.py index 48edc6efc..b5ff2159b 100644 --- a/mlfinlab/microstructural_features/entropy.py +++ b/mlfinlab/microstructural_features/entropy.py @@ -155,5 +155,5 @@ def get_konto_entropy(message: str, window: int = 0) -> float: out['h'] = out['sum'] / out['num'] except ZeroDivisionError: out['h'] = 0 - out['r'] = 1 - out['h'] / np.log2(len(message)) # Redundancy, 0<=r<=1 + out['r'] = 1 - out['h'] / (np.log2(len(message)) if np.log2(len(message)) > 0 else 1) # Redundancy, 0<=r<=1 return out['h'] diff --git a/mlfinlab/microstructural_features/second_generation.py b/mlfinlab/microstructural_features/second_generation.py index d41d02224..c468381e0 100644 --- a/mlfinlab/microstructural_features/second_generation.py +++ b/mlfinlab/microstructural_features/second_generation.py @@ -21,7 +21,7 @@ def get_bar_based_kyle_lambda(close: pd.Series, volume: pd.Series, window: int = :return: (pd.Series) Kyle lambdas """ close_diff = close.diff() - close_diff_sign = np.sign(close_diff) + close_diff_sign = close_diff.apply(np.sign) close_diff_sign.replace(0, method='pad', inplace=True) # Replace 0 values with previous volume_mult_trade_signs = volume * close_diff_sign # bt * Vt return (close_diff / volume_mult_trade_signs).rolling(window=window).mean() @@ -54,7 +54,7 @@ def get_bar_based_hasbrouck_lambda(close: pd.Series, dollar_volume: pd.Series, w :return: (pd.Series) Hasbrouck lambda """ log_ret = np.log(close / close.shift(1)) - log_ret_sign = np.sign(log_ret).replace(0, method='pad') + log_ret_sign = log_ret.apply(np.sign).replace(0, method='pad') signed_dollar_volume_sqrt = log_ret_sign * np.sqrt(dollar_volume) return (log_ret / signed_dollar_volume_sqrt).rolling(window=window).mean() @@ -75,7 +75,7 @@ def get_trades_based_kyle_lambda(price_diff: list, volume: list, aggressor_flags X = np.array(signed_volume).reshape(-1, 1) y = np.array(price_diff) coef, std = get_betas(X, y) - t_value = coef[0] / std[0] + t_value = coef[0] / std[0] if std[0] > 0 else np.array([0]) return [coef[0], t_value[0]] @@ -92,7 +92,7 @@ def get_trades_based_amihud_lambda(log_ret: list, dollar_volume: list) -> List[f X = np.array(dollar_volume).reshape(-1, 1) y = np.abs(np.array(log_ret)) coef, std = get_betas(X, y) - t_value = coef[0] / std[0] + t_value = coef[0] / std[0] if std[0] > 0 else np.array([0]) return [coef[0], t_value[0]] @@ -110,5 +110,5 @@ def get_trades_based_hasbrouck_lambda(log_ret: list, dollar_volume: list, aggres X = (np.sqrt(np.array(dollar_volume)) * np.array(aggressor_flags)).reshape(-1, 1) y = np.abs(np.array(log_ret)) coef, std = get_betas(X, y) - t_value = coef[0] / std[0] + t_value = coef[0] / std[0] if std[0] > 0 else np.array([0]) return [coef[0], t_value[0]] diff --git a/mlfinlab/multi_product/etf_trick.py b/mlfinlab/multi_product/etf_trick.py index 9d9bd3648..548a6073a 100644 --- a/mlfinlab/multi_product/etf_trick.py +++ b/mlfinlab/multi_product/etf_trick.py @@ -210,7 +210,7 @@ def _chunk_loop(self, data_df): :param data_df: The data set on which to apply the ETF trick. :return: (pd.Series): pandas Series with ETF trick values """ - etf_series = pd.Series() + etf_series = pd.Series(dtype='float64') for index, row in zip(data_df.index, data_df.values): # Split row in corresponding values for ETF trick # pylint: disable=unbalanced-tuple-unpacking @@ -304,7 +304,7 @@ def _csv_file_etf_series(self, batch_size): :param: batch_size: (int): Size of the batch that you would like to make use of :return: (pd.Series): pandas Series with ETF trick values starting from 1.0 """ - etf_series = pd.Series() + etf_series = pd.Series(dtype='float64') self._get_batch_from_csv(batch_size) # Data frame which contains all precomputed info for etf trick data_df = self.generate_trick_components(cache=None) # Cache is empty on the first batch run diff --git a/mlfinlab/online_portfolio_selection/base.py b/mlfinlab/online_portfolio_selection/base.py index 0efee1b44..b19f2f1ad 100644 --- a/mlfinlab/online_portfolio_selection/base.py +++ b/mlfinlab/online_portfolio_selection/base.py @@ -211,7 +211,7 @@ def _optimize(self, optimize_array, solver=cp.SCS): # Use cp.log and cp.sum to make the cost function a convex function. # Multiplying continuous returns equates to summing over the log returns. - portfolio_return = cp.sum(cp.log(optimize_array * weights)) + portfolio_return = cp.sum(cp.log(optimize_array @ weights)) # Optimization objective and constraints. allocation_objective = cp.Maximize(portfolio_return) diff --git a/mlfinlab/portfolio_optimization/mean_variance.py b/mlfinlab/portfolio_optimization/mean_variance.py index f6e1eaad3..d3b6c99e9 100644 --- a/mlfinlab/portfolio_optimization/mean_variance.py +++ b/mlfinlab/portfolio_optimization/mean_variance.py @@ -13,6 +13,7 @@ class MeanVarianceOptimisation: This class implements some classic mean-variance optimisation techniques for calculating the efficient frontier solutions. With the help of quadratic optimisers, users can generate optimal portfolios for different objective functions. Currently solutions to the following portfolios can be generated: + 1. Inverse Variance 2. Maximum Sharpe 3. Minimum Volatility diff --git a/mlfinlab/portfolio_optimization/nco.py b/mlfinlab/portfolio_optimization/nco.py index c558e8e7e..0618c44ab 100644 --- a/mlfinlab/portfolio_optimization/nco.py +++ b/mlfinlab/portfolio_optimization/nco.py @@ -254,7 +254,7 @@ def _cluster_kmeans_base(corr, max_num_clusters=None, n_init=10): dist_matrix = ((1 - corr.fillna(0)) / 2) ** (1 / 2) # Series for Silhouette Coefficients - cluster fit measure - silh_coef_optimal = pd.Series() + silh_coef_optimal = pd.Series(dtype='float64') # If maximum number of clusters undefined, it's equal to half the number of elements if max_num_clusters is None: @@ -265,7 +265,7 @@ def _cluster_kmeans_base(corr, max_num_clusters=None, n_init=10): # Iterating through every number of clusters for num_clusters in range(2, max_num_clusters + 1): # Computing k-means clustering - kmeans = KMeans(n_clusters=num_clusters, n_jobs=1, n_init=init) + kmeans = KMeans(n_clusters=num_clusters, n_init=init) kmeans = kmeans.fit(dist_matrix) # Computing a Silhouette Coefficient - cluster fit measure diff --git a/mlfinlab/portfolio_optimization/tic.py b/mlfinlab/portfolio_optimization/tic.py index 6c79e7682..72c7b575a 100644 --- a/mlfinlab/portfolio_optimization/tic.py +++ b/mlfinlab/portfolio_optimization/tic.py @@ -120,6 +120,7 @@ def _get_linkage_corr(self, tree_struct, corr_matrix): # If the top level of the tree contains multiple elements, creating a level with just one element (tree root) if len(np.unique(tree_struct.iloc[:, -1])) > 1: + tree_struct = tree_struct.copy(deep=True) tree_struct['All'] = 0 # Creating a linkage object (matrix with link elements). diff --git a/mlfinlab/sample_weights/attribution.py b/mlfinlab/sample_weights/attribution.py index 8d750e957..906b8f1a0 100644 --- a/mlfinlab/sample_weights/attribution.py +++ b/mlfinlab/sample_weights/attribution.py @@ -26,7 +26,7 @@ def _apply_weight_by_return(label_endtime, num_conc_events, close_series, molecu """ ret = np.log(close_series).diff() # Log-returns, so that they are additive - weights = pd.Series(index=molecule) + weights = pd.Series(index=molecule, dtype='float64') for t_in, t_out in label_endtime.loc[weights.index].iteritems(): # Weights depend on returns and label concurrency @@ -34,7 +34,7 @@ def _apply_weight_by_return(label_endtime, num_conc_events, close_series, molecu return weights.abs() -def get_weights_by_return(triple_barrier_events, close_series, num_threads=5): +def get_weights_by_return(triple_barrier_events, close_series, num_threads=5, verbose=True): """ Advances in Financial Machine Learning, Snippet 4.10(part 2), page 69. @@ -45,6 +45,7 @@ def get_weights_by_return(triple_barrier_events, close_series, num_threads=5): :param triple_barrier_events: (pd.DataFrame) Events from labeling.get_events() :param close_series: (pd.Series) Close prices :param num_threads: (int) The number of threads concurrently used by the function. + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) Sample weights based on number return and concurrency """ @@ -53,17 +54,18 @@ def get_weights_by_return(triple_barrier_events, close_series, num_threads=5): assert has_null_events is False and has_null_index is False, 'NaN values in triple_barrier_events, delete nans' num_conc_events = mp_pandas_obj(num_concurrent_events, ('molecule', triple_barrier_events.index), num_threads, - close_series_index=close_series.index, label_endtime=triple_barrier_events['t1']) + close_series_index=close_series.index, label_endtime=triple_barrier_events['t1'], + verbose=verbose) num_conc_events = num_conc_events.loc[~num_conc_events.index.duplicated(keep='last')] num_conc_events = num_conc_events.reindex(close_series.index).fillna(0) weights = mp_pandas_obj(_apply_weight_by_return, ('molecule', triple_barrier_events.index), num_threads, label_endtime=triple_barrier_events['t1'], num_conc_events=num_conc_events, - close_series=close_series) + close_series=close_series, verbose=verbose) weights *= weights.shape[0] / weights.sum() return weights -def get_weights_by_time_decay(triple_barrier_events, close_series, num_threads=5, decay=1): +def get_weights_by_time_decay(triple_barrier_events, close_series, num_threads=5, decay=1, verbose=True): """ Advances in Financial Machine Learning, Snippet 4.11, page 70. @@ -77,6 +79,7 @@ def get_weights_by_time_decay(triple_barrier_events, close_series, num_threads=5 - 0 < decay < 1 means that weights decay linearly over time, but every observation still receives a strictly positive weight, regadless of how old - decay = 0 means that weights converge linearly to zero, as they become older - decay < 0 means that the oldes portion c of the observations receive zero weight (i.e they are erased from memory) + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) Sample weights based on time decay factors """ assert bool(triple_barrier_events.isnull().values.any()) is False and bool( @@ -84,7 +87,7 @@ def get_weights_by_time_decay(triple_barrier_events, close_series, num_threads=5 # Apply piecewise-linear decay to observed uniqueness # Newest observation gets weight=1, oldest observation gets weight=decay - av_uniqueness = get_av_uniqueness_from_triple_barrier(triple_barrier_events, close_series, num_threads) + av_uniqueness = get_av_uniqueness_from_triple_barrier(triple_barrier_events, close_series, num_threads, verbose) decay_w = av_uniqueness['tW'].sort_index().cumsum() if decay >= 0: slope = (1 - decay) / decay_w.iloc[-1] diff --git a/mlfinlab/sampling/bootstrapping.py b/mlfinlab/sampling/bootstrapping.py index 130e20908..fc8b65581 100644 --- a/mlfinlab/sampling/bootstrapping.py +++ b/mlfinlab/sampling/bootstrapping.py @@ -64,8 +64,9 @@ def get_ind_mat_average_uniqueness(ind_mat): :param ind_mat: (np.matrix) Indicator binary matrix :return: (float) Average uniqueness """ + ind_mat = np.array(ind_mat, dtype=np.float64) concurrency = ind_mat.sum(axis=1) - uniqueness = ind_mat.T / concurrency + uniqueness = np.divide(ind_mat.T, concurrency, out=np.zeros_like(ind_mat.T), where=concurrency != 0) avg_uniqueness = uniqueness[uniqueness > 0].mean() @@ -81,9 +82,9 @@ def get_ind_mat_label_uniqueness(ind_mat): :param ind_mat: (np.matrix) Indicator binary matrix :return: (np.matrix) Element uniqueness """ + ind_mat = np.array(ind_mat, dtype=np.float64) concurrency = ind_mat.sum(axis=1) - uniqueness = ind_mat.T / concurrency - + uniqueness = np.divide(ind_mat.T, concurrency, out=np.zeros_like(ind_mat.T), where=concurrency != 0) return uniqueness diff --git a/mlfinlab/sampling/concurrent.py b/mlfinlab/sampling/concurrent.py index 168b63d3c..a5a7a1e33 100644 --- a/mlfinlab/sampling/concurrent.py +++ b/mlfinlab/sampling/concurrent.py @@ -50,13 +50,13 @@ def _get_average_uniqueness(label_endtime, num_conc_events, molecule): :return: (pd.Series) Average uniqueness over event's lifespan. """ # Derive average uniqueness over the event's lifespan - wght = pd.Series(index=molecule) + wght = pd.Series(index=molecule, dtype='float64') for t_in, t_out in label_endtime.loc[wght.index].iteritems(): wght.loc[t_in] = (1. / num_conc_events.loc[t_in:t_out]).mean() return wght -def get_av_uniqueness_from_triple_barrier(triple_barrier_events, close_series, num_threads): +def get_av_uniqueness_from_triple_barrier(triple_barrier_events, close_series, num_threads, verbose=True): """ This function is the orchestrator to derive average sample uniqueness from a dataset labeled by the triple barrier method. @@ -64,13 +64,16 @@ def get_av_uniqueness_from_triple_barrier(triple_barrier_events, close_series, n :param triple_barrier_events: (pd.DataFrame) Events from labeling.get_events() :param close_series: (pd.Series) Close prices. :param num_threads: (int) The number of threads concurrently used by the function. + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) Average uniqueness over event's lifespan for each index in triple_barrier_events """ out = pd.DataFrame() num_conc_events = mp_pandas_obj(num_concurrent_events, ('molecule', triple_barrier_events.index), num_threads, - close_series_index=close_series.index, label_endtime=triple_barrier_events['t1']) + close_series_index=close_series.index, label_endtime=triple_barrier_events['t1'], + verbose=verbose) num_conc_events = num_conc_events.loc[~num_conc_events.index.duplicated(keep='last')] num_conc_events = num_conc_events.reindex(close_series.index).fillna(0) out['tW'] = mp_pandas_obj(_get_average_uniqueness, ('molecule', triple_barrier_events.index), num_threads, - label_endtime=triple_barrier_events['t1'], num_conc_events=num_conc_events) + label_endtime=triple_barrier_events['t1'], num_conc_events=num_conc_events, + verbose=verbose) return out diff --git a/mlfinlab/structural_breaks/chow.py b/mlfinlab/structural_breaks/chow.py index bdcc4f0d2..bbd1de3d8 100644 --- a/mlfinlab/structural_breaks/chow.py +++ b/mlfinlab/structural_breaks/chow.py @@ -18,7 +18,7 @@ def _get_dfc_for_t(series: pd.Series, molecule: list) -> pd.Series: :return: (pd.Series) Statistics for each index from molecule """ - dfc_series = pd.Series(index=molecule) + dfc_series = pd.Series(index=molecule, dtype='float64') for index in molecule: series_diff = series.diff().dropna() @@ -34,13 +34,14 @@ def _get_dfc_for_t(series: pd.Series, molecule: list) -> pd.Series: return dfc_series -def get_chow_type_stat(series: pd.Series, min_length: int = 20, num_threads: int = 8) -> pd.Series: +def get_chow_type_stat(series: pd.Series, min_length: int = 20, num_threads: int = 8, verbose: bool = True) -> pd.Series: """ Multithread implementation of Chow-Type Dickey-Fuller Test, p.251-252 :param series: (pd.Series) Series to test :param min_length: (int) Minimum sample length used to estimate statistics :param num_threads: (int): Number of cores to use + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) Chow-Type Dickey-Fuller Test statistics """ # Indices to test. We drop min_length first and last values @@ -49,5 +50,6 @@ def get_chow_type_stat(series: pd.Series, min_length: int = 20, num_threads: int pd_obj=('molecule', molecule), series=series, num_threads=num_threads, + verbose=verbose, ) return dfc_series diff --git a/mlfinlab/structural_breaks/cusum.py b/mlfinlab/structural_breaks/cusum.py index 8c99d28b1..b0c3d61bb 100644 --- a/mlfinlab/structural_breaks/cusum.py +++ b/mlfinlab/structural_breaks/cusum.py @@ -63,13 +63,14 @@ def _get_s_n_for_t(series: pd.Series, test_type: str, molecule: list) -> pd.Seri def get_chu_stinchcombe_white_statistics(series: pd.Series, test_type: str = 'one_sided', - num_threads: int = 8) -> pd.Series: + num_threads: int = 8, verbose: bool = True) -> pd.Series: """ Multithread Chu-Stinchcombe-White test implementation, p.251 :param series: (pd.Series) Series to get statistics for :param test_type: (str): Two-sided or one-sided test :param num_threads: (int) Number of cores + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) Statistics """ molecule = series.index[2:series.shape[0]] # For the first two values we don't have enough info @@ -79,5 +80,6 @@ def get_chu_stinchcombe_white_statistics(series: pd.Series, test_type: str = 'on series=series, test_type=test_type, num_threads=num_threads, + verbose=verbose, ) return s_n_t_series diff --git a/mlfinlab/structural_breaks/sadf.py b/mlfinlab/structural_breaks/sadf.py index ac237098e..5e4750a42 100644 --- a/mlfinlab/structural_breaks/sadf.py +++ b/mlfinlab/structural_breaks/sadf.py @@ -29,7 +29,9 @@ def _get_sadf_at_t(X: pd.DataFrame, y: pd.DataFrame, min_length: int, model: str b_mean_, b_std_ = get_betas(X_, y_) if not np.isnan(b_mean_[0]): b_mean_, b_std_ = b_mean_[0, 0], b_std_[0, 0] ** 0.5 - all_adf = b_mean_ / b_std_ + # TODO: Rewrite logic of this module to avoid division by zero + with np.errstate(invalid='ignore'): + all_adf = b_mean_ / b_std_ if model[:2] == 'sm': all_adf = np.abs(all_adf) / (y.shape[0]**phi) if all_adf > bsadf: @@ -90,7 +92,9 @@ def _get_y_x(series: pd.Series, model: str, lags: Union[int, list], y = np.log(series.loc[y.index]) x = pd.DataFrame(index=y.index) x['const'] = 1 - x['log_trend'] = np.log(np.arange(x.shape[0])) + # TODO: Rewrite logic of this module to avoid division by zero + with np.errstate(divide='ignore'): + x['log_trend'] = np.log(np.arange(x.shape[0])) beta_column = 'log_trend' else: raise ValueError('Unknown model') @@ -163,7 +167,7 @@ def _sadf_outer_loop(X: pd.DataFrame, y: pd.DataFrame, min_length: int, model: s :param molecule: (list) Indices to get SADF :return: (pd.Series) SADF statistics """ - sadf_series = pd.Series(index=molecule) + sadf_series = pd.Series(index=molecule, dtype='float64') for index in molecule: X_subset = X.loc[:index].values y_subset = y.loc[:index].values.reshape(-1, 1) @@ -173,7 +177,7 @@ def _sadf_outer_loop(X: pd.DataFrame, y: pd.DataFrame, min_length: int, model: s def get_sadf(series: pd.Series, model: str, lags: Union[int, list], min_length: int, add_const: bool = False, - phi: float = 0, num_threads: int = 8) -> pd.Series: + phi: float = 0, num_threads: int = 8, verbose: bool = True) -> pd.Series: """ Advances in Financial Machine Learning, p. 258-259. @@ -196,6 +200,7 @@ def get_sadf(series: pd.Series, model: str, lags: Union[int, list], min_length: :param add_const: (bool) Flag to add constant :param phi: (float) Coefficient to penalize large sample lengths when computing SMT, in [0, 1] :param num_threads: (int) Number of cores to use + :param verbose: (bool) Flag to report progress on asynch jobs :return: (pd.Series) SADF statistics """ X, y = _get_y_x(series, model, lags, add_const) @@ -209,5 +214,6 @@ def get_sadf(series: pd.Series, model: str, lags: Union[int, list], min_length: model=model, phi=phi, num_threads=num_threads, + verbose=verbose, ) return sadf_series diff --git a/mlfinlab/tests/test_backtests.py b/mlfinlab/tests/test_backtests.py index 6d0cc404e..cbf8479e8 100644 --- a/mlfinlab/tests/test_backtests.py +++ b/mlfinlab/tests/test_backtests.py @@ -40,8 +40,6 @@ def test_haircut_sharpe_ratios_simple_input(self): self.assertAlmostEqual(haircuts[0][2], 0.174, delta=1e-2) self.assertAlmostEqual(haircuts[0][3], 0.348, delta=1e-2) - print(haircuts[0][2]) - def test_profit_hurdle(self): """ Test the calculation of haircuts with simple inputs diff --git a/mlfinlab/tests/test_bet_sizing.py b/mlfinlab/tests/test_bet_sizing.py index 9955446ed..01e50b224 100644 --- a/mlfinlab/tests/test_bet_sizing.py +++ b/mlfinlab/tests/test_bet_sizing.py @@ -196,14 +196,14 @@ def test_bet_size_reserve_default(self, mock_likely_parameters): events_active['c_t'] = events_active['active_long'] - events_active['active_short'] central_moments = [moment(events_active['c_t'].to_numpy(), moment=i) for i in range(1, 6)] raw_moments = raw_moment(central_moments=central_moments, dist_mean=events_active['c_t'].mean()) - m2n_test = M2N(raw_moments, epsilon=1e-5, factor=5, n_runs=25, variant=2, max_iter=10_000, num_workers=1) + m2n_test = M2N(raw_moments, epsilon=1e-5, factor=5, n_runs=10, variant=2, max_iter=10_000, num_workers=1) test_results = m2n_test.mp_fit() test_params = most_likely_parameters(test_results) mock_likely_parameters.return_value = test_params test_fit = [test_params[key] for key in ['mu_1', 'mu_2', 'sigma_1', 'sigma_2', 'p_1']] events_active['bet_size'] = events_active['c_t'].apply(lambda c: single_bet_size_mixed(c, test_fit)) # Evaluate. - df_bet = bet_size_reserve(df_events['t1'], df_events['side'], fit_runs=25) + df_bet = bet_size_reserve(df_events['t1'], df_events['side'], fit_runs=10) self.assertTrue(events_active.equals(df_bet)) @patch('mlfinlab.bet_sizing.bet_sizing.most_likely_parameters') @@ -232,7 +232,7 @@ def test_bet_size_reserve_return_params(self, mock_likely_parameters): events_active['c_t'] = events_active['active_long'] - events_active['active_short'] central_moments = [moment(events_active['c_t'].to_numpy(), moment=i) for i in range(1, 6)] raw_moments = raw_moment(central_moments=central_moments, dist_mean=events_active['c_t'].mean()) - m2n_test = M2N(raw_moments, epsilon=1e-5, factor=5, n_runs=25, variant=2, max_iter=10_000, num_workers=1) + m2n_test = M2N(raw_moments, epsilon=1e-5, factor=5, n_runs=10, variant=2, max_iter=10_000, num_workers=1) test_results = m2n_test.mp_fit() test_params = most_likely_parameters(test_results) mock_likely_parameters.return_value = test_params @@ -240,7 +240,7 @@ def test_bet_size_reserve_return_params(self, mock_likely_parameters): events_active['bet_size'] = events_active['c_t'].apply(lambda c: single_bet_size_mixed(c, test_fit)) # Evaluate. eval_events, eval_params = bet_size_reserve(df_events['t1'], df_events['side'], - fit_runs=25, return_parameters=True) + fit_runs=10, return_parameters=True) self.assertEqual(test_params, eval_params) self.assertTrue(events_active.equals(eval_events)) diff --git a/mlfinlab/tests/test_ch10_snippets.py b/mlfinlab/tests/test_ch10_snippets.py index b22dfce7a..1fb5bdc78 100644 --- a/mlfinlab/tests/test_ch10_snippets.py +++ b/mlfinlab/tests/test_ch10_snippets.py @@ -324,7 +324,6 @@ def test_get_w_power_warning(self): with warnings.catch_warnings(record=True) as warn_catch: warnings.simplefilter("always") w_param = get_w_power(0.1, 2) - print(warn_catch[0].category) self.assertTrue(len(warn_catch) == 1) self.assertEqual(0, w_param) self.assertTrue('User' in str(warn_catch[0].category)) diff --git a/mlfinlab/tests/test_codependence.py b/mlfinlab/tests/test_codependence.py index 667d25dc4..9457eb647 100644 --- a/mlfinlab/tests/test_codependence.py +++ b/mlfinlab/tests/test_codependence.py @@ -10,7 +10,9 @@ from mlfinlab.codependence.information import (get_mutual_info, variation_of_information_score, get_optimal_number_of_bins) from mlfinlab.codependence.codependence_matrix import (get_dependence_matrix, get_distance_matrix) +from mlfinlab.codependence.gnpr_distance import (spearmans_rho, gpr_distance, gnpr_distance) from mlfinlab.util.generate_dataset import get_classification_data + # pylint: disable=invalid-name class TestCodependence(unittest.TestCase): @@ -82,11 +84,17 @@ def test_codependence_matrix(self): ''' Test the get_dependence_matrix and get_distance_matrix function ''' + + # TODO: add tests for values in matrix #Dependence_matrix vi_matrix = get_dependence_matrix(self.X_matrix, dependence_method='information_variation') mi_matrix = get_dependence_matrix(self.X_matrix, dependence_method='mutual_information') corr_matrix = get_dependence_matrix(self.X_matrix, dependence_method='distance_correlation') + rho_matrix = get_dependence_matrix(self.X_matrix, dependence_method='spearmans_rho') + gpr_matrix = get_dependence_matrix(self.X_matrix, dependence_method='gpr_distance', theta=0.5) + gnpr_matrix = get_dependence_matrix(self.X_matrix, dependence_method='gnpr_distance', theta=0.5, bandwidth=0.02) + #Distance_matrix angl = get_distance_matrix(vi_matrix, distance_metric='angular') sq_angl = get_distance_matrix(mi_matrix, distance_metric='squared_angular') @@ -96,6 +104,10 @@ def test_codependence_matrix(self): self.assertEqual(vi_matrix.shape[0], self.X_matrix.shape[1]) self.assertEqual(mi_matrix.shape[0], self.X_matrix.shape[1]) self.assertEqual(corr_matrix.shape[0], self.X_matrix.shape[1]) + self.assertEqual(rho_matrix.shape[0], self.X_matrix.shape[1]) + self.assertEqual(gpr_matrix.shape[0], self.X_matrix.shape[1]) + self.assertEqual(gnpr_matrix.shape[0], self.X_matrix.shape[1]) + self.assertEqual(angl.shape[0], self.X_matrix.shape[1]) self.assertEqual(sq_angl.shape[0], self.X_matrix.shape[1]) self.assertEqual(abs_angl.shape[0], self.X_matrix.shape[1]) @@ -110,3 +122,48 @@ def test_value_error_raise(self): #Unkown distance_metric with self.assertRaises(ValueError): get_distance_matrix(self.X_matrix, distance_metric='unknown') + + def test_spearmans_rho(self): + """ + Test spearmans_rho function. + """ + + rho_xy1 = spearmans_rho(self.x, self.y_1) + rho_xy2 = spearmans_rho(self.x, self.y_2) + + self.assertAlmostEqual(rho_xy1, 0.0105586, delta=1e-7) + self.assertAlmostEqual(rho_xy2, 0.0289523, delta=1e-7) + + def test_gpr_distance(self): + """ + Test gnp_distance function. + """ + + gpr0_xy1 = gpr_distance(self.x, self.y_1, theta=0) + gpr0_xy2 = gpr_distance(self.x, self.y_2, theta=0) + + gpr1_xy1 = gpr_distance(self.x, self.y_1, theta=1) + gpr1_xy2 = gpr_distance(self.x, self.y_2, theta=1) + + self.assertAlmostEqual(gpr0_xy1, 0.3216183, delta=1e-7) + self.assertAlmostEqual(gpr0_xy2, 0.3803020, delta=1e-7) + + self.assertAlmostEqual(gpr1_xy1, 0.7033639, delta=1e-7) + self.assertAlmostEqual(gpr1_xy2, 0.6967954, delta=1e-7) + + def test_gnpr_distance(self): + """ + Test gnpr_distance function. + """ + + gnpr0_xy1 = gnpr_distance(self.x, self.y_1, theta=0) + gnpr0_xy2 = gnpr_distance(self.x, self.y_2, theta=0) + + gnpr1_xy1 = gnpr_distance(self.x, self.y_1, theta=1) + gnpr1_xy2 = gnpr_distance(self.x, self.y_2, theta=1) + + self.assertAlmostEqual(gnpr0_xy1, 0.58834643, delta=1e-7) + self.assertAlmostEqual(gnpr0_xy2, 0.57115983, delta=1e-7) + + self.assertAlmostEqual(gnpr1_xy1, 0.0032625, delta=1e-7) + self.assertAlmostEqual(gnpr1_xy2, 0.0023459, delta=1e-7) diff --git a/mlfinlab/tests/test_data/imbalance_sample_data_small.csv b/mlfinlab/tests/test_data/imbalance_sample_data_small.csv new file mode 100644 index 000000000..c703a1fa2 --- /dev/null +++ b/mlfinlab/tests/test_data/imbalance_sample_data_small.csv @@ -0,0 +1,6956 @@ +Date and Time,Price,Volume +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,31 +2011/07/31 22:00:00.120,1306.0,6 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,15 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,25 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,106 +2011/07/31 22:00:00.120,1306.0,8 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,73 +2011/07/31 22:00:00.120,1306.0,28 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,95 +2011/07/31 22:00:00.120,1306.0,97 +2011/07/31 22:00:00.120,1306.0,15 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,97 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,50 +2011/07/31 22:00:00.120,1306.0,25 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,26 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,36 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,15 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,30 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,30 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,8 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,6 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,25 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,6 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,88 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,10 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,15 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,25 +2011/07/31 22:00:00.120,1306.0,7 +2011/07/31 22:00:00.120,1306.0,7 +2011/07/31 22:00:00.120,1306.0,7 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,3 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,20 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,12 +2011/07/31 22:00:00.120,1306.0,6 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,23 +2011/07/31 22:00:00.120,1306.0,2 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,4 +2011/07/31 22:00:00.120,1306.0,1 +2011/07/31 22:00:00.120,1306.0,5 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,4 +2011/07/31 22:00:00.125,1306.0,2 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,10 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,10 +2011/07/31 22:00:00.125,1306.0,5 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,2 +2011/07/31 22:00:00.125,1306.0,4 +2011/07/31 22:00:00.125,1306.0,11 +2011/07/31 22:00:00.125,1306.0,7 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.125,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,15 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,8 +2011/07/31 22:00:00.164,1306.0,9 +2011/07/31 22:00:00.164,1306.0,8 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,6 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,18 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,4 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,4 +2011/07/31 22:00:00.164,1306.0,19 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,4 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,25 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,25 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,17 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,22 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,6 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,62 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,6 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,90 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,50 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,9 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,15 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,100 +2011/07/31 22:00:00.164,1306.0,25 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,10 +2011/07/31 22:00:00.164,1306.0,15 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1305.75,5 +2011/07/31 22:00:00.164,1305.75,5 +2011/07/31 22:00:00.164,1305.75,5 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1305.75,2 +2011/07/31 22:00:00.164,1305.75,2 +2011/07/31 22:00:00.164,1305.75,1 +2011/07/31 22:00:00.164,1305.75,1 +2011/07/31 22:00:00.164,1305.75,1 +2011/07/31 22:00:00.164,1305.75,2 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,5 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,16 +2011/07/31 22:00:00.164,1305.5,4 +2011/07/31 22:00:00.164,1305.5,3 +2011/07/31 22:00:00.164,1305.5,2 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.5,1 +2011/07/31 22:00:00.164,1305.25,5 +2011/07/31 22:00:00.164,1305.25,2 +2011/07/31 22:00:00.164,1305.25,2 +2011/07/31 22:00:00.164,1305.25,2 +2011/07/31 22:00:00.164,1305.25,2 +2011/07/31 22:00:00.164,1305.25,2 +2011/07/31 22:00:00.164,1305.25,1 +2011/07/31 22:00:00.164,1305.75,1 +2011/07/31 22:00:00.164,1305.75,1 +2011/07/31 22:00:00.164,1305.25,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,2 +2011/07/31 22:00:00.164,1306.0,20 +2011/07/31 22:00:00.164,1306.0,3 +2011/07/31 22:00:00.164,1306.0,1 +2011/07/31 22:00:00.164,1306.0,5 +2011/07/31 22:00:00.169,1306.0,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1306.0,2 +2011/07/31 22:00:00.169,1305.25,1 +2011/07/31 22:00:00.169,1305.25,2 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1305.5,2 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1305.5,2 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1305.5,2 +2011/07/31 22:00:00.169,1305.5,2 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1305.5,1 +2011/07/31 22:00:00.169,1306.0,1 +2011/07/31 22:00:00.204,1306.0,2 +2011/07/31 22:00:00.204,1306.0,2 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,10 +2011/07/31 22:00:00.204,1306.0,2 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,2 +2011/07/31 22:00:00.204,1306.0,10 +2011/07/31 22:00:00.204,1305.5,1 +2011/07/31 22:00:00.204,1306.0,2 +2011/07/31 22:00:00.204,1305.25,2 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,83 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1305.25,3 +2011/07/31 22:00:00.204,1305.5,1 +2011/07/31 22:00:00.204,1305.75,1 +2011/07/31 22:00:00.204,1305.75,1 +2011/07/31 22:00:00.204,1305.25,1 +2011/07/31 22:00:00.204,1305.5,9 +2011/07/31 22:00:00.204,1305.75,1 +2011/07/31 22:00:00.204,1305.75,1 +2011/07/31 22:00:00.204,1306.0,81 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1306.0,1 +2011/07/31 22:00:00.204,1305.75,1 +2011/07/31 22:00:00.210,1305.75,1 +2011/07/31 22:00:00.269,1306.0,4 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1305.75,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1305.5,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,2 +2011/07/31 22:00:00.269,1306.0,2 +2011/07/31 22:00:00.269,1306.0,2 +2011/07/31 22:00:00.269,1305.25,2 +2011/07/31 22:00:00.269,1306.0,2 +2011/07/31 22:00:00.269,1305.75,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1305.75,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1306.0,1 +2011/07/31 22:00:00.269,1305.25,2 +2011/07/31 22:00:00.306,1305.25,5 +2011/07/31 22:00:00.306,1305.25,5 +2011/07/31 22:00:00.306,1305.25,1 +2011/07/31 22:00:00.306,1305.25,2 +2011/07/31 22:00:00.373,1305.75,3 +2011/07/31 22:00:00.373,1305.25,1 +2011/07/31 22:00:00.373,1305.75,2 +2011/07/31 22:00:00.373,1305.75,3 +2011/07/31 22:00:00.373,1305.25,1 +2011/07/31 22:00:00.373,1305.25,2 +2011/07/31 22:00:00.373,1305.75,2 +2011/07/31 22:00:00.373,1305.75,1 +2011/07/31 22:00:00.416,1305.75,1 +2011/07/31 22:00:00.416,1306.0,1 +2011/07/31 22:00:00.416,1306.0,1 +2011/07/31 22:00:00.416,1306.0,1 +2011/07/31 22:00:00.416,1306.0,1 +2011/07/31 22:00:00.416,1306.0,4 +2011/07/31 22:00:00.416,1305.25,2 +2011/07/31 22:00:00.529,1306.0,1 +2011/07/31 22:00:00.569,1306.0,20 +2011/07/31 22:00:00.578,1305.25,1 +2011/07/31 22:00:00.578,1305.25,1 +2011/07/31 22:00:00.578,1305.25,1 +2011/07/31 22:00:00.578,1305.25,1 +2011/07/31 22:00:00.578,1305.25,1 +2011/07/31 22:00:00.634,1305.25,1 +2011/07/31 22:00:00.634,1305.0,1 +2011/07/31 22:00:00.634,1305.0,3 +2011/07/31 22:00:00.670,1305.5,1 +2011/07/31 22:00:00.730,1305.5,1 +2011/07/31 22:00:00.730,1305.0,30 +2011/07/31 22:00:00.730,1305.75,1 +2011/07/31 22:00:00.730,1305.75,1 +2011/07/31 22:00:00.812,1305.5,1 +2011/07/31 22:00:00.812,1305.0,4 +2011/07/31 22:00:00.817,1305.0,5 +2011/07/31 22:00:00.884,1305.75,1 +2011/07/31 22:00:00.889,1306.0,4 +2011/07/31 22:00:00.924,1306.0,2 +2011/07/31 22:00:00.940,1305.5,2 +2011/07/31 22:00:00.940,1305.5,3 +2011/07/31 22:00:00.972,1305.5,4 +2011/07/31 22:00:00.981,1305.5,3 +2011/07/31 22:00:00.981,1305.0,2 +2011/07/31 22:00:01.054,1305.5,2 +2011/07/31 22:00:01.054,1305.0,3 +2011/07/31 22:00:01.054,1305.0,3 +2011/07/31 22:00:01.054,1305.0,2 +2011/07/31 22:00:01.098,1305.75,1 +2011/07/31 22:00:01.098,1305.75,2 +2011/07/31 22:00:01.098,1306.0,23 +2011/07/31 22:00:01.103,1305.0,3 +2011/07/31 22:00:01.103,1305.0,2 +2011/07/31 22:00:01.109,1305.0,5 +2011/07/31 22:00:01.146,1305.0,3 +2011/07/31 22:00:01.168,1305.0,5 +2011/07/31 22:00:01.193,1305.0,4 +2011/07/31 22:00:01.210,1305.25,1 +2011/07/31 22:00:01.210,1305.0,4 +2011/07/31 22:00:01.210,1305.0,2 +2011/07/31 22:00:01.210,1305.0,1 +2011/07/31 22:00:01.210,1305.0,2 +2011/07/31 22:00:01.263,1305.0,5 +2011/07/31 22:00:01.263,1305.0,5 +2011/07/31 22:00:01.295,1305.0,5 +2011/07/31 22:00:01.306,1305.0,2 +2011/07/31 22:00:01.306,1305.0,1 +2011/07/31 22:00:01.306,1305.0,1 +2011/07/31 22:00:01.306,1305.0,1 +2011/07/31 22:00:01.328,1305.0,1 +2011/07/31 22:00:01.328,1305.0,1 +2011/07/31 22:00:01.328,1305.0,1 +2011/07/31 22:00:01.328,1305.0,1 +2011/07/31 22:00:01.328,1305.0,1 +2011/07/31 22:00:01.328,1305.25,1 +2011/07/31 22:00:01.353,1305.25,1 +2011/07/31 22:00:01.377,1305.0,5 +2011/07/31 22:00:01.426,1305.0,4 +2011/07/31 22:00:01.426,1305.0,1 +2011/07/31 22:00:01.426,1305.0,5 +2011/07/31 22:00:01.426,1305.0,5 +2011/07/31 22:00:01.426,1305.0,1 +2011/07/31 22:00:01.426,1305.0,1 +2011/07/31 22:00:01.426,1304.75,8 +2011/07/31 22:00:01.481,1305.0,5 +2011/07/31 22:00:01.515,1305.0,5 +2011/07/31 22:00:01.548,1305.25,1 +2011/07/31 22:00:01.731,1305.25,10 +2011/07/31 22:00:01.731,1305.25,5 +2011/07/31 22:00:01.832,1305.5,1 +2011/07/31 22:00:01.832,1305.5,1 +2011/07/31 22:00:01.842,1305.5,1 +2011/07/31 22:00:01.848,1305.5,4 +2011/07/31 22:00:01.848,1305.5,8 +2011/07/31 22:00:01.848,1305.5,2 +2011/07/31 22:00:01.848,1305.5,7 +2011/07/31 22:00:01.848,1305.5,50 +2011/07/31 22:00:01.848,1305.75,20 +2011/07/31 22:00:01.848,1305.75,1 +2011/07/31 22:00:01.848,1305.75,1 +2011/07/31 22:00:01.848,1305.75,5 +2011/07/31 22:00:01.848,1305.75,27 +2011/07/31 22:00:01.854,1305.75,3 +2011/07/31 22:00:01.881,1305.25,10 +2011/07/31 22:00:01.904,1305.25,5 +2011/07/31 22:00:01.960,1305.25,1 +2011/07/31 22:00:01.998,1305.25,5 +2011/07/31 22:00:02.040,1305.25,5 +2011/07/31 22:00:02.089,1305.25,1 +2011/07/31 22:00:02.147,1305.5,2 +2011/07/31 22:00:02.147,1305.75,18 +2011/07/31 22:00:02.262,1305.25,8 +2011/07/31 22:00:02.297,1305.25,50 +2011/07/31 22:00:02.312,1305.25,1 +2011/07/31 22:00:02.345,1305.75,12 +2011/07/31 22:00:02.345,1305.75,1 +2011/07/31 22:00:02.391,1305.75,1 +2011/07/31 22:00:02.492,1305.75,5 +2011/07/31 22:00:02.617,1305.75,5 +2011/07/31 22:00:02.629,1305.75,1 +2011/07/31 22:00:02.629,1305.75,1 +2011/07/31 22:00:02.629,1305.5,6 +2011/07/31 22:00:02.761,1305.5,1 +2011/07/31 22:00:02.761,1305.5,1 +2011/07/31 22:00:02.761,1305.5,1 +2011/07/31 22:00:02.761,1305.5,5 +2011/07/31 22:00:02.761,1305.5,5 +2011/07/31 22:00:02.761,1305.5,2 +2011/07/31 22:00:02.761,1305.5,12 +2011/07/31 22:00:02.761,1305.5,2 +2011/07/31 22:00:02.761,1305.25,71 +2011/07/31 22:00:02.848,1306.0,25 +2011/07/31 22:00:03.034,1306.0,1 +2011/07/31 22:00:03.070,1306.0,1 +2011/07/31 22:00:03.116,1305.75,1 +2011/07/31 22:00:03.116,1305.75,2 +2011/07/31 22:00:03.116,1305.75,17 +2011/07/31 22:00:03.138,1305.75,3 +2011/07/31 22:00:03.138,1305.75,2 +2011/07/31 22:00:03.215,1305.75,1 +2011/07/31 22:00:03.215,1305.75,5 +2011/07/31 22:00:03.256,1306.0,13 +2011/07/31 22:00:03.256,1306.0,1 +2011/07/31 22:00:03.256,1306.0,1 +2011/07/31 22:00:03.256,1306.0,1 +2011/07/31 22:00:03.256,1306.0,4 +2011/07/31 22:00:03.314,1305.75,4 +2011/07/31 22:00:03.314,1305.75,1 +2011/07/31 22:00:03.314,1306.0,1 +2011/07/31 22:00:03.491,1305.75,1 +2011/07/31 22:00:03.491,1305.75,1 +2011/07/31 22:00:03.649,1306.0,2 +2011/07/31 22:00:03.679,1305.75,5 +2011/07/31 22:00:03.740,1306.0,1 +2011/07/31 22:00:03.794,1305.75,1 +2011/07/31 22:00:03.802,1305.5,1 +2011/07/31 22:00:03.827,1305.75,2 +2011/07/31 22:00:03.993,1305.5,1 +2011/07/31 22:00:03.993,1305.5,1 +2011/07/31 22:00:03.993,1305.5,1 +2011/07/31 22:00:03.993,1305.5,4 +2011/07/31 22:00:03.993,1305.5,2 +2011/07/31 22:00:03.993,1305.5,2 +2011/07/31 22:00:03.993,1305.5,1 +2011/07/31 22:00:03.993,1305.5,4 +2011/07/31 22:00:03.993,1305.5,1 +2011/07/31 22:00:04.063,1305.5,3 +2011/07/31 22:00:04.207,1305.5,5 +2011/07/31 22:00:04.287,1305.75,1 +2011/07/31 22:00:04.350,1305.5,2 +2011/07/31 22:00:04.668,1305.5,18 +2011/07/31 22:00:04.668,1305.75,5 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.668,1305.75,4 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.668,1305.75,5 +2011/07/31 22:00:04.668,1305.75,2 +2011/07/31 22:00:04.668,1305.75,3 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.668,1305.75,6 +2011/07/31 22:00:04.668,1305.75,5 +2011/07/31 22:00:04.668,1305.75,10 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.668,1305.75,1 +2011/07/31 22:00:04.869,1305.75,10 +2011/07/31 22:00:04.869,1305.75,8 +2011/07/31 22:00:05.011,1305.75,1 +2011/07/31 22:00:05.064,1305.75,40 +2011/07/31 22:00:05.082,1305.75,50 +2011/07/31 22:00:05.108,1305.75,1 +2011/07/31 22:00:05.141,1305.75,8 +2011/07/31 22:00:05.233,1305.75,1 +2011/07/31 22:00:05.240,1305.75,10 +2011/07/31 22:00:05.293,1305.75,7 +2011/07/31 22:00:05.293,1305.75,1 +2011/07/31 22:00:05.293,1305.25,1 +2011/07/31 22:00:05.299,1305.25,3 +2011/07/31 22:00:05.299,1305.25,1 +2011/07/31 22:00:05.299,1305.25,1 +2011/07/31 22:00:05.299,1305.25,3 +2011/07/31 22:00:05.371,1305.75,1 +2011/07/31 22:00:05.371,1305.75,1 +2011/07/31 22:00:05.371,1306.0,2 +2011/07/31 22:00:05.371,1306.0,1 +2011/07/31 22:00:05.371,1306.0,20 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,20 +2011/07/31 22:00:05.447,1306.0,7 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,8 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,5 +2011/07/31 22:00:05.447,1306.0,20 +2011/07/31 22:00:05.447,1306.0,2 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,5 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,1 +2011/07/31 22:00:05.447,1306.0,13 +2011/07/31 22:00:05.672,1305.5,1 +2011/07/31 22:00:05.714,1305.75,2 +2011/07/31 22:00:05.727,1305.25,1 +2011/07/31 22:00:05.791,1305.25,1 +2011/07/31 22:00:05.807,1305.75,48 +2011/07/31 22:00:05.807,1305.75,1 +2011/07/31 22:00:05.807,1305.75,10 +2011/07/31 22:00:05.889,1305.75,1 +2011/07/31 22:00:05.905,1305.5,1 +2011/07/31 22:00:05.933,1305.5,1 +2011/07/31 22:00:05.933,1305.25,3 +2011/07/31 22:00:05.941,1305.25,1 +2011/07/31 22:00:05.991,1305.5,1 +2011/07/31 22:00:05.991,1305.5,4 +2011/07/31 22:00:05.997,1305.5,5 +2011/07/31 22:00:06.099,1305.5,1 +2011/07/31 22:00:06.127,1305.5,1 +2011/07/31 22:00:06.188,1305.75,5 +2011/07/31 22:00:06.188,1305.75,5 +2011/07/31 22:00:06.206,1305.75,1 +2011/07/31 22:00:06.316,1305.75,9 +2011/07/31 22:00:06.431,1305.5,1 +2011/07/31 22:00:06.489,1305.75,1 +2011/07/31 22:00:06.613,1305.75,2 +2011/07/31 22:00:06.630,1305.75,2 +2011/07/31 22:00:06.684,1305.75,1 +2011/07/31 22:00:06.751,1305.75,1 +2011/07/31 22:00:06.795,1305.75,2 +2011/07/31 22:00:06.972,1305.5,2 +2011/07/31 22:00:06.972,1305.5,1 +2011/07/31 22:00:06.987,1305.75,4 +2011/07/31 22:00:06.987,1305.75,1 +2011/07/31 22:00:07.078,1305.5,4 +2011/07/31 22:00:07.101,1305.5,10 +2011/07/31 22:00:07.101,1305.5,4 +2011/07/31 22:00:07.114,1305.5,1 +2011/07/31 22:00:07.133,1305.5,1 +2011/07/31 22:00:07.234,1305.5,1 +2011/07/31 22:00:07.315,1305.75,1 +2011/07/31 22:00:07.361,1305.5,3 +2011/07/31 22:00:07.361,1305.5,4 +2011/07/31 22:00:07.361,1305.5,7 +2011/07/31 22:00:07.361,1305.5,4 +2011/07/31 22:00:07.361,1305.25,21 +2011/07/31 22:00:07.361,1305.25,3 +2011/07/31 22:00:07.361,1305.25,1 +2011/07/31 22:00:07.361,1305.25,5 +2011/07/31 22:00:07.361,1305.25,1 +2011/07/31 22:00:07.361,1305.25,1 +2011/07/31 22:00:07.552,1305.25,10 +2011/07/31 22:00:07.552,1305.25,2 +2011/07/31 22:00:07.552,1305.25,1 +2011/07/31 22:00:07.552,1305.25,1 +2011/07/31 22:00:07.552,1305.25,5 +2011/07/31 22:00:07.552,1305.25,1 +2011/07/31 22:00:07.552,1305.25,1 +2011/07/31 22:00:07.552,1305.0,1 +2011/07/31 22:00:07.552,1305.0,1 +2011/07/31 22:00:07.552,1305.0,1 +2011/07/31 22:00:07.552,1305.0,5 +2011/07/31 22:00:07.552,1305.0,5 +2011/07/31 22:00:07.552,1305.0,5 +2011/07/31 22:00:07.552,1305.0,20 +2011/07/31 22:00:07.552,1305.0,1 +2011/07/31 22:00:07.552,1305.0,1 +2011/07/31 22:00:07.552,1304.75,39 +2011/07/31 22:00:07.552,1304.75,1 +2011/07/31 22:00:07.767,1305.25,1 +2011/07/31 22:00:07.932,1305.0,1 +2011/07/31 22:00:07.939,1305.0,1 +2011/07/31 22:00:08.050,1305.0,1 +2011/07/31 22:00:08.460,1304.75,1 +2011/07/31 22:00:08.466,1304.75,1 +2011/07/31 22:00:08.466,1304.75,1 +2011/07/31 22:00:08.466,1304.75,1 +2011/07/31 22:00:08.506,1304.75,1 +2011/07/31 22:00:08.506,1304.75,1 +2011/07/31 22:00:08.636,1304.75,3 +2011/07/31 22:00:08.636,1304.75,2 +2011/07/31 22:00:08.642,1304.75,5 +2011/07/31 22:00:08.662,1305.0,1 +2011/07/31 22:00:08.662,1304.5,1 +2011/07/31 22:00:08.662,1304.5,1 +2011/07/31 22:00:08.949,1304.75,1 +2011/07/31 22:00:08.954,1304.75,1 +2011/07/31 22:00:08.966,1304.75,1 +2011/07/31 22:00:09.145,1304.5,1 +2011/07/31 22:00:09.226,1304.75,1 +2011/07/31 22:00:09.244,1304.5,1 +2011/07/31 22:00:09.244,1304.5,1 +2011/07/31 22:00:09.270,1304.5,1 +2011/07/31 22:00:09.270,1304.5,1 +2011/07/31 22:00:09.524,1304.5,1 +2011/07/31 22:00:09.544,1304.5,1 +2011/07/31 22:00:09.544,1304.5,4 +2011/07/31 22:00:09.591,1304.75,5 +2011/07/31 22:00:09.623,1304.5,1 +2011/07/31 22:00:09.761,1304.5,2 +2011/07/31 22:00:09.772,1304.75,1 +2011/07/31 22:00:09.808,1304.5,2 +2011/07/31 22:00:09.876,1304.5,1 +2011/07/31 22:00:09.876,1304.5,2 +2011/07/31 22:00:09.876,1304.5,4 +2011/07/31 22:00:09.876,1304.5,1 +2011/07/31 22:00:09.896,1304.5,1 +2011/07/31 22:00:09.971,1304.5,3 +2011/07/31 22:00:10.007,1304.5,1 +2011/07/31 22:00:10.013,1304.5,1 +2011/07/31 22:00:10.105,1304.5,1 +2011/07/31 22:00:10.197,1304.5,1 +2011/07/31 22:00:10.296,1304.25,1 +2011/07/31 22:00:10.296,1304.25,1 +2011/07/31 22:00:10.296,1304.5,1 +2011/07/31 22:00:10.296,1304.25,1 +2011/07/31 22:00:10.316,1304.25,1 +2011/07/31 22:00:10.488,1304.25,1 +2011/07/31 22:00:10.576,1304.25,1 +2011/07/31 22:00:10.588,1304.5,1 +2011/07/31 22:00:10.595,1304.5,4 +2011/07/31 22:00:10.611,1304.5,5 +2011/07/31 22:00:10.661,1304.5,1 +2011/07/31 22:00:10.738,1304.25,1 +2011/07/31 22:00:10.757,1304.5,1 +2011/07/31 22:00:10.763,1304.25,10 +2011/07/31 22:00:10.789,1304.25,3 +2011/07/31 22:00:10.789,1304.25,2 +2011/07/31 22:00:10.862,1304.5,1 +2011/07/31 22:00:10.904,1304.5,4 +2011/07/31 22:00:10.999,1304.25,20 +2011/07/31 22:00:11.217,1304.25,50 +2011/07/31 22:00:11.217,1304.5,1 +2011/07/31 22:00:11.225,1304.5,2 +2011/07/31 22:00:11.235,1304.25,5 +2011/07/31 22:00:11.262,1304.25,5 +2011/07/31 22:00:11.310,1304.25,1 +2011/07/31 22:00:11.360,1304.25,1 +2011/07/31 22:00:11.483,1304.5,2 +2011/07/31 22:00:11.555,1304.25,1 +2011/07/31 22:00:11.743,1304.25,12 +2011/07/31 22:00:11.743,1304.25,25 +2011/07/31 22:00:11.756,1304.25,4 +2011/07/31 22:00:11.823,1304.5,1 +2011/07/31 22:00:11.848,1304.25,20 +2011/07/31 22:00:11.853,1304.25,3 +2011/07/31 22:00:11.853,1304.25,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,2 +2011/07/31 22:00:11.920,1304.5,20 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,10 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,2 +2011/07/31 22:00:11.920,1304.5,5 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,2 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,1 +2011/07/31 22:00:11.920,1304.5,3 +2011/07/31 22:00:11.940,1304.25,10 +2011/07/31 22:00:11.977,1304.25,5 +2011/07/31 22:00:11.995,1304.5,2 +2011/07/31 22:00:11.995,1304.25,5 +2011/07/31 22:00:12.051,1304.25,1 +2011/07/31 22:00:12.076,1304.5,1 +2011/07/31 22:00:12.152,1304.5,1 +2011/07/31 22:00:12.175,1304.25,5 +2011/07/31 22:00:12.206,1304.25,25 +2011/07/31 22:00:12.219,1304.25,5 +2011/07/31 22:00:12.262,1304.25,5 +2011/07/31 22:00:12.282,1304.25,1 +2011/07/31 22:00:12.325,1304.5,1 +2011/07/31 22:00:12.325,1304.25,5 +2011/07/31 22:00:12.334,1304.25,1 +2011/07/31 22:00:12.470,1304.5,1 +2011/07/31 22:00:12.521,1304.25,20 +2011/07/31 22:00:12.521,1304.25,1 +2011/07/31 22:00:12.521,1304.5,1 +2011/07/31 22:00:12.677,1304.5,1 +2011/07/31 22:00:12.696,1304.5,1 +2011/07/31 22:00:12.696,1304.5,1 +2011/07/31 22:00:12.696,1304.25,18 +2011/07/31 22:00:12.780,1304.75,1 +2011/07/31 22:00:12.846,1304.5,1 +2011/07/31 22:00:12.852,1304.25,1 +2011/07/31 22:00:12.898,1304.5,4 +2011/07/31 22:00:12.936,1304.75,1 +2011/07/31 22:00:12.936,1304.75,2 +2011/07/31 22:00:12.948,1304.5,1 +2011/07/31 22:00:12.975,1304.5,1 +2011/07/31 22:00:13.012,1304.5,1 +2011/07/31 22:00:13.056,1304.5,1 +2011/07/31 22:00:13.071,1304.75,3 +2011/07/31 22:00:13.111,1304.25,35 +2011/07/31 22:00:13.157,1304.25,5 +2011/07/31 22:00:13.216,1304.25,1 +2011/07/31 22:00:13.303,1304.5,1 +2011/07/31 22:00:13.309,1304.75,1 +2011/07/31 22:00:13.309,1304.75,1 +2011/07/31 22:00:13.309,1304.75,1 +2011/07/31 22:00:13.309,1304.75,2 +2011/07/31 22:00:13.595,1304.75,1 +2011/07/31 22:00:13.602,1304.5,1 +2011/07/31 22:00:13.796,1304.75,5 +2011/07/31 22:00:13.858,1304.5,1 +2011/07/31 22:00:14.087,1304.75,1 +2011/07/31 22:00:14.325,1304.75,1 +2011/07/31 22:00:14.325,1304.75,4 +2011/07/31 22:00:14.325,1305.0,16 +2011/07/31 22:00:14.325,1305.0,8 +2011/07/31 22:00:14.415,1304.5,3 +2011/07/31 22:00:14.415,1304.5,1 +2011/07/31 22:00:14.415,1304.5,1 +2011/07/31 22:00:14.415,1304.5,3 +2011/07/31 22:00:14.415,1304.5,3 +2011/07/31 22:00:14.462,1304.5,1 +2011/07/31 22:00:14.652,1305.0,1 +2011/07/31 22:00:14.749,1304.75,1 +2011/07/31 22:00:14.749,1304.75,1 +2011/07/31 22:00:14.786,1304.5,21 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,7 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,5 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,1 +2011/07/31 22:00:14.786,1304.5,11 +2011/07/31 22:00:14.786,1304.75,1 +2011/07/31 22:00:14.880,1304.75,1 +2011/07/31 22:00:15.004,1304.75,1 +2011/07/31 22:00:15.004,1304.75,1 +2011/07/31 22:00:15.004,1304.75,18 +2011/07/31 22:00:15.102,1304.75,2 +2011/07/31 22:00:15.102,1304.75,2 +2011/07/31 22:00:15.169,1305.0,6 +2011/07/31 22:00:15.176,1304.75,1 +2011/07/31 22:00:15.352,1305.0,1 +2011/07/31 22:00:15.449,1304.75,4 +2011/07/31 22:00:15.492,1304.75,1 +2011/07/31 22:00:15.508,1304.75,1 +2011/07/31 22:00:15.508,1304.75,1 +2011/07/31 22:00:15.514,1304.75,1 +2011/07/31 22:00:15.892,1305.0,4 +2011/07/31 22:00:15.892,1305.0,20 +2011/07/31 22:00:15.892,1305.0,10 +2011/07/31 22:00:15.892,1305.0,6 +2011/07/31 22:00:16.033,1305.0,2 +2011/07/31 22:00:16.033,1305.0,1 +2011/07/31 22:00:16.033,1305.0,5 +2011/07/31 22:00:16.137,1304.75,5 +2011/07/31 22:00:16.351,1304.75,1 +2011/07/31 22:00:16.351,1304.75,1 +2011/07/31 22:00:16.351,1304.75,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,1 +2011/07/31 22:00:16.351,1305.0,3 +2011/07/31 22:00:16.358,1305.0,1 +2011/07/31 22:00:16.376,1305.0,5 +2011/07/31 22:00:16.376,1305.0,1 +2011/07/31 22:00:16.376,1305.0,1 +2011/07/31 22:00:16.376,1305.0,1 +2011/07/31 22:00:16.383,1305.0,1 +2011/07/31 22:00:16.757,1305.25,1 +2011/07/31 22:00:16.757,1305.25,4 +2011/07/31 22:00:16.763,1305.0,10 +2011/07/31 22:00:16.850,1305.25,5 +2011/07/31 22:00:16.931,1305.0,2 +2011/07/31 22:00:17.026,1305.25,1 +2011/07/31 22:00:17.142,1305.25,1 +2011/07/31 22:00:17.308,1305.25,1 +2011/07/31 22:00:17.724,1305.25,1 +2011/07/31 22:00:17.811,1305.25,12 +2011/07/31 22:00:17.811,1305.25,1 +2011/07/31 22:00:17.811,1305.25,7 +2011/07/31 22:00:17.969,1305.25,1 +2011/07/31 22:00:18.251,1305.0,1 +2011/07/31 22:00:18.701,1305.0,1 +2011/07/31 22:00:18.728,1305.0,3 +2011/07/31 22:00:18.728,1305.0,1 +2011/07/31 22:00:18.728,1305.0,5 +2011/07/31 22:00:18.728,1305.0,25 +2011/07/31 22:00:18.728,1305.0,1 +2011/07/31 22:00:18.728,1305.0,3 +2011/07/31 22:00:18.728,1305.0,1 +2011/07/31 22:00:18.728,1305.0,1 +2011/07/31 22:00:18.728,1305.0,5 +2011/07/31 22:00:18.728,1305.0,2 +2011/07/31 22:00:18.728,1304.75,3 +2011/07/31 22:00:18.728,1304.75,5 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,3 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,10 +2011/07/31 22:00:18.728,1304.75,3 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.728,1304.75,1 +2011/07/31 22:00:18.991,1305.0,1 +2011/07/31 22:00:19.066,1305.0,4 +2011/07/31 22:00:19.194,1305.0,1 +2011/07/31 22:00:19.314,1304.75,1 +2011/07/31 22:00:19.421,1304.5,1 +2011/07/31 22:00:19.603,1304.5,1 +2011/07/31 22:00:19.696,1305.0,5 +2011/07/31 22:00:19.830,1304.75,1 +2011/07/31 22:00:19.856,1304.5,10 +2011/07/31 22:00:20.140,1304.5,1 +2011/07/31 22:00:20.499,1304.75,1 +2011/07/31 22:00:20.730,1304.5,2 +2011/07/31 22:00:20.872,1304.5,50 +2011/07/31 22:00:21.079,1304.5,174 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.079,1304.5,1 +2011/07/31 22:00:21.084,1304.5,8 +2011/07/31 22:00:21.225,1304.25,1 +2011/07/31 22:00:21.225,1304.25,1 +2011/07/31 22:00:21.225,1304.25,1 +2011/07/31 22:00:21.225,1304.25,1 +2011/07/31 22:00:21.225,1304.25,2 +2011/07/31 22:00:21.225,1304.25,1 +2011/07/31 22:00:21.225,1304.25,8 +2011/07/31 22:00:21.263,1304.5,1 +2011/07/31 22:00:21.388,1304.5,1 +2011/07/31 22:00:21.425,1304.5,1 +2011/07/31 22:00:21.485,1304.5,1 +2011/07/31 22:00:21.643,1304.25,3 +2011/07/31 22:00:21.680,1304.25,1 +2011/07/31 22:00:21.686,1304.25,8 +2011/07/31 22:00:21.686,1304.25,7 +2011/07/31 22:00:21.686,1304.25,5 +2011/07/31 22:00:21.770,1304.25,1 +2011/07/31 22:00:21.770,1304.25,1 +2011/07/31 22:00:21.770,1304.25,1 +2011/07/31 22:00:21.770,1304.25,1 +2011/07/31 22:00:21.770,1304.25,1 +2011/07/31 22:00:21.770,1304.25,5 +2011/07/31 22:00:21.778,1304.25,10 +2011/07/31 22:00:21.798,1304.5,1 +2011/07/31 22:00:21.879,1304.25,5 +2011/07/31 22:00:21.888,1304.25,5 +2011/07/31 22:00:21.957,1304.5,1 +2011/07/31 22:00:21.995,1304.25,2 +2011/07/31 22:00:22.004,1304.25,4 +2011/07/31 22:00:22.021,1304.25,1 +2011/07/31 22:00:22.045,1304.25,1 +2011/07/31 22:00:22.102,1304.5,2 +2011/07/31 22:00:22.120,1304.25,1 +2011/07/31 22:00:22.125,1304.5,1 +2011/07/31 22:00:22.171,1304.25,3 +2011/07/31 22:00:22.171,1304.25,2 +2011/07/31 22:00:22.185,1304.25,5 +2011/07/31 22:00:22.185,1304.25,10 +2011/07/31 22:00:22.349,1304.25,4 +2011/07/31 22:00:22.354,1304.25,2 +2011/07/31 22:00:22.354,1304.25,1 +2011/07/31 22:00:22.354,1304.25,1 +2011/07/31 22:00:22.354,1304.25,1 +2011/07/31 22:00:22.440,1304.25,10 +2011/07/31 22:00:22.440,1304.5,2 +2011/07/31 22:00:22.440,1304.5,5 +2011/07/31 22:00:22.440,1304.5,3 +2011/07/31 22:00:22.440,1304.5,2 +2011/07/31 22:00:22.440,1304.5,10 +2011/07/31 22:00:22.440,1304.5,1 +2011/07/31 22:00:22.440,1304.5,5 +2011/07/31 22:00:22.440,1304.5,1 +2011/07/31 22:00:22.440,1304.75,2 +2011/07/31 22:00:22.440,1304.75,5 +2011/07/31 22:00:22.440,1304.75,4 +2011/07/31 22:00:22.440,1304.75,4 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,3 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1304.75,2 +2011/07/31 22:00:22.440,1304.75,4 +2011/07/31 22:00:22.440,1304.75,1 +2011/07/31 22:00:22.440,1305.0,3 +2011/07/31 22:00:22.440,1305.0,1 +2011/07/31 22:00:22.440,1305.0,1 +2011/07/31 22:00:22.440,1305.0,4 +2011/07/31 22:00:22.440,1305.0,2 +2011/07/31 22:00:22.440,1305.0,1 +2011/07/31 22:00:22.440,1305.0,1 +2011/07/31 22:00:22.440,1305.0,4 +2011/07/31 22:00:22.440,1305.0,1 +2011/07/31 22:00:22.440,1305.0,4 +2011/07/31 22:00:22.440,1305.0,3 +2011/07/31 22:00:22.440,1305.25,2 +2011/07/31 22:00:22.440,1305.25,2 +2011/07/31 22:00:22.440,1305.25,1 +2011/07/31 22:00:22.440,1305.25,1 +2011/07/31 22:00:22.445,1305.25,1 +2011/07/31 22:00:22.451,1305.25,1 +2011/07/31 22:00:22.451,1305.25,4 +2011/07/31 22:00:22.451,1305.25,1 +2011/07/31 22:00:22.471,1305.25,3 +2011/07/31 22:00:22.476,1305.25,2 +2011/07/31 22:00:22.494,1305.25,1 +2011/07/31 22:00:22.499,1305.25,3 +2011/07/31 22:00:22.499,1304.25,1 +2011/07/31 22:00:22.506,1304.25,1 +2011/07/31 22:00:22.512,1304.25,1 +2011/07/31 22:00:22.518,1304.25,1 +2011/07/31 22:00:22.556,1304.25,1 +2011/07/31 22:00:22.573,1304.25,1 +2011/07/31 22:00:22.761,1304.0,1 +2011/07/31 22:00:22.837,1304.25,1 +2011/07/31 22:00:22.935,1304.0,1 +2011/07/31 22:00:23.046,1304.25,10 +2011/07/31 22:00:23.078,1304.25,10 +2011/07/31 22:00:23.249,1304.25,5 +2011/07/31 22:00:23.366,1304.0,15 +2011/07/31 22:00:23.414,1304.25,20 +2011/07/31 22:00:23.522,1304.0,60 +2011/07/31 22:00:23.861,1304.25,10 +2011/07/31 22:00:23.894,1304.0,6 +2011/07/31 22:00:24.114,1304.25,2 +2011/07/31 22:00:24.114,1304.25,1 +2011/07/31 22:00:24.114,1304.25,1 +2011/07/31 22:00:24.114,1304.25,1 +2011/07/31 22:00:24.121,1304.25,5 +2011/07/31 22:00:24.277,1304.25,1 +2011/07/31 22:00:24.375,1304.25,2 +2011/07/31 22:00:24.392,1304.0,15 +2011/07/31 22:00:24.439,1304.0,4 +2011/07/31 22:00:24.581,1304.25,4 +2011/07/31 22:00:24.655,1304.25,2 +2011/07/31 22:00:24.787,1304.25,1 +2011/07/31 22:00:24.799,1304.25,2 +2011/07/31 22:00:24.822,1304.25,1 +2011/07/31 22:00:24.958,1304.0,1 +2011/07/31 22:00:25.241,1304.25,1 +2011/07/31 22:00:25.361,1304.0,1 +2011/07/31 22:00:25.437,1304.0,1 +2011/07/31 22:00:25.437,1304.0,1 +2011/07/31 22:00:25.437,1304.25,1 +2011/07/31 22:00:25.540,1304.25,1 +2011/07/31 22:00:25.778,1304.0,25 +2011/07/31 22:00:26.103,1304.25,2 +2011/07/31 22:00:26.200,1304.25,4 +2011/07/31 22:00:26.200,1304.25,1 +2011/07/31 22:00:26.239,1304.0,1 +2011/07/31 22:00:26.253,1304.0,1 +2011/07/31 22:00:26.365,1304.0,5 +2011/07/31 22:00:26.559,1304.0,1 +2011/07/31 22:00:26.600,1304.0,25 +2011/07/31 22:00:26.605,1304.0,19 +2011/07/31 22:00:26.668,1304.0,1 +2011/07/31 22:00:26.668,1304.25,1 +2011/07/31 22:00:26.833,1304.0,15 +2011/07/31 22:00:26.845,1304.0,2 +2011/07/31 22:00:26.868,1304.0,1 +2011/07/31 22:00:27.055,1304.0,40 +2011/07/31 22:00:27.172,1304.25,3 +2011/07/31 22:00:27.205,1304.25,1 +2011/07/31 22:00:27.247,1304.0,1 +2011/07/31 22:00:27.385,1304.25,1 +2011/07/31 22:00:27.456,1304.0,98 +2011/07/31 22:00:27.493,1304.25,1 +2011/07/31 22:00:27.553,1304.25,2 +2011/07/31 22:00:27.818,1304.25,1 +2011/07/31 22:00:27.987,1304.25,1 +2011/07/31 22:00:28.090,1304.0,1 +2011/07/31 22:00:28.119,1304.0,1 +2011/07/31 22:00:28.189,1304.25,2 +2011/07/31 22:00:28.286,1304.0,10 +2011/07/31 22:00:28.323,1304.25,1 +2011/07/31 22:00:28.628,1304.0,1 +2011/07/31 22:00:28.679,1304.0,5 +2011/07/31 22:00:28.882,1304.25,1 +2011/07/31 22:00:28.934,1304.25,1 +2011/07/31 22:00:28.974,1304.0,1 +2011/07/31 22:00:29.072,1304.25,1 +2011/07/31 22:00:29.093,1304.25,1 +2011/07/31 22:00:29.131,1304.0,15 +2011/07/31 22:00:29.242,1304.0,10 +2011/07/31 22:00:29.574,1304.25,1 +2011/07/31 22:00:29.613,1304.0,2 +2011/07/31 22:00:29.646,1304.0,7 +2011/07/31 22:00:29.664,1304.25,1 +2011/07/31 22:00:29.696,1304.0,4 +2011/07/31 22:00:29.696,1304.0,2 +2011/07/31 22:00:29.696,1304.0,2 +2011/07/31 22:00:29.749,1304.0,8 +2011/07/31 22:00:29.749,1304.0,15 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,25 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,10 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,8 +2011/07/31 22:00:29.749,1304.0,2 +2011/07/31 22:00:29.749,1304.0,2 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,2 +2011/07/31 22:00:29.749,1304.0,4 +2011/07/31 22:00:29.749,1304.0,25 +2011/07/31 22:00:29.749,1304.0,1 +2011/07/31 22:00:29.749,1304.0,2 +2011/07/31 22:00:29.819,1304.0,7 +2011/07/31 22:00:29.819,1304.0,5 +2011/07/31 22:00:29.830,1304.0,1 +2011/07/31 22:00:29.918,1304.25,1 +2011/07/31 22:00:30.069,1304.0,3 +2011/07/31 22:00:30.078,1304.0,1 +2011/07/31 22:00:30.086,1304.0,1 +2011/07/31 22:00:30.101,1304.0,4 +2011/07/31 22:00:30.151,1304.0,6 +2011/07/31 22:00:30.151,1304.0,1 +2011/07/31 22:00:30.151,1304.0,1 +2011/07/31 22:00:30.151,1304.0,5 +2011/07/31 22:00:30.151,1304.0,1 +2011/07/31 22:00:30.151,1304.0,1 +2011/07/31 22:00:30.151,1304.0,5 +2011/07/31 22:00:30.162,1304.0,5 +2011/07/31 22:00:30.162,1304.0,1 +2011/07/31 22:00:30.162,1304.0,1 +2011/07/31 22:00:30.203,1303.75,2 +2011/07/31 22:00:30.203,1303.75,1 +2011/07/31 22:00:30.245,1304.0,2 +2011/07/31 22:00:30.294,1303.75,1 +2011/07/31 22:00:30.382,1304.0,5 +2011/07/31 22:00:30.462,1303.75,1 +2011/07/31 22:00:30.462,1303.75,5 +2011/07/31 22:00:30.462,1303.75,1 +2011/07/31 22:00:30.462,1303.75,4 +2011/07/31 22:00:30.468,1303.75,1 +2011/07/31 22:00:30.509,1303.5,1 +2011/07/31 22:00:30.509,1303.5,1 +2011/07/31 22:00:30.509,1303.5,1 +2011/07/31 22:00:30.509,1303.5,1 +2011/07/31 22:00:30.509,1303.5,20 +2011/07/31 22:00:30.509,1303.5,2 +2011/07/31 22:00:30.562,1303.75,8 +2011/07/31 22:00:30.638,1303.5,3 +2011/07/31 22:00:30.766,1303.5,2 +2011/07/31 22:00:30.794,1303.75,1 +2011/07/31 22:00:30.794,1303.75,1 +2011/07/31 22:00:30.794,1303.75,3 +2011/07/31 22:00:30.794,1303.75,25 +2011/07/31 22:00:30.794,1303.75,5 +2011/07/31 22:00:30.794,1303.75,1 +2011/07/31 22:00:30.794,1303.75,1 +2011/07/31 22:00:30.794,1303.75,1 +2011/07/31 22:00:30.794,1304.0,93 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,3 +2011/07/31 22:00:30.794,1304.0,3 +2011/07/31 22:00:30.794,1304.0,2 +2011/07/31 22:00:30.794,1304.0,2 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,5 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,2 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,5 +2011/07/31 22:00:30.794,1304.0,1 +2011/07/31 22:00:30.794,1304.0,4 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,3 +2011/07/31 22:00:30.794,1304.25,2 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,2 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,1 +2011/07/31 22:00:30.794,1304.25,4 +2011/07/31 22:00:30.794,1304.5,19 +2011/07/31 22:00:30.924,1304.25,1 +2011/07/31 22:00:30.943,1304.25,1 +2011/07/31 22:00:31.049,1304.25,3 +2011/07/31 22:00:31.049,1304.0,1 +2011/07/31 22:00:31.049,1304.0,1 +2011/07/31 22:00:31.049,1303.75,5 +2011/07/31 22:00:31.060,1304.0,3 +2011/07/31 22:00:31.153,1304.0,1 +2011/07/31 22:00:31.153,1304.5,1 +2011/07/31 22:00:31.153,1304.5,1 +2011/07/31 22:00:31.153,1304.5,17 +2011/07/31 22:00:31.224,1303.75,1 +2011/07/31 22:00:31.224,1303.75,3 +2011/07/31 22:00:31.263,1303.75,1 +2011/07/31 22:00:31.466,1303.75,3 +2011/07/31 22:00:31.568,1304.0,1 +2011/07/31 22:00:31.665,1304.0,1 +2011/07/31 22:00:31.752,1304.0,2 +2011/07/31 22:00:32.001,1304.0,1 +2011/07/31 22:00:32.101,1304.0,1 +2011/07/31 22:00:32.108,1304.0,1 +2011/07/31 22:00:32.175,1304.0,18 +2011/07/31 22:00:32.175,1304.0,3 +2011/07/31 22:00:32.175,1304.0,1 +2011/07/31 22:00:32.175,1304.0,1 +2011/07/31 22:00:32.175,1304.0,7 +2011/07/31 22:00:32.175,1304.0,1 +2011/07/31 22:00:32.175,1304.0,6 +2011/07/31 22:00:32.199,1304.25,2 +2011/07/31 22:00:32.199,1304.25,5 +2011/07/31 22:00:32.199,1304.25,1 +2011/07/31 22:00:32.199,1304.25,1 +2011/07/31 22:00:32.199,1304.25,1 +2011/07/31 22:00:32.199,1304.25,3 +2011/07/31 22:00:32.205,1304.25,5 +2011/07/31 22:00:32.627,1304.5,2 +2011/07/31 22:00:32.649,1304.25,2 +2011/07/31 22:00:32.649,1304.25,1 +2011/07/31 22:00:32.649,1304.25,1 +2011/07/31 22:00:32.680,1304.0,10 +2011/07/31 22:00:32.771,1304.25,196 +2011/07/31 22:00:32.771,1304.25,1 +2011/07/31 22:00:32.771,1304.25,3 +2011/07/31 22:00:33.252,1304.25,1 +2011/07/31 22:00:33.252,1304.25,2 +2011/07/31 22:00:33.500,1304.25,1 +2011/07/31 22:00:33.665,1304.25,1 +2011/07/31 22:00:33.665,1304.25,1 +2011/07/31 22:00:33.665,1304.25,2 +2011/07/31 22:00:33.665,1304.25,1 +2011/07/31 22:00:33.665,1304.25,2 +2011/07/31 22:00:33.665,1304.25,15 +2011/07/31 22:00:33.665,1304.25,1 +2011/07/31 22:00:33.665,1304.25,2 +2011/07/31 22:00:33.665,1304.25,1 +2011/07/31 22:00:33.703,1304.5,4 +2011/07/31 22:00:33.916,1304.5,10 +2011/07/31 22:00:34.023,1304.25,2 +2011/07/31 22:00:34.023,1304.25,1 +2011/07/31 22:00:34.023,1304.25,1 +2011/07/31 22:00:34.023,1304.25,10 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,4 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,3 +2011/07/31 22:00:34.023,1304.0,7 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.023,1304.0,10 +2011/07/31 22:00:34.023,1304.0,8 +2011/07/31 22:00:34.023,1304.0,1 +2011/07/31 22:00:34.044,1304.25,1 +2011/07/31 22:00:35.527,1304.25,4 +2011/07/31 22:00:35.527,1304.25,4 +2011/07/31 22:00:35.527,1304.25,1 +2011/07/31 22:00:35.527,1304.25,1 +2011/07/31 22:00:35.555,1304.25,1 +2011/07/31 22:00:36.227,1304.25,1 +2011/07/31 22:00:36.363,1304.25,9 +2011/07/31 22:00:36.363,1304.25,2 +2011/07/31 22:00:36.363,1304.25,1 +2011/07/31 22:00:36.464,1304.25,1 +2011/07/31 22:00:36.797,1304.25,5 +2011/07/31 22:00:36.803,1304.25,1 +2011/07/31 22:00:36.803,1304.25,1 +2011/07/31 22:00:36.803,1304.25,2 +2011/07/31 22:00:36.819,1304.25,2 +2011/07/31 22:00:37.463,1304.0,1 +2011/07/31 22:00:37.463,1304.0,1 +2011/07/31 22:00:37.463,1304.0,4 +2011/07/31 22:00:37.463,1304.0,2 +2011/07/31 22:00:37.463,1304.0,2 +2011/07/31 22:00:37.463,1304.0,5 +2011/07/31 22:00:37.463,1304.0,1 +2011/07/31 22:00:37.642,1304.0,1 +2011/07/31 22:00:37.642,1304.0,1 +2011/07/31 22:00:37.642,1303.75,3 +2011/07/31 22:00:38.065,1303.75,4 +2011/07/31 22:00:38.124,1303.75,2 +2011/07/31 22:00:38.321,1304.0,4 +2011/07/31 22:00:38.587,1303.75,1 +2011/07/31 22:00:38.587,1303.75,1 +2011/07/31 22:00:38.587,1303.75,10 +2011/07/31 22:00:38.587,1303.75,2 +2011/07/31 22:00:38.587,1303.75,1 +2011/07/31 22:00:38.587,1303.75,4 +2011/07/31 22:00:38.587,1303.75,3 +2011/07/31 22:00:38.587,1303.75,3 +2011/07/31 22:00:39.063,1304.0,1 +2011/07/31 22:00:39.074,1303.75,2 +2011/07/31 22:00:39.143,1303.75,1 +2011/07/31 22:00:39.143,1303.75,1 +2011/07/31 22:00:39.143,1303.75,15 +2011/07/31 22:00:39.143,1303.75,1 +2011/07/31 22:00:39.143,1303.75,4 +2011/07/31 22:00:39.148,1303.75,1 +2011/07/31 22:00:39.663,1303.75,1 +2011/07/31 22:00:39.663,1303.75,1 +2011/07/31 22:00:39.747,1303.75,1 +2011/07/31 22:00:40.044,1303.75,5 +2011/07/31 22:00:40.404,1303.75,2 +2011/07/31 22:00:40.411,1303.75,1 +2011/07/31 22:00:40.411,1303.75,2 +2011/07/31 22:00:40.419,1303.75,2 +2011/07/31 22:00:40.491,1303.5,1 +2011/07/31 22:00:40.570,1303.5,2 +2011/07/31 22:00:40.823,1303.75,5 +2011/07/31 22:00:40.823,1303.75,1 +2011/07/31 22:00:40.823,1303.75,1 +2011/07/31 22:00:40.823,1303.75,3 +2011/07/31 22:00:41.052,1303.5,1 +2011/07/31 22:00:41.052,1303.5,9 +2011/07/31 22:00:41.052,1303.5,1 +2011/07/31 22:00:41.052,1303.5,1 +2011/07/31 22:00:41.052,1303.5,10 +2011/07/31 22:00:41.052,1303.5,10 +2011/07/31 22:00:41.052,1303.5,3 +2011/07/31 22:00:41.052,1303.5,1 +2011/07/31 22:00:41.052,1303.5,59 +2011/07/31 22:00:41.511,1303.5,1 +2011/07/31 22:00:41.865,1303.5,1 +2011/07/31 22:00:41.865,1303.75,2 +2011/07/31 22:00:41.984,1303.5,2 +2011/07/31 22:00:42.038,1303.5,5 +2011/07/31 22:00:42.038,1303.5,1 +2011/07/31 22:00:42.038,1303.5,4 +2011/07/31 22:00:42.059,1303.5,3 +2011/07/31 22:00:42.148,1303.5,1 +2011/07/31 22:00:42.380,1303.5,1 +2011/07/31 22:00:42.550,1303.5,2 +2011/07/31 22:00:42.578,1303.5,1 +2011/07/31 22:00:42.673,1303.5,1 +2011/07/31 22:00:42.673,1303.5,1 +2011/07/31 22:00:42.697,1303.5,1 +2011/07/31 22:00:42.919,1303.5,10 +2011/07/31 22:00:43.077,1303.75,35 +2011/07/31 22:00:43.077,1303.75,1 +2011/07/31 22:00:43.077,1303.75,4 +2011/07/31 22:00:43.077,1303.75,4 +2011/07/31 22:00:43.077,1303.75,3 +2011/07/31 22:00:43.077,1303.75,10 +2011/07/31 22:00:43.077,1303.75,4 +2011/07/31 22:00:43.077,1303.75,3 +2011/07/31 22:00:43.077,1303.75,4 +2011/07/31 22:00:43.077,1303.75,4 +2011/07/31 22:00:43.077,1303.75,50 +2011/07/31 22:00:43.077,1304.0,2 +2011/07/31 22:00:43.077,1304.0,10 +2011/07/31 22:00:43.077,1304.0,4 +2011/07/31 22:00:43.077,1304.0,1 +2011/07/31 22:00:43.077,1304.0,5 +2011/07/31 22:00:43.077,1304.0,4 +2011/07/31 22:00:43.077,1304.0,1 +2011/07/31 22:00:43.077,1304.0,1 +2011/07/31 22:00:43.077,1304.0,1 +2011/07/31 22:00:43.172,1303.5,30 +2011/07/31 22:00:43.172,1303.5,1 +2011/07/31 22:00:43.172,1303.5,5 +2011/07/31 22:00:43.172,1303.5,3 +2011/07/31 22:00:43.172,1303.5,5 +2011/07/31 22:00:43.172,1303.5,5 +2011/07/31 22:00:43.172,1303.5,1 +2011/07/31 22:00:43.178,1303.5,2 +2011/07/31 22:00:43.363,1303.5,2 +2011/07/31 22:00:43.523,1303.5,1 +2011/07/31 22:00:43.528,1303.5,1 +2011/07/31 22:00:43.804,1303.5,1 +2011/07/31 22:00:43.965,1303.5,1 +2011/07/31 22:00:44.348,1303.5,1 +2011/07/31 22:00:44.379,1303.5,1 +2011/07/31 22:00:44.470,1303.5,2 +2011/07/31 22:00:44.977,1303.5,3 +2011/07/31 22:00:44.977,1303.5,1 +2011/07/31 22:00:44.977,1303.5,1 +2011/07/31 22:00:45.447,1303.5,2 +2011/07/31 22:00:45.553,1303.25,1 +2011/07/31 22:00:45.553,1303.25,1 +2011/07/31 22:00:45.553,1303.25,1 +2011/07/31 22:00:45.553,1303.25,2 +2011/07/31 22:00:45.599,1303.25,1 +2011/07/31 22:00:45.605,1303.25,9 +2011/07/31 22:00:45.611,1303.25,3 +2011/07/31 22:00:46.061,1303.25,5 +2011/07/31 22:00:46.520,1303.25,1 +2011/07/31 22:00:46.629,1303.25,1 +2011/07/31 22:00:46.719,1303.5,4 +2011/07/31 22:00:46.719,1303.5,4 +2011/07/31 22:00:46.719,1303.5,1 +2011/07/31 22:00:46.719,1303.5,1 +2011/07/31 22:00:46.719,1303.5,5 +2011/07/31 22:00:46.719,1303.5,1 +2011/07/31 22:00:46.719,1303.5,41 +2011/07/31 22:00:46.832,1303.25,3 +2011/07/31 22:00:46.832,1303.25,1 +2011/07/31 22:00:46.832,1303.25,1 +2011/07/31 22:00:46.928,1303.25,4 +2011/07/31 22:00:46.928,1303.25,1 +2011/07/31 22:00:46.928,1303.25,5 +2011/07/31 22:00:46.928,1303.25,1 +2011/07/31 22:00:46.928,1303.25,1 +2011/07/31 22:00:46.928,1303.25,5 +2011/07/31 22:00:46.928,1303.25,1 +2011/07/31 22:00:46.928,1303.25,2 +2011/07/31 22:00:46.928,1303.25,1 +2011/07/31 22:00:47.261,1303.0,1 +2011/07/31 22:00:47.261,1303.0,1 +2011/07/31 22:00:47.261,1303.0,1 +2011/07/31 22:00:47.261,1303.0,1 +2011/07/31 22:00:47.755,1303.25,1 +2011/07/31 22:00:48.004,1303.25,19 +2011/07/31 22:00:48.004,1303.25,3 +2011/07/31 22:00:48.004,1303.25,1 +2011/07/31 22:00:48.011,1303.25,1 +2011/07/31 22:00:48.011,1303.25,4 +2011/07/31 22:00:48.011,1303.25,1 +2011/07/31 22:00:48.189,1303.25,1 +2011/07/31 22:00:48.341,1303.25,19 +2011/07/31 22:00:48.341,1303.25,1 +2011/07/31 22:00:48.341,1303.25,3 +2011/07/31 22:00:48.341,1303.25,2 +2011/07/31 22:00:48.341,1303.25,1 +2011/07/31 22:00:48.341,1303.0,2 +2011/07/31 22:00:48.341,1303.0,2 +2011/07/31 22:00:48.341,1303.0,1 +2011/07/31 22:00:48.341,1303.0,1 +2011/07/31 22:00:48.341,1303.0,1 +2011/07/31 22:00:48.341,1303.0,8 +2011/07/31 22:00:48.341,1303.0,3 +2011/07/31 22:00:48.341,1303.0,2 +2011/07/31 22:00:48.341,1303.0,4 +2011/07/31 22:00:48.352,1303.25,1 +2011/07/31 22:00:48.358,1303.25,1 +2011/07/31 22:00:48.358,1303.5,1 +2011/07/31 22:00:48.586,1303.25,1 +2011/07/31 22:00:48.769,1303.25,2 +2011/07/31 22:00:49.003,1303.5,1 +2011/07/31 22:00:49.182,1303.5,1 +2011/07/31 22:00:49.403,1303.5,6 +2011/07/31 22:00:49.403,1303.5,3 +2011/07/31 22:00:49.403,1303.5,3 +2011/07/31 22:00:49.403,1303.5,3 +2011/07/31 22:00:49.403,1303.5,2 +2011/07/31 22:00:49.403,1303.5,1 +2011/07/31 22:00:49.403,1303.5,1 +2011/07/31 22:00:49.453,1303.5,6 +2011/07/31 22:00:49.453,1303.25,9 +2011/07/31 22:00:49.789,1303.5,1 +2011/07/31 22:00:49.789,1303.5,1 +2011/07/31 22:00:49.973,1303.5,1 +2011/07/31 22:00:49.985,1303.25,8 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:49.985,1303.25,5 +2011/07/31 22:00:49.985,1303.25,3 +2011/07/31 22:00:49.985,1303.25,1 +2011/07/31 22:00:50.215,1303.5,1 +2011/07/31 22:00:50.342,1303.75,5 +2011/07/31 22:00:50.342,1303.75,3 +2011/07/31 22:00:50.342,1303.75,5 +2011/07/31 22:00:50.342,1303.75,12 +2011/07/31 22:00:50.342,1303.75,1 +2011/07/31 22:00:50.780,1303.5,1 +2011/07/31 22:00:51.448,1303.75,5 +2011/07/31 22:00:51.553,1303.5,1 +2011/07/31 22:00:51.702,1303.5,1 +2011/07/31 22:00:52.150,1303.5,2 +2011/07/31 22:00:52.166,1303.5,1 +2011/07/31 22:00:52.340,1303.5,4 +2011/07/31 22:00:52.340,1303.5,2 +2011/07/31 22:00:52.340,1303.5,3 +2011/07/31 22:00:52.340,1303.5,4 +2011/07/31 22:00:52.340,1303.5,1 +2011/07/31 22:00:52.522,1303.5,2 +2011/07/31 22:00:52.616,1303.5,1 +2011/07/31 22:00:52.786,1303.25,1 +2011/07/31 22:00:52.786,1303.25,1 +2011/07/31 22:00:52.801,1303.5,1 +2011/07/31 22:00:52.826,1303.5,2 +2011/07/31 22:00:53.149,1303.5,1 +2011/07/31 22:00:53.249,1303.5,2 +2011/07/31 22:00:53.249,1303.25,1 +2011/07/31 22:00:53.249,1303.25,4 +2011/07/31 22:00:53.249,1303.25,1 +2011/07/31 22:00:53.249,1303.25,1 +2011/07/31 22:00:53.249,1303.25,1 +2011/07/31 22:00:53.509,1303.25,1 +2011/07/31 22:00:54.042,1303.5,1 +2011/07/31 22:00:54.042,1303.5,1 +2011/07/31 22:00:54.042,1303.5,3 +2011/07/31 22:00:54.116,1303.75,3 +2011/07/31 22:00:54.213,1303.5,3 +2011/07/31 22:00:54.627,1303.75,1 +2011/07/31 22:00:55.040,1303.5,3 +2011/07/31 22:00:55.278,1303.75,1 +2011/07/31 22:00:55.905,1303.75,10 +2011/07/31 22:00:56.363,1303.5,4 +2011/07/31 22:00:56.363,1303.5,10 +2011/07/31 22:00:56.363,1303.5,3 +2011/07/31 22:00:56.363,1303.5,3 +2011/07/31 22:00:56.363,1303.5,1 +2011/07/31 22:00:56.363,1303.5,1 +2011/07/31 22:00:56.563,1303.75,1 +2011/07/31 22:00:56.712,1303.75,1 +2011/07/31 22:00:56.813,1303.75,1 +2011/07/31 22:00:56.871,1303.75,1 +2011/07/31 22:00:56.909,1303.75,13 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,10 +2011/07/31 22:00:56.909,1303.75,2 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1303.75,5 +2011/07/31 22:00:56.909,1303.75,5 +2011/07/31 22:00:56.909,1303.75,3 +2011/07/31 22:00:56.909,1303.75,2 +2011/07/31 22:00:56.909,1303.75,4 +2011/07/31 22:00:56.909,1303.75,1 +2011/07/31 22:00:56.909,1304.0,2 +2011/07/31 22:00:57.025,1303.75,1 +2011/07/31 22:00:57.101,1303.75,1 +2011/07/31 22:00:57.158,1303.75,1 +2011/07/31 22:00:57.214,1303.75,3 +2011/07/31 22:00:57.214,1303.75,1 +2011/07/31 22:00:57.628,1303.75,16 +2011/07/31 22:00:57.628,1303.75,3 +2011/07/31 22:00:57.628,1303.75,14 +2011/07/31 22:00:57.823,1303.75,3 +2011/07/31 22:00:57.823,1303.75,2 +2011/07/31 22:00:58.158,1303.75,1 +2011/07/31 22:00:58.158,1303.75,1 +2011/07/31 22:00:58.158,1303.75,10 +2011/07/31 22:00:58.158,1303.75,1 +2011/07/31 22:00:58.158,1303.75,1 +2011/07/31 22:00:58.158,1303.75,1 +2011/07/31 22:00:58.158,1303.75,5 +2011/07/31 22:00:58.158,1303.75,2 +2011/07/31 22:00:58.158,1303.75,10 +2011/07/31 22:00:58.158,1303.75,10 +2011/07/31 22:00:58.158,1303.75,4 +2011/07/31 22:00:58.158,1303.75,10 +2011/07/31 22:00:58.158,1303.75,10 +2011/07/31 22:00:58.158,1303.5,3 +2011/07/31 22:00:58.158,1303.5,2 +2011/07/31 22:00:58.158,1303.5,2 +2011/07/31 22:00:58.158,1303.5,3 +2011/07/31 22:00:58.158,1303.5,18 +2011/07/31 22:00:58.171,1303.75,1 +2011/07/31 22:00:58.703,1304.0,1 +2011/07/31 22:00:58.703,1304.0,1 +2011/07/31 22:00:58.703,1304.0,2 +2011/07/31 22:00:58.835,1304.0,1 +2011/07/31 22:00:58.835,1304.0,1 +2011/07/31 22:00:58.878,1303.75,1 +2011/07/31 22:00:59.071,1304.0,3 +2011/07/31 22:00:59.071,1304.0,5 +2011/07/31 22:00:59.071,1304.0,12 +2011/07/31 22:00:59.340,1304.0,3 +2011/07/31 22:00:59.449,1303.75,1 +2011/07/31 22:01:00.009,1303.75,1 +2011/07/31 22:01:00.053,1304.0,35 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,10 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,4 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,3 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,3 +2011/07/31 22:01:00.053,1304.0,2 +2011/07/31 22:01:00.053,1304.0,1 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,50 +2011/07/31 22:01:00.053,1304.0,3 +2011/07/31 22:01:00.133,1304.0,5 +2011/07/31 22:01:00.777,1304.25,1 +2011/07/31 22:01:00.777,1304.25,1 +2011/07/31 22:01:00.777,1304.25,1 +2011/07/31 22:01:00.777,1304.25,1 +2011/07/31 22:01:01.197,1304.25,2 +2011/07/31 22:01:01.391,1304.25,2 +2011/07/31 22:01:01.610,1304.25,1 +2011/07/31 22:01:01.761,1304.0,1 +2011/07/31 22:01:01.843,1304.25,1 +2011/07/31 22:01:01.958,1304.25,2 +2011/07/31 22:01:02.005,1304.0,22 +2011/07/31 22:01:02.005,1304.0,1 +2011/07/31 22:01:02.005,1304.0,3 +2011/07/31 22:01:02.005,1304.0,10 +2011/07/31 22:01:02.005,1304.0,55 +2011/07/31 22:01:02.057,1304.25,1 +2011/07/31 22:01:02.210,1304.25,1 +2011/07/31 22:01:02.226,1304.25,2 +2011/07/31 22:01:02.226,1304.25,1 +2011/07/31 22:01:02.276,1304.25,1 +2011/07/31 22:01:02.276,1304.25,1 +2011/07/31 22:01:02.276,1304.25,1 +2011/07/31 22:01:02.276,1304.25,1 +2011/07/31 22:01:02.276,1304.25,1 +2011/07/31 22:01:02.873,1304.0,5 +2011/07/31 22:01:02.945,1304.0,3 +2011/07/31 22:01:03.255,1304.0,1 +2011/07/31 22:01:03.671,1304.0,1 +2011/07/31 22:01:03.702,1304.0,2 +2011/07/31 22:01:04.050,1304.25,2 +2011/07/31 22:01:04.207,1304.0,15 +2011/07/31 22:01:04.207,1304.0,5 +2011/07/31 22:01:04.207,1304.0,1 +2011/07/31 22:01:04.207,1304.0,1 +2011/07/31 22:01:04.207,1304.0,4 +2011/07/31 22:01:04.207,1304.0,50 +2011/07/31 22:01:04.207,1304.0,5 +2011/07/31 22:01:04.207,1304.0,14 +2011/07/31 22:01:05.149,1304.0,4 +2011/07/31 22:01:05.149,1304.0,1 +2011/07/31 22:01:06.012,1304.0,43 +2011/07/31 22:01:06.562,1304.25,1 +2011/07/31 22:01:06.754,1304.25,1 +2011/07/31 22:01:07.096,1304.25,42 +2011/07/31 22:01:07.280,1304.25,57 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,1 +2011/07/31 22:01:07.280,1304.25,10 +2011/07/31 22:01:07.280,1304.25,2 +2011/07/31 22:01:07.280,1304.25,3 +2011/07/31 22:01:07.280,1304.25,21 +2011/07/31 22:01:07.468,1304.25,20 +2011/07/31 22:01:07.760,1304.25,9 +2011/07/31 22:01:07.760,1304.25,1 +2011/07/31 22:01:07.796,1304.25,3 +2011/07/31 22:01:07.796,1304.25,1 +2011/07/31 22:01:07.796,1304.25,6 +2011/07/31 22:01:07.815,1304.25,1 +2011/07/31 22:01:07.815,1304.25,1 +2011/07/31 22:01:07.815,1304.25,1 +2011/07/31 22:01:07.815,1304.25,1 +2011/07/31 22:01:07.830,1304.0,88 +2011/07/31 22:01:07.830,1304.0,1 +2011/07/31 22:01:07.830,1304.0,3 +2011/07/31 22:01:07.830,1304.0,11 +2011/07/31 22:01:07.859,1304.25,1 +2011/07/31 22:01:07.859,1304.25,1 +2011/07/31 22:01:07.859,1304.25,1 +2011/07/31 22:01:07.859,1304.25,1 +2011/07/31 22:01:08.026,1304.0,1 +2011/07/31 22:01:08.060,1304.25,1 +2011/07/31 22:01:08.266,1304.25,1 +2011/07/31 22:01:08.380,1304.0,2 +2011/07/31 22:01:08.409,1304.0,1 +2011/07/31 22:01:08.644,1304.0,35 +2011/07/31 22:01:08.644,1304.0,2 +2011/07/31 22:01:08.644,1304.0,1 +2011/07/31 22:01:08.644,1304.0,1 +2011/07/31 22:01:08.644,1304.0,3 +2011/07/31 22:01:08.644,1304.0,8 +2011/07/31 22:01:08.932,1304.0,2 +2011/07/31 22:01:09.082,1304.25,1 +2011/07/31 22:01:09.082,1304.25,1 +2011/07/31 22:01:10.098,1304.25,3 +2011/07/31 22:01:10.159,1304.0,5 +2011/07/31 22:01:10.667,1304.0,4 +2011/07/31 22:01:10.816,1304.25,1 +2011/07/31 22:01:10.816,1304.25,1 +2011/07/31 22:01:10.816,1304.25,1 +2011/07/31 22:01:10.816,1304.25,3 +2011/07/31 22:01:10.924,1304.0,25 +2011/07/31 22:01:11.287,1304.0,6 +2011/07/31 22:01:11.287,1304.0,1 +2011/07/31 22:01:11.287,1304.0,4 +2011/07/31 22:01:11.287,1304.0,2 +2011/07/31 22:01:11.287,1304.0,7 +2011/07/31 22:01:11.374,1304.25,1 +2011/07/31 22:01:13.123,1304.0,4 +2011/07/31 22:01:13.230,1304.0,1 +2011/07/31 22:01:13.343,1304.0,2 +2011/07/31 22:01:13.343,1304.0,2 +2011/07/31 22:01:13.623,1304.0,10 +2011/07/31 22:01:14.182,1304.0,10 +2011/07/31 22:01:14.203,1304.0,1 +2011/07/31 22:01:14.307,1304.0,5 +2011/07/31 22:01:14.367,1304.0,1 +2011/07/31 22:01:14.393,1304.0,7 +2011/07/31 22:01:14.393,1304.0,1 +2011/07/31 22:01:14.393,1304.0,2 +2011/07/31 22:01:14.519,1304.0,1 +2011/07/31 22:01:14.555,1304.0,2 +2011/07/31 22:01:14.555,1304.0,8 +2011/07/31 22:01:14.555,1304.0,1 +2011/07/31 22:01:14.655,1304.0,1 +2011/07/31 22:01:14.952,1304.0,1 +2011/07/31 22:01:15.136,1304.0,1 +2011/07/31 22:01:15.191,1304.0,1 +2011/07/31 22:01:15.292,1304.0,1 +2011/07/31 22:01:15.523,1304.0,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,3 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.606,1304.25,1 +2011/07/31 22:01:15.892,1304.0,1 +2011/07/31 22:01:16.128,1304.0,1 +2011/07/31 22:01:16.176,1304.0,5 +2011/07/31 22:01:17.012,1304.0,2 +2011/07/31 22:01:17.196,1304.25,1 +2011/07/31 22:01:18.020,1304.0,1 +2011/07/31 22:01:18.072,1304.25,5 +2011/07/31 22:01:18.084,1304.25,12 +2011/07/31 22:01:18.168,1304.25,8 +2011/07/31 22:01:18.168,1304.25,1 +2011/07/31 22:01:18.168,1304.25,1 +2011/07/31 22:01:18.332,1304.25,21 +2011/07/31 22:01:18.332,1304.25,1 +2011/07/31 22:01:18.332,1304.25,1 +2011/07/31 22:01:18.332,1304.25,4 +2011/07/31 22:01:18.332,1304.25,10 +2011/07/31 22:01:18.332,1304.25,2 +2011/07/31 22:01:18.332,1304.25,11 +2011/07/31 22:01:18.434,1304.25,5 +2011/07/31 22:01:18.966,1304.25,1 +2011/07/31 22:01:19.801,1304.0,5 +2011/07/31 22:01:20.118,1304.25,5 +2011/07/31 22:01:20.213,1304.0,1 +2011/07/31 22:01:21.457,1304.0,10 +2011/07/31 22:01:21.523,1304.0,1 +2011/07/31 22:01:21.731,1304.0,5 +2011/07/31 22:01:21.782,1304.0,3 +2011/07/31 22:01:21.782,1304.0,1 +2011/07/31 22:01:21.782,1304.0,1 +2011/07/31 22:01:21.782,1304.0,1 +2011/07/31 22:01:21.782,1304.0,5 +2011/07/31 22:01:21.782,1304.0,1 +2011/07/31 22:01:21.782,1304.0,1 +2011/07/31 22:01:21.782,1304.0,7 +2011/07/31 22:01:21.988,1304.0,1 +2011/07/31 22:01:22.143,1304.0,1 +2011/07/31 22:01:22.254,1304.0,1 +2011/07/31 22:01:22.303,1304.0,1 +2011/07/31 22:01:22.439,1304.0,1 +2011/07/31 22:01:22.915,1304.0,1 +2011/07/31 22:01:22.915,1304.25,5 +2011/07/31 22:01:23.020,1304.0,1 +2011/07/31 22:01:23.223,1304.25,5 +2011/07/31 22:01:25.840,1304.0,2 +2011/07/31 22:01:25.874,1304.0,20 +2011/07/31 22:01:25.983,1304.0,14 +2011/07/31 22:01:25.983,1304.0,1 +2011/07/31 22:01:25.983,1304.0,1 +2011/07/31 22:01:25.983,1304.0,1 +2011/07/31 22:01:25.983,1304.0,3 +2011/07/31 22:01:26.383,1304.25,10 +2011/07/31 22:01:26.383,1304.25,1 +2011/07/31 22:01:26.383,1304.25,5 +2011/07/31 22:01:26.383,1304.25,1 +2011/07/31 22:01:26.383,1304.25,3 +2011/07/31 22:01:26.383,1304.25,5 +2011/07/31 22:01:26.383,1304.25,1 +2011/07/31 22:01:26.383,1304.25,5 +2011/07/31 22:01:26.383,1304.25,4 +2011/07/31 22:01:26.383,1304.25,3 +2011/07/31 22:01:26.383,1304.25,42 +2011/07/31 22:01:26.383,1304.25,1 +2011/07/31 22:01:26.456,1304.0,3 +2011/07/31 22:01:26.997,1304.0,2 +2011/07/31 22:01:27.371,1304.25,4 +2011/07/31 22:01:27.900,1304.0,1 +2011/07/31 22:01:28.110,1304.0,1 +2011/07/31 22:01:28.786,1304.0,1 +2011/07/31 22:01:28.786,1304.0,1 +2011/07/31 22:01:29.525,1304.25,3 +2011/07/31 22:01:29.623,1304.25,1 +2011/07/31 22:01:29.813,1304.25,1 +2011/07/31 22:01:31.309,1304.25,1 +2011/07/31 22:01:31.309,1304.25,1 +2011/07/31 22:01:31.439,1304.25,3 +2011/07/31 22:01:31.439,1304.25,4 +2011/07/31 22:01:31.439,1304.25,2 +2011/07/31 22:01:31.439,1304.25,1 +2011/07/31 22:01:31.439,1304.25,1 +2011/07/31 22:01:31.439,1304.25,1 +2011/07/31 22:01:31.439,1304.25,2 +2011/07/31 22:01:31.439,1304.25,1 +2011/07/31 22:01:31.439,1304.25,5 +2011/07/31 22:01:31.470,1304.0,1 +2011/07/31 22:01:32.022,1304.25,1 +2011/07/31 22:01:32.022,1304.25,1 +2011/07/31 22:01:32.195,1304.25,2 +2011/07/31 22:01:32.368,1304.0,1 +2011/07/31 22:01:32.368,1304.25,1 +2011/07/31 22:01:32.368,1304.25,1 +2011/07/31 22:01:32.540,1304.25,2 +2011/07/31 22:01:32.681,1304.0,5 +2011/07/31 22:01:33.131,1304.25,5 +2011/07/31 22:01:33.731,1304.0,1 +2011/07/31 22:01:34.129,1304.0,1 +2011/07/31 22:01:34.359,1304.25,1 +2011/07/31 22:01:34.571,1304.0,1 +2011/07/31 22:01:34.604,1304.0,5 +2011/07/31 22:01:35.379,1304.0,1 +2011/07/31 22:01:36.166,1304.25,1 +2011/07/31 22:01:36.166,1304.25,4 +2011/07/31 22:01:36.200,1304.25,1 +2011/07/31 22:01:36.200,1304.25,2 +2011/07/31 22:01:36.661,1304.25,1 +2011/07/31 22:01:36.661,1304.25,1 +2011/07/31 22:01:36.661,1304.25,1 +2011/07/31 22:01:36.661,1304.25,1 +2011/07/31 22:01:36.661,1304.25,1 +2011/07/31 22:01:37.346,1304.25,3 +2011/07/31 22:01:37.346,1304.25,1 +2011/07/31 22:01:37.346,1304.25,3 +2011/07/31 22:01:37.346,1304.25,2 +2011/07/31 22:01:37.346,1304.25,1 +2011/07/31 22:01:37.636,1304.25,1 +2011/07/31 22:01:38.207,1304.25,2 +2011/07/31 22:01:38.286,1304.0,4 +2011/07/31 22:01:38.286,1304.0,10 +2011/07/31 22:01:38.322,1304.0,1 +2011/07/31 22:01:38.437,1304.0,1 +2011/07/31 22:01:39.038,1304.0,1 +2011/07/31 22:01:39.205,1304.25,1 +2011/07/31 22:01:39.851,1304.0,1 +2011/07/31 22:01:41.298,1304.0,1 +2011/07/31 22:01:41.931,1304.25,9 +2011/07/31 22:01:41.931,1304.25,1 +2011/07/31 22:01:42.114,1304.25,1 +2011/07/31 22:01:42.114,1304.25,1 +2011/07/31 22:01:42.640,1304.0,3 +2011/07/31 22:01:43.740,1304.25,3 +2011/07/31 22:01:44.348,1304.0,1 +2011/07/31 22:01:45.130,1304.0,1 +2011/07/31 22:01:45.303,1304.0,1 +2011/07/31 22:01:45.464,1304.0,1 +2011/07/31 22:01:45.593,1304.25,7 +2011/07/31 22:01:45.593,1304.25,1 +2011/07/31 22:01:45.593,1304.25,2 +2011/07/31 22:01:45.608,1304.0,1 +2011/07/31 22:01:45.769,1304.0,1 +2011/07/31 22:01:45.913,1304.0,1 +2011/07/31 22:01:46.400,1304.0,1 +2011/07/31 22:01:46.880,1304.25,3 +2011/07/31 22:01:46.880,1304.25,3 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,10 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,5 +2011/07/31 22:01:46.880,1304.25,4 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.880,1304.25,5 +2011/07/31 22:01:46.880,1304.25,1 +2011/07/31 22:01:46.917,1304.5,1 +2011/07/31 22:01:46.917,1304.5,3 +2011/07/31 22:01:46.917,1304.5,1 +2011/07/31 22:01:46.917,1304.5,2 +2011/07/31 22:01:46.917,1304.5,4 +2011/07/31 22:01:46.917,1304.5,5 +2011/07/31 22:01:46.917,1304.5,5 +2011/07/31 22:01:46.917,1304.5,1 +2011/07/31 22:01:46.917,1304.5,28 +2011/07/31 22:01:46.917,1304.5,1 +2011/07/31 22:01:46.917,1304.5,1 +2011/07/31 22:01:47.009,1304.0,1 +2011/07/31 22:01:47.611,1304.25,1 +2011/07/31 22:01:47.769,1304.5,5 +2011/07/31 22:01:47.915,1304.5,2 +2011/07/31 22:01:47.970,1304.5,5 +2011/07/31 22:01:48.026,1304.25,1 +2011/07/31 22:01:48.026,1304.25,2 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.052,1304.5,17 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.052,1304.5,5 +2011/07/31 22:01:48.052,1304.5,1 +2011/07/31 22:01:48.061,1304.5,6 +2011/07/31 22:01:48.067,1304.5,1 +2011/07/31 22:01:48.067,1304.5,3 +2011/07/31 22:01:48.307,1304.5,3 +2011/07/31 22:01:48.312,1304.5,1 +2011/07/31 22:01:48.575,1304.75,1 +2011/07/31 22:01:48.575,1304.75,1 +2011/07/31 22:01:48.980,1304.75,1 +2011/07/31 22:01:49.126,1304.75,4 +2011/07/31 22:01:49.126,1304.75,10 +2011/07/31 22:01:49.126,1304.75,6 +2011/07/31 22:01:49.298,1304.75,1 +2011/07/31 22:01:49.329,1304.75,3 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.329,1304.75,1 +2011/07/31 22:01:49.334,1304.75,1 +2011/07/31 22:01:49.334,1304.75,1 +2011/07/31 22:01:49.334,1304.75,1 +2011/07/31 22:01:49.334,1304.75,1 +2011/07/31 22:01:49.531,1304.75,2 +2011/07/31 22:01:49.647,1304.75,10 +2011/07/31 22:01:49.647,1304.75,1 +2011/07/31 22:01:49.647,1304.75,1 +2011/07/31 22:01:49.647,1304.75,1 +2011/07/31 22:01:49.653,1304.75,5 +2011/07/31 22:01:49.658,1304.75,1 +2011/07/31 22:01:49.665,1304.75,3 +2011/07/31 22:01:49.700,1304.75,5 +2011/07/31 22:01:50.672,1304.75,1 +2011/07/31 22:01:50.745,1305.0,1 +2011/07/31 22:01:50.745,1305.0,1 +2011/07/31 22:01:50.745,1305.0,23 +2011/07/31 22:01:50.893,1304.75,7 +2011/07/31 22:01:50.893,1304.75,13 +2011/07/31 22:01:51.005,1304.75,12 +2011/07/31 22:01:51.005,1304.75,1 +2011/07/31 22:01:51.005,1304.75,6 +2011/07/31 22:01:51.005,1304.75,1 +2011/07/31 22:01:51.005,1304.75,1 +2011/07/31 22:01:51.005,1304.75,1 +2011/07/31 22:01:51.011,1304.75,6 +2011/07/31 22:01:51.457,1305.0,2 +2011/07/31 22:01:51.533,1305.0,8 +2011/07/31 22:01:51.671,1305.0,1 +2011/07/31 22:01:51.927,1305.0,1 +2011/07/31 22:01:51.927,1305.0,1 +2011/07/31 22:01:52.506,1305.0,1 +2011/07/31 22:01:52.671,1304.75,18 +2011/07/31 22:01:52.671,1304.75,10 +2011/07/31 22:01:52.671,1304.75,4 +2011/07/31 22:01:52.671,1304.75,1 +2011/07/31 22:01:53.054,1304.75,1 +2011/07/31 22:01:53.393,1304.75,1 +2011/07/31 22:01:54.046,1304.75,2 +2011/07/31 22:01:54.046,1304.75,1 +2011/07/31 22:01:54.046,1304.75,1 +2011/07/31 22:01:54.046,1304.75,1 +2011/07/31 22:01:54.046,1304.75,5 +2011/07/31 22:01:54.116,1304.75,1 +2011/07/31 22:01:54.380,1304.75,4 +2011/07/31 22:01:54.579,1305.0,1 +2011/07/31 22:01:54.755,1304.75,1 +2011/07/31 22:01:54.755,1304.75,1 +2011/07/31 22:01:56.760,1305.0,1 +2011/07/31 22:01:57.194,1304.75,4 +2011/07/31 22:01:57.194,1304.75,1 +2011/07/31 22:01:58.145,1305.0,1 +2011/07/31 22:01:58.175,1305.0,1 +2011/07/31 22:01:58.825,1304.75,3 +2011/07/31 22:01:58.911,1305.0,2 +2011/07/31 22:01:58.911,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,10 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,5 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,2 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.099,1305.0,3 +2011/07/31 22:01:59.099,1305.0,1 +2011/07/31 22:01:59.162,1305.0,1 +2011/07/31 22:01:59.610,1305.0,1 +2011/07/31 22:01:59.610,1305.0,1 +2011/07/31 22:01:59.610,1305.0,1 +2011/07/31 22:01:59.610,1305.0,1 +2011/07/31 22:01:59.610,1305.0,2 +2011/07/31 22:01:59.657,1304.75,2 +2011/07/31 22:01:59.657,1304.75,3 +2011/07/31 22:01:59.738,1305.0,1 +2011/07/31 22:01:59.904,1305.0,12 +2011/07/31 22:01:59.904,1305.0,10 +2011/07/31 22:01:59.904,1305.0,1 +2011/07/31 22:01:59.904,1305.0,1 +2011/07/31 22:01:59.904,1305.0,1 +2011/07/31 22:01:59.904,1305.0,1 +2011/07/31 22:01:59.904,1305.0,1 +2011/07/31 22:01:59.904,1305.0,3 +2011/07/31 22:01:59.904,1305.0,3 +2011/07/31 22:01:59.919,1305.0,1 +2011/07/31 22:01:59.919,1305.0,2 +2011/07/31 22:01:59.919,1305.0,1 +2011/07/31 22:01:59.919,1305.0,1 +2011/07/31 22:01:59.919,1305.0,1 +2011/07/31 22:02:00.189,1305.0,2 +2011/07/31 22:02:00.778,1305.0,4 +2011/07/31 22:02:00.804,1305.0,1 +2011/07/31 22:02:00.804,1305.0,1 +2011/07/31 22:02:01.277,1305.25,4 +2011/07/31 22:02:01.277,1305.25,1 +2011/07/31 22:02:01.322,1305.25,2 +2011/07/31 22:02:01.322,1305.25,3 +2011/07/31 22:02:01.322,1305.25,7 +2011/07/31 22:02:01.322,1305.25,10 +2011/07/31 22:02:01.322,1305.25,1 +2011/07/31 22:02:01.322,1305.25,4 +2011/07/31 22:02:01.322,1305.25,1 +2011/07/31 22:02:01.322,1305.25,10 +2011/07/31 22:02:01.322,1305.25,5 +2011/07/31 22:02:01.322,1305.25,4 +2011/07/31 22:02:01.322,1305.25,2 +2011/07/31 22:02:01.322,1305.25,1 +2011/07/31 22:02:01.322,1305.25,10 +2011/07/31 22:02:01.322,1305.25,40 +2011/07/31 22:02:01.327,1305.25,2 +2011/07/31 22:02:01.327,1305.25,1 +2011/07/31 22:02:01.327,1305.25,4 +2011/07/31 22:02:01.327,1305.25,1 +2011/07/31 22:02:01.343,1305.0,4 +2011/07/31 22:02:01.432,1305.0,2 +2011/07/31 22:02:01.467,1305.25,1 +2011/07/31 22:02:02.189,1305.25,3 +2011/07/31 22:02:02.189,1305.25,1 +2011/07/31 22:02:02.743,1305.25,1 +2011/07/31 22:02:02.743,1305.25,1 +2011/07/31 22:02:02.743,1305.25,1 +2011/07/31 22:02:02.993,1305.25,2 +2011/07/31 22:02:03.197,1305.25,2 +2011/07/31 22:02:04.127,1305.25,1 +2011/07/31 22:02:04.173,1305.5,1 +2011/07/31 22:02:04.173,1305.5,1 +2011/07/31 22:02:04.173,1305.5,1 +2011/07/31 22:02:04.618,1305.5,1 +2011/07/31 22:02:04.618,1305.5,4 +2011/07/31 22:02:04.618,1305.5,1 +2011/07/31 22:02:04.618,1305.5,1 +2011/07/31 22:02:04.618,1305.5,13 +2011/07/31 22:02:04.809,1305.5,4 +2011/07/31 22:02:05.986,1305.25,12 +2011/07/31 22:02:05.986,1305.25,5 +2011/07/31 22:02:05.986,1305.25,1 +2011/07/31 22:02:05.986,1305.25,10 +2011/07/31 22:02:05.986,1305.25,7 +2011/07/31 22:02:05.986,1305.25,11 +2011/07/31 22:02:05.986,1305.25,3 +2011/07/31 22:02:05.986,1305.25,4 +2011/07/31 22:02:05.986,1305.25,3 +2011/07/31 22:02:05.986,1305.25,1 +2011/07/31 22:02:06.047,1305.25,1 +2011/07/31 22:02:06.206,1305.25,4 +2011/07/31 22:02:06.212,1305.25,5 +2011/07/31 22:02:06.534,1305.25,1 +2011/07/31 22:02:06.576,1305.25,32 +2011/07/31 22:02:06.576,1305.25,1 +2011/07/31 22:02:06.576,1305.25,17 +2011/07/31 22:02:08.643,1305.0,3 +2011/07/31 22:02:08.896,1305.0,1 +2011/07/31 22:02:09.546,1305.0,5 +2011/07/31 22:02:09.546,1305.25,1 +2011/07/31 22:02:10.843,1305.25,7 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,10 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,5 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,3 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:10.843,1305.25,1 +2011/07/31 22:02:11.143,1305.25,2 +2011/07/31 22:02:11.334,1305.25,2 +2011/07/31 22:02:11.495,1305.25,2 +2011/07/31 22:02:12.346,1305.25,1 +2011/07/31 22:02:13.848,1305.5,1 +2011/07/31 22:02:14.034,1305.25,1 +2011/07/31 22:02:14.799,1305.25,1 +2011/07/31 22:02:14.864,1305.25,2 +2011/07/31 22:02:14.972,1305.5,1 +2011/07/31 22:02:15.186,1305.25,1 +2011/07/31 22:02:16.930,1305.5,10 +2011/07/31 22:02:16.989,1305.25,1 +2011/07/31 22:02:17.537,1305.25,1 +2011/07/31 22:02:17.604,1305.25,5 +2011/07/31 22:02:18.390,1305.5,15 +2011/07/31 22:02:18.520,1305.25,2 +2011/07/31 22:02:19.117,1305.25,1 +2011/07/31 22:02:19.145,1305.5,1 +2011/07/31 22:02:20.500,1305.5,1 +2011/07/31 22:02:20.588,1305.25,5 +2011/07/31 22:02:21.279,1305.5,50 +2011/07/31 22:02:21.354,1305.5,1 +2011/07/31 22:02:21.646,1305.25,2 +2011/07/31 22:02:22.816,1305.25,1 +2011/07/31 22:02:22.917,1305.5,3 +2011/07/31 22:02:22.917,1305.5,5 +2011/07/31 22:02:22.917,1305.5,1 +2011/07/31 22:02:22.917,1305.5,1 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,2 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,5 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,4 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,3 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.353,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.420,1305.5,1 +2011/07/31 22:02:23.501,1305.5,4 +2011/07/31 22:02:23.641,1305.5,1 +2011/07/31 22:02:23.719,1305.5,3 +2011/07/31 22:02:23.719,1305.5,7 +2011/07/31 22:02:24.285,1305.5,2 +2011/07/31 22:02:24.285,1305.5,1 +2011/07/31 22:02:24.285,1305.5,1 +2011/07/31 22:02:24.285,1305.5,1 +2011/07/31 22:02:24.285,1305.5,1 +2011/07/31 22:02:24.285,1305.5,2 +2011/07/31 22:02:24.594,1305.75,1 +2011/07/31 22:02:24.594,1305.75,1 +2011/07/31 22:02:24.594,1305.75,1 +2011/07/31 22:02:24.594,1305.75,1 +2011/07/31 22:02:24.647,1305.75,17 +2011/07/31 22:02:24.647,1305.75,8 +2011/07/31 22:02:24.647,1305.75,2 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,4 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,10 +2011/07/31 22:02:24.647,1305.75,10 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,10 +2011/07/31 22:02:24.647,1305.75,10 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,3 +2011/07/31 22:02:24.647,1305.75,1 +2011/07/31 22:02:24.647,1305.75,3 +2011/07/31 22:02:24.647,1305.75,5 +2011/07/31 22:02:24.647,1306.0,11 +2011/07/31 22:02:24.647,1306.0,2 +2011/07/31 22:02:24.736,1305.75,1 +2011/07/31 22:02:24.857,1305.5,4 +2011/07/31 22:02:24.857,1305.5,3 +2011/07/31 22:02:24.857,1305.5,3 +2011/07/31 22:02:24.936,1305.5,4 +2011/07/31 22:02:25.159,1305.75,1 +2011/07/31 22:02:25.310,1305.75,1 +2011/07/31 22:02:25.834,1305.75,1 +2011/07/31 22:02:26.101,1305.75,1 +2011/07/31 22:02:26.147,1305.75,5 +2011/07/31 22:02:26.147,1305.75,2 +2011/07/31 22:02:26.321,1305.75,1 +2011/07/31 22:02:26.490,1305.75,1 +2011/07/31 22:02:26.603,1305.75,1 +2011/07/31 22:02:26.750,1305.75,6 +2011/07/31 22:02:26.750,1305.75,1 +2011/07/31 22:02:26.750,1305.75,2 +2011/07/31 22:02:26.853,1305.5,1 +2011/07/31 22:02:26.934,1305.75,1 +2011/07/31 22:02:27.852,1305.5,1 +2011/07/31 22:02:27.975,1305.75,1 +2011/07/31 22:02:28.222,1305.5,1 +2011/07/31 22:02:28.222,1305.5,2 +2011/07/31 22:02:28.242,1305.75,9 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,3 +2011/07/31 22:02:28.242,1305.75,3 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,5 +2011/07/31 22:02:28.242,1305.75,1 +2011/07/31 22:02:28.242,1305.75,4 +2011/07/31 22:02:28.242,1305.75,5 +2011/07/31 22:02:28.242,1305.75,5 +2011/07/31 22:02:28.789,1305.75,5 +2011/07/31 22:02:28.957,1305.75,4 +2011/07/31 22:02:29.111,1305.75,1 +2011/07/31 22:02:29.111,1305.75,1 +2011/07/31 22:02:29.345,1305.75,2 +2011/07/31 22:02:29.792,1305.75,1 +2011/07/31 22:02:30.555,1305.75,1 +2011/07/31 22:02:30.866,1305.75,1 +2011/07/31 22:02:30.972,1305.5,1 +2011/07/31 22:02:30.972,1305.5,1 +2011/07/31 22:02:30.972,1305.5,1 +2011/07/31 22:02:30.972,1305.5,2 +2011/07/31 22:02:31.445,1305.75,1 +2011/07/31 22:02:31.841,1305.75,1 +2011/07/31 22:02:31.948,1305.75,2 +2011/07/31 22:02:31.948,1305.75,1 +2011/07/31 22:02:32.642,1305.5,4 +2011/07/31 22:02:32.642,1305.5,1 +2011/07/31 22:02:32.911,1305.75,1 +2011/07/31 22:02:33.045,1305.5,1 +2011/07/31 22:02:33.753,1305.5,14 +2011/07/31 22:02:33.753,1305.5,4 +2011/07/31 22:02:33.753,1305.5,3 +2011/07/31 22:02:33.753,1305.5,4 +2011/07/31 22:02:33.753,1305.5,1 +2011/07/31 22:02:33.753,1305.5,1 +2011/07/31 22:02:33.753,1305.5,1 +2011/07/31 22:02:34.404,1305.5,1 +2011/07/31 22:02:34.425,1305.25,1 +2011/07/31 22:02:34.425,1305.25,2 +2011/07/31 22:02:34.755,1305.25,1 +2011/07/31 22:02:34.872,1305.25,10 +2011/07/31 22:02:35.286,1305.5,1 +2011/07/31 22:02:35.338,1305.25,1 +2011/07/31 22:02:35.420,1305.25,1 +2011/07/31 22:02:35.663,1305.25,3 +2011/07/31 22:02:35.946,1305.5,1 +2011/07/31 22:02:35.946,1305.5,4 +2011/07/31 22:02:36.609,1305.25,1 +2011/07/31 22:02:36.705,1305.5,2 +2011/07/31 22:02:37.172,1305.25,1 +2011/07/31 22:02:37.274,1305.5,4 +2011/07/31 22:02:37.274,1305.5,3 +2011/07/31 22:02:37.274,1305.5,3 +2011/07/31 22:02:37.651,1305.5,1 +2011/07/31 22:02:37.651,1305.5,1 +2011/07/31 22:02:38.970,1305.5,1 +2011/07/31 22:02:39.007,1305.25,2 +2011/07/31 22:02:40.015,1305.5,18 +2011/07/31 22:02:40.015,1305.5,10 +2011/07/31 22:02:40.015,1305.5,4 +2011/07/31 22:02:40.015,1305.5,1 +2011/07/31 22:02:40.015,1305.5,1 +2011/07/31 22:02:40.015,1305.5,1 +2011/07/31 22:02:40.015,1305.5,1 +2011/07/31 22:02:40.015,1305.5,5 +2011/07/31 22:02:40.015,1305.5,7 +2011/07/31 22:02:40.020,1305.5,3 +2011/07/31 22:02:40.020,1305.5,2 +2011/07/31 22:02:40.020,1305.5,2 +2011/07/31 22:02:40.020,1305.5,1 +2011/07/31 22:02:40.020,1305.5,1 +2011/07/31 22:02:40.020,1305.5,1 +2011/07/31 22:02:40.020,1305.5,1 +2011/07/31 22:02:40.330,1305.5,1 +2011/07/31 22:02:40.619,1305.5,2 +2011/07/31 22:02:40.858,1305.5,1 +2011/07/31 22:02:40.928,1305.5,1 +2011/07/31 22:02:40.928,1305.5,1 +2011/07/31 22:02:41.582,1305.5,1 +2011/07/31 22:02:41.692,1305.75,1 +2011/07/31 22:02:41.692,1305.75,1 +2011/07/31 22:02:41.940,1305.5,1 +2011/07/31 22:02:41.940,1305.5,2 +2011/07/31 22:02:41.940,1305.5,2 +2011/07/31 22:02:42.350,1305.75,1 +2011/07/31 22:02:43.933,1305.5,2 +2011/07/31 22:02:44.190,1305.5,1 +2011/07/31 22:02:44.190,1305.5,1 +2011/07/31 22:02:44.190,1305.5,3 +2011/07/31 22:02:44.190,1305.5,1 +2011/07/31 22:02:44.190,1305.5,1 +2011/07/31 22:02:44.190,1305.5,1 +2011/07/31 22:02:44.190,1305.25,6 +2011/07/31 22:02:44.190,1305.25,1 +2011/07/31 22:02:45.418,1305.5,1 +2011/07/31 22:02:45.418,1305.5,1 +2011/07/31 22:02:45.828,1305.25,1 +2011/07/31 22:02:48.645,1305.5,1 +2011/07/31 22:02:48.645,1305.5,4 +2011/07/31 22:02:48.645,1305.5,5 +2011/07/31 22:02:48.809,1305.5,1 +2011/07/31 22:02:48.809,1305.5,1 +2011/07/31 22:02:48.819,1305.5,6 +2011/07/31 22:02:49.105,1305.5,1 +2011/07/31 22:02:50.954,1305.5,1 +2011/07/31 22:02:50.954,1305.25,1 +2011/07/31 22:02:52.219,1305.25,1 +2011/07/31 22:02:52.219,1305.25,1 +2011/07/31 22:02:52.219,1305.25,2 +2011/07/31 22:02:52.403,1305.25,1 +2011/07/31 22:02:52.403,1305.25,1 +2011/07/31 22:02:52.656,1305.25,5 +2011/07/31 22:02:52.751,1305.25,1 +2011/07/31 22:02:52.858,1305.25,3 +2011/07/31 22:02:52.858,1305.25,2 +2011/07/31 22:02:52.865,1305.25,8 +2011/07/31 22:02:52.865,1305.25,5 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,38 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,38 +2011/07/31 22:02:52.865,1305.25,2 +2011/07/31 22:02:52.865,1305.25,5 +2011/07/31 22:02:52.865,1305.25,1 +2011/07/31 22:02:52.865,1305.25,4 +2011/07/31 22:02:52.874,1305.25,1 +2011/07/31 22:02:52.974,1305.25,5 +2011/07/31 22:02:53.020,1305.25,4 +2011/07/31 22:02:53.048,1305.25,5 +2011/07/31 22:02:53.177,1305.25,24 +2011/07/31 22:02:53.226,1305.5,1 +2011/07/31 22:02:53.609,1305.25,7 +2011/07/31 22:02:53.609,1305.25,3 +2011/07/31 22:02:54.349,1305.25,2 +2011/07/31 22:02:54.349,1305.25,1 +2011/07/31 22:02:56.126,1305.25,39 +2011/07/31 22:02:56.126,1305.25,1 +2011/07/31 22:02:56.126,1305.25,1 +2011/07/31 22:02:56.126,1305.25,9 +2011/07/31 22:02:57.051,1305.5,3 +2011/07/31 22:02:57.051,1305.5,5 +2011/07/31 22:02:57.051,1305.5,2 +2011/07/31 22:02:57.051,1305.5,5 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,10 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,3 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,3 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,3 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,20 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,2 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.051,1305.5,1 +2011/07/31 22:02:57.135,1305.5,1 +2011/07/31 22:02:57.468,1305.5,2 +2011/07/31 22:02:57.906,1305.75,2 +2011/07/31 22:02:57.906,1305.75,1 +2011/07/31 22:02:57.906,1305.75,1 +2011/07/31 22:02:57.906,1305.75,1 +2011/07/31 22:02:57.990,1305.75,1 +2011/07/31 22:02:58.052,1305.5,1 +2011/07/31 22:02:58.303,1305.75,1 +2011/07/31 22:02:58.303,1305.75,4 +2011/07/31 22:02:58.303,1305.75,1 +2011/07/31 22:02:58.303,1305.75,4 +2011/07/31 22:02:58.320,1305.75,1 +2011/07/31 22:02:58.901,1305.5,5 +2011/07/31 22:02:59.165,1305.75,1 +2011/07/31 22:02:59.165,1305.75,1 +2011/07/31 22:02:59.186,1305.75,19 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,5 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,2 +2011/07/31 22:02:59.186,1305.75,2 +2011/07/31 22:02:59.186,1305.75,5 +2011/07/31 22:02:59.186,1305.75,5 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.186,1305.75,1 +2011/07/31 22:02:59.264,1305.75,1 +2011/07/31 22:02:59.292,1305.75,2 +2011/07/31 22:02:59.438,1305.75,1 +2011/07/31 22:02:59.577,1305.75,5 +2011/07/31 22:02:59.611,1305.75,1 +2011/07/31 22:02:59.956,1306.0,4 +2011/07/31 22:02:59.956,1306.0,1 +2011/07/31 22:02:59.956,1306.0,1 +2011/07/31 22:02:59.956,1306.0,1 +2011/07/31 22:02:59.956,1306.0,25 +2011/07/31 22:02:59.956,1306.0,30 +2011/07/31 22:02:59.956,1306.0,30 +2011/07/31 22:02:59.956,1306.0,1 +2011/07/31 22:02:59.956,1306.0,1 +2011/07/31 22:02:59.956,1306.0,16 +2011/07/31 22:03:00.110,1306.0,4 +2011/07/31 22:03:00.221,1306.0,5 +2011/07/31 22:03:00.221,1305.75,2 +2011/07/31 22:03:00.221,1305.75,2 +2011/07/31 22:03:00.229,1305.75,1 +2011/07/31 22:03:00.387,1306.0,1 +2011/07/31 22:03:00.462,1306.0,4 +2011/07/31 22:03:00.462,1306.0,1 +2011/07/31 22:03:00.462,1306.0,1 +2011/07/31 22:03:00.462,1306.0,14 +2011/07/31 22:03:00.607,1306.0,16 +2011/07/31 22:03:00.607,1306.0,4 +2011/07/31 22:03:00.624,1306.0,1 +2011/07/31 22:03:00.734,1306.0,5 +2011/07/31 22:03:00.734,1306.0,1 +2011/07/31 22:03:00.734,1306.0,5 +2011/07/31 22:03:00.734,1306.0,9 +2011/07/31 22:03:00.786,1306.0,1 +2011/07/31 22:03:00.786,1306.0,1 +2011/07/31 22:03:00.786,1306.0,1 +2011/07/31 22:03:00.786,1306.0,1 +2011/07/31 22:03:00.786,1306.0,1 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:00.954,1306.0,5 +2011/07/31 22:03:00.954,1306.0,2 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:00.954,1306.0,2 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:00.954,1306.0,5 +2011/07/31 22:03:00.954,1306.0,1 +2011/07/31 22:03:01.045,1306.0,1 +2011/07/31 22:03:01.045,1306.0,1 +2011/07/31 22:03:01.324,1306.0,5 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,8 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,5 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,1 +2011/07/31 22:03:01.784,1306.25,3 +2011/07/31 22:03:01.784,1306.5,2 +2011/07/31 22:03:01.784,1306.5,4 +2011/07/31 22:03:01.784,1306.5,2 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,4 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.784,1306.5,8 +2011/07/31 22:03:01.784,1306.5,3 +2011/07/31 22:03:01.784,1306.5,1 +2011/07/31 22:03:01.790,1306.5,2 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.790,1306.5,1 +2011/07/31 22:03:01.795,1306.5,5 +2011/07/31 22:03:01.814,1306.5,1 +2011/07/31 22:03:01.819,1306.5,1 +2011/07/31 22:03:01.819,1306.5,1 +2011/07/31 22:03:01.902,1306.0,2 +2011/07/31 22:03:01.941,1306.0,9 +2011/07/31 22:03:01.941,1306.0,1 +2011/07/31 22:03:01.941,1306.0,1 +2011/07/31 22:03:01.941,1306.0,4 +2011/07/31 22:03:01.941,1306.0,3 +2011/07/31 22:03:01.941,1306.0,1 +2011/07/31 22:03:01.941,1306.0,1 +2011/07/31 22:03:01.970,1306.5,1 +2011/07/31 22:03:01.970,1306.5,1 +2011/07/31 22:03:01.970,1306.5,1 +2011/07/31 22:03:01.981,1306.5,3 +2011/07/31 22:03:01.981,1306.5,1 +2011/07/31 22:03:01.981,1306.5,1 +2011/07/31 22:03:02.193,1306.25,1 +2011/07/31 22:03:02.334,1306.0,4 +2011/07/31 22:03:02.334,1306.0,3 +2011/07/31 22:03:02.334,1306.0,1 +2011/07/31 22:03:02.778,1306.25,1 +2011/07/31 22:03:03.085,1306.25,2 +2011/07/31 22:03:03.386,1306.5,1 +2011/07/31 22:03:03.556,1306.25,1 +2011/07/31 22:03:03.613,1306.25,1 +2011/07/31 22:03:04.341,1306.25,2 +2011/07/31 22:03:04.491,1306.0,1 +2011/07/31 22:03:04.618,1306.0,1 +2011/07/31 22:03:04.618,1306.0,3 +2011/07/31 22:03:04.618,1306.0,3 +2011/07/31 22:03:04.864,1306.25,20 +2011/07/31 22:03:04.864,1306.25,1 +2011/07/31 22:03:04.864,1306.25,1 +2011/07/31 22:03:04.864,1306.25,2 +2011/07/31 22:03:04.864,1306.25,5 +2011/07/31 22:03:04.864,1306.25,5 +2011/07/31 22:03:04.864,1306.25,5 +2011/07/31 22:03:04.950,1306.25,1 +2011/07/31 22:03:05.003,1306.25,1 +2011/07/31 22:03:05.152,1306.25,10 +2011/07/31 22:03:05.222,1306.25,5 +2011/07/31 22:03:05.399,1306.25,5 +2011/07/31 22:03:05.493,1306.5,1 +2011/07/31 22:03:05.635,1306.25,3 +2011/07/31 22:03:05.652,1306.25,1 +2011/07/31 22:03:05.722,1306.5,1 +2011/07/31 22:03:05.809,1306.25,1 +2011/07/31 22:03:05.969,1306.25,1 +2011/07/31 22:03:06.017,1306.5,3 +2011/07/31 22:03:06.017,1306.5,5 +2011/07/31 22:03:06.017,1306.5,1 +2011/07/31 22:03:06.017,1306.5,1 +2011/07/31 22:03:06.104,1306.5,7 +2011/07/31 22:03:06.297,1306.5,2 +2011/07/31 22:03:06.297,1306.5,2 +2011/07/31 22:03:06.297,1306.5,2 +2011/07/31 22:03:06.297,1306.5,1 +2011/07/31 22:03:06.297,1306.5,2 +2011/07/31 22:03:06.297,1306.5,5 +2011/07/31 22:03:06.297,1306.5,1 +2011/07/31 22:03:06.297,1306.5,3 +2011/07/31 22:03:06.297,1306.5,7 +2011/07/31 22:03:06.417,1306.25,2 +2011/07/31 22:03:06.470,1306.5,1 +2011/07/31 22:03:06.649,1306.5,1 +2011/07/31 22:03:06.673,1306.5,1 +2011/07/31 22:03:06.673,1306.5,1 +2011/07/31 22:03:06.673,1306.5,1 +2011/07/31 22:03:06.673,1306.5,1 +2011/07/31 22:03:06.673,1306.75,1 +2011/07/31 22:03:06.673,1306.75,1 +2011/07/31 22:03:06.673,1306.75,1 +2011/07/31 22:03:06.673,1306.75,1 +2011/07/31 22:03:06.673,1306.75,1 +2011/07/31 22:03:06.706,1306.5,1 +2011/07/31 22:03:06.706,1306.75,1 +2011/07/31 22:03:06.706,1306.75,1 +2011/07/31 22:03:06.805,1306.5,1 +2011/07/31 22:03:06.817,1306.5,1 +2011/07/31 22:03:07.057,1306.5,2 +2011/07/31 22:03:07.069,1306.5,1 +2011/07/31 22:03:07.069,1306.5,1 +2011/07/31 22:03:07.123,1306.75,1 +2011/07/31 22:03:07.263,1306.75,2 +2011/07/31 22:03:07.263,1306.75,5 +2011/07/31 22:03:07.263,1306.75,1 +2011/07/31 22:03:07.263,1306.75,1 +2011/07/31 22:03:07.263,1306.75,1 +2011/07/31 22:03:07.637,1306.75,1 +2011/07/31 22:03:07.736,1306.75,1 +2011/07/31 22:03:07.966,1306.5,3 +2011/07/31 22:03:07.966,1306.5,10 +2011/07/31 22:03:07.966,1306.5,1 +2011/07/31 22:03:07.966,1306.5,1 +2011/07/31 22:03:07.966,1306.5,1 +2011/07/31 22:03:07.966,1306.5,1 +2011/07/31 22:03:08.024,1306.5,10 +2011/07/31 22:03:08.034,1306.5,1 +2011/07/31 22:03:08.393,1306.5,3 +2011/07/31 22:03:08.763,1306.5,1 +2011/07/31 22:03:08.846,1306.5,1 +2011/07/31 22:03:09.024,1306.25,30 +2011/07/31 22:03:09.024,1306.25,3 +2011/07/31 22:03:09.477,1306.5,8 +2011/07/31 22:03:09.477,1306.5,2 +2011/07/31 22:03:09.477,1306.5,1 +2011/07/31 22:03:09.477,1306.5,5 +2011/07/31 22:03:09.477,1306.5,4 +2011/07/31 22:03:09.739,1306.25,60 +2011/07/31 22:03:09.970,1306.25,5 +2011/07/31 22:03:10.006,1306.5,1 +2011/07/31 22:03:10.537,1306.5,1 +2011/07/31 22:03:10.627,1306.5,1 +2011/07/31 22:03:10.678,1306.25,8 +2011/07/31 22:03:10.678,1306.25,1 +2011/07/31 22:03:10.678,1306.25,1 +2011/07/31 22:03:10.678,1306.25,1 +2011/07/31 22:03:10.678,1306.25,1 +2011/07/31 22:03:10.693,1306.25,8 +2011/07/31 22:03:10.693,1306.5,3 +2011/07/31 22:03:10.693,1306.5,5 +2011/07/31 22:03:10.693,1306.5,5 +2011/07/31 22:03:10.693,1306.5,2 +2011/07/31 22:03:10.693,1306.5,1 +2011/07/31 22:03:10.693,1306.5,3 +2011/07/31 22:03:10.693,1306.5,1 +2011/07/31 22:03:10.693,1306.5,5 +2011/07/31 22:03:10.693,1306.5,1 +2011/07/31 22:03:10.693,1306.5,2 +2011/07/31 22:03:10.693,1306.5,14 +2011/07/31 22:03:10.757,1306.0,7 +2011/07/31 22:03:10.757,1306.0,8 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,10 +2011/07/31 22:03:10.757,1306.0,4 +2011/07/31 22:03:10.757,1306.0,2 +2011/07/31 22:03:10.757,1306.0,3 +2011/07/31 22:03:10.757,1306.0,5 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,1 +2011/07/31 22:03:10.757,1306.0,10 +2011/07/31 22:03:10.811,1306.0,1 +2011/07/31 22:03:11.074,1306.0,1 +2011/07/31 22:03:11.209,1306.0,1 +2011/07/31 22:03:11.562,1305.75,1 +2011/07/31 22:03:11.562,1305.75,1 +2011/07/31 22:03:11.562,1305.75,1 +2011/07/31 22:03:11.718,1306.0,1 +2011/07/31 22:03:11.943,1305.75,1 +2011/07/31 22:03:12.205,1305.75,3 +2011/07/31 22:03:12.205,1305.75,1 +2011/07/31 22:03:12.205,1305.75,1 +2011/07/31 22:03:12.205,1305.75,3 +2011/07/31 22:03:12.224,1305.5,1 +2011/07/31 22:03:12.224,1305.5,1 +2011/07/31 22:03:12.224,1305.5,2 +2011/07/31 22:03:12.224,1305.5,7 +2011/07/31 22:03:12.224,1305.5,1 +2011/07/31 22:03:12.224,1305.5,1 +2011/07/31 22:03:12.671,1305.5,1 +2011/07/31 22:03:12.944,1305.5,2 +2011/07/31 22:03:13.046,1305.75,1 +2011/07/31 22:03:13.315,1305.5,1 +2011/07/31 22:03:13.315,1305.5,1 +2011/07/31 22:03:13.315,1305.25,3 +2011/07/31 22:03:13.315,1305.25,9 +2011/07/31 22:03:13.369,1305.75,2 +2011/07/31 22:03:13.369,1305.75,1 +2011/07/31 22:03:13.377,1305.75,2 +2011/07/31 22:03:13.741,1305.5,6 +2011/07/31 22:03:13.741,1305.5,3 +2011/07/31 22:03:13.944,1305.75,2 +2011/07/31 22:03:14.474,1305.5,5 +2011/07/31 22:03:14.474,1305.75,4 +2011/07/31 22:03:14.474,1305.75,3 +2011/07/31 22:03:14.474,1305.75,5 +2011/07/31 22:03:14.474,1305.75,4 +2011/07/31 22:03:14.474,1305.75,1 +2011/07/31 22:03:14.474,1305.75,1 +2011/07/31 22:03:14.474,1305.75,1 +2011/07/31 22:03:14.474,1305.75,1 +2011/07/31 22:03:14.480,1305.75,1 +2011/07/31 22:03:14.830,1305.5,1 +2011/07/31 22:03:14.856,1305.5,1 +2011/07/31 22:03:15.243,1305.75,1 +2011/07/31 22:03:15.250,1305.75,1 +2011/07/31 22:03:15.265,1305.5,2 +2011/07/31 22:03:15.814,1305.5,1 +2011/07/31 22:03:16.227,1305.5,1 +2011/07/31 22:03:16.227,1305.5,2 +2011/07/31 22:03:16.227,1305.5,1 +2011/07/31 22:03:16.232,1305.5,6 +2011/07/31 22:03:16.232,1305.75,2 +2011/07/31 22:03:16.232,1305.75,1 +2011/07/31 22:03:16.232,1305.75,4 +2011/07/31 22:03:16.232,1305.75,3 +2011/07/31 22:03:16.232,1305.75,4 +2011/07/31 22:03:16.232,1305.75,1 +2011/07/31 22:03:16.382,1305.5,1 +2011/07/31 22:03:16.387,1305.5,1 +2011/07/31 22:03:16.719,1305.5,1 +2011/07/31 22:03:16.719,1305.5,4 +2011/07/31 22:03:17.167,1305.5,1 +2011/07/31 22:03:17.167,1305.5,1 +2011/07/31 22:03:17.611,1305.5,2 +2011/07/31 22:03:18.058,1305.5,1 +2011/07/31 22:03:18.201,1305.5,1 +2011/07/31 22:03:18.524,1305.5,1 +2011/07/31 22:03:18.922,1305.75,1 +2011/07/31 22:03:18.922,1305.5,1 +2011/07/31 22:03:18.922,1305.5,1 +2011/07/31 22:03:18.922,1305.5,1 +2011/07/31 22:03:18.957,1305.25,10 +2011/07/31 22:03:19.088,1305.5,1 +2011/07/31 22:03:19.158,1305.25,9 +2011/07/31 22:03:19.158,1305.25,1 +2011/07/31 22:03:19.235,1305.5,1 +2011/07/31 22:03:19.256,1305.5,5 +2011/07/31 22:03:20.303,1305.5,2 +2011/07/31 22:03:20.487,1305.5,1 +2011/07/31 22:03:20.487,1305.5,1 +2011/07/31 22:03:21.249,1305.25,1 +2011/07/31 22:03:21.263,1305.25,2 +2011/07/31 22:03:21.263,1305.25,1 +2011/07/31 22:03:22.049,1305.5,1 +2011/07/31 22:03:22.488,1305.5,5 +2011/07/31 22:03:22.720,1305.5,2 +2011/07/31 22:03:22.720,1305.5,1 +2011/07/31 22:03:22.720,1305.5,1 +2011/07/31 22:03:22.829,1305.5,10 +2011/07/31 22:03:22.829,1305.5,5 +2011/07/31 22:03:22.829,1305.5,5 +2011/07/31 22:03:22.829,1305.5,5 +2011/07/31 22:03:22.829,1305.5,1 +2011/07/31 22:03:22.829,1305.5,1 +2011/07/31 22:03:22.829,1305.5,1 +2011/07/31 22:03:22.829,1305.5,4 +2011/07/31 22:03:22.829,1305.5,1 +2011/07/31 22:03:22.829,1305.5,4 +2011/07/31 22:03:22.829,1305.5,3 +2011/07/31 22:03:22.829,1305.5,22 +2011/07/31 22:03:22.875,1305.5,1 +2011/07/31 22:03:22.905,1305.25,1 +2011/07/31 22:03:23.592,1305.5,1 +2011/07/31 22:03:23.608,1305.5,1 +2011/07/31 22:03:23.671,1305.25,2 +2011/07/31 22:03:23.671,1305.25,2 +2011/07/31 22:03:23.671,1305.5,1 +2011/07/31 22:03:24.862,1305.25,1 +2011/07/31 22:03:25.369,1305.25,1 +2011/07/31 22:03:25.624,1305.5,2 +2011/07/31 22:03:26.651,1305.25,1 +2011/07/31 22:03:26.905,1305.25,1 +2011/07/31 22:03:27.811,1305.25,1 +2011/07/31 22:03:28.052,1305.5,3 +2011/07/31 22:03:28.052,1305.5,1 +2011/07/31 22:03:28.052,1305.5,5 +2011/07/31 22:03:28.052,1305.5,4 +2011/07/31 22:03:28.052,1305.5,5 +2011/07/31 22:03:28.052,1305.5,1 +2011/07/31 22:03:28.052,1305.5,2 +2011/07/31 22:03:28.052,1305.5,25 +2011/07/31 22:03:28.052,1305.5,5 +2011/07/31 22:03:28.052,1305.5,2 +2011/07/31 22:03:28.052,1305.5,1 +2011/07/31 22:03:28.052,1305.5,1 +2011/07/31 22:03:28.052,1305.5,5 +2011/07/31 22:03:28.052,1305.5,2 +2011/07/31 22:03:28.052,1305.5,1 +2011/07/31 22:03:28.057,1305.75,2 +2011/07/31 22:03:28.131,1305.5,5 +2011/07/31 22:03:28.932,1305.5,1 +2011/07/31 22:03:29.219,1305.5,1 +2011/07/31 22:03:29.658,1305.5,2 +2011/07/31 22:03:29.744,1305.75,2 +2011/07/31 22:03:29.744,1305.75,5 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,40 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,2 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,5 +2011/07/31 22:03:29.744,1305.75,5 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,1 +2011/07/31 22:03:29.744,1305.75,5 +2011/07/31 22:03:29.943,1305.75,5 +2011/07/31 22:03:30.120,1305.75,1 +2011/07/31 22:03:30.230,1305.75,1 +2011/07/31 22:03:30.659,1305.75,1 +2011/07/31 22:03:30.769,1306.0,2 +2011/07/31 22:03:31.049,1306.0,1 +2011/07/31 22:03:31.411,1306.0,37 +2011/07/31 22:03:31.411,1306.0,3 +2011/07/31 22:03:31.499,1306.0,2 +2011/07/31 22:03:31.499,1306.0,4 +2011/07/31 22:03:31.499,1306.0,4 +2011/07/31 22:03:31.860,1306.0,1 +2011/07/31 22:03:32.077,1306.0,1 +2011/07/31 22:03:32.120,1306.0,25 +2011/07/31 22:03:32.120,1306.0,1 +2011/07/31 22:03:32.120,1306.0,5 +2011/07/31 22:03:32.120,1306.0,1 +2011/07/31 22:03:32.120,1306.0,1 +2011/07/31 22:03:32.120,1306.0,4 +2011/07/31 22:03:32.120,1306.0,1 +2011/07/31 22:03:32.120,1306.0,1 +2011/07/31 22:03:32.126,1306.0,1 +2011/07/31 22:03:32.140,1306.0,6 +2011/07/31 22:03:32.145,1306.0,4 +2011/07/31 22:03:32.324,1306.0,1 +2011/07/31 22:03:32.519,1306.0,1 +2011/07/31 22:03:32.519,1305.75,15 +2011/07/31 22:03:32.586,1306.0,2 +2011/07/31 22:03:32.610,1306.0,2 +2011/07/31 22:03:32.667,1306.0,1 +2011/07/31 22:03:32.667,1306.0,1 +2011/07/31 22:03:32.784,1306.0,1 +2011/07/31 22:03:32.817,1306.0,1 +2011/07/31 22:03:32.889,1306.0,1 +2011/07/31 22:03:32.913,1306.0,1 +2011/07/31 22:03:33.464,1306.0,15 +2011/07/31 22:03:34.217,1306.0,1 +2011/07/31 22:03:34.498,1306.0,1 +2011/07/31 22:03:34.498,1305.75,1 +2011/07/31 22:03:34.927,1306.0,1 +2011/07/31 22:03:34.993,1306.0,1 +2011/07/31 22:03:35.075,1306.0,1 +2011/07/31 22:03:35.289,1306.0,1 +2011/07/31 22:03:35.600,1306.0,1 +2011/07/31 22:03:35.682,1306.0,1 +2011/07/31 22:03:35.706,1306.0,1 +2011/07/31 22:03:35.805,1306.25,2 +2011/07/31 22:03:35.857,1306.25,1 +2011/07/31 22:03:36.022,1306.0,1 +2011/07/31 22:03:36.022,1306.0,1 +2011/07/31 22:03:36.084,1306.0,2 +2011/07/31 22:03:36.084,1306.0,8 +2011/07/31 22:03:36.128,1306.25,1 +2011/07/31 22:03:36.174,1306.0,2 +2011/07/31 22:03:36.411,1306.0,1 +2011/07/31 22:03:36.411,1306.0,1 +2011/07/31 22:03:36.411,1306.0,28 +2011/07/31 22:03:37.248,1306.25,16 +2011/07/31 22:03:37.248,1306.25,4 +2011/07/31 22:03:37.248,1306.25,5 +2011/07/31 22:03:37.248,1306.25,10 +2011/07/31 22:03:37.248,1306.25,5 +2011/07/31 22:03:37.248,1306.25,1 +2011/07/31 22:03:37.248,1306.25,3 +2011/07/31 22:03:37.248,1306.25,1 +2011/07/31 22:03:37.248,1306.25,1 +2011/07/31 22:03:37.248,1306.25,4 +2011/07/31 22:03:37.253,1306.25,1 +2011/07/31 22:03:37.273,1306.25,91 +2011/07/31 22:03:37.306,1306.25,1 +2011/07/31 22:03:37.306,1306.25,2 +2011/07/31 22:03:37.858,1306.5,1 +2011/07/31 22:03:37.967,1306.25,10 +2011/07/31 22:03:38.044,1306.5,1 +2011/07/31 22:03:38.400,1306.5,1 +2011/07/31 22:03:38.400,1306.5,1 +2011/07/31 22:03:38.400,1306.5,2 +2011/07/31 22:03:38.400,1306.5,1 +2011/07/31 22:03:38.400,1306.5,5 +2011/07/31 22:03:38.434,1306.5,1 +2011/07/31 22:03:38.469,1306.5,1 +2011/07/31 22:03:38.469,1306.5,1 +2011/07/31 22:03:38.681,1306.25,5 +2011/07/31 22:03:39.295,1306.25,4 +2011/07/31 22:03:39.815,1306.25,2 +2011/07/31 22:03:39.868,1306.5,1 +2011/07/31 22:03:40.076,1306.25,6 +2011/07/31 22:03:40.123,1306.25,6 +2011/07/31 22:03:40.123,1306.25,16 +2011/07/31 22:03:40.123,1306.25,5 +2011/07/31 22:03:40.430,1306.25,20 +2011/07/31 22:03:40.556,1306.25,9 +2011/07/31 22:03:40.556,1306.25,2 +2011/07/31 22:03:40.556,1306.25,4 +2011/07/31 22:03:40.556,1306.25,1 +2011/07/31 22:03:40.556,1306.25,1 +2011/07/31 22:03:43.265,1306.25,1 +2011/07/31 22:03:43.333,1306.25,2 +2011/07/31 22:03:43.333,1306.25,4 +2011/07/31 22:03:43.333,1306.25,1 +2011/07/31 22:03:43.333,1306.25,1 +2011/07/31 22:03:43.333,1306.25,1 +2011/07/31 22:03:43.333,1306.25,1 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,3 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,4 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,3 +2011/07/31 22:03:43.333,1306.5,20 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,1 +2011/07/31 22:03:43.333,1306.5,2 +2011/07/31 22:03:43.786,1306.0,1 +2011/07/31 22:03:43.811,1306.25,1 +2011/07/31 22:03:44.206,1306.0,21 +2011/07/31 22:03:44.206,1306.0,9 +2011/07/31 22:03:44.268,1306.0,1 +2011/07/31 22:03:44.268,1306.0,3 +2011/07/31 22:03:44.426,1306.25,1 +2011/07/31 22:03:44.443,1306.25,4 +2011/07/31 22:03:44.550,1306.25,4 +2011/07/31 22:03:44.550,1306.25,3 +2011/07/31 22:03:44.782,1306.5,1 +2011/07/31 22:03:44.933,1306.5,1 +2011/07/31 22:03:45.444,1306.25,1 +2011/07/31 22:03:45.444,1306.25,2 +2011/07/31 22:03:45.444,1306.25,2 +2011/07/31 22:03:45.444,1306.25,5 +2011/07/31 22:03:45.444,1306.25,2 +2011/07/31 22:03:45.444,1306.25,1 +2011/07/31 22:03:45.444,1306.25,3 +2011/07/31 22:03:45.583,1306.25,2 +2011/07/31 22:03:45.699,1306.5,1 +2011/07/31 22:03:45.749,1306.5,1 +2011/07/31 22:03:45.749,1306.5,1 +2011/07/31 22:03:45.749,1306.5,1 +2011/07/31 22:03:45.749,1306.5,1 +2011/07/31 22:03:45.749,1306.5,2 +2011/07/31 22:03:45.749,1306.5,1 +2011/07/31 22:03:45.749,1306.5,3 +2011/07/31 22:03:45.926,1306.5,1 +2011/07/31 22:03:46.228,1306.25,2 +2011/07/31 22:03:46.228,1306.25,1 +2011/07/31 22:03:46.617,1306.25,2 +2011/07/31 22:03:46.788,1306.5,2 +2011/07/31 22:03:47.182,1306.25,3 +2011/07/31 22:03:47.182,1306.25,1 +2011/07/31 22:03:47.182,1306.25,1 +2011/07/31 22:03:47.182,1306.0,4 +2011/07/31 22:03:47.182,1306.0,4 +2011/07/31 22:03:47.182,1306.0,1 +2011/07/31 22:03:47.182,1306.0,1 +2011/07/31 22:03:47.182,1306.0,1 +2011/07/31 22:03:47.182,1306.0,50 +2011/07/31 22:03:47.182,1306.0,3 +2011/07/31 22:03:47.182,1306.0,5 +2011/07/31 22:03:47.182,1306.0,1 +2011/07/31 22:03:47.182,1306.0,5 +2011/07/31 22:03:47.182,1306.0,1 +2011/07/31 22:03:47.182,1306.0,50 +2011/07/31 22:03:47.182,1306.0,14 +2011/07/31 22:03:47.335,1306.25,1 +2011/07/31 22:03:47.389,1306.25,2 +2011/07/31 22:03:47.586,1306.25,2 +2011/07/31 22:03:48.391,1306.0,30 +2011/07/31 22:03:48.401,1306.0,1 +2011/07/31 22:03:48.401,1306.0,5 +2011/07/31 22:03:48.401,1306.0,1 +2011/07/31 22:03:48.401,1306.0,1 +2011/07/31 22:03:48.594,1306.25,1 +2011/07/31 22:03:48.888,1306.0,1 +2011/07/31 22:03:49.313,1306.0,1 +2011/07/31 22:03:49.826,1306.0,1 +2011/07/31 22:03:50.474,1306.0,13 +2011/07/31 22:03:50.946,1306.0,14 +2011/07/31 22:03:51.402,1306.0,2 +2011/07/31 22:03:51.644,1306.0,17 +2011/07/31 22:03:51.644,1306.0,1 +2011/07/31 22:03:51.644,1306.0,7 +2011/07/31 22:03:52.143,1306.0,1 +2011/07/31 22:03:52.184,1306.25,4 +2011/07/31 22:03:52.678,1306.0,3 +2011/07/31 22:03:52.678,1306.0,6 +2011/07/31 22:03:56.885,1306.25,1 +2011/07/31 22:03:56.926,1306.25,1 +2011/07/31 22:03:56.926,1306.25,1 +2011/07/31 22:03:57.439,1306.25,2 +2011/07/31 22:03:57.439,1306.25,4 +2011/07/31 22:03:57.439,1306.25,1 +2011/07/31 22:03:57.439,1306.25,1 +2011/07/31 22:03:57.439,1306.25,5 +2011/07/31 22:03:57.439,1306.25,2 +2011/07/31 22:03:57.439,1306.25,1 +2011/07/31 22:03:57.439,1306.25,4 +2011/07/31 22:03:57.567,1306.25,1 +2011/07/31 22:03:57.567,1306.25,4 +2011/07/31 22:03:57.567,1306.25,5 +2011/07/31 22:03:57.567,1306.25,4 +2011/07/31 22:03:57.567,1306.25,1 +2011/07/31 22:03:57.567,1306.25,2 +2011/07/31 22:03:57.567,1306.25,1 +2011/07/31 22:03:57.567,1306.25,1 +2011/07/31 22:03:57.567,1306.25,1 +2011/07/31 22:03:57.717,1306.25,1 +2011/07/31 22:03:57.717,1306.25,2 +2011/07/31 22:03:57.793,1306.5,1 +2011/07/31 22:03:58.065,1306.25,6 +2011/07/31 22:03:59.185,1306.25,4 +2011/07/31 22:04:01.045,1306.25,1 +2011/07/31 22:04:02.540,1306.25,30 +2011/07/31 22:04:02.831,1306.25,1 +2011/07/31 22:04:02.831,1306.5,1 +2011/07/31 22:04:03.620,1306.25,1 +2011/07/31 22:04:04.060,1306.5,1 +2011/07/31 22:04:04.066,1306.25,1 +2011/07/31 22:04:04.110,1306.25,3 +2011/07/31 22:04:04.110,1306.25,2 +2011/07/31 22:04:04.335,1306.5,1 +2011/07/31 22:04:04.335,1306.5,1 +2011/07/31 22:04:04.363,1306.25,1 +2011/07/31 22:04:04.363,1306.25,1 +2011/07/31 22:04:04.602,1306.5,1 +2011/07/31 22:04:05.035,1306.5,1 +2011/07/31 22:04:05.297,1306.5,4 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,3 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,2 +2011/07/31 22:04:05.297,1306.5,2 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,5 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,4 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,5 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,2 +2011/07/31 22:04:05.297,1306.5,38 +2011/07/31 22:04:05.297,1306.5,5 +2011/07/31 22:04:05.297,1306.5,10 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.297,1306.5,1 +2011/07/31 22:04:05.333,1306.5,31 +2011/07/31 22:04:05.564,1306.5,1 +2011/07/31 22:04:06.599,1306.75,2 +2011/07/31 22:04:07.173,1306.5,4 +2011/07/31 22:04:07.363,1306.75,1 +2011/07/31 22:04:07.363,1306.75,1 +2011/07/31 22:04:07.576,1306.5,123 +2011/07/31 22:04:07.576,1306.5,3 +2011/07/31 22:04:07.576,1306.5,5 +2011/07/31 22:04:08.407,1306.25,5 +2011/07/31 22:04:08.407,1306.25,5 +2011/07/31 22:04:08.407,1306.25,1 +2011/07/31 22:04:08.407,1306.25,1 +2011/07/31 22:04:08.407,1306.25,4 +2011/07/31 22:04:08.407,1306.25,1 +2011/07/31 22:04:08.407,1306.25,5 +2011/07/31 22:04:09.307,1306.25,5 +2011/07/31 22:04:09.500,1306.25,13 +2011/07/31 22:04:09.500,1306.25,2 +2011/07/31 22:04:09.500,1306.25,4 +2011/07/31 22:04:09.500,1306.25,10 +2011/07/31 22:04:09.671,1306.25,3 +2011/07/31 22:04:10.797,1306.25,18 +2011/07/31 22:04:10.797,1306.25,1 +2011/07/31 22:04:10.797,1306.25,4 +2011/07/31 22:04:10.797,1306.25,1 +2011/07/31 22:04:10.797,1306.25,1 +2011/07/31 22:04:11.120,1306.25,1 +2011/07/31 22:04:11.210,1306.5,1 +2011/07/31 22:04:11.257,1306.5,1 +2011/07/31 22:04:11.492,1306.25,2 +2011/07/31 22:04:11.492,1306.25,6 +2011/07/31 22:04:11.492,1306.25,1 +2011/07/31 22:04:11.847,1306.25,22 +2011/07/31 22:04:11.847,1306.5,3 +2011/07/31 22:04:12.028,1306.25,1 +2011/07/31 22:04:12.532,1306.25,2 +2011/07/31 22:04:12.554,1306.25,2 +2011/07/31 22:04:13.201,1306.25,1 +2011/07/31 22:04:13.251,1306.25,1 +2011/07/31 22:04:13.802,1306.25,1 +2011/07/31 22:04:13.982,1306.0,4 +2011/07/31 22:04:14.806,1306.25,4 +2011/07/31 22:04:16.102,1306.0,20 +2011/07/31 22:04:16.182,1306.25,1 +2011/07/31 22:04:16.231,1306.0,20 +2011/07/31 22:04:17.845,1306.0,1 +2011/07/31 22:04:17.845,1306.0,1 +2011/07/31 22:04:18.240,1306.25,1 +2011/07/31 22:04:18.357,1306.25,1 +2011/07/31 22:04:18.357,1306.25,3 +2011/07/31 22:04:18.357,1306.25,1 +2011/07/31 22:04:18.357,1306.25,5 +2011/07/31 22:04:18.357,1306.25,1 +2011/07/31 22:04:18.357,1306.25,20 +2011/07/31 22:04:19.195,1306.0,1 +2011/07/31 22:04:21.410,1306.0,1 +2011/07/31 22:04:22.047,1306.0,1 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,2 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,8 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,2 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,1 +2011/07/31 22:04:22.393,1306.0,40 +2011/07/31 22:04:23.188,1306.0,10 +2011/07/31 22:04:23.188,1306.0,1 +2011/07/31 22:04:23.188,1306.0,1 +2011/07/31 22:04:23.188,1306.0,13 +2011/07/31 22:04:23.408,1306.0,1 +2011/07/31 22:04:23.545,1306.0,1 +2011/07/31 22:04:23.689,1306.0,1 +2011/07/31 22:04:24.210,1306.0,25 +2011/07/31 22:04:24.300,1306.25,2 +2011/07/31 22:04:24.503,1306.0,9 +2011/07/31 22:04:24.503,1306.0,1 +2011/07/31 22:04:26.857,1306.25,1 +2011/07/31 22:04:27.185,1306.0,1 +2011/07/31 22:04:27.244,1306.25,2 +2011/07/31 22:04:27.244,1306.25,20 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,3 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,3 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.25,1 +2011/07/31 22:04:27.244,1306.5,11 +2011/07/31 22:04:27.726,1306.25,1 +2011/07/31 22:04:27.945,1306.25,19 +2011/07/31 22:04:27.945,1306.25,3 +2011/07/31 22:04:27.945,1306.25,3 +2011/07/31 22:04:29.389,1306.25,7 +2011/07/31 22:04:29.389,1306.25,5 +2011/07/31 22:04:29.389,1306.25,3 +2011/07/31 22:04:29.389,1306.25,3 +2011/07/31 22:04:29.389,1306.25,5 +2011/07/31 22:04:29.389,1306.25,1 +2011/07/31 22:04:29.389,1306.0,1 +2011/07/31 22:04:29.389,1306.0,5 +2011/07/31 22:04:29.843,1306.0,15 +2011/07/31 22:04:29.843,1306.0,5 +2011/07/31 22:04:30.829,1306.25,2 +2011/07/31 22:04:31.900,1306.25,3 +2011/07/31 22:04:33.238,1306.25,2 +2011/07/31 22:04:34.297,1306.5,1 +2011/07/31 22:04:36.581,1306.25,8 +2011/07/31 22:04:36.581,1306.25,1 +2011/07/31 22:04:36.581,1306.25,1 +2011/07/31 22:04:37.265,1306.0,45 +2011/07/31 22:04:37.265,1306.0,1 +2011/07/31 22:04:37.265,1306.0,3 +2011/07/31 22:04:37.265,1306.0,1 +2011/07/31 22:04:40.644,1306.0,10 +2011/07/31 22:04:41.067,1306.25,2 +2011/07/31 22:04:41.833,1306.25,6 +2011/07/31 22:04:42.884,1306.25,5 +2011/07/31 22:04:42.884,1306.25,7 +2011/07/31 22:04:42.884,1306.25,13 +2011/07/31 22:04:42.908,1306.25,10 +2011/07/31 22:04:43.137,1306.0,48 +2011/07/31 22:04:45.215,1306.25,2 +2011/07/31 22:04:45.215,1306.25,3 +2011/07/31 22:04:45.255,1306.25,1 +2011/07/31 22:04:46.143,1306.25,1 +2011/07/31 22:04:46.911,1306.25,1 +2011/07/31 22:04:46.911,1306.25,2 +2011/07/31 22:04:46.911,1306.25,1 +2011/07/31 22:04:46.911,1306.25,1 +2011/07/31 22:04:47.442,1306.0,1 +2011/07/31 22:04:47.811,1306.0,30 +2011/07/31 22:04:48.239,1306.0,25 +2011/07/31 22:04:48.314,1306.0,10 +2011/07/31 22:04:48.525,1306.0,2 +2011/07/31 22:04:48.660,1306.25,1 +2011/07/31 22:04:48.752,1306.0,1 +2011/07/31 22:04:48.904,1306.0,4 +2011/07/31 22:04:49.986,1306.25,1 +2011/07/31 22:04:50.057,1306.0,1 +2011/07/31 22:04:50.719,1306.25,1 +2011/07/31 22:04:51.209,1306.0,17 +2011/07/31 22:04:51.209,1306.0,1 +2011/07/31 22:04:51.209,1306.0,1 +2011/07/31 22:04:51.209,1306.0,5 +2011/07/31 22:04:51.209,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,4 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.775,1306.0,1 +2011/07/31 22:04:51.786,1306.0,5 +2011/07/31 22:04:51.967,1306.0,1 +2011/07/31 22:04:52.156,1305.75,4 +2011/07/31 22:04:52.156,1305.75,3 +2011/07/31 22:04:52.156,1305.75,1 +2011/07/31 22:04:52.156,1305.75,4 +2011/07/31 22:04:52.156,1305.75,1 +2011/07/31 22:04:52.156,1305.75,5 +2011/07/31 22:04:52.156,1305.75,4 +2011/07/31 22:04:52.156,1305.75,1 +2011/07/31 22:04:52.156,1305.75,1 +2011/07/31 22:04:52.156,1305.75,1 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.469,1305.75,5 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.469,1305.75,2 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.469,1305.75,10 +2011/07/31 22:04:52.469,1305.75,2 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.469,1305.75,1 +2011/07/31 22:04:52.651,1305.75,25 +2011/07/31 22:04:52.701,1305.75,10 +2011/07/31 22:04:52.840,1305.75,15 +2011/07/31 22:04:52.840,1305.75,1 +2011/07/31 22:04:52.840,1305.75,1 +2011/07/31 22:04:52.840,1305.75,43 +2011/07/31 22:04:52.876,1305.75,7 +2011/07/31 22:04:52.876,1305.75,18 +2011/07/31 22:04:53.090,1305.75,5 +2011/07/31 22:04:53.121,1305.75,10 +2011/07/31 22:04:53.204,1305.75,4 +2011/07/31 22:04:53.477,1305.75,4 +2011/07/31 22:04:53.534,1305.75,9 +2011/07/31 22:04:53.534,1305.75,1 +2011/07/31 22:04:53.780,1305.75,5 +2011/07/31 22:04:53.897,1306.0,3 +2011/07/31 22:04:54.030,1305.75,4 +2011/07/31 22:04:55.104,1306.0,4 +2011/07/31 22:04:55.159,1306.0,1 +2011/07/31 22:04:55.159,1306.0,2 +2011/07/31 22:04:55.159,1306.0,1 +2011/07/31 22:04:55.159,1306.0,10 +2011/07/31 22:04:55.159,1306.0,3 +2011/07/31 22:04:55.159,1306.0,4 +2011/07/31 22:04:55.159,1306.0,4 +2011/07/31 22:04:55.159,1306.0,5 +2011/07/31 22:04:55.159,1306.0,10 +2011/07/31 22:04:55.159,1306.0,5 +2011/07/31 22:04:55.159,1306.0,5 +2011/07/31 22:04:56.494,1306.0,8 +2011/07/31 22:04:56.494,1306.0,10 +2011/07/31 22:04:56.494,1306.0,4 +2011/07/31 22:04:56.494,1306.0,3 +2011/07/31 22:04:56.494,1306.0,1 +2011/07/31 22:04:56.494,1305.75,15 +2011/07/31 22:04:56.494,1305.75,9 +2011/07/31 22:04:57.111,1306.0,1 +2011/07/31 22:04:57.111,1306.0,1 +2011/07/31 22:04:57.135,1306.0,1 +2011/07/31 22:04:58.004,1306.0,2 +2011/07/31 22:04:58.956,1306.0,2 +2011/07/31 22:04:59.299,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,5 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,4 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,4 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,4 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:00.126,1306.0,1 +2011/07/31 22:05:02.843,1306.0,4 +2011/07/31 22:05:02.843,1306.0,2 +2011/07/31 22:05:02.843,1306.0,1 +2011/07/31 22:05:02.966,1306.0,3 +2011/07/31 22:05:03.125,1306.0,1 +2011/07/31 22:05:03.462,1306.0,189 +2011/07/31 22:05:03.462,1306.0,3 +2011/07/31 22:05:03.462,1306.0,8 +2011/07/31 22:05:04.067,1306.0,17 +2011/07/31 22:05:04.067,1306.0,13 +2011/07/31 22:05:04.080,1306.0,1 +2011/07/31 22:05:06.479,1306.0,1 +2011/07/31 22:05:08.324,1306.0,1 +2011/07/31 22:05:09.308,1306.25,4 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,5 +2011/07/31 22:05:09.308,1306.25,5 +2011/07/31 22:05:09.308,1306.25,15 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,2 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,5 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.308,1306.25,5 +2011/07/31 22:05:09.308,1306.25,1 +2011/07/31 22:05:09.342,1306.0,2 +2011/07/31 22:05:09.342,1306.0,2 +2011/07/31 22:05:09.342,1306.0,2 +2011/07/31 22:05:10.358,1306.0,3 +2011/07/31 22:05:10.358,1306.0,1 +2011/07/31 22:05:10.358,1306.0,4 +2011/07/31 22:05:10.358,1306.0,1 +2011/07/31 22:05:10.358,1306.0,4 +2011/07/31 22:05:10.358,1306.0,1 +2011/07/31 22:05:10.358,1306.0,1 +2011/07/31 22:05:10.358,1306.0,3 +2011/07/31 22:05:10.358,1306.0,10 +2011/07/31 22:05:10.358,1306.0,3 +2011/07/31 22:05:14.837,1306.0,1 +2011/07/31 22:05:17.871,1306.25,1 +2011/07/31 22:05:17.871,1306.25,1 +2011/07/31 22:05:17.871,1306.25,1 +2011/07/31 22:05:19.632,1306.25,3 +2011/07/31 22:05:19.632,1306.25,1 +2011/07/31 22:05:19.632,1306.25,5 +2011/07/31 22:05:19.632,1306.25,1 +2011/07/31 22:05:19.632,1306.25,1 +2011/07/31 22:05:19.632,1306.25,14 +2011/07/31 22:05:22.750,1306.25,2 +2011/07/31 22:05:23.448,1306.0,1 +2011/07/31 22:05:30.554,1306.0,5 +2011/07/31 22:05:30.554,1306.0,5 +2011/07/31 22:05:30.554,1306.0,1 +2011/07/31 22:05:30.554,1306.0,1 +2011/07/31 22:05:30.554,1306.0,19 +2011/07/31 22:05:30.554,1306.0,1 +2011/07/31 22:05:30.554,1306.0,1 +2011/07/31 22:05:30.554,1306.0,1 +2011/07/31 22:05:30.554,1306.0,3 +2011/07/31 22:05:31.288,1306.0,3 +2011/07/31 22:05:31.695,1306.0,2 +2011/07/31 22:05:31.802,1306.0,8 +2011/07/31 22:05:31.802,1306.0,7 +2011/07/31 22:05:31.802,1306.0,1 +2011/07/31 22:05:33.692,1306.25,4 +2011/07/31 22:05:34.329,1306.0,1 +2011/07/31 22:05:34.443,1306.0,9 +2011/07/31 22:05:34.443,1306.0,1 +2011/07/31 22:05:34.562,1306.0,2 +2011/07/31 22:05:39.011,1306.0,2 +2011/07/31 22:05:39.011,1306.0,2 +2011/07/31 22:05:39.011,1306.0,2 +2011/07/31 22:05:39.011,1306.0,1 +2011/07/31 22:05:39.011,1306.0,5 +2011/07/31 22:05:39.011,1306.0,1 +2011/07/31 22:05:39.011,1306.0,2 +2011/07/31 22:05:39.871,1306.0,2 +2011/07/31 22:05:40.835,1305.75,41 +2011/07/31 22:05:40.835,1305.75,3 +2011/07/31 22:05:40.835,1305.75,6 +2011/07/31 22:05:42.253,1305.75,1 +2011/07/31 22:05:42.417,1305.75,1 +2011/07/31 22:05:42.417,1305.75,5 +2011/07/31 22:05:42.417,1305.75,1 +2011/07/31 22:05:42.417,1305.75,1 +2011/07/31 22:05:42.417,1305.75,2 +2011/07/31 22:05:46.422,1305.75,1 +2011/07/31 22:05:47.791,1305.75,7 +2011/07/31 22:05:48.024,1305.75,15 +2011/07/31 22:05:48.024,1305.75,1 +2011/07/31 22:05:48.024,1305.75,26 +2011/07/31 22:05:48.024,1305.75,1 +2011/07/31 22:05:48.024,1305.75,1 +2011/07/31 22:05:48.413,1305.75,1 +2011/07/31 22:05:48.544,1305.75,1 +2011/07/31 22:05:48.578,1305.75,3 +2011/07/31 22:05:48.791,1305.75,1 +2011/07/31 22:05:49.008,1305.75,1 +2011/07/31 22:05:49.020,1305.75,3 +2011/07/31 22:05:49.737,1305.75,1 +2011/07/31 22:05:51.355,1305.75,11 +2011/07/31 22:05:51.355,1305.75,5 +2011/07/31 22:05:51.355,1305.75,9 +2011/07/31 22:05:51.605,1305.75,1 +2011/07/31 22:05:52.472,1305.75,1 +2011/07/31 22:05:53.424,1305.75,1 +2011/07/31 22:05:55.103,1305.75,1 +2011/07/31 22:05:55.158,1305.75,5 +2011/07/31 22:05:56.561,1305.75,2 +2011/07/31 22:05:56.809,1305.75,2 +2011/07/31 22:06:00.647,1305.75,1 +2011/07/31 22:06:01.476,1305.75,1 +2011/07/31 22:06:03.749,1305.75,1 +2011/07/31 22:06:04.417,1305.75,14 +2011/07/31 22:06:04.425,1305.75,1 +2011/07/31 22:06:04.788,1305.75,1 +2011/07/31 22:06:05.123,1305.75,1 +2011/07/31 22:06:05.236,1305.75,1 +2011/07/31 22:06:06.110,1305.75,7 +2011/07/31 22:06:06.110,1305.75,3 +2011/07/31 22:06:06.864,1305.75,1 +2011/07/31 22:06:06.954,1305.75,1 +2011/07/31 22:06:07.061,1306.0,1 +2011/07/31 22:06:07.447,1305.75,1 +2011/07/31 22:06:07.628,1306.0,5 +2011/07/31 22:06:08.638,1306.0,1 +2011/07/31 22:06:11.009,1306.0,1 +2011/07/31 22:06:14.190,1306.0,1 +2011/07/31 22:06:14.722,1305.75,1 +2011/07/31 22:06:15.986,1306.0,4 +2011/07/31 22:06:15.986,1306.0,20 +2011/07/31 22:06:15.986,1306.0,2 +2011/07/31 22:06:15.986,1306.0,30 +2011/07/31 22:06:15.986,1306.0,5 +2011/07/31 22:06:15.986,1306.0,2 +2011/07/31 22:06:15.986,1306.0,1 +2011/07/31 22:06:15.986,1306.0,1 +2011/07/31 22:06:15.986,1306.0,1 +2011/07/31 22:06:15.986,1306.0,34 +2011/07/31 22:06:16.105,1305.75,1 +2011/07/31 22:06:17.077,1305.75,1 +2011/07/31 22:06:17.703,1305.75,4 +2011/07/31 22:06:17.932,1306.0,1 +2011/07/31 22:06:18.483,1305.75,1 +2011/07/31 22:06:18.963,1305.75,1 +2011/07/31 22:06:19.209,1305.75,1 +2011/07/31 22:06:20.163,1305.75,2 +2011/07/31 22:06:20.163,1305.75,3 +2011/07/31 22:06:20.311,1305.75,5 +2011/07/31 22:06:20.515,1305.75,1 +2011/07/31 22:06:20.871,1305.75,1 +2011/07/31 22:06:20.930,1305.75,15 +2011/07/31 22:06:20.930,1305.75,1 +2011/07/31 22:06:20.930,1305.75,1 +2011/07/31 22:06:20.930,1305.75,3 +2011/07/31 22:06:21.333,1306.0,1 +2011/07/31 22:06:21.467,1305.75,10 +2011/07/31 22:06:24.043,1305.75,5 +2011/07/31 22:06:24.282,1305.75,1 +2011/07/31 22:06:25.131,1305.75,25 +2011/07/31 22:06:25.147,1305.75,6 +2011/07/31 22:06:25.147,1305.75,1 +2011/07/31 22:06:25.500,1305.75,1 +2011/07/31 22:06:26.076,1306.0,1 +2011/07/31 22:06:26.270,1305.75,3 +2011/07/31 22:06:26.843,1305.75,1 +2011/07/31 22:06:27.689,1305.75,3 +2011/07/31 22:06:29.652,1305.75,1 +2011/07/31 22:06:29.970,1306.0,13 +2011/07/31 22:06:29.970,1306.0,1 +2011/07/31 22:06:29.970,1306.0,24 +2011/07/31 22:06:29.970,1306.0,2 +2011/07/31 22:06:29.970,1306.0,1 +2011/07/31 22:06:29.970,1306.0,54 +2011/07/31 22:06:29.989,1305.75,1 +2011/07/31 22:06:30.314,1306.0,11 +2011/07/31 22:06:30.314,1306.0,2 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,37 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,10 +2011/07/31 22:06:30.314,1306.0,2 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,5 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,1 +2011/07/31 22:06:30.314,1306.0,10 +2011/07/31 22:06:30.668,1306.0,1 +2011/07/31 22:06:30.791,1306.0,1 +2011/07/31 22:06:30.970,1306.0,10 +2011/07/31 22:06:30.983,1306.0,2 +2011/07/31 22:06:31.069,1306.0,6 +2011/07/31 22:06:31.069,1306.0,1 +2011/07/31 22:06:31.069,1306.0,1 +2011/07/31 22:06:31.069,1306.0,2 +2011/07/31 22:06:31.069,1306.0,2 +2011/07/31 22:06:31.069,1306.0,2 +2011/07/31 22:06:31.069,1306.0,1 +2011/07/31 22:06:31.991,1306.25,3 +2011/07/31 22:06:32.405,1306.0,1 +2011/07/31 22:06:34.214,1306.0,9 +2011/07/31 22:06:34.214,1306.0,1 +2011/07/31 22:06:34.214,1306.0,10 +2011/07/31 22:06:34.214,1306.0,10 +2011/07/31 22:06:34.214,1306.0,5 +2011/07/31 22:06:34.214,1306.0,4 +2011/07/31 22:06:34.214,1306.0,10 +2011/07/31 22:06:34.214,1306.0,1 +2011/07/31 22:06:34.214,1306.0,4 +2011/07/31 22:06:34.214,1306.0,3 +2011/07/31 22:06:34.214,1306.0,5 +2011/07/31 22:06:34.465,1306.0,1 +2011/07/31 22:06:35.595,1305.75,10 +2011/07/31 22:06:35.824,1306.0,2 +2011/07/31 22:06:36.370,1305.75,10 +2011/07/31 22:06:36.709,1305.75,20 +2011/07/31 22:06:36.709,1305.75,1 +2011/07/31 22:06:36.709,1305.75,78 +2011/07/31 22:06:36.984,1305.75,10 +2011/07/31 22:06:37.447,1305.75,4 +2011/07/31 22:06:38.059,1305.75,3 +2011/07/31 22:06:40.088,1305.75,5 +2011/07/31 22:06:40.088,1305.75,1 +2011/07/31 22:06:40.128,1305.75,2 +2011/07/31 22:06:40.504,1305.75,2 +2011/07/31 22:06:40.584,1305.75,1 +2011/07/31 22:06:40.664,1305.75,20 +2011/07/31 22:06:40.694,1306.0,2 +2011/07/31 22:06:42.639,1306.0,3 +2011/07/31 22:06:42.897,1305.75,20 +2011/07/31 22:06:44.768,1306.0,1 +2011/07/31 22:06:47.747,1305.75,1 +2011/07/31 22:06:48.048,1305.75,4 +2011/07/31 22:06:48.048,1305.75,1 +2011/07/31 22:06:48.822,1305.75,1 +2011/07/31 22:06:51.069,1306.0,4 +2011/07/31 22:06:51.069,1306.0,10 +2011/07/31 22:06:51.069,1306.0,4 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,4 +2011/07/31 22:06:51.069,1306.0,4 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,2 +2011/07/31 22:06:51.069,1306.0,3 +2011/07/31 22:06:51.069,1306.0,2 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,10 +2011/07/31 22:06:51.069,1306.0,1 +2011/07/31 22:06:51.069,1306.0,5 +2011/07/31 22:06:51.526,1306.0,1 +2011/07/31 22:06:51.566,1306.0,1 +2011/07/31 22:06:53.243,1306.25,1 +2011/07/31 22:06:54.471,1306.25,1 +2011/07/31 22:06:55.781,1306.0,9 +2011/07/31 22:06:56.913,1306.0,1 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,2 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,3 +2011/07/31 22:06:57.620,1306.25,2 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:57.620,1306.25,10 +2011/07/31 22:06:57.620,1306.25,5 +2011/07/31 22:06:57.620,1306.25,2 +2011/07/31 22:06:57.620,1306.25,1 +2011/07/31 22:06:58.254,1306.25,3 +2011/07/31 22:06:58.254,1306.25,1 +2011/07/31 22:06:58.254,1306.25,5 +2011/07/31 22:06:58.254,1306.25,16 +2011/07/31 22:06:58.572,1306.0,10 +2011/07/31 22:06:58.572,1306.0,14 +2011/07/31 22:06:58.572,1306.0,1 +2011/07/31 22:06:58.572,1306.0,83 +2011/07/31 22:06:58.743,1306.0,10 +2011/07/31 22:06:58.813,1306.0,10 +2011/07/31 22:06:58.942,1306.0,5 +2011/07/31 22:06:59.498,1306.0,4 +2011/07/31 22:06:59.795,1305.75,2 +2011/07/31 22:06:59.795,1305.75,3 +2011/07/31 22:07:00.022,1306.0,13 +2011/07/31 22:07:00.022,1306.0,3 +2011/07/31 22:07:00.022,1306.0,1 +2011/07/31 22:07:00.022,1306.0,4 +2011/07/31 22:07:00.022,1306.0,5 +2011/07/31 22:07:00.022,1306.0,10 +2011/07/31 22:07:00.022,1306.0,50 +2011/07/31 22:07:00.022,1306.0,50 +2011/07/31 22:07:00.022,1306.0,50 +2011/07/31 22:07:00.022,1306.0,50 +2011/07/31 22:07:00.350,1306.0,14 +2011/07/31 22:07:03.389,1305.75,1 +2011/07/31 22:07:03.864,1305.75,10 +2011/07/31 22:07:04.009,1305.75,12 +2011/07/31 22:07:04.009,1305.75,38 +2011/07/31 22:07:04.662,1305.75,10 +2011/07/31 22:07:04.681,1305.75,2 +2011/07/31 22:07:04.681,1305.75,1 +2011/07/31 22:07:04.681,1305.75,2 +2011/07/31 22:07:04.681,1305.75,17 +2011/07/31 22:07:04.721,1305.75,3 +2011/07/31 22:07:05.390,1305.75,5 +2011/07/31 22:07:05.395,1305.75,1 +2011/07/31 22:07:06.029,1305.75,10 +2011/07/31 22:07:06.063,1305.75,5 +2011/07/31 22:07:06.110,1306.0,1 +2011/07/31 22:07:06.905,1305.75,1 +2011/07/31 22:07:07.417,1305.75,5 +2011/07/31 22:07:07.463,1305.75,1 +2011/07/31 22:07:07.472,1306.0,1 +2011/07/31 22:07:07.720,1305.75,2 +2011/07/31 22:07:07.720,1305.75,1 +2011/07/31 22:07:07.720,1305.75,5 +2011/07/31 22:07:07.969,1305.75,10 +2011/07/31 22:07:07.993,1306.0,1 +2011/07/31 22:07:10.854,1305.75,5 +2011/07/31 22:07:10.854,1305.75,1 +2011/07/31 22:07:14.368,1306.0,1 +2011/07/31 22:07:15.677,1305.75,10 +2011/07/31 22:07:15.995,1305.75,10 +2011/07/31 22:07:16.914,1306.0,32 +2011/07/31 22:07:16.914,1306.0,10 +2011/07/31 22:07:16.914,1306.0,4 +2011/07/31 22:07:16.914,1306.0,10 +2011/07/31 22:07:16.914,1306.0,2 +2011/07/31 22:07:16.914,1306.0,1 +2011/07/31 22:07:16.914,1306.0,1 +2011/07/31 22:07:16.914,1306.0,5 +2011/07/31 22:07:16.914,1306.0,1 +2011/07/31 22:07:16.914,1306.0,2 +2011/07/31 22:07:16.914,1306.0,10 +2011/07/31 22:07:16.914,1306.0,1 +2011/07/31 22:07:16.914,1306.0,3 +2011/07/31 22:07:16.914,1306.0,2 +2011/07/31 22:07:16.914,1306.0,2 +2011/07/31 22:07:16.914,1306.0,40 +2011/07/31 22:07:16.914,1306.0,3 +2011/07/31 22:07:16.940,1306.0,2 +2011/07/31 22:07:18.718,1306.0,1 +2011/07/31 22:07:19.251,1306.25,8 +2011/07/31 22:07:19.429,1306.0,1 +2011/07/31 22:07:19.429,1306.0,5 +2011/07/31 22:07:19.429,1306.0,4 +2011/07/31 22:07:19.429,1306.0,1 +2011/07/31 22:07:19.429,1306.0,1 +2011/07/31 22:07:20.019,1306.0,2 +2011/07/31 22:07:20.311,1306.0,2 +2011/07/31 22:07:20.311,1306.0,1 +2011/07/31 22:07:20.311,1306.0,10 +2011/07/31 22:07:20.326,1306.0,1 +2011/07/31 22:07:20.326,1306.0,1 +2011/07/31 22:07:20.326,1306.0,1 +2011/07/31 22:07:20.326,1306.0,1 +2011/07/31 22:07:20.326,1306.0,1 +2011/07/31 22:07:21.029,1306.0,1 +2011/07/31 22:07:21.302,1306.0,1 +2011/07/31 22:07:22.172,1306.0,9 +2011/07/31 22:07:22.172,1306.0,3 +2011/07/31 22:07:24.609,1306.0,1 +2011/07/31 22:07:24.829,1306.0,16 +2011/07/31 22:07:24.829,1306.0,3 +2011/07/31 22:07:24.829,1306.0,4 +2011/07/31 22:07:24.829,1306.0,5 +2011/07/31 22:07:24.829,1306.0,4 +2011/07/31 22:07:24.829,1306.0,1 +2011/07/31 22:07:24.829,1306.0,3 +2011/07/31 22:07:24.974,1306.0,1 +2011/07/31 22:07:25.646,1306.0,1 +2011/07/31 22:07:25.896,1306.0,12 +2011/07/31 22:07:25.896,1306.0,8 +2011/07/31 22:07:25.896,1306.0,8 +2011/07/31 22:07:25.920,1306.0,50 +2011/07/31 22:07:25.920,1306.0,5 +2011/07/31 22:07:25.968,1306.0,17 +2011/07/31 22:07:25.974,1306.0,1 +2011/07/31 22:07:27.422,1306.0,1 +2011/07/31 22:07:27.664,1306.0,2 +2011/07/31 22:07:27.719,1305.75,6 +2011/07/31 22:07:27.850,1305.75,1 +2011/07/31 22:07:28.100,1306.0,29 +2011/07/31 22:07:28.100,1306.0,5 +2011/07/31 22:07:28.100,1306.0,5 +2011/07/31 22:07:28.100,1306.0,1 +2011/07/31 22:07:28.100,1306.0,3 +2011/07/31 22:07:28.124,1306.0,42 +2011/07/31 22:07:28.801,1306.0,2 +2011/07/31 22:07:30.785,1306.0,3 +2011/07/31 22:07:33.169,1306.0,1 +2011/07/31 22:07:33.189,1305.75,1 +2011/07/31 22:07:34.169,1306.0,1 +2011/07/31 22:07:35.263,1306.0,1 +2011/07/31 22:07:35.980,1306.0,5 +2011/07/31 22:07:36.388,1306.0,1 +2011/07/31 22:07:36.548,1306.0,2 +2011/07/31 22:07:38.112,1305.75,1 +2011/07/31 22:07:38.112,1305.75,5 +2011/07/31 22:07:38.112,1305.75,4 +2011/07/31 22:07:38.777,1306.0,1 +2011/07/31 22:07:39.013,1305.75,1 +2011/07/31 22:07:39.026,1306.0,2 +2011/07/31 22:07:40.266,1305.75,4 +2011/07/31 22:07:40.695,1305.75,1 +2011/07/31 22:07:41.919,1306.0,1 +2011/07/31 22:07:41.919,1306.0,2 +2011/07/31 22:07:41.919,1306.0,5 +2011/07/31 22:07:41.919,1306.0,5 +2011/07/31 22:07:41.919,1306.0,1 +2011/07/31 22:07:41.919,1306.0,1 +2011/07/31 22:07:42.269,1306.0,1 +2011/07/31 22:07:43.512,1305.75,5 +2011/07/31 22:07:44.380,1305.75,7 +2011/07/31 22:07:47.719,1305.75,1 +2011/07/31 22:07:49.545,1305.75,1 +2011/07/31 22:07:51.457,1306.0,25 +2011/07/31 22:07:52.267,1306.0,5 +2011/07/31 22:07:52.670,1306.0,1 +2011/07/31 22:07:52.971,1305.75,1 +2011/07/31 22:07:54.293,1305.75,1 +2011/07/31 22:07:54.638,1305.75,1 +2011/07/31 22:07:55.473,1305.75,1 +2011/07/31 22:07:58.584,1306.0,2 +2011/07/31 22:07:58.629,1305.75,1 +2011/07/31 22:07:58.700,1305.75,2 +2011/07/31 22:07:59.793,1306.0,15 +2011/07/31 22:07:59.793,1306.0,1 +2011/07/31 22:07:59.793,1306.0,3 +2011/07/31 22:07:59.793,1306.0,2 +2011/07/31 22:07:59.793,1306.0,5 +2011/07/31 22:07:59.793,1306.0,1 +2011/07/31 22:07:59.793,1306.0,10 +2011/07/31 22:07:59.793,1306.0,2 +2011/07/31 22:07:59.793,1306.0,11 +2011/07/31 22:08:06.449,1306.0,6 +2011/07/31 22:08:06.697,1306.0,1 +2011/07/31 22:08:08.245,1306.0,1 +2011/07/31 22:08:17.472,1306.0,1 +2011/07/31 22:08:18.096,1306.0,2 +2011/07/31 22:08:19.540,1306.0,1 +2011/07/31 22:08:21.785,1306.0,1 +2011/07/31 22:08:22.347,1305.75,4 +2011/07/31 22:08:22.888,1306.0,5 +2011/07/31 22:08:22.888,1306.0,1 +2011/07/31 22:08:22.888,1306.0,1 +2011/07/31 22:08:22.888,1306.0,10 +2011/07/31 22:08:22.888,1306.0,10 +2011/07/31 22:08:22.888,1306.0,5 +2011/07/31 22:08:22.888,1306.0,5 +2011/07/31 22:08:22.888,1306.0,1 +2011/07/31 22:08:22.888,1306.0,1 +2011/07/31 22:08:22.888,1306.0,11 +2011/07/31 22:08:23.666,1306.0,21 +2011/07/31 22:08:23.666,1306.0,3 +2011/07/31 22:08:23.666,1306.0,1 +2011/07/31 22:08:23.666,1306.0,2 +2011/07/31 22:08:23.666,1306.0,3 +2011/07/31 22:08:23.919,1306.0,2 +2011/07/31 22:08:25.886,1306.25,2 +2011/07/31 22:08:27.766,1306.0,3 +2011/07/31 22:08:27.766,1306.0,4 +2011/07/31 22:08:28.450,1306.25,4 +2011/07/31 22:08:28.450,1306.25,1 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,10 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,10 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,5 +2011/07/31 22:08:28.533,1306.25,4 +2011/07/31 22:08:28.533,1306.25,2 +2011/07/31 22:08:28.533,1306.25,5 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,1 +2011/07/31 22:08:28.533,1306.25,3 +2011/07/31 22:08:28.533,1306.25,5 +2011/07/31 22:08:29.030,1306.0,1 +2011/07/31 22:08:29.211,1306.25,6 +2011/07/31 22:08:29.236,1306.25,3 +2011/07/31 22:08:29.274,1306.25,1 +2011/07/31 22:08:29.586,1306.25,5 +2011/07/31 22:08:29.586,1306.25,1 +2011/07/31 22:08:29.586,1306.25,2 +2011/07/31 22:08:29.586,1306.25,13 +2011/07/31 22:08:29.586,1306.25,1 +2011/07/31 22:08:29.586,1306.5,20 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.586,1306.5,25 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,3 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.586,1306.5,4 +2011/07/31 22:08:29.586,1306.5,2 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,6 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,10 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,1 +2011/07/31 22:08:29.586,1306.5,20 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.586,1306.5,5 +2011/07/31 22:08:29.591,1306.5,4 +2011/07/31 22:08:29.591,1306.5,3 +2011/07/31 22:08:30.408,1306.75,1 +2011/07/31 22:08:30.408,1306.75,4 +2011/07/31 22:08:30.408,1306.75,1 +2011/07/31 22:08:30.439,1306.75,2 +2011/07/31 22:08:30.567,1306.75,3 +2011/07/31 22:08:30.567,1306.75,1 +2011/07/31 22:08:30.567,1306.75,1 +2011/07/31 22:08:30.833,1306.5,1 +2011/07/31 22:08:31.002,1306.5,1 +2011/07/31 22:08:31.108,1306.75,1 +2011/07/31 22:08:31.108,1306.75,3 +2011/07/31 22:08:31.108,1306.75,5 +2011/07/31 22:08:31.108,1306.75,1 +2011/07/31 22:08:31.108,1306.75,1 +2011/07/31 22:08:31.108,1306.75,5 +2011/07/31 22:08:31.108,1306.75,4 +2011/07/31 22:08:31.258,1306.75,6 +2011/07/31 22:08:31.258,1306.75,1 +2011/07/31 22:08:31.258,1306.75,4 +2011/07/31 22:08:31.258,1306.75,1 +2011/07/31 22:08:31.258,1306.75,1 +2011/07/31 22:08:31.258,1306.75,4 +2011/07/31 22:08:31.258,1306.75,3 +2011/07/31 22:08:32.684,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,1 +2011/07/31 22:08:32.796,1306.75,2 +2011/07/31 22:08:32.796,1306.75,2 +2011/07/31 22:08:33.569,1306.5,1 +2011/07/31 22:08:34.180,1306.75,1 +2011/07/31 22:08:34.680,1306.5,2 +2011/07/31 22:08:34.992,1306.75,1 +2011/07/31 22:08:35.020,1306.5,3 +2011/07/31 22:08:35.254,1306.5,1 +2011/07/31 22:08:35.436,1306.5,1 +2011/07/31 22:08:35.533,1306.75,1 +2011/07/31 22:08:35.702,1306.75,4 +2011/07/31 22:08:35.702,1306.75,3 +2011/07/31 22:08:35.702,1306.75,8 +2011/07/31 22:08:35.724,1306.75,4 +2011/07/31 22:08:35.724,1306.75,3 +2011/07/31 22:08:35.724,1306.75,5 +2011/07/31 22:08:35.724,1306.75,3 +2011/07/31 22:08:35.724,1306.75,1 +2011/07/31 22:08:35.724,1306.75,1 +2011/07/31 22:08:35.724,1306.75,2 +2011/07/31 22:08:35.724,1306.75,1 +2011/07/31 22:08:35.724,1306.75,3 +2011/07/31 22:08:35.724,1306.75,1 +2011/07/31 22:08:35.724,1306.75,2 +2011/07/31 22:08:35.724,1306.75,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,2 +2011/07/31 22:08:35.724,1307.0,16 +2011/07/31 22:08:35.724,1307.0,59 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,2 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,100 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,4 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,9 +2011/07/31 22:08:35.724,1307.0,35 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,8 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,24 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,3 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,2 +2011/07/31 22:08:35.724,1307.0,33 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,4 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,5 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,1 +2011/07/31 22:08:35.724,1307.0,3 +2011/07/31 22:08:35.756,1306.75,1 +2011/07/31 22:08:35.756,1307.0,1 +2011/07/31 22:08:35.980,1307.0,1 +2011/07/31 22:08:36.102,1307.0,1 +2011/07/31 22:08:36.651,1306.75,1 +2011/07/31 22:08:36.828,1307.0,50 +2011/07/31 22:08:36.899,1307.0,4 +2011/07/31 22:08:36.899,1307.0,4 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,1 +2011/07/31 22:08:36.899,1307.0,6 +2011/07/31 22:08:36.899,1307.0,2 +2011/07/31 22:08:37.105,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,5 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,10 +2011/07/31 22:08:37.112,1307.25,5 +2011/07/31 22:08:37.112,1307.25,3 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,3 +2011/07/31 22:08:37.112,1307.25,2 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,28 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,5 +2011/07/31 22:08:37.112,1307.25,2 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,2 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,3 +2011/07/31 22:08:37.112,1307.25,1 +2011/07/31 22:08:37.112,1307.25,6 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,4 +2011/07/31 22:08:37.112,1307.5,4 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,2 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,2 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,4 +2011/07/31 22:08:37.112,1307.5,6 +2011/07/31 22:08:37.112,1307.5,5 +2011/07/31 22:08:37.112,1307.5,5 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,2 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,4 +2011/07/31 22:08:37.112,1307.5,2 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,5 +2011/07/31 22:08:37.112,1307.5,1 +2011/07/31 22:08:37.112,1307.5,3 +2011/07/31 22:08:37.125,1307.5,1 +2011/07/31 22:08:37.125,1307.5,1 +2011/07/31 22:08:37.141,1307.5,2 +2011/07/31 22:08:37.141,1307.5,1 +2011/07/31 22:08:37.141,1307.5,2 +2011/07/31 22:08:37.141,1307.5,1 +2011/07/31 22:08:37.141,1307.5,1 +2011/07/31 22:08:37.765,1307.5,2 +2011/07/31 22:08:38.126,1307.5,20 +2011/07/31 22:08:38.160,1307.25,1 +2011/07/31 22:08:38.160,1307.25,5 +2011/07/31 22:08:38.160,1307.25,3 +2011/07/31 22:08:38.160,1307.25,10 +2011/07/31 22:08:38.160,1307.25,1 +2011/07/31 22:08:38.197,1307.5,3 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,30 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,1 +2011/07/31 22:08:38.197,1307.5,11 +2011/07/31 22:08:38.203,1307.5,9 +2011/07/31 22:08:38.203,1307.5,2 +2011/07/31 22:08:38.203,1307.5,5 +2011/07/31 22:08:38.203,1307.5,1 +2011/07/31 22:08:38.203,1307.5,1 +2011/07/31 22:08:38.283,1307.25,1 +2011/07/31 22:08:38.485,1307.25,2 +2011/07/31 22:08:38.500,1307.5,1 +2011/07/31 22:08:38.726,1307.5,1 +2011/07/31 22:08:39.057,1307.5,1 +2011/07/31 22:08:39.663,1307.25,1 +2011/07/31 22:08:39.750,1307.5,1 +2011/07/31 22:08:40.393,1307.5,2 +2011/07/31 22:08:40.393,1307.5,1 +2011/07/31 22:08:41.027,1307.5,1 +2011/07/31 22:08:41.093,1307.5,2 +2011/07/31 22:08:41.119,1307.5,2 +2011/07/31 22:08:41.375,1307.25,1 +2011/07/31 22:08:41.375,1307.25,2 +2011/07/31 22:08:41.407,1307.25,1 +2011/07/31 22:08:41.523,1307.5,2 +2011/07/31 22:08:41.865,1307.5,1 +2011/07/31 22:08:41.875,1307.25,2 +2011/07/31 22:08:41.875,1307.25,3 +2011/07/31 22:08:41.965,1307.5,1 +2011/07/31 22:08:41.965,1307.5,1 +2011/07/31 22:08:41.995,1307.5,1 +2011/07/31 22:08:42.322,1307.5,1 +2011/07/31 22:08:42.402,1307.5,1 +2011/07/31 22:08:42.664,1307.5,1 +2011/07/31 22:08:43.002,1307.5,2 +2011/07/31 22:08:43.002,1307.5,1 +2011/07/31 22:08:43.002,1307.5,2 +2011/07/31 22:08:43.002,1307.5,10 +2011/07/31 22:08:43.013,1307.25,1 +2011/07/31 22:08:43.013,1307.25,2 +2011/07/31 22:08:43.013,1307.25,1 +2011/07/31 22:08:43.013,1307.25,1 +2011/07/31 22:08:43.088,1307.25,2 +2011/07/31 22:08:43.088,1307.25,5 +2011/07/31 22:08:43.088,1307.25,3 +2011/07/31 22:08:43.088,1307.25,1 +2011/07/31 22:08:43.088,1307.25,1 +2011/07/31 22:08:43.088,1307.25,1 +2011/07/31 22:08:43.088,1307.25,2 +2011/07/31 22:08:43.088,1307.25,1 +2011/07/31 22:08:43.583,1307.25,1 +2011/07/31 22:08:43.685,1307.25,3 +2011/07/31 22:08:43.685,1307.25,1 +2011/07/31 22:08:43.685,1307.25,1 +2011/07/31 22:08:43.988,1307.25,4 +2011/07/31 22:08:43.988,1307.25,5 +2011/07/31 22:08:43.988,1307.25,1 +2011/07/31 22:08:44.676,1307.0,3 +2011/07/31 22:08:44.994,1307.25,1 +2011/07/31 22:08:45.912,1307.0,1 +2011/07/31 22:08:45.912,1307.0,5 +2011/07/31 22:08:45.912,1307.0,4 +2011/07/31 22:08:47.043,1307.0,2 +2011/07/31 22:08:47.054,1307.0,2 +2011/07/31 22:08:47.054,1307.0,1 +2011/07/31 22:08:47.054,1307.0,1 +2011/07/31 22:08:47.054,1307.0,1 +2011/07/31 22:08:47.054,1307.0,1 +2011/07/31 22:08:47.202,1307.25,1 +2011/07/31 22:08:47.202,1307.25,1 +2011/07/31 22:08:47.202,1307.25,1 +2011/07/31 22:08:47.202,1307.25,1 +2011/07/31 22:08:47.202,1307.25,1 +2011/07/31 22:08:47.202,1307.25,3 +2011/07/31 22:08:47.202,1307.25,2 +2011/07/31 22:08:47.213,1307.0,3 +2011/07/31 22:08:47.213,1307.0,1 +2011/07/31 22:08:47.213,1307.0,1 +2011/07/31 22:08:47.213,1307.0,1 +2011/07/31 22:08:47.213,1307.0,1 +2011/07/31 22:08:47.464,1307.0,10 +2011/07/31 22:08:47.464,1307.0,3 +2011/07/31 22:08:47.464,1307.25,3 +2011/07/31 22:08:47.464,1307.25,3 +2011/07/31 22:08:47.464,1307.25,1 +2011/07/31 22:08:47.464,1307.25,3 +2011/07/31 22:08:47.464,1307.25,3 +2011/07/31 22:08:47.464,1307.25,5 +2011/07/31 22:08:47.464,1307.25,1 +2011/07/31 22:08:47.464,1307.25,3 +2011/07/31 22:08:47.464,1307.25,10 +2011/07/31 22:08:47.464,1307.25,1 +2011/07/31 22:08:47.464,1307.25,4 +2011/07/31 22:08:47.469,1307.0,10 +2011/07/31 22:08:47.952,1307.0,5 +2011/07/31 22:08:47.960,1307.0,3 +2011/07/31 22:08:48.161,1307.0,1 +2011/07/31 22:08:48.334,1307.0,5 +2011/07/31 22:08:48.477,1307.0,6 +2011/07/31 22:08:49.420,1307.25,1 +2011/07/31 22:08:49.822,1307.25,1 +2011/07/31 22:08:49.939,1307.25,1 +2011/07/31 22:08:50.199,1307.25,1 +2011/07/31 22:08:50.733,1307.25,7 +2011/07/31 22:08:50.733,1307.25,5 +2011/07/31 22:08:50.733,1307.25,8 +2011/07/31 22:08:51.268,1307.25,5 +2011/07/31 22:08:51.268,1307.25,10 +2011/07/31 22:08:51.268,1307.25,1 +2011/07/31 22:08:51.268,1307.25,1 +2011/07/31 22:08:51.268,1307.5,2 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,5 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,5 +2011/07/31 22:08:51.268,1307.5,3 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,3 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,6 +2011/07/31 22:08:51.268,1307.5,10 +2011/07/31 22:08:51.268,1307.5,2 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,1 +2011/07/31 22:08:51.268,1307.5,2 +2011/07/31 22:08:51.337,1307.5,2 +2011/07/31 22:08:51.337,1307.5,1 +2011/07/31 22:08:51.347,1307.5,2 +2011/07/31 22:08:51.347,1307.5,2 +2011/07/31 22:08:51.793,1307.5,20 +2011/07/31 22:08:52.039,1307.5,8 +2011/07/31 22:08:52.039,1307.5,5 +2011/07/31 22:08:52.604,1307.5,1 +2011/07/31 22:08:53.550,1307.25,1 +2011/07/31 22:08:53.978,1307.25,2 +2011/07/31 22:08:55.388,1307.25,2 +2011/07/31 22:08:55.742,1307.5,1 +2011/07/31 22:08:56.665,1307.5,1 +2011/07/31 22:08:57.271,1307.25,6 +2011/07/31 22:08:57.271,1307.25,3 +2011/07/31 22:08:57.271,1307.25,1 +2011/07/31 22:08:57.735,1307.25,1 +2011/07/31 22:08:57.735,1307.25,1 +2011/07/31 22:08:57.735,1307.25,1 +2011/07/31 22:08:57.735,1307.25,1 +2011/07/31 22:08:57.735,1307.25,1 +2011/07/31 22:08:58.128,1307.25,1 +2011/07/31 22:08:58.711,1307.25,1 +2011/07/31 22:08:58.907,1307.25,1 +2011/07/31 22:08:58.955,1307.25,1 +2011/07/31 22:08:59.447,1307.25,1 +2011/07/31 22:08:59.447,1307.25,1 +2011/07/31 22:08:59.447,1307.25,3 +2011/07/31 22:08:59.447,1307.25,1 +2011/07/31 22:08:59.447,1307.25,1 +2011/07/31 22:08:59.447,1307.25,1 +2011/07/31 22:08:59.447,1307.5,3 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,5 +2011/07/31 22:08:59.447,1307.5,1 +2011/07/31 22:08:59.447,1307.5,3 +2011/07/31 22:09:00.176,1307.25,2 +2011/07/31 22:09:00.735,1307.25,2 +2011/07/31 22:09:01.106,1307.25,6 +2011/07/31 22:09:01.106,1307.25,3 +2011/07/31 22:09:01.106,1307.25,3 +2011/07/31 22:09:01.106,1307.25,1 +2011/07/31 22:09:01.106,1307.25,1 +2011/07/31 22:09:01.106,1307.25,11 +2011/07/31 22:09:02.454,1307.25,1 +2011/07/31 22:09:02.765,1307.25,1 +2011/07/31 22:09:03.777,1307.25,2 +2011/07/31 22:09:03.819,1307.25,1 +2011/07/31 22:09:03.819,1307.25,2 +2011/07/31 22:09:03.819,1307.0,2 +2011/07/31 22:09:03.819,1307.0,5 +2011/07/31 22:09:03.819,1307.0,5 +2011/07/31 22:09:03.819,1307.0,5 +2011/07/31 22:09:03.819,1307.0,3 +2011/07/31 22:09:03.819,1307.0,1 +2011/07/31 22:09:03.819,1307.0,1 +2011/07/31 22:09:04.616,1307.25,1 +2011/07/31 22:09:04.616,1307.25,1 +2011/07/31 22:09:04.616,1307.25,1 +2011/07/31 22:09:04.616,1307.25,1 +2011/07/31 22:09:04.616,1307.25,1 +2011/07/31 22:09:04.913,1307.25,1 +2011/07/31 22:09:04.948,1307.0,1 +2011/07/31 22:09:04.989,1307.0,2 +2011/07/31 22:09:04.989,1307.0,4 +2011/07/31 22:09:04.989,1307.0,1 +2011/07/31 22:09:05.554,1307.25,5 +2011/07/31 22:09:05.554,1307.25,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,2 +2011/07/31 22:09:05.554,1307.5,3 +2011/07/31 22:09:05.554,1307.5,3 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,2 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,15 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,2 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.5,1 +2011/07/31 22:09:05.554,1307.75,3 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,4 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,8 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,5 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,79 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,2 +2011/07/31 22:09:05.554,1307.75,1 +2011/07/31 22:09:05.554,1307.75,5 +2011/07/31 22:09:05.581,1307.25,2 +2011/07/31 22:09:05.729,1307.5,1 +2011/07/31 22:09:05.890,1307.0,5 +2011/07/31 22:09:06.173,1307.0,2 +2011/07/31 22:09:06.173,1307.0,1 +2011/07/31 22:09:06.173,1307.0,2 +2011/07/31 22:09:06.173,1307.0,1 +2011/07/31 22:09:06.173,1307.0,5 +2011/07/31 22:09:06.173,1307.0,1 +2011/07/31 22:09:06.173,1307.0,3 +2011/07/31 22:09:06.184,1307.0,1 +2011/07/31 22:09:06.370,1307.0,14 +2011/07/31 22:09:06.370,1307.25,2 +2011/07/31 22:09:06.370,1307.25,3 +2011/07/31 22:09:06.370,1307.25,1 +2011/07/31 22:09:06.783,1307.25,3 +2011/07/31 22:09:07.079,1307.25,15 +2011/07/31 22:09:07.108,1307.25,1 +2011/07/31 22:09:07.717,1307.25,1 +2011/07/31 22:09:08.086,1307.5,1 +2011/07/31 22:09:08.104,1307.5,1 +2011/07/31 22:09:08.145,1307.25,1 +2011/07/31 22:09:08.304,1307.5,1 +2011/07/31 22:09:08.858,1307.5,3 +2011/07/31 22:09:09.648,1307.5,2 +2011/07/31 22:09:09.648,1307.5,5 +2011/07/31 22:09:09.648,1307.5,1 +2011/07/31 22:09:09.648,1307.5,3 +2011/07/31 22:09:09.648,1307.5,1 +2011/07/31 22:09:09.648,1307.5,2 +2011/07/31 22:09:09.648,1307.75,12 +2011/07/31 22:09:09.648,1307.75,2 +2011/07/31 22:09:09.648,1307.75,1 +2011/07/31 22:09:09.648,1307.75,3 +2011/07/31 22:09:09.648,1307.75,1 +2011/07/31 22:09:09.648,1307.75,5 +2011/07/31 22:09:09.648,1307.75,3 +2011/07/31 22:09:09.648,1307.75,1 +2011/07/31 22:09:09.648,1307.75,10 +2011/07/31 22:09:09.648,1307.75,1 +2011/07/31 22:09:09.648,1307.75,1 +2011/07/31 22:09:09.648,1308.0,20 +2011/07/31 22:09:09.648,1308.0,2 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,19 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,3 +2011/07/31 22:09:09.648,1308.0,2 +2011/07/31 22:09:09.648,1308.0,6 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,2 +2011/07/31 22:09:09.648,1308.0,6 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,3 +2011/07/31 22:09:09.648,1308.0,5 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,5 +2011/07/31 22:09:09.648,1308.0,1 +2011/07/31 22:09:09.648,1308.0,3 +2011/07/31 22:09:10.030,1307.5,4 +2011/07/31 22:09:10.433,1307.5,1 +2011/07/31 22:09:10.433,1307.5,1 +2011/07/31 22:09:10.658,1307.75,1 +2011/07/31 22:09:11.066,1307.75,1 +2011/07/31 22:09:11.066,1307.75,3 +2011/07/31 22:09:11.066,1307.75,1 +2011/07/31 22:09:11.066,1307.75,3 +2011/07/31 22:09:11.143,1308.0,1 +2011/07/31 22:09:11.153,1307.75,2 +2011/07/31 22:09:11.304,1307.75,1 +2011/07/31 22:09:11.304,1307.75,3 +2011/07/31 22:09:11.304,1307.75,5 +2011/07/31 22:09:11.371,1307.75,1 +2011/07/31 22:09:11.409,1307.75,1 +2011/07/31 22:09:11.502,1307.75,5 +2011/07/31 22:09:11.590,1307.75,4 +2011/07/31 22:09:11.590,1307.75,7 +2011/07/31 22:09:11.590,1307.75,2 +2011/07/31 22:09:11.649,1307.75,1 +2011/07/31 22:09:11.649,1307.75,1 +2011/07/31 22:09:11.999,1307.75,3 +2011/07/31 22:09:11.999,1307.75,3 +2011/07/31 22:09:12.080,1307.75,3 +2011/07/31 22:09:12.219,1307.75,1 +2011/07/31 22:09:12.423,1307.75,1 +2011/07/31 22:09:12.423,1307.75,2 +2011/07/31 22:09:12.762,1308.0,1 +2011/07/31 22:09:13.193,1307.75,1 +2011/07/31 22:09:14.149,1307.75,1 +2011/07/31 22:09:14.236,1307.75,1 +2011/07/31 22:09:14.703,1307.75,1 +2011/07/31 22:09:14.804,1307.5,2 +2011/07/31 22:09:14.804,1307.5,1 +2011/07/31 22:09:14.828,1307.5,1 +2011/07/31 22:09:14.828,1307.5,2 +2011/07/31 22:09:14.910,1307.75,1 +2011/07/31 22:09:14.910,1307.75,1 +2011/07/31 22:09:15.010,1307.5,1 +2011/07/31 22:09:15.284,1307.75,20 +2011/07/31 22:09:15.284,1307.75,25 +2011/07/31 22:09:15.284,1307.75,6 +2011/07/31 22:09:15.284,1307.75,2 +2011/07/31 22:09:15.284,1307.75,1 +2011/07/31 22:09:15.574,1308.0,1 +2011/07/31 22:09:15.574,1308.0,2 +2011/07/31 22:09:15.586,1307.75,1 +2011/07/31 22:09:15.614,1307.75,4 +2011/07/31 22:09:15.898,1307.75,5 +2011/07/31 22:09:16.025,1307.75,3 +2011/07/31 22:09:16.054,1307.75,3 +2011/07/31 22:09:16.072,1307.75,2 +2011/07/31 22:09:16.122,1308.0,2 +2011/07/31 22:09:16.146,1307.75,1 +2011/07/31 22:09:16.162,1308.0,6 +2011/07/31 22:09:16.162,1308.0,10 +2011/07/31 22:09:16.162,1308.0,4 +2011/07/31 22:09:16.307,1308.0,6 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,1 +2011/07/31 22:09:16.307,1308.0,2 +2011/07/31 22:09:16.307,1308.0,6 +2011/07/31 22:09:16.433,1308.0,4 +2011/07/31 22:09:16.433,1308.0,7 +2011/07/31 22:09:16.433,1308.0,5 +2011/07/31 22:09:16.433,1308.0,3 +2011/07/31 22:09:16.433,1308.0,1 +2011/07/31 22:09:16.618,1308.0,1 +2011/07/31 22:09:16.656,1308.0,2 +2011/07/31 22:09:16.666,1308.0,2 +2011/07/31 22:09:16.666,1308.0,2 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,5 +2011/07/31 22:09:16.666,1308.0,5 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,10 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,2 +2011/07/31 22:09:16.666,1308.0,2 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,5 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.666,1308.0,3 +2011/07/31 22:09:16.666,1308.0,1 +2011/07/31 22:09:16.672,1308.0,2 +2011/07/31 22:09:16.718,1308.0,2 +2011/07/31 22:09:16.737,1308.0,5 +2011/07/31 22:09:16.793,1308.0,1 +2011/07/31 22:09:16.889,1308.0,1 +2011/07/31 22:09:18.159,1308.0,3 +2011/07/31 22:09:18.667,1308.0,1 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:18.912,1308.25,3 +2011/07/31 22:09:18.912,1308.25,1 +2011/07/31 22:09:19.075,1308.25,1 +2011/07/31 22:09:19.086,1308.25,1 +2011/07/31 22:09:19.143,1308.25,1 +2011/07/31 22:09:19.152,1308.0,2 +2011/07/31 22:09:19.179,1308.0,1 +2011/07/31 22:09:19.179,1308.0,4 +2011/07/31 22:09:19.179,1308.0,10 +2011/07/31 22:09:19.179,1308.0,5 +2011/07/31 22:09:19.250,1308.0,1 +2011/07/31 22:09:19.477,1308.25,2 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,10 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,2 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.477,1308.25,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,4 +2011/07/31 22:09:19.768,1308.5,5 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,30 +2011/07/31 22:09:19.768,1308.5,20 +2011/07/31 22:09:19.768,1308.5,10 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,5 +2011/07/31 22:09:19.768,1308.5,2 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,3 +2011/07/31 22:09:19.768,1308.5,3 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.5,1 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.768,1308.75,2 +2011/07/31 22:09:19.768,1308.75,1 +2011/07/31 22:09:19.787,1308.5,1 +2011/07/31 22:09:19.800,1308.25,1 +2011/07/31 22:09:19.876,1308.5,1 +2011/07/31 22:09:19.876,1308.75,9 +2011/07/31 22:09:20.768,1308.5,5 +2011/07/31 22:09:21.014,1308.25,1 +2011/07/31 22:09:21.312,1308.25,1 +2011/07/31 22:09:22.397,1308.5,1 +2011/07/31 22:09:22.463,1308.5,1 +2011/07/31 22:09:22.482,1308.25,12 +2011/07/31 22:09:22.482,1308.25,8 +2011/07/31 22:09:22.989,1308.25,1 +2011/07/31 22:09:23.766,1308.25,10 +2011/07/31 22:09:24.334,1308.25,3 +2011/07/31 22:09:24.677,1308.5,2 +2011/07/31 22:09:24.922,1308.25,1 +2011/07/31 22:09:25.035,1308.25,2 +2011/07/31 22:09:25.092,1308.25,1 +2011/07/31 22:09:25.371,1308.25,1 +2011/07/31 22:09:25.423,1308.25,2 +2011/07/31 22:09:25.595,1308.25,3 +2011/07/31 22:09:25.706,1308.25,18 +2011/07/31 22:09:25.706,1308.25,2 +2011/07/31 22:09:25.791,1308.25,1 +2011/07/31 22:09:25.791,1308.25,1 +2011/07/31 22:09:25.791,1308.25,1 +2011/07/31 22:09:25.954,1308.25,9 +2011/07/31 22:09:25.954,1308.25,1 +2011/07/31 22:09:25.954,1308.25,2 +2011/07/31 22:09:25.954,1308.25,5 +2011/07/31 22:09:25.954,1308.25,1 +2011/07/31 22:09:25.954,1308.25,40 +2011/07/31 22:09:25.959,1308.25,1 +2011/07/31 22:09:25.959,1308.25,3 +2011/07/31 22:09:25.959,1308.25,3 +2011/07/31 22:09:25.959,1308.25,3 +2011/07/31 22:09:25.959,1308.25,4 +2011/07/31 22:09:25.959,1308.25,1 +2011/07/31 22:09:25.959,1308.25,20 +2011/07/31 22:09:25.965,1308.25,1 +2011/07/31 22:09:26.221,1308.0,1 +2011/07/31 22:09:26.900,1308.25,1 +2011/07/31 22:09:27.159,1308.0,1 +2011/07/31 22:09:27.784,1308.25,3 +2011/07/31 22:09:27.784,1308.0,1 +2011/07/31 22:09:27.784,1308.0,1 +2011/07/31 22:09:27.784,1308.0,1 +2011/07/31 22:09:27.784,1308.0,2 +2011/07/31 22:09:27.784,1308.0,1 +2011/07/31 22:09:27.784,1308.0,1 +2011/07/31 22:09:27.784,1308.0,3 +2011/07/31 22:09:27.902,1308.0,7 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,1 +2011/07/31 22:09:27.902,1308.0,2 +2011/07/31 22:09:28.021,1308.0,1 +2011/07/31 22:09:28.120,1308.0,1 +2011/07/31 22:09:28.174,1308.0,1 +2011/07/31 22:09:28.819,1308.0,1 +2011/07/31 22:09:29.054,1308.0,2 +2011/07/31 22:09:30.480,1307.75,2 +2011/07/31 22:09:31.390,1307.75,1 +2011/07/31 22:09:31.921,1308.0,28 +2011/07/31 22:09:31.921,1308.0,2 +2011/07/31 22:09:31.921,1308.0,20 +2011/07/31 22:09:31.921,1308.0,1 +2011/07/31 22:09:31.921,1308.0,5 +2011/07/31 22:09:31.921,1308.0,6 +2011/07/31 22:09:31.921,1308.0,2 +2011/07/31 22:09:31.921,1308.0,20 +2011/07/31 22:09:31.921,1308.0,5 +2011/07/31 22:09:31.921,1308.0,2 +2011/07/31 22:09:31.921,1308.0,1 +2011/07/31 22:09:31.921,1308.0,3 +2011/07/31 22:09:31.921,1308.0,1 +2011/07/31 22:09:32.030,1308.0,1 +2011/07/31 22:09:32.058,1308.25,3 +2011/07/31 22:09:32.058,1308.0,1 +2011/07/31 22:09:32.058,1308.0,1 +2011/07/31 22:09:32.095,1308.25,22 +2011/07/31 22:09:32.095,1308.25,10 +2011/07/31 22:09:32.095,1308.25,5 +2011/07/31 22:09:32.095,1308.25,1 +2011/07/31 22:09:32.095,1308.25,2 +2011/07/31 22:09:32.095,1308.25,1 +2011/07/31 22:09:32.095,1308.25,1 +2011/07/31 22:09:32.095,1308.25,8 +2011/07/31 22:09:32.109,1308.0,2 +2011/07/31 22:09:32.109,1308.0,1 +2011/07/31 22:09:32.576,1308.0,10 +2011/07/31 22:09:32.996,1308.0,1 +2011/07/31 22:09:32.996,1308.0,10 +2011/07/31 22:09:33.003,1308.0,1 +2011/07/31 22:09:33.422,1308.0,20 +2011/07/31 22:09:33.697,1308.0,1 +2011/07/31 22:09:33.886,1308.25,1 +2011/07/31 22:09:33.886,1308.25,1 +2011/07/31 22:09:33.898,1308.25,1 +2011/07/31 22:09:33.921,1308.0,1 +2011/07/31 22:09:34.604,1308.0,1 +2011/07/31 22:09:34.695,1308.0,2 +2011/07/31 22:09:34.695,1308.0,1 +2011/07/31 22:09:34.695,1308.0,10 +2011/07/31 22:09:34.695,1308.0,1 +2011/07/31 22:09:34.695,1308.0,1 +2011/07/31 22:09:34.695,1308.0,5 +2011/07/31 22:09:34.695,1308.0,4 +2011/07/31 22:09:34.695,1308.0,1 +2011/07/31 22:09:34.695,1308.0,4 +2011/07/31 22:09:34.695,1308.0,25 +2011/07/31 22:09:34.695,1308.0,46 +2011/07/31 22:09:34.719,1308.0,4 +2011/07/31 22:09:34.719,1308.0,2 +2011/07/31 22:09:34.746,1308.0,9 +2011/07/31 22:09:34.746,1308.0,1 +2011/07/31 22:09:34.759,1308.0,40 +2011/07/31 22:09:34.786,1308.0,4 +2011/07/31 22:09:35.041,1308.0,1 +2011/07/31 22:09:36.041,1307.75,2 +2011/07/31 22:09:36.041,1307.75,1 +2011/07/31 22:09:36.249,1308.0,1 +2011/07/31 22:09:37.556,1307.75,1 +2011/07/31 22:09:37.699,1308.0,32 +2011/07/31 22:09:38.059,1308.0,22 +2011/07/31 22:09:38.059,1308.0,3 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,5 +2011/07/31 22:09:38.059,1308.0,6 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,1 +2011/07/31 22:09:38.059,1308.0,18 +2011/07/31 22:09:39.953,1308.0,10 +2011/07/31 22:09:39.953,1308.0,70 +2011/07/31 22:09:39.961,1308.0,2 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,2 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:39.961,1308.0,1 +2011/07/31 22:09:41.808,1307.75,2 +2011/07/31 22:09:42.396,1307.75,8 +2011/07/31 22:09:44.665,1308.0,1 +2011/07/31 22:09:44.885,1307.75,2 +2011/07/31 22:09:45.320,1308.0,54 +2011/07/31 22:09:45.320,1308.0,1 +2011/07/31 22:09:45.320,1308.0,1 +2011/07/31 22:09:45.320,1308.0,2 +2011/07/31 22:09:45.320,1308.0,1 +2011/07/31 22:09:45.546,1307.75,5 +2011/07/31 22:09:45.916,1308.0,1 +2011/07/31 22:09:45.916,1308.0,1 +2011/07/31 22:09:45.916,1308.0,1 +2011/07/31 22:09:45.916,1308.0,1 +2011/07/31 22:09:45.916,1308.0,2 +2011/07/31 22:09:45.916,1308.0,44 +2011/07/31 22:09:46.511,1307.75,3 +2011/07/31 22:09:49.786,1307.75,1 +2011/07/31 22:09:50.785,1307.75,1 +2011/07/31 22:09:51.104,1308.0,10 +2011/07/31 22:09:52.360,1308.0,4 +2011/07/31 22:09:52.360,1308.0,10 +2011/07/31 22:09:52.360,1308.0,2 +2011/07/31 22:09:52.360,1308.0,1 +2011/07/31 22:09:52.360,1308.0,15 +2011/07/31 22:09:52.360,1308.0,2 +2011/07/31 22:09:52.360,1308.0,4 +2011/07/31 22:09:52.552,1307.75,1 +2011/07/31 22:09:53.469,1308.0,1 +2011/07/31 22:09:55.822,1308.0,10 +2011/07/31 22:09:55.822,1308.0,1 +2011/07/31 22:09:55.822,1308.0,15 +2011/07/31 22:09:55.822,1308.0,1 +2011/07/31 22:09:55.822,1308.0,1 +2011/07/31 22:09:55.822,1308.0,3 +2011/07/31 22:09:55.822,1308.0,3 +2011/07/31 22:09:55.828,1308.0,1 +2011/07/31 22:09:56.342,1308.0,1 +2011/07/31 22:09:58.266,1308.0,1 +2011/07/31 22:09:59.153,1308.0,1 +2011/07/31 22:09:59.884,1308.0,62 +2011/07/31 22:09:59.884,1308.0,3 +2011/07/31 22:09:59.884,1308.0,1 +2011/07/31 22:09:59.884,1308.0,10 +2011/07/31 22:09:59.884,1308.0,10 +2011/07/31 22:09:59.884,1308.0,5 +2011/07/31 22:09:59.884,1308.0,2 +2011/07/31 22:09:59.884,1308.0,1 +2011/07/31 22:09:59.884,1308.0,1 +2011/07/31 22:10:00.453,1308.0,1 +2011/07/31 22:10:03.342,1308.0,1 +2011/07/31 22:10:04.399,1307.75,100 +2011/07/31 22:10:04.404,1307.75,27 +2011/07/31 22:10:04.404,1307.75,1 +2011/07/31 22:10:04.653,1308.0,5 +2011/07/31 22:10:05.427,1307.75,2 +2011/07/31 22:10:05.453,1307.75,1 +2011/07/31 22:10:05.547,1307.75,5 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,2 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,5 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.547,1307.75,1 +2011/07/31 22:10:05.622,1307.75,1 +2011/07/31 22:10:05.622,1307.75,10 +2011/07/31 22:10:05.622,1307.75,2 +2011/07/31 22:10:05.622,1307.75,5 +2011/07/31 22:10:05.628,1307.75,6 +2011/07/31 22:10:06.012,1307.75,2 +2011/07/31 22:10:06.724,1307.75,1 +2011/07/31 22:10:07.341,1307.75,8 +2011/07/31 22:10:07.564,1307.5,1 +2011/07/31 22:10:09.073,1307.5,1 +2011/07/31 22:10:09.138,1307.5,1 +2011/07/31 22:10:09.205,1307.5,4 +2011/07/31 22:10:09.205,1307.5,10 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,5 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,2 +2011/07/31 22:10:09.205,1307.5,14 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,2 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,1 +2011/07/31 22:10:09.205,1307.5,2 +2011/07/31 22:10:09.205,1307.5,2 +2011/07/31 22:10:09.205,1307.5,11 +2011/07/31 22:10:09.211,1307.5,9 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,10 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.211,1307.5,1 +2011/07/31 22:10:09.621,1307.5,1 +2011/07/31 22:10:10.105,1307.25,1 +2011/07/31 22:10:10.105,1307.25,4 +2011/07/31 22:10:10.105,1307.25,1 +2011/07/31 22:10:10.105,1307.25,10 +2011/07/31 22:10:10.105,1307.25,2 +2011/07/31 22:10:10.105,1307.0,1 +2011/07/31 22:10:10.105,1307.0,1 +2011/07/31 22:10:10.105,1307.0,1 +2011/07/31 22:10:10.111,1307.25,1 +2011/07/31 22:10:10.119,1307.25,1 +2011/07/31 22:10:10.612,1307.25,7 +2011/07/31 22:10:10.612,1307.25,3 +2011/07/31 22:10:11.179,1307.25,1 +2011/07/31 22:10:11.232,1307.25,1 +2011/07/31 22:10:12.044,1307.5,1 +2011/07/31 22:10:12.157,1307.25,8 +2011/07/31 22:10:12.157,1307.25,1 +2011/07/31 22:10:12.157,1307.25,3 +2011/07/31 22:10:12.157,1307.25,1 +2011/07/31 22:10:12.157,1307.25,1 +2011/07/31 22:10:12.157,1307.25,3 +2011/07/31 22:10:12.157,1307.25,1 +2011/07/31 22:10:12.392,1307.0,1 +2011/07/31 22:10:12.570,1307.25,2 +2011/07/31 22:10:12.570,1307.25,1 +2011/07/31 22:10:12.588,1307.0,1 +2011/07/31 22:10:12.621,1307.25,3 +2011/07/31 22:10:12.694,1307.0,1 +2011/07/31 22:10:12.767,1307.0,1 +2011/07/31 22:10:12.957,1307.0,1 +2011/07/31 22:10:13.104,1307.25,1 +2011/07/31 22:10:13.145,1307.0,1 +2011/07/31 22:10:13.533,1307.0,5 +2011/07/31 22:10:13.736,1307.25,1 +2011/07/31 22:10:13.736,1307.25,5 +2011/07/31 22:10:14.314,1307.0,1 +2011/07/31 22:10:14.488,1307.0,1 +2011/07/31 22:10:14.695,1307.0,1 +2011/07/31 22:10:14.782,1307.25,1 +2011/07/31 22:10:14.922,1307.0,1 +2011/07/31 22:10:17.247,1307.0,1 +2011/07/31 22:10:17.247,1307.0,8 +2011/07/31 22:10:17.247,1307.0,1 +2011/07/31 22:10:17.328,1307.25,3 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.328,1307.25,8 +2011/07/31 22:10:17.328,1307.25,6 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.328,1307.25,1 +2011/07/31 22:10:17.380,1307.25,11 +2011/07/31 22:10:17.380,1307.25,1 +2011/07/31 22:10:17.421,1307.25,10 +2011/07/31 22:10:17.749,1307.25,1 +2011/07/31 22:10:18.123,1307.25,2 +2011/07/31 22:10:18.123,1307.25,5 +2011/07/31 22:10:18.123,1307.25,3 +2011/07/31 22:10:18.128,1307.25,2 +2011/07/31 22:10:18.128,1307.25,2 +2011/07/31 22:10:18.645,1307.25,5 +2011/07/31 22:10:18.645,1307.25,1 +2011/07/31 22:10:18.645,1307.25,4 +2011/07/31 22:10:19.152,1307.25,1 +2011/07/31 22:10:19.152,1307.25,1 +2011/07/31 22:10:19.152,1307.25,1 +2011/07/31 22:10:19.152,1307.25,1 +2011/07/31 22:10:19.152,1307.25,1 +2011/07/31 22:10:19.165,1307.25,1 +2011/07/31 22:10:19.601,1307.25,3 +2011/07/31 22:10:19.948,1307.5,8 +2011/07/31 22:10:19.948,1307.5,4 +2011/07/31 22:10:19.948,1307.5,3 +2011/07/31 22:10:19.948,1307.5,1 +2011/07/31 22:10:19.948,1307.5,8 +2011/07/31 22:10:19.948,1307.5,1 +2011/07/31 22:10:22.066,1307.25,2 +2011/07/31 22:10:22.066,1307.25,2 +2011/07/31 22:10:22.066,1307.25,4 +2011/07/31 22:10:22.952,1307.25,2 +2011/07/31 22:10:22.952,1307.25,2 +2011/07/31 22:10:22.952,1307.25,2 +2011/07/31 22:10:22.952,1307.25,3 +2011/07/31 22:10:22.952,1307.25,2 +2011/07/31 22:10:22.952,1307.25,8 +2011/07/31 22:10:22.952,1307.25,1 +2011/07/31 22:10:23.467,1307.25,1 +2011/07/31 22:10:23.476,1307.25,1 +2011/07/31 22:10:23.587,1307.25,3 +2011/07/31 22:10:23.685,1307.25,17 +2011/07/31 22:10:23.685,1307.25,3 +2011/07/31 22:10:23.733,1307.5,1 +2011/07/31 22:10:26.266,1307.25,1 +2011/07/31 22:10:27.337,1307.0,2 +2011/07/31 22:10:27.909,1307.25,10 +2011/07/31 22:10:27.909,1307.25,1 +2011/07/31 22:10:27.909,1307.25,8 +2011/07/31 22:10:27.909,1307.25,4 +2011/07/31 22:10:27.909,1307.25,1 +2011/07/31 22:10:27.909,1307.5,2 +2011/07/31 22:10:27.909,1307.5,2 +2011/07/31 22:10:27.909,1307.5,1 +2011/07/31 22:10:27.909,1307.5,7 +2011/07/31 22:10:28.461,1307.25,1 +2011/07/31 22:10:28.461,1307.25,2 +2011/07/31 22:10:28.834,1307.25,1 +2011/07/31 22:10:28.868,1307.25,6 +2011/07/31 22:10:28.868,1307.25,1 +2011/07/31 22:10:28.868,1307.0,1 +2011/07/31 22:10:28.868,1307.0,1 +2011/07/31 22:10:28.868,1307.0,1 +2011/07/31 22:10:31.947,1307.25,4 +2011/07/31 22:10:31.947,1307.25,1 +2011/07/31 22:10:31.947,1307.25,1 +2011/07/31 22:10:31.947,1307.25,1 +2011/07/31 22:10:37.459,1307.25,1 +2011/07/31 22:10:37.755,1307.0,1 +2011/07/31 22:10:38.759,1307.0,1 +2011/07/31 22:10:38.939,1307.0,2 +2011/07/31 22:10:39.272,1307.0,1 +2011/07/31 22:10:41.345,1307.25,1 +2011/07/31 22:10:41.345,1307.25,1 +2011/07/31 22:10:42.295,1307.0,1 +2011/07/31 22:10:42.295,1307.0,1 +2011/07/31 22:10:42.295,1307.0,1 +2011/07/31 22:10:44.555,1307.0,1 +2011/07/31 22:10:45.043,1307.0,1 +2011/07/31 22:10:45.043,1307.0,1 +2011/07/31 22:10:45.043,1307.0,3 +2011/07/31 22:10:46.435,1307.25,2 +2011/07/31 22:10:48.192,1307.0,1 +2011/07/31 22:10:49.835,1307.25,1 +2011/07/31 22:10:51.040,1307.25,1 +2011/07/31 22:10:51.146,1307.25,1 +2011/07/31 22:10:51.146,1307.25,1 +2011/07/31 22:10:52.147,1307.25,1 +2011/07/31 22:10:52.147,1307.25,2 +2011/07/31 22:10:52.156,1307.25,1 +2011/07/31 22:10:52.156,1307.25,1 +2011/07/31 22:10:52.192,1307.25,1 +2011/07/31 22:10:52.620,1307.25,2 +2011/07/31 22:10:52.620,1307.25,1 +2011/07/31 22:10:52.620,1307.25,1 +2011/07/31 22:10:52.620,1307.25,1 +2011/07/31 22:10:52.620,1307.25,1 +2011/07/31 22:10:52.620,1307.25,23 +2011/07/31 22:10:52.620,1307.25,1 +2011/07/31 22:10:52.620,1307.25,4 +2011/07/31 22:10:53.248,1307.25,3 +2011/07/31 22:10:54.418,1307.25,1 +2011/07/31 22:10:54.839,1307.25,1 +2011/07/31 22:10:58.214,1307.5,10 +2011/07/31 22:10:58.219,1307.5,10 +2011/07/31 22:10:58.219,1307.5,3 +2011/07/31 22:10:58.219,1307.5,4 +2011/07/31 22:10:58.219,1307.5,2 +2011/07/31 22:10:58.219,1307.5,1 +2011/07/31 22:10:58.231,1307.5,3 +2011/07/31 22:10:58.231,1307.5,1 +2011/07/31 22:10:58.231,1307.5,1 +2011/07/31 22:10:58.231,1307.5,1 +2011/07/31 22:10:58.231,1307.5,1 +2011/07/31 22:10:58.231,1307.5,2 +2011/07/31 22:10:58.845,1307.5,1 +2011/07/31 22:10:59.274,1307.5,5 +2011/07/31 22:10:59.274,1307.5,5 +2011/07/31 22:10:59.977,1307.75,2 +2011/07/31 22:11:04.570,1307.5,5 +2011/07/31 22:11:04.570,1307.5,5 +2011/07/31 22:11:05.411,1307.75,3 +2011/07/31 22:11:05.411,1307.75,1 +2011/07/31 22:11:05.642,1307.5,1 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,4 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:07.624,1307.5,4 +2011/07/31 22:11:07.624,1307.5,10 +2011/07/31 22:11:07.624,1307.5,1 +2011/07/31 22:11:10.049,1307.5,1 +2011/07/31 22:11:11.024,1307.5,2 +2011/07/31 22:11:12.075,1307.5,2 +2011/07/31 22:11:12.075,1307.5,1 +2011/07/31 22:11:12.075,1307.5,10 +2011/07/31 22:11:12.075,1307.5,19 +2011/07/31 22:11:12.075,1307.5,2 +2011/07/31 22:11:12.140,1307.5,6 +2011/07/31 22:11:12.324,1307.5,3 +2011/07/31 22:11:12.468,1307.5,5 +2011/07/31 22:11:12.468,1307.5,2 +2011/07/31 22:11:12.560,1307.25,5 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,5 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,4 +2011/07/31 22:11:12.560,1307.25,3 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,1 +2011/07/31 22:11:12.560,1307.25,13 +2011/07/31 22:11:13.012,1307.5,2 +2011/07/31 22:11:13.046,1307.5,1 +2011/07/31 22:11:13.656,1307.25,1 +2011/07/31 22:11:14.606,1307.5,3 +2011/07/31 22:11:16.638,1307.25,10 +2011/07/31 22:11:16.761,1307.5,4 +2011/07/31 22:11:19.521,1307.25,3 +2011/07/31 22:11:20.207,1307.25,10 +2011/07/31 22:11:20.311,1307.25,3 +2011/07/31 22:11:20.311,1307.25,1 +2011/07/31 22:11:20.311,1307.25,4 +2011/07/31 22:11:20.311,1307.25,1 +2011/07/31 22:11:20.311,1307.25,1 +2011/07/31 22:11:20.311,1307.25,4 +2011/07/31 22:11:20.311,1307.25,2 +2011/07/31 22:11:20.311,1307.25,4 +2011/07/31 22:11:20.311,1307.25,1 +2011/07/31 22:11:20.455,1307.25,1 +2011/07/31 22:11:21.094,1307.25,3 +2011/07/31 22:11:21.120,1307.25,6 +2011/07/31 22:11:21.215,1307.0,1 +2011/07/31 22:11:21.215,1307.0,1 +2011/07/31 22:11:21.947,1307.25,1 +2011/07/31 22:11:21.947,1307.25,1 +2011/07/31 22:11:21.947,1307.25,5 +2011/07/31 22:11:21.947,1307.25,4 +2011/07/31 22:11:21.947,1307.25,9 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.269,1307.0,1 +2011/07/31 22:11:22.312,1307.25,1 +2011/07/31 22:11:22.312,1307.25,3 +2011/07/31 22:11:22.509,1307.5,1 +2011/07/31 22:11:24.314,1307.25,1 +2011/07/31 22:11:25.805,1307.25,1 +2011/07/31 22:11:25.979,1307.25,5 +2011/07/31 22:11:27.423,1307.5,1 +2011/07/31 22:11:27.453,1307.25,5 +2011/07/31 22:11:28.308,1307.25,1 +2011/07/31 22:11:28.421,1307.25,1 +2011/07/31 22:11:28.712,1307.25,2 +2011/07/31 22:11:28.712,1307.25,1 +2011/07/31 22:11:28.712,1307.25,1 +2011/07/31 22:11:29.269,1307.25,2 +2011/07/31 22:11:29.269,1307.25,1 +2011/07/31 22:11:30.537,1307.25,1 +2011/07/31 22:11:31.324,1307.25,1 +2011/07/31 22:11:31.922,1307.25,1 +2011/07/31 22:11:31.963,1307.25,1 +2011/07/31 22:11:33.019,1307.25,5 +2011/07/31 22:11:33.019,1307.25,1 +2011/07/31 22:11:33.019,1307.25,4 +2011/07/31 22:11:33.019,1307.25,1 +2011/07/31 22:11:33.019,1307.25,1 +2011/07/31 22:11:33.019,1307.25,3 +2011/07/31 22:11:33.019,1307.25,1 +2011/07/31 22:11:33.019,1307.25,4 +2011/07/31 22:11:33.775,1307.25,2 +2011/07/31 22:11:34.477,1307.25,1 +2011/07/31 22:11:35.407,1307.0,1 +2011/07/31 22:11:36.325,1307.25,5 +2011/07/31 22:11:36.366,1307.25,1 +2011/07/31 22:11:36.660,1307.25,1 +2011/07/31 22:11:38.243,1307.25,1 +2011/07/31 22:11:38.319,1307.25,3 +2011/07/31 22:11:38.369,1307.25,2 +2011/07/31 22:11:38.410,1307.25,1 +2011/07/31 22:11:38.449,1307.25,1 +2011/07/31 22:11:38.485,1307.25,2 +2011/07/31 22:11:38.525,1307.25,1 +2011/07/31 22:11:38.596,1307.25,2 +2011/07/31 22:11:38.596,1307.25,1 +2011/07/31 22:11:38.650,1307.25,2 +2011/07/31 22:11:38.679,1307.25,4 +2011/07/31 22:11:38.689,1307.25,1 +2011/07/31 22:11:38.728,1307.25,2 +2011/07/31 22:11:38.759,1307.25,1 +2011/07/31 22:11:38.778,1307.0,1 +2011/07/31 22:11:38.837,1307.0,1 +2011/07/31 22:11:40.151,1307.25,1 +2011/07/31 22:11:40.811,1307.0,1 +2011/07/31 22:11:41.800,1307.25,1 +2011/07/31 22:11:41.889,1307.0,1 +2011/07/31 22:11:42.686,1307.0,2 +2011/07/31 22:11:48.973,1307.0,10 +2011/07/31 22:11:50.813,1307.0,3 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,62 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,3 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:50.813,1307.0,2 +2011/07/31 22:11:50.813,1307.0,1 +2011/07/31 22:11:51.788,1307.0,20 +2011/07/31 22:11:51.788,1307.0,10 +2011/07/31 22:11:51.788,1307.0,5 +2011/07/31 22:11:51.788,1307.0,24 +2011/07/31 22:11:51.788,1307.0,2 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,10 +2011/07/31 22:11:51.788,1307.25,10 +2011/07/31 22:11:51.788,1307.25,3 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,4 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,5 +2011/07/31 22:11:51.788,1307.25,1 +2011/07/31 22:11:51.788,1307.25,3 +2011/07/31 22:11:51.788,1307.25,37 +2011/07/31 22:11:51.788,1307.25,41 +2011/07/31 22:11:51.788,1307.25,21 +2011/07/31 22:11:52.332,1307.0,1 +2011/07/31 22:11:54.795,1307.0,1 +2011/07/31 22:11:56.910,1307.0,3 +2011/07/31 22:11:56.910,1307.0,2 +2011/07/31 22:11:56.910,1307.0,1 +2011/07/31 22:11:59.207,1307.25,1 +2011/07/31 22:11:59.812,1307.0,2 +2011/07/31 22:12:01.186,1307.25,15 +2011/07/31 22:12:01.186,1307.25,27 +2011/07/31 22:12:01.186,1307.25,6 +2011/07/31 22:12:01.186,1307.25,10 +2011/07/31 22:12:01.186,1307.25,1 +2011/07/31 22:12:01.186,1307.25,1 +2011/07/31 22:12:01.186,1307.25,3 +2011/07/31 22:12:01.186,1307.25,38 +2011/07/31 22:12:05.337,1307.25,1 +2011/07/31 22:12:05.462,1307.0,1 +2011/07/31 22:12:06.809,1307.0,1 +2011/07/31 22:12:08.403,1307.0,1 +2011/07/31 22:12:08.578,1307.0,3 +2011/07/31 22:12:08.947,1307.0,1 +2011/07/31 22:12:09.927,1307.0,1 +2011/07/31 22:12:11.901,1307.0,2 +2011/07/31 22:12:12.114,1307.0,1 +2011/07/31 22:12:13.223,1307.25,1 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,10 +2011/07/31 22:12:13.641,1307.0,10 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,5 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,3 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:13.641,1307.0,10 +2011/07/31 22:12:13.641,1307.0,2 +2011/07/31 22:12:13.641,1307.0,1 +2011/07/31 22:12:14.054,1307.0,1 +2011/07/31 22:12:15.725,1307.0,1 +2011/07/31 22:12:15.725,1307.0,1 +2011/07/31 22:12:17.348,1306.75,1 +2011/07/31 22:12:17.348,1306.75,1 +2011/07/31 22:12:17.348,1306.75,1 +2011/07/31 22:12:17.348,1306.75,1 +2011/07/31 22:12:18.947,1306.75,1 +2011/07/31 22:12:19.210,1306.75,1 +2011/07/31 22:12:20.293,1307.0,1 +2011/07/31 22:12:20.293,1307.0,1 +2011/07/31 22:12:20.424,1307.0,5 +2011/07/31 22:12:20.424,1307.0,48 +2011/07/31 22:12:20.424,1307.0,28 +2011/07/31 22:12:20.430,1307.0,23 +2011/07/31 22:12:20.430,1307.0,1 +2011/07/31 22:12:20.430,1307.0,1 +2011/07/31 22:12:20.430,1307.0,1 +2011/07/31 22:12:20.430,1307.0,24 +2011/07/31 22:12:21.508,1306.75,1 +2011/07/31 22:12:21.686,1307.0,24 +2011/07/31 22:12:21.686,1307.0,1 +2011/07/31 22:12:21.686,1307.0,1 +2011/07/31 22:12:21.686,1307.0,1 +2011/07/31 22:12:21.686,1307.0,11 +2011/07/31 22:12:22.499,1306.75,1 +2011/07/31 22:12:22.499,1306.75,1 +2011/07/31 22:12:22.698,1306.75,2 +2011/07/31 22:12:22.698,1306.75,1 +2011/07/31 22:12:22.698,1306.75,1 +2011/07/31 22:12:22.698,1306.75,1 +2011/07/31 22:12:26.292,1306.75,1 +2011/07/31 22:12:26.292,1306.75,5 +2011/07/31 22:12:26.292,1306.75,5 +2011/07/31 22:12:26.292,1306.75,1 +2011/07/31 22:12:26.292,1306.75,8 +2011/07/31 22:12:26.336,1306.75,2 +2011/07/31 22:12:26.336,1306.75,2 +2011/07/31 22:12:26.336,1306.75,1 +2011/07/31 22:12:26.336,1306.75,1 +2011/07/31 22:12:26.336,1306.75,5 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,1 +2011/07/31 22:12:26.781,1306.75,3 +2011/07/31 22:12:26.781,1306.75,5 +2011/07/31 22:12:26.781,1306.75,3 +2011/07/31 22:12:29.731,1306.5,1 +2011/07/31 22:12:29.731,1306.5,1 +2011/07/31 22:12:29.731,1306.5,1 +2011/07/31 22:12:29.731,1306.5,1 +2011/07/31 22:12:29.731,1306.5,1 +2011/07/31 22:12:30.112,1306.5,1 +2011/07/31 22:12:30.112,1306.5,3 +2011/07/31 22:12:30.112,1306.5,1 +2011/07/31 22:12:32.437,1306.75,1 +2011/07/31 22:12:32.437,1306.75,1 +2011/07/31 22:12:34.466,1306.75,1 +2011/07/31 22:12:34.466,1306.75,1 +2011/07/31 22:12:34.466,1306.75,1 +2011/07/31 22:12:34.523,1306.5,1 +2011/07/31 22:12:34.523,1306.5,1 +2011/07/31 22:12:34.708,1306.75,1 +2011/07/31 22:12:34.708,1306.75,1 +2011/07/31 22:12:34.708,1306.75,1 +2011/07/31 22:12:36.336,1306.5,1 +2011/07/31 22:12:36.387,1306.75,5 +2011/07/31 22:12:37.188,1306.75,3 +2011/07/31 22:12:37.188,1306.75,2 +2011/07/31 22:12:37.188,1306.75,2 +2011/07/31 22:12:37.188,1306.75,3 +2011/07/31 22:12:37.188,1306.75,4 +2011/07/31 22:12:37.195,1306.75,1 +2011/07/31 22:12:37.433,1306.5,1 +2011/07/31 22:12:37.616,1306.75,1 +2011/07/31 22:12:37.616,1306.75,4 +2011/07/31 22:12:39.081,1306.5,1 +2011/07/31 22:12:40.083,1306.5,1 +2011/07/31 22:12:40.988,1306.5,1 +2011/07/31 22:12:41.358,1306.5,1 +2011/07/31 22:12:41.358,1306.5,10 +2011/07/31 22:12:41.358,1306.5,1 +2011/07/31 22:12:41.932,1306.5,5 +2011/07/31 22:12:41.932,1306.5,3 +2011/07/31 22:12:41.932,1306.5,2 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,3 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,10 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,3 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:41.939,1306.5,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.305,1306.25,1 +2011/07/31 22:12:42.692,1306.25,1 +2011/07/31 22:12:42.708,1306.25,1 +2011/07/31 22:12:45.223,1306.5,1 +2011/07/31 22:12:45.223,1306.5,1 +2011/07/31 22:12:45.223,1306.5,3 +2011/07/31 22:12:45.317,1306.25,5 +2011/07/31 22:12:45.922,1306.5,2 +2011/07/31 22:12:48.824,1306.5,1 +2011/07/31 22:12:48.824,1306.5,1 +2011/07/31 22:12:50.321,1306.25,1 +2011/07/31 22:12:50.321,1306.25,2 +2011/07/31 22:12:50.505,1306.5,1 +2011/07/31 22:12:50.686,1306.5,3 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,2 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:50.761,1306.5,1 +2011/07/31 22:12:51.553,1306.5,1 +2011/07/31 22:12:52.289,1306.5,1 +2011/07/31 22:12:55.200,1306.5,1 +2011/07/31 22:12:56.036,1306.5,1 +2011/07/31 22:12:57.622,1306.5,1 +2011/07/31 22:12:58.957,1306.5,1 +2011/07/31 22:13:04.355,1306.75,2 +2011/07/31 22:13:08.453,1306.75,2 +2011/07/31 22:13:08.453,1306.75,1 +2011/07/31 22:13:08.453,1306.75,1 +2011/07/31 22:13:08.453,1306.75,6 +2011/07/31 22:13:09.594,1306.5,4 +2011/07/31 22:13:13.856,1306.5,1 +2011/07/31 22:13:13.910,1306.5,2 +2011/07/31 22:13:14.032,1306.5,2 +2011/07/31 22:13:15.361,1306.5,2 +2011/07/31 22:13:15.361,1306.5,1 +2011/07/31 22:13:15.361,1306.5,1 +2011/07/31 22:13:17.683,1306.5,4 +2011/07/31 22:13:17.683,1306.5,1 +2011/07/31 22:13:18.411,1306.75,3 +2011/07/31 22:13:18.900,1306.75,10 +2011/07/31 22:13:19.453,1306.5,2 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.453,1306.5,3 +2011/07/31 22:13:19.453,1306.5,9 +2011/07/31 22:13:19.453,1306.5,1 +2011/07/31 22:13:19.480,1306.75,10 +2011/07/31 22:13:19.509,1306.75,21 +2011/07/31 22:13:19.509,1306.75,19 +2011/07/31 22:13:19.834,1306.75,27 +2011/07/31 22:13:19.834,1306.75,3 +2011/07/31 22:13:19.834,1306.75,1 +2011/07/31 22:13:19.834,1306.75,1 +2011/07/31 22:13:19.834,1306.75,1 +2011/07/31 22:13:19.834,1306.75,2 +2011/07/31 22:13:19.834,1306.75,1 +2011/07/31 22:13:19.834,1306.75,1 +2011/07/31 22:13:19.834,1306.75,20 +2011/07/31 22:13:19.834,1306.75,4 +2011/07/31 22:13:21.048,1307.0,1 +2011/07/31 22:13:21.048,1307.0,1 +2011/07/31 22:13:21.048,1307.0,3 +2011/07/31 22:13:21.048,1307.0,1 +2011/07/31 22:13:21.048,1307.0,4 +2011/07/31 22:13:21.102,1307.0,2 +2011/07/31 22:13:21.441,1306.75,2 +2011/07/31 22:13:21.623,1307.0,13 +2011/07/31 22:13:21.623,1307.0,1 +2011/07/31 22:13:21.623,1307.0,1 +2011/07/31 22:13:21.623,1307.0,2 +2011/07/31 22:13:21.623,1307.0,1 +2011/07/31 22:13:21.623,1307.0,2 +2011/07/31 22:13:25.958,1307.0,10 +2011/07/31 22:13:26.773,1306.75,1 +2011/07/31 22:13:28.420,1306.75,1 +2011/07/31 22:13:31.049,1307.0,1 +2011/07/31 22:13:33.605,1306.75,4 +2011/07/31 22:13:38.142,1307.0,1 +2011/07/31 22:13:38.514,1306.75,10 +2011/07/31 22:13:38.520,1306.75,1 +2011/07/31 22:13:39.520,1306.75,3 +2011/07/31 22:13:40.167,1306.75,10 +2011/07/31 22:13:40.174,1306.75,6 +2011/07/31 22:13:40.174,1306.75,2 +2011/07/31 22:13:40.174,1306.75,2 +2011/07/31 22:13:40.174,1306.75,1 +2011/07/31 22:13:40.174,1306.75,4 +2011/07/31 22:13:40.174,1306.75,1 +2011/07/31 22:13:40.174,1306.75,3 +2011/07/31 22:13:42.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,3 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:43.725,1306.5,1 +2011/07/31 22:13:44.837,1306.75,1 +2011/07/31 22:13:46.091,1306.5,1 +2011/07/31 22:13:46.091,1306.5,1 +2011/07/31 22:13:46.091,1306.5,1 +2011/07/31 22:13:46.091,1306.5,1 +2011/07/31 22:13:46.091,1306.5,1 +2011/07/31 22:13:46.091,1306.5,5 +2011/07/31 22:13:46.551,1306.75,1 +2011/07/31 22:13:46.971,1306.5,5 +2011/07/31 22:13:46.971,1306.5,1 +2011/07/31 22:13:47.621,1306.5,5 +2011/07/31 22:13:47.867,1306.5,9 +2011/07/31 22:13:47.867,1306.5,1 +2011/07/31 22:13:47.873,1306.5,1 +2011/07/31 22:13:48.888,1306.5,3 +2011/07/31 22:13:50.040,1306.5,3 +2011/07/31 22:13:50.040,1306.5,1 +2011/07/31 22:13:50.540,1306.5,1 +2011/07/31 22:13:50.990,1306.5,1 +2011/07/31 22:13:50.990,1306.5,1 +2011/07/31 22:13:51.893,1306.5,1 +2011/07/31 22:13:52.246,1306.5,1 +2011/07/31 22:13:53.580,1306.25,1 +2011/07/31 22:13:54.284,1306.25,2 +2011/07/31 22:13:56.581,1306.5,1 +2011/07/31 22:13:59.911,1306.25,1 +2011/07/31 22:14:01.131,1306.5,1 +2011/07/31 22:14:01.131,1306.5,3 +2011/07/31 22:14:04.274,1306.25,10 +2011/07/31 22:14:04.678,1306.25,15 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,5 +2011/07/31 22:14:04.678,1306.25,2 +2011/07/31 22:14:04.678,1306.25,2 +2011/07/31 22:14:04.678,1306.25,2 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,5 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.678,1306.25,30 +2011/07/31 22:14:04.678,1306.25,1 +2011/07/31 22:14:04.684,1306.25,1 +2011/07/31 22:14:04.684,1306.25,1 +2011/07/31 22:14:04.684,1306.25,1 +2011/07/31 22:14:04.684,1306.25,1 +2011/07/31 22:14:04.684,1306.25,2 +2011/07/31 22:14:06.276,1306.0,1 +2011/07/31 22:14:06.276,1306.0,1 +2011/07/31 22:14:06.317,1306.0,1 +2011/07/31 22:14:06.886,1306.0,1 +2011/07/31 22:14:09.277,1306.0,2 +2011/07/31 22:14:09.277,1306.0,1 +2011/07/31 22:14:12.125,1306.25,2 +2011/07/31 22:14:12.455,1306.0,1 +2011/07/31 22:14:14.575,1306.25,1 +2011/07/31 22:14:15.771,1306.0,1 +2011/07/31 22:14:15.771,1306.0,1 +2011/07/31 22:14:16.510,1306.0,1 +2011/07/31 22:14:17.465,1306.0,2 +2011/07/31 22:14:17.924,1306.0,1 +2011/07/31 22:14:19.137,1306.0,1 +2011/07/31 22:14:19.137,1306.0,1 +2011/07/31 22:14:19.137,1306.0,1 +2011/07/31 22:14:19.312,1306.0,1 +2011/07/31 22:14:19.359,1306.0,1 +2011/07/31 22:14:20.379,1306.0,1 +2011/07/31 22:14:20.379,1306.0,1 +2011/07/31 22:14:20.379,1306.0,1 +2011/07/31 22:14:20.379,1306.0,1 +2011/07/31 22:14:20.379,1306.0,1 +2011/07/31 22:14:22.143,1306.25,3 +2011/07/31 22:14:22.462,1306.0,1 +2011/07/31 22:14:22.487,1306.25,4 +2011/07/31 22:14:22.487,1306.25,10 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,3 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,3 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,1 +2011/07/31 22:14:22.487,1306.25,36 +2011/07/31 22:14:22.487,1306.25,4 +2011/07/31 22:14:22.986,1306.0,1 +2011/07/31 22:14:22.986,1306.0,1 +2011/07/31 22:14:22.986,1306.0,1 +2011/07/31 22:14:23.798,1306.0,1 +2011/07/31 22:14:23.798,1306.0,1 +2011/07/31 22:14:23.798,1306.0,1 +2011/07/31 22:14:23.798,1306.0,1 +2011/07/31 22:14:23.798,1306.0,5 +2011/07/31 22:14:23.798,1306.0,1 +2011/07/31 22:14:24.172,1306.0,1 +2011/07/31 22:14:28.487,1306.0,5 +2011/07/31 22:14:28.487,1306.0,1 +2011/07/31 22:14:28.487,1306.0,1 +2011/07/31 22:14:28.487,1306.0,10 +2011/07/31 22:14:28.487,1306.0,2 +2011/07/31 22:14:28.487,1306.0,1 +2011/07/31 22:14:28.487,1306.0,1 +2011/07/31 22:14:28.487,1306.0,1 +2011/07/31 22:14:28.705,1306.0,15 +2011/07/31 22:14:31.162,1306.0,1 +2011/07/31 22:14:31.380,1306.0,1 +2011/07/31 22:14:32.523,1306.0,1 +2011/07/31 22:14:34.298,1305.75,1 +2011/07/31 22:14:34.298,1305.75,2 +2011/07/31 22:14:34.298,1305.75,4 +2011/07/31 22:14:34.298,1305.75,1 +2011/07/31 22:14:34.298,1305.75,10 +2011/07/31 22:14:34.298,1305.75,10 +2011/07/31 22:14:34.298,1305.75,1 +2011/07/31 22:14:34.298,1305.75,2 +2011/07/31 22:14:34.298,1305.75,9 +2011/07/31 22:14:34.298,1305.75,16 +2011/07/31 22:14:34.298,1305.75,1 +2011/07/31 22:14:34.298,1305.75,5 +2011/07/31 22:14:34.298,1305.75,1 +2011/07/31 22:14:34.298,1305.75,2 +2011/07/31 22:14:34.761,1305.75,2 +2011/07/31 22:14:34.761,1306.0,1 +2011/07/31 22:14:35.051,1305.75,1 +2011/07/31 22:14:35.612,1305.75,1 +2011/07/31 22:14:35.642,1305.75,2 +2011/07/31 22:14:43.019,1306.0,5 +2011/07/31 22:14:43.120,1306.0,1 +2011/07/31 22:14:43.120,1306.0,1 +2011/07/31 22:14:43.989,1305.75,2 +2011/07/31 22:14:43.989,1305.75,2 +2011/07/31 22:14:43.989,1305.75,1 +2011/07/31 22:14:45.863,1306.0,1 +2011/07/31 22:14:50.244,1305.75,1 +2011/07/31 22:14:52.352,1305.75,2 +2011/07/31 22:14:52.352,1305.75,1 +2011/07/31 22:14:52.352,1305.75,2 +2011/07/31 22:14:52.352,1305.75,6 +2011/07/31 22:14:53.079,1306.0,3 +2011/07/31 22:14:53.079,1306.0,8 +2011/07/31 22:14:53.079,1306.0,2 +2011/07/31 22:14:53.079,1306.0,1 +2011/07/31 22:14:53.079,1306.0,1 +2011/07/31 22:14:53.079,1306.0,1 +2011/07/31 22:14:53.079,1306.0,3 +2011/07/31 22:14:53.079,1306.0,10 +2011/07/31 22:14:53.079,1306.0,1 +2011/07/31 22:14:53.079,1306.0,2 +2011/07/31 22:14:53.079,1306.0,1 +2011/07/31 22:14:53.079,1306.0,2 +2011/07/31 22:14:53.079,1306.0,2 +2011/07/31 22:14:53.079,1306.0,29 +2011/07/31 22:14:53.084,1306.0,28 +2011/07/31 22:14:53.084,1306.0,1 +2011/07/31 22:14:53.084,1306.0,3 +2011/07/31 22:14:53.084,1306.0,5 +2011/07/31 22:14:53.084,1306.0,5 +2011/07/31 22:14:53.084,1306.0,1 +2011/07/31 22:14:53.084,1306.0,1 +2011/07/31 22:14:53.084,1306.0,50 +2011/07/31 22:14:53.084,1306.0,1 +2011/07/31 22:14:53.084,1306.0,1 +2011/07/31 22:14:53.084,1306.25,1 +2011/07/31 22:14:53.084,1306.25,2 +2011/07/31 22:14:53.084,1306.25,1 +2011/07/31 22:14:53.084,1306.25,1 +2011/07/31 22:14:53.215,1306.0,1 +2011/07/31 22:14:53.325,1306.0,56 +2011/07/31 22:14:53.325,1306.0,1 +2011/07/31 22:14:54.469,1306.25,10 +2011/07/31 22:14:54.602,1306.0,1 +2011/07/31 22:14:54.719,1306.25,2 +2011/07/31 22:14:54.754,1306.25,1 +2011/07/31 22:14:55.149,1306.25,6 +2011/07/31 22:14:55.149,1306.25,1 +2011/07/31 22:14:55.149,1306.25,1 +2011/07/31 22:14:55.149,1306.25,1 +2011/07/31 22:14:55.149,1306.25,1 +2011/07/31 22:14:55.484,1306.25,1 +2011/07/31 22:14:55.484,1306.25,3 +2011/07/31 22:14:55.484,1306.25,24 +2011/07/31 22:14:55.484,1306.25,2 +2011/07/31 22:14:55.484,1306.25,1 +2011/07/31 22:14:56.588,1306.5,2 +2011/07/31 22:14:56.588,1306.5,8 +2011/07/31 22:14:58.237,1306.25,1 +2011/07/31 22:14:58.881,1306.25,1 +2011/07/31 22:14:58.888,1306.25,1 +2011/07/31 22:14:58.899,1306.25,1 +2011/07/31 22:14:58.906,1306.25,1 +2011/07/31 22:14:58.915,1306.25,1 +2011/07/31 22:14:58.923,1306.25,1 +2011/07/31 22:14:58.940,1306.25,1 +2011/07/31 22:14:58.949,1306.25,1 +2011/07/31 22:14:58.958,1306.25,1 +2011/07/31 22:14:58.967,1306.25,1 +2011/07/31 22:14:58.991,1306.25,1 +2011/07/31 22:14:59.006,1306.25,1 +2011/07/31 22:14:59.024,1306.25,1 +2011/07/31 22:14:59.033,1306.25,1 +2011/07/31 22:14:59.043,1306.25,1 +2011/07/31 22:14:59.051,1306.25,1 +2011/07/31 22:14:59.059,1306.25,1 +2011/07/31 22:14:59.067,1306.25,1 +2011/07/31 22:14:59.067,1306.25,10 +2011/07/31 22:14:59.067,1306.25,1 +2011/07/31 22:14:59.073,1306.0,1 +2011/07/31 22:14:59.095,1306.0,1 +2011/07/31 22:14:59.121,1306.0,1 +2011/07/31 22:14:59.135,1306.0,1 +2011/07/31 22:14:59.144,1306.0,1 +2011/07/31 22:14:59.153,1306.0,1 +2011/07/31 22:14:59.161,1306.0,1 +2011/07/31 22:14:59.177,1306.0,1 +2011/07/31 22:14:59.192,1306.0,1 +2011/07/31 22:14:59.208,1306.0,1 +2011/07/31 22:14:59.217,1306.0,1 +2011/07/31 22:14:59.225,1306.0,1 +2011/07/31 22:14:59.234,1306.0,1 +2011/07/31 22:14:59.241,1306.0,1 +2011/07/31 22:14:59.250,1306.0,1 +2011/07/31 22:14:59.258,1306.0,1 +2011/07/31 22:14:59.266,1306.0,1 +2011/07/31 22:15:01.384,1306.0,1 +2011/07/31 22:15:01.410,1306.0,1 +2011/07/31 22:15:01.435,1306.0,1 +2011/07/31 22:15:01.462,1306.0,1 +2011/07/31 22:15:01.500,1306.0,1 +2011/07/31 22:15:01.523,1306.0,1 +2011/07/31 22:15:01.624,1306.0,1 +2011/07/31 22:15:01.650,1306.0,1 +2011/07/31 22:15:01.675,1306.0,1 +2011/07/31 22:15:01.712,1306.0,1 +2011/07/31 22:15:01.745,1306.0,1 +2011/07/31 22:15:01.771,1306.0,1 +2011/07/31 22:15:01.807,1306.0,1 +2011/07/31 22:15:01.843,1306.0,1 +2011/07/31 22:15:01.843,1306.0,1 +2011/07/31 22:15:01.876,1306.0,1 +2011/07/31 22:15:01.900,1306.0,1 +2011/07/31 22:15:01.924,1306.0,1 +2011/07/31 22:15:01.961,1306.0,1 +2011/07/31 22:15:01.986,1306.0,1 +2011/07/31 22:15:02.041,1306.0,1 +2011/07/31 22:15:02.091,1306.0,1 +2011/07/31 22:15:03.053,1306.25,1 +2011/07/31 22:15:03.161,1306.25,1 +2011/07/31 22:15:03.440,1306.25,3 +2011/07/31 22:15:03.440,1306.25,10 +2011/07/31 22:15:03.440,1306.25,3 +2011/07/31 22:15:03.440,1306.25,1 +2011/07/31 22:15:03.440,1306.25,1 +2011/07/31 22:15:03.523,1306.25,5 +2011/07/31 22:15:03.539,1306.25,4 +2011/07/31 22:15:05.705,1306.5,7 +2011/07/31 22:15:05.705,1306.5,1 +2011/07/31 22:15:05.705,1306.5,1 +2011/07/31 22:15:05.705,1306.5,1 +2011/07/31 22:15:05.705,1306.5,2 +2011/07/31 22:15:05.705,1306.5,1 +2011/07/31 22:15:05.705,1306.5,10 +2011/07/31 22:15:05.705,1306.5,2 +2011/07/31 22:15:06.241,1306.25,10 +2011/07/31 22:15:06.241,1306.25,20 +2011/07/31 22:15:06.241,1306.25,5 +2011/07/31 22:15:06.241,1306.25,5 +2011/07/31 22:15:06.241,1306.25,10 +2011/07/31 22:15:06.651,1306.25,1 +2011/07/31 22:15:07.436,1306.25,1 +2011/07/31 22:15:07.436,1306.25,2 +2011/07/31 22:15:07.443,1306.25,3 +2011/07/31 22:15:07.491,1306.25,3 +2011/07/31 22:15:07.510,1306.25,2 +2011/07/31 22:15:07.510,1306.25,1 +2011/07/31 22:15:07.517,1306.25,3 +2011/07/31 22:15:07.548,1306.25,3 +2011/07/31 22:15:07.622,1306.25,3 +2011/07/31 22:15:07.636,1306.25,3 +2011/07/31 22:15:07.643,1306.25,3 +2011/07/31 22:15:07.650,1306.25,3 +2011/07/31 22:15:07.656,1306.25,1 +2011/07/31 22:15:07.656,1306.25,1 +2011/07/31 22:15:07.656,1306.25,1 +2011/07/31 22:15:07.684,1306.25,2 +2011/07/31 22:15:07.684,1306.25,1 +2011/07/31 22:15:08.361,1306.25,1 +2011/07/31 22:15:11.594,1306.25,1 +2011/07/31 22:15:12.240,1306.25,3 +2011/07/31 22:15:12.264,1306.25,3 +2011/07/31 22:15:12.334,1306.25,2 +2011/07/31 22:15:12.334,1306.25,1 +2011/07/31 22:15:12.382,1306.25,2 +2011/07/31 22:15:12.382,1306.25,1 +2011/07/31 22:15:12.413,1306.25,3 +2011/07/31 22:15:12.463,1306.25,1 +2011/07/31 22:15:12.463,1306.25,2 +2011/07/31 22:15:12.496,1306.25,3 +2011/07/31 22:15:12.519,1306.25,3 +2011/07/31 22:15:13.911,1306.25,2 +2011/07/31 22:15:14.209,1306.25,10 +2011/07/31 22:15:14.241,1306.5,1 +2011/07/31 22:15:15.953,1306.5,22 +2011/07/31 22:15:15.953,1306.5,16 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,40 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,10 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,5 +2011/07/31 22:15:15.953,1306.5,1 +2011/07/31 22:15:15.953,1306.5,19 +2011/07/31 22:15:15.963,1306.5,2 +2011/07/31 22:15:18.845,1306.75,1 +2011/07/31 22:15:20.238,1306.75,3 +2011/07/31 22:15:20.238,1306.75,1 +2011/07/31 22:15:20.238,1306.75,6 +2011/07/31 22:15:20.786,1306.75,3 +2011/07/31 22:15:21.785,1306.5,6 +2011/07/31 22:15:21.785,1306.5,5 +2011/07/31 22:15:21.785,1306.5,1 +2011/07/31 22:15:21.785,1306.5,1 +2011/07/31 22:15:21.785,1306.5,1 +2011/07/31 22:15:21.785,1306.5,1 +2011/07/31 22:15:22.190,1306.5,2 +2011/07/31 22:15:23.733,1306.5,1 +2011/07/31 22:15:23.733,1306.5,1 +2011/07/31 22:15:25.958,1306.5,1 +2011/07/31 22:15:25.958,1306.5,1 +2011/07/31 22:15:27.881,1306.5,1 +2011/07/31 22:15:27.881,1306.5,2 +2011/07/31 22:15:27.881,1306.5,1 +2011/07/31 22:15:27.881,1306.5,1 +2011/07/31 22:15:30.964,1306.5,4 +2011/07/31 22:15:30.964,1306.5,1 +2011/07/31 22:15:30.964,1306.5,1 +2011/07/31 22:15:30.964,1306.5,1 +2011/07/31 22:15:30.964,1306.5,1 +2011/07/31 22:15:30.964,1306.5,2 +2011/07/31 22:15:30.964,1306.5,2 +2011/07/31 22:15:32.953,1306.5,5 +2011/07/31 22:15:33.255,1306.25,1 +2011/07/31 22:15:33.302,1306.25,2 +2011/07/31 22:15:33.976,1306.25,10 +2011/07/31 22:15:34.002,1306.5,1 +2011/07/31 22:15:34.989,1306.25,1 +2011/07/31 22:15:35.006,1306.25,2 +2011/07/31 22:15:35.019,1306.25,2 +2011/07/31 22:15:35.025,1306.25,2 +2011/07/31 22:15:35.032,1306.25,1 +2011/07/31 22:15:35.044,1306.25,1 +2011/07/31 22:15:35.051,1306.25,2 +2011/07/31 22:15:35.057,1306.25,1 +2011/07/31 22:15:35.063,1306.25,1 +2011/07/31 22:15:35.072,1306.25,2 +2011/07/31 22:15:35.084,1306.25,1 +2011/07/31 22:15:35.108,1306.25,1 +2011/07/31 22:15:35.115,1306.25,2 +2011/07/31 22:15:35.122,1306.25,1 +2011/07/31 22:15:35.128,1306.25,1 +2011/07/31 22:15:35.136,1306.25,1 +2011/07/31 22:15:35.136,1306.25,1 +2011/07/31 22:15:35.143,1306.25,1 +2011/07/31 22:15:35.149,1306.25,1 +2011/07/31 22:15:35.156,1306.25,2 +2011/07/31 22:15:35.162,1306.25,1 +2011/07/31 22:15:35.178,1306.25,1 +2011/07/31 22:15:36.324,1306.25,3 +2011/07/31 22:15:36.443,1306.25,1 +2011/07/31 22:15:36.443,1306.25,1 +2011/07/31 22:15:36.443,1306.25,1 +2011/07/31 22:15:36.443,1306.25,3 +2011/07/31 22:15:36.761,1306.25,2 +2011/07/31 22:15:36.761,1306.25,1 +2011/07/31 22:15:36.761,1306.25,1 +2011/07/31 22:15:36.761,1306.25,4 +2011/07/31 22:15:36.870,1306.25,6 +2011/07/31 22:15:37.518,1306.0,1 +2011/07/31 22:15:39.300,1306.25,2 +2011/07/31 22:15:41.365,1306.0,1 +2011/07/31 22:15:43.583,1306.0,1 +2011/07/31 22:15:43.907,1306.25,1 +2011/07/31 22:15:46.490,1306.25,2 +2011/07/31 22:15:46.953,1306.25,1 +2011/07/31 22:15:46.953,1306.25,20 +2011/07/31 22:15:46.953,1306.25,1 +2011/07/31 22:15:46.953,1306.25,10 +2011/07/31 22:15:46.953,1306.25,3 +2011/07/31 22:15:46.953,1306.25,40 +2011/07/31 22:15:46.953,1306.25,5 +2011/07/31 22:15:47.583,1306.25,7 +2011/07/31 22:15:49.961,1306.25,20 +2011/07/31 22:15:49.961,1306.25,1 +2011/07/31 22:15:49.961,1306.25,10 +2011/07/31 22:15:50.618,1306.25,6 +2011/07/31 22:15:50.618,1306.25,3 +2011/07/31 22:15:50.626,1306.25,1 +2011/07/31 22:15:51.369,1306.25,1 +2011/07/31 22:15:57.592,1306.25,1 +2011/07/31 22:15:58.083,1306.25,1 +2011/07/31 22:15:59.511,1306.25,1 +2011/07/31 22:15:59.646,1306.25,1 +2011/07/31 22:16:03.761,1306.25,1 +2011/07/31 22:16:04.156,1306.25,2 +2011/07/31 22:16:07.092,1306.5,1 +2011/07/31 22:16:07.342,1306.25,1 +2011/07/31 22:16:12.734,1306.5,1 +2011/07/31 22:16:13.596,1306.25,3 +2011/07/31 22:16:17.574,1306.25,1 +2011/07/31 22:16:19.615,1306.25,4 +2011/07/31 22:16:20.803,1306.25,5 +2011/07/31 22:16:21.998,1306.25,3 +2011/07/31 22:16:21.998,1306.25,1 +2011/07/31 22:16:21.998,1306.25,2 +2011/07/31 22:16:21.998,1306.25,1 +2011/07/31 22:16:21.998,1306.25,1 +2011/07/31 22:16:21.998,1306.25,1 +2011/07/31 22:16:21.998,1306.25,1 +2011/07/31 22:16:21.998,1306.25,2 +2011/07/31 22:16:22.012,1306.25,1 +2011/07/31 22:16:23.876,1306.25,1 +2011/07/31 22:16:23.876,1306.25,5 +2011/07/31 22:16:23.876,1306.25,1 +2011/07/31 22:16:23.876,1306.25,5 +2011/07/31 22:16:23.876,1306.25,4 +2011/07/31 22:16:23.876,1306.25,8 +2011/07/31 22:16:26.253,1306.0,3 +2011/07/31 22:16:26.253,1306.0,10 +2011/07/31 22:16:26.253,1306.0,10 +2011/07/31 22:16:26.253,1306.0,10 +2011/07/31 22:16:26.253,1306.0,3 +2011/07/31 22:16:26.253,1306.0,125 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,5 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,2 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,1 +2011/07/31 22:16:26.253,1306.0,75 +2011/07/31 22:16:26.253,1306.0,50 +2011/07/31 22:16:26.402,1306.0,2 +2011/07/31 22:16:27.105,1305.75,1 +2011/07/31 22:16:27.105,1305.75,1 +2011/07/31 22:16:27.105,1305.75,1 +2011/07/31 22:16:27.131,1305.75,3 +2011/07/31 22:16:27.152,1305.75,1 +2011/07/31 22:16:27.190,1305.75,1 +2011/07/31 22:16:27.246,1305.75,2 +2011/07/31 22:16:27.305,1305.75,1 +2011/07/31 22:16:27.337,1305.75,3 +2011/07/31 22:16:27.345,1305.75,2 +2011/07/31 22:16:27.405,1305.75,1 +2011/07/31 22:16:27.433,1305.75,2 +2011/07/31 22:16:27.457,1305.75,1 +2011/07/31 22:16:27.466,1305.75,1 +2011/07/31 22:16:27.473,1305.75,2 +2011/07/31 22:16:27.482,1305.75,1 +2011/07/31 22:16:27.507,1305.75,2 +2011/07/31 22:16:27.533,1305.75,1 +2011/07/31 22:16:27.667,1305.75,3 +2011/07/31 22:16:27.677,1305.75,1 +2011/07/31 22:16:27.684,1305.75,1 +2011/07/31 22:16:27.684,1305.75,1 +2011/07/31 22:16:27.692,1305.75,1 +2011/07/31 22:16:27.730,1305.75,2 +2011/07/31 22:16:27.749,1305.75,1 +2011/07/31 22:16:27.766,1305.75,1 +2011/07/31 22:16:27.766,1305.75,1 +2011/07/31 22:16:27.774,1305.75,1 +2011/07/31 22:16:27.837,1305.75,2 +2011/07/31 22:16:28.443,1305.75,2 +2011/07/31 22:16:28.674,1305.75,2 +2011/07/31 22:16:28.674,1305.75,2 +2011/07/31 22:16:28.674,1305.75,1 +2011/07/31 22:16:30.720,1305.75,1 +2011/07/31 22:16:30.769,1305.75,1 +2011/07/31 22:16:34.315,1305.75,1 +2011/07/31 22:16:34.475,1305.75,1 +2011/07/31 22:16:35.137,1305.75,1 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.657,1305.75,2 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.657,1305.75,2 +2011/07/31 22:16:36.657,1305.75,1 +2011/07/31 22:16:36.689,1305.75,1 +2011/07/31 22:16:36.730,1305.75,2 +2011/07/31 22:16:37.165,1305.75,37 +2011/07/31 22:16:37.165,1305.75,10 +2011/07/31 22:16:37.165,1306.0,2 +2011/07/31 22:16:37.165,1306.0,8 +2011/07/31 22:16:37.165,1306.0,10 +2011/07/31 22:16:37.165,1306.0,4 +2011/07/31 22:16:37.165,1306.0,3 +2011/07/31 22:16:37.165,1306.0,12 +2011/07/31 22:16:37.165,1306.0,1 +2011/07/31 22:16:37.165,1306.0,2 +2011/07/31 22:16:37.165,1306.0,1 +2011/07/31 22:16:37.165,1306.0,1 +2011/07/31 22:16:37.165,1306.0,5 +2011/07/31 22:16:37.170,1306.25,2 +2011/07/31 22:16:37.189,1306.0,4 +2011/07/31 22:16:37.319,1306.25,1 +2011/07/31 22:16:37.329,1305.75,1 +2011/07/31 22:16:37.391,1305.75,4 +2011/07/31 22:16:37.391,1305.75,1 +2011/07/31 22:16:37.391,1305.75,3 +2011/07/31 22:16:37.391,1305.5,4 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,10 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,5 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,2 +2011/07/31 22:16:37.391,1305.5,10 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,3 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,2 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,2 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.391,1305.5,1 +2011/07/31 22:16:37.418,1305.5,1 +2011/07/31 22:16:37.560,1305.75,5 +2011/07/31 22:16:37.905,1305.75,3 +2011/07/31 22:16:37.972,1305.75,2 +2011/07/31 22:16:38.435,1305.75,8 +2011/07/31 22:16:38.435,1305.75,3 +2011/07/31 22:16:38.435,1305.75,10 +2011/07/31 22:16:38.435,1305.75,2 +2011/07/31 22:16:38.435,1305.75,2 +2011/07/31 22:16:38.853,1305.75,2 +2011/07/31 22:16:38.853,1305.75,1 +2011/07/31 22:16:39.704,1305.75,2 +2011/07/31 22:16:41.923,1305.75,1 +2011/07/31 22:16:42.419,1305.75,2 +2011/07/31 22:16:42.915,1305.75,2 +2011/07/31 22:16:45.138,1305.75,6 +2011/07/31 22:16:46.154,1305.75,1 +2011/07/31 22:16:46.371,1305.75,1 +2011/07/31 22:16:46.371,1305.75,5 +2011/07/31 22:16:46.371,1305.75,4 +2011/07/31 22:16:46.740,1305.75,1 +2011/07/31 22:16:46.740,1305.75,3 +2011/07/31 22:16:46.740,1305.75,1 +2011/07/31 22:16:46.740,1305.75,1 +2011/07/31 22:16:46.740,1305.75,2 +2011/07/31 22:16:48.015,1305.75,3 +2011/07/31 22:16:50.739,1305.75,7 +2011/07/31 22:16:50.739,1305.75,4 +2011/07/31 22:16:50.739,1305.75,3 +2011/07/31 22:16:50.739,1305.75,3 +2011/07/31 22:16:50.739,1305.75,1 +2011/07/31 22:16:50.739,1305.75,6 +2011/07/31 22:16:50.739,1305.75,1 +2011/07/31 22:16:50.739,1305.75,2 +2011/07/31 22:16:50.739,1305.75,1 +2011/07/31 22:16:50.862,1305.75,1 +2011/07/31 22:16:51.157,1305.75,5 +2011/07/31 22:16:52.518,1305.75,1 +2011/07/31 22:16:54.420,1305.75,1 +2011/07/31 22:16:54.940,1305.75,1 +2011/07/31 22:17:00.339,1305.75,1 +2011/07/31 22:17:04.403,1306.0,1 +2011/07/31 22:17:09.487,1306.0,1 +2011/07/31 22:17:10.246,1305.75,19 +2011/07/31 22:17:10.246,1305.75,1 +2011/07/31 22:17:10.388,1305.75,1 +2011/07/31 22:17:10.388,1305.75,1 +2011/07/31 22:17:11.033,1305.75,4 +2011/07/31 22:17:11.033,1305.75,1 +2011/07/31 22:17:11.033,1305.75,2 +2011/07/31 22:17:11.033,1305.75,1 +2011/07/31 22:17:11.033,1305.75,1 +2011/07/31 22:17:11.033,1305.75,1 +2011/07/31 22:17:11.739,1305.75,1 +2011/07/31 22:17:12.214,1305.75,1 +2011/07/31 22:17:12.420,1305.75,2 +2011/07/31 22:17:12.420,1305.75,2 +2011/07/31 22:17:13.478,1305.5,2 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,30 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,5 +2011/07/31 22:17:13.478,1305.5,2 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,8 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,3 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,10 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,3 +2011/07/31 22:17:13.478,1305.5,4 +2011/07/31 22:17:13.478,1305.5,10 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.478,1305.5,3 +2011/07/31 22:17:13.478,1305.5,1 +2011/07/31 22:17:13.857,1305.5,25 +2011/07/31 22:17:13.857,1305.5,2 +2011/07/31 22:17:13.857,1305.5,1 +2011/07/31 22:17:14.321,1305.5,3 +2011/07/31 22:17:15.196,1305.5,4 +2011/07/31 22:17:15.398,1305.5,5 +2011/07/31 22:17:16.019,1305.5,2 +2011/07/31 22:17:16.119,1305.5,1 +2011/07/31 22:17:21.451,1305.5,2 +2011/07/31 22:17:22.317,1305.5,2 +2011/07/31 22:17:22.392,1305.25,1 +2011/07/31 22:17:22.392,1305.25,4 +2011/07/31 22:17:22.392,1305.25,1 +2011/07/31 22:17:22.392,1305.25,7 +2011/07/31 22:17:22.392,1305.25,1 +2011/07/31 22:17:22.399,1305.25,1 +2011/07/31 22:17:22.457,1305.25,1 +2011/07/31 22:17:22.466,1305.25,1 +2011/07/31 22:17:22.521,1305.25,1 +2011/07/31 22:17:22.534,1305.25,1 +2011/07/31 22:17:22.584,1305.25,1 +2011/07/31 22:17:22.597,1305.25,1 +2011/07/31 22:17:22.637,1305.25,1 +2011/07/31 22:17:22.645,1305.25,1 +2011/07/31 22:17:22.657,1305.25,1 +2011/07/31 22:17:22.688,1305.25,1 +2011/07/31 22:17:22.696,1305.25,1 +2011/07/31 22:17:22.704,1305.25,1 +2011/07/31 22:17:22.712,1305.25,1 +2011/07/31 22:17:22.727,1305.25,1 +2011/07/31 22:17:22.735,1305.25,1 +2011/07/31 22:17:22.743,1305.25,1 +2011/07/31 22:17:22.773,1305.25,1 +2011/07/31 22:17:22.781,1305.25,1 +2011/07/31 22:17:22.789,1305.25,1 +2011/07/31 22:17:22.798,1305.25,1 +2011/07/31 22:17:22.825,1305.25,1 +2011/07/31 22:17:22.843,1305.25,1 +2011/07/31 22:17:22.851,1305.25,1 +2011/07/31 22:17:22.861,1305.25,1 +2011/07/31 22:17:22.867,1305.25,1 +2011/07/31 22:17:22.881,1305.25,1 +2011/07/31 22:17:22.896,1305.25,1 +2011/07/31 22:17:22.906,1305.25,1 +2011/07/31 22:17:22.916,1305.25,1 +2011/07/31 22:17:22.977,1305.25,1 +2011/07/31 22:17:22.985,1305.25,1 +2011/07/31 22:17:22.993,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,10 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,3 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,4 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,25 +2011/07/31 22:17:23.097,1305.25,5 +2011/07/31 22:17:23.097,1305.25,2 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,5 +2011/07/31 22:17:23.097,1305.25,4 +2011/07/31 22:17:23.097,1305.25,5 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.097,1305.25,2 +2011/07/31 22:17:23.097,1305.25,1 +2011/07/31 22:17:23.385,1305.25,1 +2011/07/31 22:17:23.385,1305.25,2 +2011/07/31 22:17:23.385,1305.25,17 +2011/07/31 22:17:23.425,1305.25,1 +2011/07/31 22:17:23.490,1305.25,10 +2011/07/31 22:17:23.498,1305.25,1 +2011/07/31 22:17:23.498,1305.25,5 +2011/07/31 22:17:23.498,1305.25,20 +2011/07/31 22:17:24.208,1305.25,2 +2011/07/31 22:17:24.281,1305.25,3 +2011/07/31 22:17:25.218,1305.0,1 +2011/07/31 22:17:25.218,1305.0,1 +2011/07/31 22:17:25.252,1305.0,1 +2011/07/31 22:17:25.252,1305.0,1 +2011/07/31 22:17:25.486,1305.0,1 +2011/07/31 22:17:26.292,1305.25,3 +2011/07/31 22:17:26.670,1305.0,1 +2011/07/31 22:17:26.787,1305.25,10 +2011/07/31 22:17:27.262,1305.0,10 +2011/07/31 22:17:28.183,1305.0,1 +2011/07/31 22:17:28.286,1305.25,1 +2011/07/31 22:17:28.437,1305.25,1 +2011/07/31 22:17:28.630,1305.0,2 +2011/07/31 22:17:30.990,1305.0,10 +2011/07/31 22:17:32.327,1305.0,1 +2011/07/31 22:17:34.253,1305.0,22 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,20 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,2 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,2 +2011/07/31 22:17:34.253,1305.0,5 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,10 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,20 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,3 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.253,1305.0,1 +2011/07/31 22:17:34.357,1304.75,10 +2011/07/31 22:17:34.357,1304.75,13 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,10 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.357,1304.75,1 +2011/07/31 22:17:34.403,1305.0,1 +2011/07/31 22:17:34.582,1305.0,50 +2011/07/31 22:17:34.864,1305.0,3 +2011/07/31 22:17:34.961,1305.0,1 +2011/07/31 22:17:35.842,1304.75,1 +2011/07/31 22:17:35.965,1304.75,5 +2011/07/31 22:17:35.984,1304.75,2 +2011/07/31 22:17:36.308,1304.75,25 +2011/07/31 22:17:36.948,1304.75,1 +2011/07/31 22:17:37.578,1304.75,2 +2011/07/31 22:17:37.595,1304.75,1 +2011/07/31 22:17:37.603,1304.75,1 +2011/07/31 22:17:37.678,1304.75,1 +2011/07/31 22:17:37.704,1304.75,1 +2011/07/31 22:17:37.716,1304.75,1 +2011/07/31 22:17:37.762,1304.75,1 +2011/07/31 22:17:37.822,1304.75,1 +2011/07/31 22:17:37.874,1304.75,1 +2011/07/31 22:17:37.881,1304.75,1 +2011/07/31 22:17:37.894,1304.75,1 +2011/07/31 22:17:37.901,1304.75,1 +2011/07/31 22:17:37.907,1304.75,1 +2011/07/31 22:17:37.938,1304.75,1 +2011/07/31 22:17:37.945,1304.75,1 +2011/07/31 22:17:37.953,1304.75,1 +2011/07/31 22:17:37.959,1304.75,1 +2011/07/31 22:17:37.967,1304.75,1 +2011/07/31 22:17:37.981,1304.75,1 +2011/07/31 22:17:37.989,1304.75,1 +2011/07/31 22:17:37.996,1304.75,1 +2011/07/31 22:17:38.026,1304.75,1 +2011/07/31 22:17:38.036,1304.75,1 +2011/07/31 22:17:38.060,1304.75,1 +2011/07/31 22:17:38.067,1304.75,1 +2011/07/31 22:17:38.074,1304.75,1 +2011/07/31 22:17:38.146,1304.75,1 +2011/07/31 22:17:38.158,1304.75,1 +2011/07/31 22:17:38.192,1304.75,1 +2011/07/31 22:17:38.289,1304.75,1 +2011/07/31 22:17:38.297,1304.75,1 +2011/07/31 22:17:38.317,1304.75,1 +2011/07/31 22:17:38.556,1304.75,2 +2011/07/31 22:17:38.556,1304.75,2 +2011/07/31 22:17:38.622,1304.75,3 +2011/07/31 22:17:38.622,1304.75,12 +2011/07/31 22:17:38.779,1304.75,2 +2011/07/31 22:17:38.793,1304.75,10 +2011/07/31 22:17:38.808,1305.0,5 +2011/07/31 22:17:39.265,1304.75,1 +2011/07/31 22:17:39.265,1304.75,1 +2011/07/31 22:17:39.265,1304.75,1 +2011/07/31 22:17:39.265,1304.75,1 +2011/07/31 22:17:39.265,1304.75,1 +2011/07/31 22:17:39.662,1304.75,1 +2011/07/31 22:17:39.748,1304.75,1 +2011/07/31 22:17:39.764,1304.75,1 +2011/07/31 22:17:39.781,1304.75,1 +2011/07/31 22:17:39.781,1304.75,1 +2011/07/31 22:17:39.807,1304.75,1 +2011/07/31 22:17:39.972,1304.75,2 +2011/07/31 22:17:39.972,1304.75,1 +2011/07/31 22:17:40.354,1304.75,1 +2011/07/31 22:17:40.622,1304.75,1 +2011/07/31 22:17:40.622,1304.75,1 +2011/07/31 22:17:40.740,1304.75,2 +2011/07/31 22:17:40.970,1304.75,1 +2011/07/31 22:17:40.978,1304.75,1 +2011/07/31 22:17:40.978,1304.75,1 +2011/07/31 22:17:41.119,1304.75,1 +2011/07/31 22:17:41.119,1304.75,4 +2011/07/31 22:17:41.119,1304.75,1 +2011/07/31 22:17:41.119,1304.75,2 +2011/07/31 22:17:41.119,1304.75,2 +2011/07/31 22:17:41.119,1304.75,10 +2011/07/31 22:17:41.119,1304.75,1 +2011/07/31 22:17:41.119,1304.75,1 +2011/07/31 22:17:41.119,1304.5,2 +2011/07/31 22:17:41.119,1304.5,4 +2011/07/31 22:17:41.119,1304.5,1 +2011/07/31 22:17:41.119,1304.5,6 +2011/07/31 22:17:41.119,1304.5,1 +2011/07/31 22:17:41.119,1304.5,3 +2011/07/31 22:17:41.119,1304.5,1 +2011/07/31 22:17:41.205,1305.0,1 +2011/07/31 22:17:41.265,1304.5,1 +2011/07/31 22:17:41.265,1304.5,1 +2011/07/31 22:17:41.265,1304.5,1 +2011/07/31 22:17:41.536,1304.75,1 +2011/07/31 22:17:41.536,1304.75,1 +2011/07/31 22:17:41.710,1304.75,1 +2011/07/31 22:17:41.918,1304.5,1 +2011/07/31 22:17:42.074,1304.5,1 +2011/07/31 22:17:42.644,1304.5,1 +2011/07/31 22:17:42.644,1304.5,3 +2011/07/31 22:17:43.312,1304.5,1 +2011/07/31 22:17:43.454,1304.5,1 +2011/07/31 22:17:44.101,1304.75,2 +2011/07/31 22:17:44.299,1304.75,1 +2011/07/31 22:17:44.621,1304.75,5 +2011/07/31 22:17:46.715,1304.5,1 +2011/07/31 22:17:47.362,1304.5,5 +2011/07/31 22:17:47.362,1304.5,2 +2011/07/31 22:17:47.362,1304.5,1 +2011/07/31 22:17:47.362,1304.5,1 +2011/07/31 22:17:47.362,1304.5,1 +2011/07/31 22:17:47.850,1304.5,1 +2011/07/31 22:17:47.850,1304.5,4 +2011/07/31 22:17:47.850,1304.5,1 +2011/07/31 22:17:47.850,1304.5,4 +2011/07/31 22:17:47.954,1304.5,1 +2011/07/31 22:17:48.461,1304.75,1 +2011/07/31 22:17:48.840,1304.5,1 +2011/07/31 22:17:49.262,1304.5,1 +2011/07/31 22:17:49.380,1304.5,4 +2011/07/31 22:17:49.380,1304.5,25 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,2 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,5 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,5 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.380,1304.5,1 +2011/07/31 22:17:49.767,1304.25,4 +2011/07/31 22:17:49.767,1304.25,1 +2011/07/31 22:17:49.767,1304.25,1 +2011/07/31 22:17:49.801,1304.25,1 +2011/07/31 22:17:49.801,1304.25,2 +2011/07/31 22:17:49.801,1304.25,1 +2011/07/31 22:17:50.201,1304.25,10 +2011/07/31 22:17:50.296,1304.25,1 +2011/07/31 22:17:51.095,1304.25,1 +2011/07/31 22:17:51.100,1304.25,1 +2011/07/31 22:17:52.033,1304.5,1 +2011/07/31 22:17:52.688,1304.25,1 +2011/07/31 22:17:52.939,1304.25,1 +2011/07/31 22:17:52.953,1304.25,1 +2011/07/31 22:17:54.736,1304.25,1 +2011/07/31 22:17:55.080,1304.25,1 +2011/07/31 22:17:55.729,1304.25,1 +2011/07/31 22:17:55.729,1304.25,1 +2011/07/31 22:17:55.729,1304.25,3 +2011/07/31 22:17:56.850,1304.25,22 +2011/07/31 22:17:56.850,1304.25,5 +2011/07/31 22:17:56.850,1304.25,1 +2011/07/31 22:17:56.850,1304.25,5 +2011/07/31 22:17:56.856,1304.25,2 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,5 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,1 +2011/07/31 22:17:56.856,1304.25,10 +2011/07/31 22:17:57.392,1304.25,2 +2011/07/31 22:17:57.524,1304.25,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,50 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,10 +2011/07/31 22:17:57.534,1304.0,4 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,10 +2011/07/31 22:17:57.534,1304.0,7 +2011/07/31 22:17:57.534,1304.0,5 +2011/07/31 22:17:57.534,1304.0,5 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.534,1304.0,1 +2011/07/31 22:17:57.568,1304.25,2 +2011/07/31 22:17:58.118,1304.25,1 +2011/07/31 22:17:58.246,1304.0,3 +2011/07/31 22:17:58.246,1304.0,10 +2011/07/31 22:17:58.246,1304.0,1 +2011/07/31 22:17:58.246,1304.0,1 +2011/07/31 22:17:58.246,1304.0,2 +2011/07/31 22:17:58.246,1304.0,1 +2011/07/31 22:17:58.246,1304.0,2 +2011/07/31 22:17:58.337,1304.0,1 +2011/07/31 22:17:58.656,1304.0,2 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.656,1304.0,1 +2011/07/31 22:17:58.667,1304.0,2 +2011/07/31 22:17:58.667,1304.0,3 +2011/07/31 22:17:58.688,1304.25,3 +2011/07/31 22:17:58.837,1304.0,2 +2011/07/31 22:17:59.158,1304.0,5 +2011/07/31 22:17:59.331,1304.0,1 +2011/07/31 22:18:01.167,1304.0,1 +2011/07/31 22:18:01.627,1303.75,1 +2011/07/31 22:18:01.627,1303.75,1 +2011/07/31 22:18:01.627,1303.75,1 +2011/07/31 22:18:01.627,1303.75,8 +2011/07/31 22:18:01.627,1303.75,1 +2011/07/31 22:18:02.660,1303.75,1 +2011/07/31 22:18:03.079,1303.75,1 +2011/07/31 22:18:03.079,1303.75,1 +2011/07/31 22:18:03.079,1303.75,1 +2011/07/31 22:18:03.079,1303.75,5 +2011/07/31 22:18:03.079,1303.75,2 +2011/07/31 22:18:04.705,1303.75,1 +2011/07/31 22:18:04.876,1303.75,1 +2011/07/31 22:18:05.730,1303.75,1 +2011/07/31 22:18:06.100,1303.75,1 +2011/07/31 22:18:06.469,1303.75,2 +2011/07/31 22:18:06.827,1303.75,2 +2011/07/31 22:18:07.115,1303.75,1 +2011/07/31 22:18:08.064,1303.75,1 +2011/07/31 22:18:08.260,1303.75,4 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,5 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,2 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,10 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,2 +2011/07/31 22:18:08.260,1303.75,10 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,2 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.260,1303.75,1 +2011/07/31 22:18:08.435,1303.75,1 +2011/07/31 22:18:08.473,1303.75,1 +2011/07/31 22:18:08.728,1303.75,2 +2011/07/31 22:18:09.186,1303.5,1 +2011/07/31 22:18:09.186,1303.5,1 +2011/07/31 22:18:09.186,1303.5,1 +2011/07/31 22:18:10.018,1303.75,48 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.018,1303.75,2 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.018,1303.75,3 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.018,1303.75,1 +2011/07/31 22:18:10.529,1303.5,1 +2011/07/31 22:18:11.196,1303.5,1 +2011/07/31 22:18:11.203,1303.5,1 +2011/07/31 22:18:11.230,1303.5,1 +2011/07/31 22:18:11.237,1303.5,1 +2011/07/31 22:18:11.245,1303.5,1 +2011/07/31 22:18:11.270,1303.5,1 +2011/07/31 22:18:11.277,1303.5,1 +2011/07/31 22:18:11.284,1303.5,1 +2011/07/31 22:18:11.292,1303.5,1 +2011/07/31 22:18:11.340,1303.5,1 +2011/07/31 22:18:11.354,1303.5,1 +2011/07/31 22:18:11.362,1303.5,1 +2011/07/31 22:18:11.368,1303.5,1 +2011/07/31 22:18:11.375,1303.5,1 +2011/07/31 22:18:11.402,1303.5,1 +2011/07/31 22:18:11.409,1303.5,1 +2011/07/31 22:18:11.424,1303.5,1 +2011/07/31 22:18:11.438,1303.5,1 +2011/07/31 22:18:11.453,1303.5,1 +2011/07/31 22:18:11.460,1303.5,1 +2011/07/31 22:18:11.467,1303.5,1 +2011/07/31 22:18:11.503,1303.5,1 +2011/07/31 22:18:11.511,1303.5,1 +2011/07/31 22:18:11.518,1303.5,1 +2011/07/31 22:18:11.544,1303.5,1 +2011/07/31 22:18:11.585,1303.5,1 +2011/07/31 22:18:11.592,1303.5,1 +2011/07/31 22:18:11.626,1303.5,1 +2011/07/31 22:18:11.633,1303.5,1 +2011/07/31 22:18:11.648,1303.5,1 +2011/07/31 22:18:11.747,1303.75,1 +2011/07/31 22:18:11.747,1303.75,1 +2011/07/31 22:18:11.747,1303.75,3 +2011/07/31 22:18:11.913,1303.75,1 +2011/07/31 22:18:11.975,1303.5,1 +2011/07/31 22:18:11.975,1303.5,1 +2011/07/31 22:18:12.002,1303.5,4 +2011/07/31 22:18:12.002,1303.5,1 +2011/07/31 22:18:12.002,1303.5,5 +2011/07/31 22:18:12.002,1303.5,3 +2011/07/31 22:18:12.002,1303.5,3 +2011/07/31 22:18:12.002,1303.5,3 +2011/07/31 22:18:12.002,1303.5,1 +2011/07/31 22:18:12.232,1303.75,1 +2011/07/31 22:18:12.392,1303.5,1 +2011/07/31 22:18:12.564,1303.75,1 +2011/07/31 22:18:13.158,1303.75,1 +2011/07/31 22:18:14.628,1303.5,4 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,5 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,2 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,3 +2011/07/31 22:18:14.628,1303.5,2 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,1 +2011/07/31 22:18:14.628,1303.5,2 +2011/07/31 22:18:15.192,1303.5,2 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,2 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:15.398,1303.5,1 +2011/07/31 22:18:16.078,1303.5,1 +2011/07/31 22:18:16.078,1303.5,1 +2011/07/31 22:18:16.078,1303.5,1 +2011/07/31 22:18:16.439,1303.5,1 +2011/07/31 22:18:17.284,1303.5,1 +2011/07/31 22:18:18.024,1303.5,1 +2011/07/31 22:18:18.167,1303.5,1 +2011/07/31 22:18:18.370,1303.75,1 +2011/07/31 22:18:19.112,1303.5,2 +2011/07/31 22:18:19.112,1303.5,1 +2011/07/31 22:18:20.552,1303.75,5 +2011/07/31 22:18:21.325,1303.5,1 +2011/07/31 22:18:21.962,1303.75,37 +2011/07/31 22:18:21.962,1303.75,32 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,4 +2011/07/31 22:18:21.962,1303.75,3 +2011/07/31 22:18:21.962,1303.75,2 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,2 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:21.962,1303.75,14 +2011/07/31 22:18:21.962,1303.75,1 +2011/07/31 22:18:22.336,1303.75,20 +2011/07/31 22:18:22.443,1303.75,1 +2011/07/31 22:18:22.534,1303.75,5 +2011/07/31 22:18:22.651,1303.5,8 +2011/07/31 22:18:22.651,1303.5,10 +2011/07/31 22:18:22.651,1303.5,2 +2011/07/31 22:18:22.681,1303.75,9 +2011/07/31 22:18:22.681,1303.75,1 +2011/07/31 22:18:22.783,1303.75,10 +2011/07/31 22:18:22.908,1303.75,10 +2011/07/31 22:18:22.954,1303.75,5 +2011/07/31 22:18:23.151,1303.75,1 +2011/07/31 22:18:23.615,1303.75,1 +2011/07/31 22:18:24.117,1303.75,1 +2011/07/31 22:18:24.330,1303.75,13 +2011/07/31 22:18:24.330,1303.75,50 +2011/07/31 22:18:24.330,1303.75,3 +2011/07/31 22:18:24.330,1303.75,2 +2011/07/31 22:18:24.330,1303.75,20 +2011/07/31 22:18:24.330,1303.75,4 +2011/07/31 22:18:24.330,1303.75,8 +2011/07/31 22:18:24.340,1303.75,1 +2011/07/31 22:18:24.438,1303.5,3 +2011/07/31 22:18:24.438,1303.5,5 +2011/07/31 22:18:24.438,1303.5,2 +2011/07/31 22:18:24.802,1303.75,1 +2011/07/31 22:18:25.174,1303.75,1 +2011/07/31 22:18:25.302,1303.5,1 +2011/07/31 22:18:25.302,1303.5,3 +2011/07/31 22:18:25.361,1303.5,2 +2011/07/31 22:18:25.935,1303.75,1 +2011/07/31 22:18:26.126,1303.5,1 +2011/07/31 22:18:26.278,1303.5,1 +2011/07/31 22:18:26.626,1303.75,1 +2011/07/31 22:18:26.857,1303.75,100 +2011/07/31 22:18:27.197,1303.75,1 +2011/07/31 22:18:27.688,1303.75,1 +2011/07/31 22:18:28.609,1303.75,1 +2011/07/31 22:18:28.657,1303.75,1 +2011/07/31 22:18:28.938,1303.5,1 +2011/07/31 22:18:28.938,1303.5,1 +2011/07/31 22:18:29.622,1303.75,46 +2011/07/31 22:18:29.622,1303.75,1 +2011/07/31 22:18:29.622,1303.75,1 +2011/07/31 22:18:29.622,1303.75,34 +2011/07/31 22:18:29.622,1303.75,5 +2011/07/31 22:18:29.622,1303.75,5 +2011/07/31 22:18:29.622,1303.75,5 +2011/07/31 22:18:29.622,1303.75,1 +2011/07/31 22:18:29.963,1303.75,1 +2011/07/31 22:18:30.428,1304.0,1 +2011/07/31 22:18:30.548,1304.0,1 +2011/07/31 22:18:30.592,1304.0,1 +2011/07/31 22:18:30.592,1304.0,1 +2011/07/31 22:18:30.691,1304.0,1 +2011/07/31 22:18:30.708,1304.0,1 +2011/07/31 22:18:30.708,1304.0,1 +2011/07/31 22:18:30.708,1304.0,1 +2011/07/31 22:18:30.708,1304.0,1 +2011/07/31 22:18:30.708,1304.0,1 +2011/07/31 22:18:30.760,1304.0,2 +2011/07/31 22:18:30.846,1303.75,1 +2011/07/31 22:18:30.896,1304.0,2 +2011/07/31 22:18:30.916,1304.0,1 +2011/07/31 22:18:31.012,1304.0,1 +2011/07/31 22:18:31.032,1304.0,1 +2011/07/31 22:18:31.032,1304.0,1 +2011/07/31 22:18:31.108,1304.0,1 +2011/07/31 22:18:31.152,1304.0,1 +2011/07/31 22:18:31.152,1304.0,1 +2011/07/31 22:18:31.248,1304.0,4 +2011/07/31 22:18:31.248,1304.0,1 +2011/07/31 22:18:31.248,1304.0,1 +2011/07/31 22:18:31.248,1304.0,1 +2011/07/31 22:18:31.248,1304.0,4 +2011/07/31 22:18:31.248,1304.0,1 +2011/07/31 22:18:31.248,1304.0,1 +2011/07/31 22:18:31.248,1304.0,34 +2011/07/31 22:18:31.490,1304.25,1 +2011/07/31 22:18:31.721,1304.0,20 +2011/07/31 22:18:31.744,1304.25,9 +2011/07/31 22:18:31.744,1304.25,8 +2011/07/31 22:18:31.744,1304.25,3 +2011/07/31 22:18:31.782,1304.25,1 +2011/07/31 22:18:31.782,1304.25,15 +2011/07/31 22:18:31.782,1304.25,4 +2011/07/31 22:18:31.823,1304.25,1 +2011/07/31 22:18:31.823,1304.25,1 +2011/07/31 22:18:31.823,1304.25,3 +2011/07/31 22:18:31.823,1304.25,1 +2011/07/31 22:18:31.837,1304.25,4 +2011/07/31 22:18:32.578,1304.25,1 +2011/07/31 22:18:32.754,1304.25,2 +2011/07/31 22:18:32.960,1304.5,2 +2011/07/31 22:18:32.960,1304.5,3 +2011/07/31 22:18:32.960,1304.5,8 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:32.960,1304.5,4 +2011/07/31 22:18:32.960,1304.5,1 +2011/07/31 22:18:33.103,1304.5,10 +2011/07/31 22:18:33.291,1304.5,1 +2011/07/31 22:18:33.504,1304.5,10 +2011/07/31 22:18:35.152,1304.25,1 +2011/07/31 22:18:35.233,1304.5,1 +2011/07/31 22:18:35.720,1304.5,2 +2011/07/31 22:18:36.242,1304.5,1 +2011/07/31 22:18:36.840,1304.5,1 +2011/07/31 22:18:36.888,1304.5,1 +2011/07/31 22:18:37.761,1304.5,1 +2011/07/31 22:18:39.712,1304.5,10 +2011/07/31 22:18:40.777,1304.5,2 +2011/07/31 22:18:41.697,1304.25,2 +2011/07/31 22:18:41.846,1304.5,1 +2011/07/31 22:18:41.998,1304.5,3 +2011/07/31 22:18:41.998,1304.5,3 +2011/07/31 22:18:41.998,1304.5,1 +2011/07/31 22:18:41.998,1304.5,1 +2011/07/31 22:18:41.998,1304.5,10 +2011/07/31 22:18:41.998,1304.5,10 +2011/07/31 22:18:41.998,1304.5,34 +2011/07/31 22:18:41.998,1304.5,1 +2011/07/31 22:18:41.998,1304.5,1 +2011/07/31 22:18:41.998,1304.5,20 +2011/07/31 22:18:41.998,1304.5,1 +2011/07/31 22:18:41.998,1304.5,15 +2011/07/31 22:18:42.764,1304.5,1 +2011/07/31 22:18:42.923,1304.5,4 +2011/07/31 22:18:42.938,1304.25,1 +2011/07/31 22:18:44.411,1304.5,1 +2011/07/31 22:18:44.670,1304.5,29 +2011/07/31 22:18:44.670,1304.5,1 +2011/07/31 22:18:44.670,1304.5,29 +2011/07/31 22:18:45.000,1304.5,1 +2011/07/31 22:18:45.159,1304.5,1 +2011/07/31 22:18:45.313,1304.5,2 +2011/07/31 22:18:45.942,1304.5,1 +2011/07/31 22:18:46.334,1304.75,1 +2011/07/31 22:18:47.095,1304.75,1 +2011/07/31 22:18:47.472,1304.75,1 +2011/07/31 22:18:49.956,1304.75,2 +2011/07/31 22:18:49.956,1304.75,2 +2011/07/31 22:18:51.698,1304.5,5 +2011/07/31 22:18:52.452,1304.5,7 +2011/07/31 22:18:52.452,1304.5,2 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:52.452,1304.5,2 +2011/07/31 22:18:52.452,1304.5,8 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:52.452,1304.5,6 +2011/07/31 22:18:52.452,1304.5,3 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:52.452,1304.5,10 +2011/07/31 22:18:52.452,1304.5,4 +2011/07/31 22:18:52.452,1304.5,1 +2011/07/31 22:18:53.236,1304.5,4 +2011/07/31 22:18:54.358,1304.5,2 +2011/07/31 22:18:54.407,1304.25,2 +2011/07/31 22:18:55.052,1304.5,1 +2011/07/31 22:18:55.225,1304.25,2 +2011/07/31 22:18:55.225,1304.25,3 +2011/07/31 22:18:55.225,1304.25,1 +2011/07/31 22:18:55.225,1304.25,8 +2011/07/31 22:18:55.225,1304.25,1 +2011/07/31 22:18:55.225,1304.25,1 +2011/07/31 22:18:55.225,1304.25,1 +2011/07/31 22:18:55.225,1304.25,3 +2011/07/31 22:18:55.564,1304.25,2 +2011/07/31 22:18:55.564,1304.25,1 +2011/07/31 22:18:55.564,1304.25,1 +2011/07/31 22:18:55.564,1304.25,1 +2011/07/31 22:18:55.920,1304.25,1 +2011/07/31 22:18:55.920,1304.25,1 +2011/07/31 22:18:55.920,1304.25,1 +2011/07/31 22:18:57.054,1304.25,2 +2011/07/31 22:18:57.054,1304.25,1 +2011/07/31 22:18:57.054,1304.25,3 +2011/07/31 22:18:57.324,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.25,1 +2011/07/31 22:19:00.122,1304.5,4 +2011/07/31 22:19:00.122,1304.5,1 +2011/07/31 22:19:02.544,1304.25,5 +2011/07/31 22:19:05.463,1304.25,2 +2011/07/31 22:19:06.544,1304.5,1 +2011/07/31 22:19:09.415,1304.5,1 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,3 +2011/07/31 22:19:12.946,1304.25,8 +2011/07/31 22:19:12.946,1304.25,10 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,2 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,1 +2011/07/31 22:19:12.946,1304.25,5 +2011/07/31 22:19:12.954,1304.25,8 +2011/07/31 22:19:14.529,1304.25,3 +2011/07/31 22:19:18.739,1304.25,1 +2011/07/31 22:19:20.110,1304.25,1 +2011/07/31 22:19:21.911,1304.25,1 +2011/07/31 22:19:22.827,1304.25,1 +2011/07/31 22:19:23.953,1304.25,1 +2011/07/31 22:19:24.795,1304.0,1 +2011/07/31 22:19:29.007,1304.0,2 +2011/07/31 22:19:29.007,1304.0,3 +2011/07/31 22:19:35.758,1304.0,1 +2011/07/31 22:19:36.611,1304.0,1 +2011/07/31 22:19:37.583,1304.0,2 +2011/07/31 22:19:40.619,1304.25,2 +2011/07/31 22:19:42.695,1304.0,2 +2011/07/31 22:19:43.082,1304.25,5 +2011/07/31 22:19:43.082,1304.25,5 +2011/07/31 22:19:43.082,1304.25,20 +2011/07/31 22:19:43.082,1304.25,20 +2011/07/31 22:19:43.088,1304.25,3 +2011/07/31 22:19:43.088,1304.25,1 +2011/07/31 22:19:43.088,1304.25,1 +2011/07/31 22:19:43.088,1304.25,25 +2011/07/31 22:19:43.088,1304.25,2 +2011/07/31 22:19:43.088,1304.25,1 +2011/07/31 22:19:43.088,1304.25,1 +2011/07/31 22:19:43.088,1304.25,2 +2011/07/31 22:19:43.088,1304.25,1 +2011/07/31 22:19:43.128,1304.25,1 +2011/07/31 22:19:43.601,1304.25,20 +2011/07/31 22:19:43.609,1304.25,1 +2011/07/31 22:19:44.797,1304.25,1 +2011/07/31 22:19:45.858,1304.25,5 +2011/07/31 22:19:45.858,1304.25,1 +2011/07/31 22:19:46.568,1304.25,10 +2011/07/31 22:19:46.834,1304.25,8 +2011/07/31 22:19:46.866,1304.25,2 +2011/07/31 22:19:46.874,1304.25,2 +2011/07/31 22:19:47.194,1304.25,1 +2011/07/31 22:19:47.830,1304.25,1 +2011/07/31 22:19:47.981,1304.25,8 +2011/07/31 22:19:47.981,1304.25,2 +2011/07/31 22:19:47.981,1304.25,1 +2011/07/31 22:19:47.981,1304.25,8 +2011/07/31 22:19:48.632,1304.25,5 +2011/07/31 22:19:49.312,1304.25,1 +2011/07/31 22:19:52.799,1304.25,4 +2011/07/31 22:19:53.713,1304.5,2 +2011/07/31 22:19:53.713,1304.5,1 +2011/07/31 22:19:54.849,1304.5,1 +2011/07/31 22:19:54.849,1304.5,1 +2011/07/31 22:19:54.849,1304.5,8 +2011/07/31 22:19:54.849,1304.5,3 +2011/07/31 22:19:55.604,1304.5,5 +2011/07/31 22:19:56.642,1304.5,42 +2011/07/31 22:19:56.642,1304.5,3 +2011/07/31 22:19:56.642,1304.5,3 +2011/07/31 22:19:56.642,1304.5,1 +2011/07/31 22:19:56.642,1304.5,34 +2011/07/31 22:19:56.642,1304.5,2 +2011/07/31 22:19:56.642,1304.5,3 +2011/07/31 22:19:56.647,1304.5,1 +2011/07/31 22:20:02.379,1304.75,1 +2011/07/31 22:20:14.629,1304.5,6 +2011/07/31 22:20:14.629,1304.5,4 +2011/07/31 22:20:15.146,1304.5,2 +2011/07/31 22:20:15.433,1304.5,3 +2011/07/31 22:20:15.438,1304.5,1 +2011/07/31 22:20:15.438,1304.5,1 +2011/07/31 22:20:17.093,1304.25,1 +2011/07/31 22:20:17.709,1304.5,2 +2011/07/31 22:20:17.709,1304.5,3 +2011/07/31 22:20:17.709,1304.5,1 +2011/07/31 22:20:17.709,1304.5,2 +2011/07/31 22:20:17.709,1304.5,2 +2011/07/31 22:20:19.466,1304.5,2 +2011/07/31 22:20:19.466,1304.5,2 +2011/07/31 22:20:32.727,1304.5,2 +2011/07/31 22:20:32.759,1304.5,1 +2011/07/31 22:20:37.179,1304.5,13 +2011/07/31 22:20:37.179,1304.5,2 +2011/07/31 22:20:37.179,1304.5,3 +2011/07/31 22:20:37.179,1304.5,7 +2011/07/31 22:20:37.179,1304.5,3 +2011/07/31 22:20:39.305,1304.25,1 +2011/07/31 22:20:39.387,1304.5,10 +2011/07/31 22:20:39.988,1304.5,1 +2011/07/31 22:20:40.196,1304.5,1 +2011/07/31 22:20:42.240,1304.5,3 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,2 +2011/07/31 22:20:42.240,1304.5,2 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,2 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,2 +2011/07/31 22:20:42.240,1304.5,1 +2011/07/31 22:20:42.240,1304.5,20 +2011/07/31 22:20:42.240,1304.5,3 +2011/07/31 22:20:48.823,1304.5,1 +2011/07/31 22:20:51.883,1304.75,1 +2011/07/31 22:20:51.883,1304.75,2 +2011/07/31 22:20:51.883,1304.75,1 +2011/07/31 22:20:52.374,1304.5,1 +2011/07/31 22:20:52.374,1304.5,1 +2011/07/31 22:20:52.712,1304.75,5 +2011/07/31 22:20:56.379,1304.5,1 +2011/07/31 22:20:56.379,1304.5,1 diff --git a/mlfinlab/tests/test_feature_importance.py b/mlfinlab/tests/test_feature_importance.py index f611dae26..4aa1c9ba3 100644 --- a/mlfinlab/tests/test_feature_importance.py +++ b/mlfinlab/tests/test_feature_importance.py @@ -36,7 +36,7 @@ def setUp(self): self.bag_clf = BaggingClassifier(base_estimator=self.clf_base, max_features=1.0, n_estimators=100, oob_score=True, random_state=1) self.fit_clf = self.bag_clf.fit(self.X, self.y) - self.cv_gen = KFold(n_splits=3, random_state=0) + self.cv_gen = KFold(n_splits=3) def test_orthogonal_features(self): """ @@ -108,7 +108,10 @@ def test_feature_importance(self): # MDI assertions self.assertAlmostEqual(mdi_feat_imp['mean'].sum(), 1, delta=0.001) # The most informative features - self.assertAlmostEqual(mdi_feat_imp.loc['I_1', 'mean'], 0.48058, delta=0.01) + # Value in the below test was changed after v.0.11.3 from 0.48058 + # to 0.46835 + # due to scikit-learn changing RandomForestClassifier, and BaggingClassifier outputs + self.assertAlmostEqual(mdi_feat_imp.loc['I_1', 'mean'], 0.46835, delta=0.01) self.assertAlmostEqual(mdi_feat_imp.loc['I_0', 'mean'], 0.08214, delta=0.01) # Redundant feature self.assertAlmostEqual(mdi_feat_imp.loc['R_0', 'mean'], 0.06511, delta=0.01) @@ -117,7 +120,10 @@ def test_feature_importance(self): # MDA(log_loss) assertions self.assertAlmostEqual(mda_feat_imp_log_loss.loc['I_1', 'mean'], 0.65522, delta=0.1) - self.assertAlmostEqual(mda_feat_imp_log_loss.loc['R_0', 'mean'], 0.00332, delta=0.1) + # Value in the below test was changed after v.0.11.3 from 0.00332 + # to -0.20645 + # due to scikit-learn changing RandomForestClassifier, and BaggingClassifier outputs + self.assertAlmostEqual(mda_feat_imp_log_loss.loc['R_0', 'mean'], -0.20645, delta=0.1) # MDA(f1) assertions self.assertAlmostEqual(mda_feat_imp_f1.loc['I_1', 'mean'], 0.47751, delta=0.1) @@ -136,7 +142,10 @@ def test_feature_importance(self): self.assertAlmostEqual(clustered_mdi.loc['I_0', 'mean'], 0.06575, delta=0.1) # Clustered MDA (log_loss) assertions - self.assertAlmostEqual(clustered_mda.loc['I_0', 'mean'], 0.04154, delta=0.1) + # Value in the below test was changed after v.0.11.3 from 0.04154 + # to -0.12248 + # due to scikit-learn changing RandomForestClassifier, and BaggingClassifier outputs + self.assertAlmostEqual(clustered_mda.loc['I_0', 'mean'], -0.12248, delta=0.1) self.assertAlmostEqual(clustered_mda.loc['R_0', 'mean'], 0.02940, delta=0.1) # Test if CFI with number of clusters same to number features is equal to normal MDI & MDA results diff --git a/mlfinlab/tests/test_fingerpint.py b/mlfinlab/tests/test_fingerpint.py index db923986a..98de2af2b 100644 --- a/mlfinlab/tests/test_fingerpint.py +++ b/mlfinlab/tests/test_fingerpint.py @@ -44,7 +44,10 @@ def test_linear_effect(self): # Test the most informative feature effects for reg_rf informative_features_1 = [0, 5, 6, 12] - for feature, effect_value in zip(informative_features_1, [0.0577, 0.5102, 0.136, 0.2139]): + # Values in the below test was changed after v.0.11.3 from [0.0577, 0.5102, 0.136, 0.2139] + # to [0.0688, 0.5292, 0.125, 0.2117] + # due to scikit-learn changing RandomForestRegressor, and RandomForestClassifier outputs + for feature, effect_value in zip(informative_features_1, [0.0688, 0.5292, 0.125, 0.2117]): self.assertAlmostEqual(linear_effect['norm'][feature], effect_value, delta=1e-3) self.reg_fingerprint.fit(self.reg_linear, self.X, num_values=20) @@ -74,7 +77,10 @@ def test_non_linear_effect(self): # Test the most informative feature effects for reg_rf informative_features_1 = [0, 5, 6, 12] - for feature, effect_value in zip(informative_features_1, [0.0758, 0.3848, 0.1, 0.28]): + # Values in the below test was changed after v.0.11.3 from [0.0758, 0.3848, 0.1, 0.28] + # to [0.0858, 0.3972, 0.0857, 0.2663] + # due to scikit-learn changing RandomForestRegressor, and RandomForestClassifier outputs + for feature, effect_value in zip(informative_features_1, [0.0858, 0.3972, 0.0857, 0.2663]): self.assertAlmostEqual(non_linear_effect['norm'][feature], effect_value, delta=1e-3) self.reg_fingerprint.fit(self.reg_linear, self.X, num_values=20) @@ -101,7 +107,10 @@ def test_pairwise_effect(self): self.reg_fingerprint.fit(self.reg_rf, self.X, num_values=20, pairwise_combinations=combinations) _, _, pair_wise_effect = self.reg_fingerprint.get_effects() - for pair, effect_value in zip(combinations, [0.203, 0.17327, 0.005, 0.032, 0, 0.00004]): + # Values in the below test was changed after v.0.11.3 from [0.203, 0.17327, 0.005, 0.032, 0, 0.00004] + # to [0.188, 0.15792, 0.005, 0.0299, 0, 0.00162] + # due to scikit-learn changing RandomForestRegressor, and RandomForestClassifier outputs + for pair, effect_value in zip(combinations, [0.188, 0.15792, 0.005, 0.0299, 0, 0.00162]): self.assertAlmostEqual(pair_wise_effect['raw'][str(pair)], effect_value, delta=1e-3) combinations = [(0, 5), (0, 12), (1, 2), (5, 7), (3, 6), (4, 9)] diff --git a/mlfinlab/tests/test_imbalance_data_structures.py b/mlfinlab/tests/test_imbalance_data_structures.py index cbf824fc3..03e7351d1 100644 --- a/mlfinlab/tests/test_imbalance_data_structures.py +++ b/mlfinlab/tests/test_imbalance_data_structures.py @@ -23,7 +23,7 @@ def setUp(self): Set the file path for the tick data csv """ project_path = os.path.dirname(__file__) - self.path = project_path + '/test_data/imbalance_sample_data.csv' + self.path = project_path + '/test_data/imbalance_sample_data_small.csv' def test_ema_imbalance_dollar_bars(self): """ @@ -47,7 +47,8 @@ def test_ema_imbalance_dollar_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (4770, 10)) + self.assertEqual(db1.shape, (624, 10)) + #self.assertEqual(db1.shape, (4770, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -68,10 +69,10 @@ def test_ema_imbalance_dollar_bars(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[1387, 'open'], 1303.5) - self.assertEqual(db1.loc[1387, 'high'], 1303.5) - self.assertEqual(db1.loc[1387, 'low'], 1303.5) - self.assertEqual(db1.loc[1387, 'close'], 1303.5) + self.assertEqual(db1.loc[600, 'open'], 1304.5) + self.assertEqual(db1.loc[600, 'high'], 1304.5) + self.assertEqual(db1.loc[600, 'low'], 1304.5) + self.assertEqual(db1.loc[600, 'close'], 1304.5) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -100,7 +101,7 @@ def test_ema_imbalance_volume_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (4770, 10)) + self.assertEqual(db1.shape, (624, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -119,10 +120,10 @@ def test_ema_imbalance_volume_bars(self): self.assertEqual(db1.loc[0, 'close'], 1304.5) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[1387, 'open'], 1303.5) - self.assertEqual(db1.loc[1387, 'high'], 1303.5) - self.assertEqual(db1.loc[1387, 'low'], 1303.5) - self.assertEqual(db1.loc[1387, 'close'], 1303.5) + self.assertEqual(db1.loc[600, 'open'], 1304.5) + self.assertEqual(db1.loc[600, 'high'], 1304.5) + self.assertEqual(db1.loc[600, 'low'], 1304.5) + self.assertEqual(db1.loc[600, 'close'], 1304.5) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -151,7 +152,7 @@ def test_ema_imbalance_tick_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (7704, 10)) + self.assertEqual(db1.shape, (3558, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -170,10 +171,10 @@ def test_ema_imbalance_tick_bars(self): self.assertEqual(db1.loc[0, 'close'], 1304.25) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[1387, 'open'], 1308.0) - self.assertEqual(db1.loc[1387, 'high'], 1308.0) - self.assertEqual(db1.loc[1387, 'low'], 1308.0) - self.assertEqual(db1.loc[1387, 'close'], 1308.0) + self.assertEqual(db1.loc[600, 'open'], 1306.75) + self.assertEqual(db1.loc[600, 'high'], 1306.75) + self.assertEqual(db1.loc[600, 'low'], 1306.75) + self.assertEqual(db1.loc[600, 'close'], 1306.75) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -207,7 +208,7 @@ def test_ema_imb_dollar_bars_with_constraints(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (1396, 10)) + self.assertEqual(db1.shape, (583, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -228,10 +229,10 @@ def test_ema_imb_dollar_bars_with_constraints(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[1387, 'open'], 1303.25) - self.assertEqual(db1.loc[1387, 'high'], 1303.25) - self.assertEqual(db1.loc[1387, 'low'], 1303.25) - self.assertEqual(db1.loc[1387, 'close'], 1303.25) + self.assertEqual(db1.loc[500, 'open'], 1303.5) + self.assertEqual(db1.loc[500, 'high'], 1303.5) + self.assertEqual(db1.loc[500, 'low'], 1303.5) + self.assertEqual(db1.loc[500, 'close'], 1303.5) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -259,7 +260,7 @@ def test_const_imbalance_dollar_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (204, 10)) + self.assertEqual(db1.shape, (109, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -280,10 +281,10 @@ def test_const_imbalance_dollar_bars(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[200, 'open'], 1304.25) - self.assertEqual(db1.loc[200, 'high'], 1304.25) - self.assertEqual(db1.loc[200, 'low'], 1303.5) - self.assertEqual(db1.loc[200, 'close'], 1303.5) + self.assertEqual(db1.loc[105, 'open'], 1304.5) + self.assertEqual(db1.loc[105, 'high'], 1304.75) + self.assertEqual(db1.loc[105, 'low'], 1304.25) + self.assertEqual(db1.loc[105, 'close'], 1304.75) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -311,7 +312,7 @@ def test_const_imbalance_volume_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (215, 10)) + self.assertEqual(db1.shape, (112, 10)) self.assertTrue(np.all(thresh1.cum_theta == thresh2.cum_theta)) @@ -334,10 +335,10 @@ def test_const_imbalance_volume_bars(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[200, 'open'], 1305.00) - self.assertEqual(db1.loc[200, 'high'], 1305.00) - self.assertEqual(db1.loc[200, 'low'], 1305.00) - self.assertEqual(db1.loc[200, 'close'], 1305.00) + self.assertEqual(db1.loc[100, 'open'], 1303.75) + self.assertEqual(db1.loc[100, 'high'], 1303.75) + self.assertEqual(db1.loc[100, 'low'], 1303.75) + self.assertEqual(db1.loc[100, 'close'], 1303.75) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -365,7 +366,7 @@ def test_const_imbalance_tick_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (78, 10)) + self.assertEqual(db1.shape, (55, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -386,10 +387,10 @@ def test_const_imbalance_tick_bars(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[70, 'open'], 1305.5) - self.assertEqual(db1.loc[70, 'high'], 1305.75) - self.assertEqual(db1.loc[70, 'low'], 1305.25) - self.assertEqual(db1.loc[70, 'close'], 1305.75) + self.assertEqual(db1.loc[50, 'open'], 1305.25) + self.assertEqual(db1.loc[50, 'high'], 1305.25) + self.assertEqual(db1.loc[50, 'low'], 1305) + self.assertEqual(db1.loc[50, 'close'], 1305) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -407,8 +408,8 @@ def test_csv_format(self): np.int64(5), 'Limit order', 'B23'] # pylint: disable=protected-access - self.assertRaises(ValueError, ds.BaseImbalanceBars._assert_csv( - pd.DataFrame(wrong_date).T)) + self.assertRaises(ValueError, ds.BaseImbalanceBars._assert_csv, + pd.DataFrame(wrong_date).T) # pylint: disable=protected-access self.assertRaises(AssertionError, ds.BaseImbalanceBars._assert_csv, diff --git a/mlfinlab/tests/test_labeling_fixed_time_horizon.py b/mlfinlab/tests/test_labeling_fixed_time_horizon.py index 4941268c7..1398a8c27 100644 --- a/mlfinlab/tests/test_labeling_fixed_time_horizon.py +++ b/mlfinlab/tests/test_labeling_fixed_time_horizon.py @@ -7,9 +7,9 @@ from mlfinlab.labeling.fixed_time_horizon import fixed_time_horizon -class TestLabellingFixedTime(unittest.TestCase): +class TestLabelingFixedTime(unittest.TestCase): """ - Tests regarding fixed time horizon labelling method + Tests regarding fixed time horizon labeling method. """ def setUp(self): @@ -19,74 +19,114 @@ def setUp(self): project_path = os.path.dirname(__file__) self.path = project_path + '/test_data/stock_prices.csv' self.data = pd.read_csv(self.path, index_col='Date') + self.data.index = pd.to_datetime(self.data.index) self.idx10 = self.data[:10].index def test_basic(self): """ - Tests for basic cases, constant threshold and no standardization, varied lookforward periods + Tests for basic case, constant threshold and no standardization, lag. """ - close = self.data['SPY'][:10] - test1 = fixed_time_horizon(close, 0, look_forward=1) - test2 = fixed_time_horizon(close, 0, look_forward=3) - test3 = fixed_time_horizon(close, 0.01, look_forward=1) - test4 = fixed_time_horizon(close, 1.0, look_forward=2) - test1_actual = pd.Series([-1, -1, -1, -1, 1, 1, -1, 1, -1, np.nan], index=self.idx10) - test2_actual = pd.Series([-1, -1, -1, 1, 1, 1, -1, np.nan, np.nan, np.nan], index=self.idx10) - test3_actual = pd.Series([0, -1, 0, -1, 1, 0, 0, 0, -1, np.nan], index=self.idx10) - test4_actual = pd.Series([0, 0, 0, 0, 0, 0, 0, 0, np.nan, np.nan], index=self.idx10) - pd.testing.assert_series_equal(test1_actual, test1) - pd.testing.assert_series_equal(test2_actual, test2) - pd.testing.assert_series_equal(test3_actual, test3) - pd.testing.assert_series_equal(test4_actual, test4) + close = self.data[['SPY', 'EPP', 'FXI']][:10] + test1 = fixed_time_horizon(close['SPY'], lag=False) + test2 = fixed_time_horizon(close, lag=False) + test3 = fixed_time_horizon(close, lag=True) + test4 = fixed_time_horizon(close, threshold=0.01, lag=True) + test5 = fixed_time_horizon(close['SPY'], threshold=0.99, lag=False) + test1_actual = pd.Series([np.nan, -1, -1, -1, -1, 1, 1, -1, 1, -1], index=self.idx10) + test2_actual = pd.DataFrame({'SPY': [np.nan, -1, -1, -1, -1, 1, 1, -1, 1, -1], + 'EPP': [np.nan, 1, -1, 1, -1, 1, 1, -1, 1, -1], + 'FXI': [np.nan, -1, -1, 1, -1, 1, 1, -1, 1, -1]}, index=self.idx10) + test3_actual = pd.DataFrame({'SPY': [-1, -1, -1, -1, 1, 1, -1, 1, -1, np.nan], + 'EPP': [1, -1, 1, -1, 1, 1, -1, 1, -1, np.nan], + 'FXI': [-1, -1, 1, -1, 1, 1, -1, 1, -1, np.nan]}, index=self.idx10) + test4_actual = pd.DataFrame({'SPY': [0, -1, 0, -1, 1, 0, 0, 0, -1, np.nan], + 'EPP': [0, -1, 1, -1, 1, 1, -1, 1, -1, np.nan], + 'FXI': [0, -1, 1, -1, 1, 0, -1, 0, -1, np.nan]}, index=self.idx10) + test5_actual = pd.Series([np.nan, 0, 0, 0, 0, 0, 0, 0, 0, 0], index=self.idx10) + + pd.testing.assert_series_equal(test1_actual, test1, check_names=False) + pd.testing.assert_frame_equal(test2_actual, test2) + pd.testing.assert_frame_equal(test3_actual, test3) + pd.testing.assert_frame_equal(test4_actual, test4) + pd.testing.assert_series_equal(test5_actual, test5, check_names=False) def test_dynamic_threshold(self): """ - Tests for when threshold is a pd.Series rather than a constant + Tests for when threshold is a pd.Series rather than a constant. """ - close = self.data['SPY'][:10] - threshold1 = pd.Series([0.01, 0.005, 0, 0.01, 0.02, 0.03, 0.1, -1, 0.99, 0], index=self.data[:10].index) + close = self.data[['SPY', 'EPP', 'FXI']][:10] + threshold1 = pd.Series([0.01, 0.005, 0, 0.01, 0.02, 0.03, 0.1, -1, 0.99, 0], index=self.idx10) + test6 = fixed_time_horizon(close, threshold=threshold1, lag=True) + test7 = fixed_time_horizon(close['SPY'], threshold=threshold1, lag=False) + test6_actual = pd.DataFrame({'SPY': [0, -1, -1, -1, 0, 0, 0, 1, 0, np.nan], + 'EPP': [0, -1, 1, -1, 0, 0, 0, 1, 0, np.nan], + 'FXI': [0, -1, 1, -1, 1, 0, 0, 1, 0, np.nan]}, index=self.idx10) + test7_actual = pd.Series([np.nan, 0, -1, 0, 0, 0, 0, 1, 0, -1], index=self.idx10) - test5 = fixed_time_horizon(close, threshold1, look_forward=1) - test6 = fixed_time_horizon(close, threshold1, look_forward=4) - test5_actual = pd.Series([0, -1, -1, -1, 0, 0, 0, 1, 0, np.nan], index=self.idx10) - test6_actual = pd.Series([-1, -1, -1, 0, 0, 0, np.nan, np.nan, np.nan, np.nan], index=self.idx10) - pd.testing.assert_series_equal(test5_actual, test5) - pd.testing.assert_series_equal(test6_actual, test6) + pd.testing.assert_frame_equal(test6_actual, test6) + pd.testing.assert_series_equal(test7_actual, test7, check_names=False) def test_with_standardization(self): """ - Test cases with standardization, with constant and dynamic threshold + Test cases with standardization, with constant and dynamic threshold. """ - close = self.data['SPY'][:10] - threshold2 = pd.Series([1, 2, 0, 0.5, 0.02, 1.5, 10, -1, 500, 1], index=self.data[:10].index) + close = self.data[['SPY', 'EPP', 'FXI']][:10] + threshold2 = pd.Series([1, 2, 0, 0.2, 0.02, 1.5, 10, -1, 500, 1], index=self.idx10) + + test8 = fixed_time_horizon(close, threshold=1, lag=False, standardized=True, window=4) + test9 = fixed_time_horizon(close, threshold=0.1, lag=True, standardized=True, window=5) + test10 = fixed_time_horizon(close, threshold=threshold2, lag=True, standardized=True, window=3) + test8_actual = pd.DataFrame({'SPY': [np.nan, np.nan, np.nan, np.nan, 0, 1, 0, 0, 0, -1], + 'EPP': [np.nan, np.nan, np.nan, np.nan, 0, 1, 0, -1, 0, -1], + 'FXI': [np.nan, np.nan, np.nan, np.nan, 0, 1, 0, -1, 0, -1]}, + index=self.idx10) + test9_actual = pd.DataFrame({'SPY': [np.nan, np.nan, np.nan, np.nan, 1, 1, -1, 1, -1, np.nan], + 'EPP': [np.nan, np.nan, np.nan, np.nan, 1, 1, -1, 1, -1, np.nan], + 'FXI': [np.nan, np.nan, np.nan, np.nan, 1, -1, -1, 0, -1, np.nan]}, + index=self.idx10) + test10_actual = pd.DataFrame({'SPY': [np.nan, np.nan, 1, 0, 1, 0, 0, 1, 0, np.nan], + 'EPP': [np.nan, np.nan, 1, -1, 1, 0, 0, 1, 0, np.nan], + 'FXI': [np.nan, np.nan, 1, -1, 1, 0, 0, 1, 0, np.nan]}, + index=self.idx10) - test7 = fixed_time_horizon(close, 1, look_forward=1, standardized=True, window=4) - test8 = fixed_time_horizon(close, 0.1, look_forward=1, standardized=True, window=5) - test9 = fixed_time_horizon(close, threshold2, look_forward=2, standardized=True, window=3) - test7_actual = pd.Series([np.nan, np.nan, np.nan, 0, 1, 0, 0, 0, -1, np.nan], index=self.idx10) - test8_actual = pd.Series([np.nan, np.nan, np.nan, np.nan, 1, 1, -1, 1, -1, np.nan], index=self.idx10) - test9_actual = pd.Series([np.nan, np.nan, 1, 1, 1, 0, 0, -1, np.nan, np.nan], index=self.idx10) - pd.testing.assert_series_equal(test7_actual, test7) - pd.testing.assert_series_equal(test8_actual, test8) - pd.testing.assert_series_equal(test9_actual, test9) + pd.testing.assert_frame_equal(test8_actual, test8) + pd.testing.assert_frame_equal(test9_actual, test9) + pd.testing.assert_frame_equal(test10_actual, test10) - def test_look_forward_warning(self): + def test_resample(self): """ - Verifies that the correct warning is raised if look_forward is greater than the length of the data + Tests for when a resample period is used. """ - close = self.data['SPY'][:10] - with self.assertWarns(UserWarning): - labels = fixed_time_horizon(close, 0.01, look_forward=50) - np.testing.assert_allclose(labels, [np.nan]*len(self.data['SPY'][:10])) + cols = ['SPY', 'EPP', 'FXI'] + close1 = self.data[cols].iloc[0:30] + close2 = self.data[cols].iloc[0:150] + week_index = close1.resample('W').last().index + month_index = close2.resample('M').last().index + threshold3 = pd.Series([0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1], index=month_index) + + test11 = fixed_time_horizon(close1, threshold=0.02, resample_by='W', lag=True, standardized=False) + test12 = fixed_time_horizon(close2, threshold=threshold3, resample_by='M', lag=True, standardized=True, window=3) + test11_actual = pd.DataFrame({'SPY': [0, -1, 0, 1, -1, 1, np.nan], + 'EPP': [0, -1, 0, 1, -1, 0, np.nan], + 'FXI': [1, -1, -1, 0, -1, 1, np.nan]}, + index=week_index) + test12_actual = pd.DataFrame({'SPY': [np.nan, np.nan, 1, 0, -1, 0, 0, np.nan], + 'EPP': [np.nan, np.nan, 1, 0, -1, 0, 0, np.nan], + 'FXI': [np.nan, np.nan, 1, 0, -1, 1, 0, np.nan]}, + index=month_index) + + pd.testing.assert_frame_equal(test11_actual, test11) + pd.testing.assert_frame_equal(test12_actual, test12) - def test_standardization_warning(self): + def test_exceptions_warnings(self): """ - Verify that an exception is raised if standardization is set to true, but window is not specified as an int. - Checks warning when look_forward is greater than the length of the data series + Tests the exceptions and warning that can be raised. """ - close = self.data['SPY'][:10] - with self.assertRaises(Exception): - fixed_time_horizon(close, 0.01, look_forward=50, standardized=True) - with self.assertWarns(UserWarning): - labels = fixed_time_horizon(close, 0.01, look_forward=50, standardized=True, window=50) - np.testing.assert_allclose(labels, [np.nan]*len(self.data['SPY'][:10])) + close = self.data[['SPY', 'EWG']][:10] + threshold = pd.Series([0.01]*10) + with self.assertRaises(Exception): # Threshold index doesn't match. + fixed_time_horizon(close, threshold) + with self.assertRaises(Exception): # Standardized but no window. + fixed_time_horizon(close, 0.01, standardized=True) + with self.assertWarns(UserWarning): # Window too long. + fixed_time_horizon(close, 0.01, standardized=True, window=50) diff --git a/mlfinlab/tests/test_labeling_over_median.py b/mlfinlab/tests/test_labeling_over_median.py new file mode 100644 index 000000000..182fa2ea3 --- /dev/null +++ b/mlfinlab/tests/test_labeling_over_median.py @@ -0,0 +1,119 @@ +# pylint: disable=missing-module-docstring + +import unittest +import os +from datetime import datetime +import numpy as np +import pandas as pd + + +from mlfinlab.labeling.excess_over_median import excess_over_median + + +class TestLabelingOverMedian(unittest.TestCase): + """ + Tests regarding labeling excess over median. + """ + + def setUp(self): + """ + Set the file path for the sample data. + """ + project_path = os.path.dirname(__file__) + self.path = project_path + '/test_data/stock_prices.csv' + self.data = pd.read_csv(self.path, index_col='Date') + self.data.index = pd.to_datetime(self.data.index) + + def test_basic(self): + """ + Test basic case for a small set with manually inputted results, with numerical and categorical outputs, with + no resampling or forward looking labels. + """ + cols = ['EEM', 'EWG', 'TIP'] + subset = self.data[cols].iloc[0:5] + test1 = excess_over_median(subset, lag=False) + test2 = excess_over_median(subset, binary=True, lag=False) + test1_actual = pd.DataFrame([(np.nan, np.nan, np.nan), (0.0056216, -0.006201, 0), (-0.010485, 0, 0.019272), + (0.006460, 0, -0.001054), (-0.000824, 0, 0.007678)], + columns=cols, index=self.data[cols].iloc[0:5].index) + test2_actual = test1_actual.apply(np.sign) + + # Check less precise because calculated numbers have more decimal places than inputted ones. + pd.testing.assert_frame_equal(test1, test1_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test2, test2_actual) + + def test_resample_period(self): + """ + Test numerical and categorical with a resample period. + """ + cols = ['EEM', 'EWG', 'TIP', 'EWJ'] + subset1 = self.data[cols].iloc[0:25] + subset2 = self.data[cols].iloc[0:100] + + # Resample per business day. Should be same as no resampling at all (after removing Jan 21, since Python + # considers that a business day even though it was MLK day during the year of the data, so no trading occurred). + test3 = excess_over_median(subset1, resample_by='B', lag=False) + test3.drop(datetime.strptime('2008-01-21', '%Y-%m-%d'), inplace=True) # MLK day, 2008 + pd.testing.assert_frame_equal(test3, excess_over_median(subset1, lag=False)) + + # Resample per week and month. + test4 = excess_over_median(subset1, resample_by='W', lag=False) + weekly_index = subset1.resample('W').last().index + test5 = excess_over_median(subset2, resample_by='M', lag=False) + monthly_index = subset2.resample('M').last().index + test6 = excess_over_median(subset2, binary=True, resample_by='M', lag=False) # Binary by month + + test4_actual = pd.DataFrame([(np.nan, np.nan, np.nan, np.nan), + (0.019896, -0.009335, 0.007538, -0.007538), + (-0.039458, -0.016603, 0.050073, 0.016603), + (-0.006333, -0.060147, 0.015185, 0.006333), + (0.009036, 0.010079, -0.039004, -0.009036), + (-0.019975, 0.002612, 0.044291, -0.002612)], + columns=cols, index=weekly_index) + test5_actual = pd.DataFrame([(np.nan, np.nan, np.nan, np.nan), + (0.018951, -0.008043, 0.008043, -0.015929), + (-0.028116, 0.026522, 0.003355, -0.003355), + (0.036035, -0.018217, -0.080735, 0.018217), + (0.000479, 0.006833, -0.000479, -0.010351)], + columns=cols, index=monthly_index) + + pd.testing.assert_frame_equal(test4, test4_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test5, test5_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test6, test5_actual.apply(np.sign), check_less_precise=True) + + def test_forward(self): + """ + Tests with lagged returns. + """ + cols = ['EEM', 'EWG', 'TIP'] + subset = self.data[cols].iloc[0:5] + subset2 = self.data[cols].iloc[0:100] + monthly_index = subset2.resample('M').last().index + + test7 = excess_over_median(subset, lag=True) + test8 = excess_over_median(subset, binary=True, lag=True) + test9 = excess_over_median(subset2, resample_by='M', lag=True) + test10 = excess_over_median(subset2, resample_by='M', binary=True, lag=True) + + test7_actual = pd.DataFrame([(0.0056216, -0.006201, 0), (-0.010485, 0, 0.019272), (0.006460, 0, -0.001054), + (-0.000824, 0, 0.007678), (np.nan, np.nan, np.nan)], + columns=cols, index=self.data[cols].iloc[0:5].index) + test9_actual = pd.DataFrame([(0.010909, -0.016086, 0), (-0.031471, 0.023167, 0), (0.054252, 0, -0.062518), + (0, 0.006354, -0.000958), (np.nan, np.nan, np.nan)], + columns=cols, index=monthly_index) + + pd.testing.assert_frame_equal(test7, test7_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test8, test7_actual.apply(np.sign), check_less_precise=True) + pd.testing.assert_frame_equal(test9, test9_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test10, test9_actual.apply(np.sign), check_less_precise=True) + + def test_nan(self): + """ + Tests to check that NaN values in prices get ignored. + """ + cols = ['EEM', 'EWG', 'TIP'] + subset = self.data[cols].iloc[0:5] + with_nan = pd.concat([subset, pd.Series([np.nan]*5, name='nan', index=subset.index)], axis=1) + test11 = excess_over_median(with_nan) + test11.drop('nan', axis=1, inplace=True) + pd.testing.assert_frame_equal(test11, excess_over_median(subset), check_less_precise=True) diff --git a/mlfinlab/tests/test_labeling_raw_return.py b/mlfinlab/tests/test_labeling_raw_return.py new file mode 100644 index 000000000..b35414f5e --- /dev/null +++ b/mlfinlab/tests/test_labeling_raw_return.py @@ -0,0 +1,98 @@ +# pylint: disable=missing-module-docstring +# pylint: disable=no-self-use + +import unittest +import os +import numpy as np +import pandas as pd + +from mlfinlab.labeling.raw_return import raw_return + + +class TestLabelingRawReturns(unittest.TestCase): + """ + Tests for the raw returns labeling method. + """ + + def setUp(self): + """ + Set the file path for the sample dollar bars data. + """ + project_path = os.path.dirname(__file__) + self.path = project_path + '/test_data/stock_prices.csv' + self.data = pd.read_csv(self.path, index_col='Date', parse_dates=True) + self.idx5 = self.data[:5].index + self.col5 = self.data.iloc[:, 0:5].columns + + def test_dataframe(self): + """ + Verifies raw returns for a DataFrame. + """ + prices = self.data.iloc[0:5, 0:5] + test1 = raw_return(prices, lag=False) + test2 = raw_return(prices, binary=True, lag=False) + test3 = raw_return(prices, logarithmic=True, lag=True) + test4 = raw_return(prices, binary=True, logarithmic=True, lag=True) + test1_actual = pd.DataFrame([(np.nan, np.nan, np.nan, np.nan, np.nan), + (0.008997, -0.002826, 0.0033758, 0.003779, 0.001662), + (-0.030037, -0.019552, -0.0002804, -0.025602, -0.022719), + (0.007327, 0.000867, -0.000187, -0.006182, 0.001045), + (-0.007754, -0.006930, 0.000748, -0.002333, -0.005610)], + columns=self.col5, index=self.idx5) + + test3_actual = pd.DataFrame([(0.008957, -0.002830, 0.003370, 0.003772, 0.001661), + (-0.030497, -0.019746, -0.0002804, -0.025936, -0.022981), + (0.007300, 0.000867, -0.000187, -0.006202, 0.001044), + (-0.007784, -0.006955, 0.0007478, -0.002336, -0.005626), + (np.nan, np.nan, np.nan, np.nan, np.nan)], + columns=self.col5, index=self.idx5) + + pd.testing.assert_frame_equal(test1, test1_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test2, test1_actual.apply(np.sign)) + pd.testing.assert_frame_equal(test3, test3_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test4, test3_actual.apply(np.sign)) + + def test_series(self): + """ + Verifies raw returns for a series for simple/logarithmic returns, with numerical/binary labels. + """ + # Takes series of 10 imaginary prices. + price = pd.Series([100, 101, 102, 102, 102, 99, 19, 2000, 100, 105]) + + test4 = raw_return(price, lag=True) + test5 = raw_return(price, logarithmic=True, lag=False) + test6 = raw_return(price, binary=True, logarithmic=True, lag=False) + test4_actual = pd.Series([0.01, 0.009901, 0, 0, -0.029412, -0.808081, 104.263158, -0.95, 0.05, np.nan]) + test5_actual = pd.Series([np.nan, 0.00995033, 0.0098523, 0, 0, -0.02985296, -1.65068087, 4.65646348, + -2.99573227, 0.04879016]) + pd.testing.assert_series_equal(test4, test4_actual, check_less_precise=True) + pd.testing.assert_series_equal(test5, test5_actual, check_less_precise=True) + pd.testing.assert_series_equal(test6, test5_actual.apply(np.sign)) + + def test_resample(self): + """ + Tests that resampling works correctly. + """ + price1 = self.data.iloc[0:25, 0:5] + price2 = self.data.iloc[:, 0:3] + week_index = price1.resample('W').last().index + year_index = self.data.resample('Y').last().index + test6 = raw_return(price1, binary=False, logarithmic=True, resample_by='W', lag=True) + test7 = raw_return(price2, binary=False, logarithmic=False, resample_by='Y', lag=True) + test8 = raw_return(price2, binary=True, logarithmic=False, resample_by='Y', lag=True) + test6_actual = pd.DataFrame([(0.014956, -0.014263, 0.002707, -0.012442, -0.018586), + (-0.081178, -0.056693, 0.011494, -0.022153, -0.046989), + (-0.015181, -0.071367, 0.006431, -0.002403, -0.014326), + (0.045872, 0.046868, -0.001099, 0.028460, 0.039661), + (-0.068778, -0.044871, -0.002203, -0.050350, -0.058079), + (np.nan, np.nan, np.nan, np.nan, np.nan)], + columns=self.col5, index=week_index) + test7_actual = pd.DataFrame({'EEM': [0.661994, 0.147952, -0.203610, 0.168951, -0.057497, -0.060048, -0.180708, + 0.077664, np.nan], + 'EWG': [0.167534, 0.066845, -0.197160, 0.285120, 0.285830, -0.136965, -0.044509, + -0.079038, np.nan], + 'TIP': [0.046957, 0.034841, 0.085287, 0.040449, -0.094803, 0.019199, -0.020802, + 0.067287, np.nan]}, index=year_index) + pd.testing.assert_frame_equal(test6, test6_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test7, test7_actual, check_less_precise=True) + pd.testing.assert_frame_equal(test8, test7_actual.apply(np.sign)) diff --git a/mlfinlab/tests/test_labeling_vs_benchmark.py b/mlfinlab/tests/test_labeling_vs_benchmark.py new file mode 100644 index 000000000..a54548d39 --- /dev/null +++ b/mlfinlab/tests/test_labeling_vs_benchmark.py @@ -0,0 +1,100 @@ +# pylint: disable=missing-module-docstring + +import unittest +import os +import numpy as np +import pandas as pd +from mlfinlab.labeling.return_vs_benchmark import return_over_benchmark + + +class TestReturnOverBenchmark(unittest.TestCase): + """ + Tests regarding the labeling returns over benchmark method. + """ + + def setUp(self): + """ + Set the file path for the sample dollar bars data. + """ + project_path = os.path.dirname(__file__) + self.path = project_path + '/test_data/stock_prices.csv' + self.data = pd.read_csv(self.path, index_col='Date', parse_dates=True) + self.idx10 = self.data[:10].index + + def test_basic(self): + """ + Tests for the basic case where the benchmark is a constant. + """ + data1 = self.data['EWQ'] + data3 = self.data[['EWU', 'XLB']] + + # No benchmark given, assumed to be 0. + test1 = return_over_benchmark(data1[:10], lag=True) + test2 = return_over_benchmark(data1[:10], binary=True, lag=True) + + # Constant benchmark, on multiple columns. + test3 = return_over_benchmark(data3[:10], benchmark=0.005, lag=False) + + test1_actual = pd.Series([-0.00052716, -0.02452523, 0.00729918, -0.00778307, 0.0029754, 0.00242709, + -0.0191014, 0.02057049, -0.02983071, np.nan], index=self.idx10) + test3_actual = pd.DataFrame({'EWU': [np.nan, 0.001281, -0.028720, -0.002016, -0.019025, -0.004569, -0.010170, + -0.026221, 0.006947, -0.029924], + 'XLB': [np.nan, 0.013160, -0.035202, -0.018732, -0.020415, 0.001313, 0.008551, + -0.015151, 0.028517, -0.032348]}, + index=self.idx10, columns=data3.columns) + pd.testing.assert_series_equal(test1, test1_actual, check_names=False) + pd.testing.assert_series_equal(test2, test1_actual.apply(np.sign), check_names=False) + pd.testing.assert_frame_equal(test3, test3_actual, check_less_precise=True) + + def test_given_benchmark(self): + """ + Tests comparing value to a dynamic benchmark. + """ + # User inputted benchmark. + benchmark4 = pd.Series([0, 0.01, -0.01, 0.02, -0.005, 0.6, 100, -90, -0.2, 0.008], index=self.idx10) + data4 = self.data['BND'] + test4 = return_over_benchmark(data4[:10], benchmark=benchmark4, lag=False) + test5 = return_over_benchmark(data4[:10], benchmark=benchmark4, binary=True, lag=False) + test4_actual = pd.Series([np.nan, -8.70736203e-03, 1.11619412e-02, -1.97421452e-02, 6.03135015e-03, + -6.01159098e-01, -1.00000387e+02, 9.00030955e+01, 2.01285921e-01, + -4.40427932e-03], index=self.idx10) + + # Using SPY as a benchmark. + benchmark6 = self.data['SPY'].pct_change(periods=1) + test6 = return_over_benchmark(data4[:10], benchmark6[:10], lag=False) + test6_actual = pd.Series([np.nan, 0.00177558, 0.02566838, 0.00110702, 0.01717979, -0.01166944, -0.00694088, + 0.01116406, -0.0067769, 0.02560875], index=self.idx10) + + pd.testing.assert_series_equal(test4, test4_actual) + pd.testing.assert_series_equal(test5, test4_actual.apply(np.sign)) + pd.testing.assert_series_equal(test6, test6_actual) + + def test_resample(self): + """ + Tests for when resampling is used. + """ + data5 = self.data[['EEM', 'EWG', 'TIP']] + subset1 = data5[40:50] + subset2 = data5[0:130] + benchmark_day = pd.Series([0.01, 0.01, 0.01, -0.01, -0.01, -0.02, 0.2, 0.04, -0.1, 0], index=subset1.index) + month_index = subset2.resample('M').last().index + + test7 = return_over_benchmark(subset1, benchmark=benchmark_day, binary=False, resample_by='B', lag=True) + test7b = return_over_benchmark(subset1, benchmark=benchmark_day, binary=False, lag=True) + test8 = return_over_benchmark(subset2, benchmark=-0.02, binary=True, resample_by='M', lag=True) # Negative + test8_actual = pd.DataFrame({'EEM': [1, -1, 1, 1, -1, -1, np.nan], 'EWG': [1, 1, 1, 1, -1, 1, np.nan], + 'TIP': [1, 1, -1, 1, 1, 1, np.nan]}, index=month_index) + + pd.testing.assert_frame_equal(test7, test7b) + pd.testing.assert_frame_equal(test8, test8_actual) + + def test_exception(self): + """ + Verifies that the exception is given when there is a mismatch between prices.index and benchmark.index. + """ + returns = self.data['TLT'].pct_change() + benchmark = self.data['SPY'].pct_change() + + # Suppose we resample the returns, but fail to update the index of benchmark. + with self.assertRaises(Exception): + return_over_benchmark(returns, benchmark=benchmark, resample_by='W') diff --git a/mlfinlab/tests/test_labels.py b/mlfinlab/tests/test_labels.py index 743582d56..2e93e9c5a 100644 --- a/mlfinlab/tests/test_labels.py +++ b/mlfinlab/tests/test_labels.py @@ -106,7 +106,8 @@ def test_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) # Test that the events are the same as expected (naive test) self.assertTrue(triple_barrier_events.shape == (8, 4)) # Assert shape @@ -128,7 +129,8 @@ def test_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=self.data['side']) + side_prediction=self.data['side'], + verbose=False) # Assert that the two different events are the the same as they are generated using same data self.assertTrue(np.all(meta_labeled_events['t1'] == triple_barrier_events['t1'])) @@ -146,7 +148,8 @@ def test_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=False, - side_prediction=None) + side_prediction=None, + verbose=False) # Assert targets match other events trgts self.assertTrue(np.all(triple_barrier_events['trgt'] == no_vertical_events['trgt'])) @@ -173,7 +176,8 @@ def test_triple_barrier_labeling(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) triple_labels = get_bins(triple_barrier_events, self.data['close']) self.assertTrue(np.all(triple_labels[np.abs(triple_labels['ret']) < triple_labels['trgt']]['bin'] == 0)) @@ -187,7 +191,8 @@ def test_triple_barrier_labeling(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=self.data['side']) + side_prediction=self.data['side'], + verbose=False) triple_labels = get_bins(triple_barrier_events, self.data['close']) @@ -226,7 +231,8 @@ def test_pt_sl_levels_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) triple_labels_ptsl_large = get_bins(triple_barrier_events_ptsl, self.data['close']) labels_large = triple_labels_ptsl_large['bin'] @@ -242,7 +248,8 @@ def test_pt_sl_levels_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) triple_labels_ptsl_small = get_bins(triple_barrier_events_ptsl, self.data['close']) labels_small = triple_labels_ptsl_small['bin'] @@ -258,7 +265,8 @@ def test_pt_sl_levels_triple_barrier_events(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) labels_no_ones = get_bins(triple_barrier_events_ptsl, self.data['close'])['bin'] self.assertTrue(np.all(labels_no_ones < 1)) @@ -281,7 +289,8 @@ def test_drop_labels(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=None) + side_prediction=None, + verbose=False) triple_labels = get_bins(triple_barrier_events, self.data['close']) # Drop the 2 zero labels in the set since they are "rare" diff --git a/mlfinlab/tests/test_microstructural_features.py b/mlfinlab/tests/test_microstructural_features.py index e447f315c..36d7dbbcc 100644 --- a/mlfinlab/tests/test_microstructural_features.py +++ b/mlfinlab/tests/test_microstructural_features.py @@ -174,8 +174,9 @@ def test_csv_format(self): too_many_cols = ['2019-01-30', 200.00, np.int64(5), 'Limit order', 'B23'] # pylint: disable=protected-access - self.assertRaises(ValueError, - MicrostructuralFeaturesGenerator._assert_csv(pd.DataFrame(wrong_date).T)) + with self.assertWarns(DeprecationWarning): + self.assertRaises(ValueError, + MicrostructuralFeaturesGenerator._assert_csv(pd.DataFrame(wrong_date).T)) # pylint: disable=protected-access self.assertRaises(AssertionError, MicrostructuralFeaturesGenerator._assert_csv, diff --git a/mlfinlab/tests/test_nco.py b/mlfinlab/tests/test_nco.py index 2b3d10f93..0b09f0541 100644 --- a/mlfinlab/tests/test_nco.py +++ b/mlfinlab/tests/test_nco.py @@ -170,18 +170,34 @@ def test_allocate_mcos(): kde_bwidth_alt = 0 # Expected weights for minimum variance allocation + # Second line in the below test was changed after v.0.11.3 from [0.257547, 0.265450, 0.242453, 0.234551] + # to [0.273299, 0.242542, 0.241464, 0.242696] + # due to scikit-learn changing np.random outputs w_cvo_expected = pd.DataFrame([[0.249287, 0.256002, 0.242593, 0.252118], - [0.257547, 0.265450, 0.242453, 0.234551]]) + [0.273299, 0.242542, 0.241464, 0.242696]]) + # Second line in the below test was changed after v.0.11.3 from [0.257547, 0.265450, 0.242453, 0.234551] + # to [0.273299, 0.242542, 0.241464, 0.242696] + # due to scikit-learn changing np.random outputs w_nco_expected = pd.DataFrame([[0.248396, 0.243172, 0.250751, 0.257680], - [0.257547, 0.265450, 0.242453, 0.234551]]) + [0.273299, 0.242542, 0.241464, 0.242696]]) # Expected weights for maximum Sharpe ratio allocation - w_cvo_sr_expected = pd.DataFrame([[-1.081719, 1.810936, 1.218067, 3.978880], - [-2.431651, 0.594868, -0.210175, 5.117628]]) - - w_nco_sr_expected = pd.DataFrame([[-1.060835, 1.910503, 1.315026, 3.908128], - [-0.937168, 1.886158, -0.389275, 4.884809]]) + # Values in the below test was changed after v.0.11.3 from [[-1.081719, 1.810936, 1.218067, 3.978880] + # [-2.431651, 0.594868, -0.210175, 5.117628]] + # to [[-0.128849, -0.326671, 0.870183, 2.020053] + # [-3.786126, -0.881858, 1.418773, 3.062546]] + # due to scikit-learn changing np.random outputs + w_cvo_sr_expected = pd.DataFrame([[-0.128849, -0.326671, 0.870183, 2.020053], + [-3.786126, -0.881858, 1.418773, 3.062546]]) + + # Values in the below test was changed after v.0.11.3 from [[-1.060835, 1.910503, 1.315026, 3.908128] + # [-0.937168, 1.886158, -0.389275, 4.884809]] + # to [[-0.204089, -0.050088, 0.912494, 1.983382] + # [-3.723231, -1.809242, 1.862001, 2.61035]] + # due to scikit-learn changing np.random outputs + w_nco_sr_expected = pd.DataFrame([[-0.204089, -0.050088, 0.912494, 1.983382], + [-3.723231, -1.809242, 1.862001, 2.61035]]) # Finding the optimal weights for minimum variance w_cvo, w_nco = nco.allocate_mcos(mu_vec, cov_mat, num_obs, num_sims, kde_bwidth, min_var_portf, lw_shrinkage) @@ -190,11 +206,11 @@ def test_allocate_mcos(): w_cvo_sr, w_nco_sr = nco.allocate_mcos(mu_vec, cov_mat, num_obs, num_sims, kde_bwidth_alt, min_var_portf_alt, lw_shrinkage) # Testing if the optimal allocation simulations are right - np.testing.assert_almost_equal(np.array(w_cvo), np.array(w_cvo_expected), decimal=4) - np.testing.assert_almost_equal(np.array(w_nco), np.array(w_nco_expected), decimal=4) + np.testing.assert_almost_equal(np.array(w_cvo), np.array(w_cvo_expected), decimal=6) + np.testing.assert_almost_equal(np.array(w_nco), np.array(w_nco_expected), decimal=6) - np.testing.assert_almost_equal(np.array(w_cvo_sr), np.array(w_cvo_sr_expected), decimal=4) - np.testing.assert_almost_equal(np.array(w_nco_sr), np.array(w_nco_sr_expected), decimal=4) + np.testing.assert_almost_equal(np.array(w_cvo_sr), np.array(w_cvo_sr_expected), decimal=6) + np.testing.assert_almost_equal(np.array(w_nco_sr), np.array(w_nco_sr_expected), decimal=6) @staticmethod def test_estim_errors_mcos(): diff --git a/mlfinlab/tests/test_run_data_structures.py b/mlfinlab/tests/test_run_data_structures.py index 827f78838..0ee33e968 100644 --- a/mlfinlab/tests/test_run_data_structures.py +++ b/mlfinlab/tests/test_run_data_structures.py @@ -23,7 +23,7 @@ def setUp(self): Set the file path for the tick data csv """ project_path = os.path.dirname(__file__) - self.path = project_path + '/test_data/imbalance_sample_data.csv' + self.path = project_path + '/test_data/imbalance_sample_data_small.csv' def test_ema_run_dollar_bars(self): """ @@ -49,7 +49,7 @@ def test_ema_run_dollar_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (3, 10)) + self.assertEqual(db1.shape, (2, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -71,10 +71,10 @@ def test_ema_run_dollar_bars(self): self.assertEqual(db1.loc[0, 'close'], 1305.75) # Assert OHLC is correct (the first value) - self.assertEqual(db1.loc[2, 'open'], 1307.25) - self.assertEqual(db1.loc[2, 'high'], 1307.25) - self.assertEqual(db1.loc[2, 'low'], 1302.25) - self.assertEqual(db1.loc[2, 'close'], 1302.25) + self.assertEqual(db1.loc[1, 'open'], 1305.75) + self.assertEqual(db1.loc[1, 'high'], 1308.75) + self.assertEqual(db1.loc[1, 'low'], 1305.25) + self.assertEqual(db1.loc[1, 'close'], 1307.25) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -106,7 +106,7 @@ def test_ema_run_volume_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (3, 10)) + self.assertEqual(db1.shape, (2, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -128,10 +128,10 @@ def test_ema_run_volume_bars(self): self.assertEqual(db1.loc[0, 'close'], 1305.75) # Assert OHLC is correct (the first value) - self.assertEqual(db1.loc[2, 'open'], 1307.25) - self.assertEqual(db1.loc[2, 'high'], 1307.25) - self.assertEqual(db1.loc[2, 'low'], 1302.25) - self.assertEqual(db1.loc[2, 'close'], 1302.25) + self.assertEqual(db1.loc[1, 'open'], 1305.75) + self.assertEqual(db1.loc[1, 'high'], 1308.75) + self.assertEqual(db1.loc[1, 'low'], 1305.25) + self.assertEqual(db1.loc[1, 'close'], 1307.25) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -163,7 +163,7 @@ def test_ema_run_tick_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (4, 10)) + self.assertEqual(db1.shape, (2, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -185,10 +185,10 @@ def test_ema_run_tick_bars(self): self.assertEqual(db1.loc[0, 'close'], 1305.75) # Assert OHLC is correct (the first value) - self.assertEqual(db1.loc[2, 'open'], 1307.25) - self.assertEqual(db1.loc[2, 'high'], 1307.75) - self.assertEqual(db1.loc[2, 'low'], 1303.5) - self.assertEqual(db1.loc[2, 'close'], 1304.5) + self.assertEqual(db1.loc[1, 'open'], 1305.75) + self.assertEqual(db1.loc[1, 'high'], 1308.75) + self.assertEqual(db1.loc[1, 'low'], 1305.25) + self.assertEqual(db1.loc[1, 'close'], 1307.25) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -223,7 +223,7 @@ def test_ema_run_dollar_bars_with_constraints(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (9, 10)) + self.assertEqual(db1.shape, (5, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -244,10 +244,10 @@ def test_ema_run_dollar_bars_with_constraints(self): self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) # Assert OHLC is correct (some index) - self.assertEqual(db1.loc[7, 'open'], 1302.5) - self.assertEqual(db1.loc[7, 'high'], 1304.75) - self.assertEqual(db1.loc[7, 'low'], 1301.75) - self.assertEqual(db1.loc[7, 'close'], 1304.5) + self.assertEqual(db1.loc[4, 'open'], 1306) + self.assertEqual(db1.loc[4, 'high'], 1306.75) + self.assertEqual(db1.loc[4, 'low'], 1303.5) + self.assertEqual(db1.loc[4, 'close'], 1303.5) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -278,7 +278,7 @@ def test_const_run_dollar_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (9, 10)) + self.assertEqual(db1.shape, (5, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -300,10 +300,10 @@ def test_const_run_dollar_bars(self): self.assertEqual(db1.loc[0, 'close'], 1305.75) # Assert OHLC is correct (the first value) - self.assertEqual(db1.loc[2, 'open'], 1306.0) - self.assertEqual(db1.loc[2, 'high'], 1307.75) - self.assertEqual(db1.loc[2, 'low'], 1305.75) - self.assertEqual(db1.loc[2, 'close'], 1307.75) + self.assertEqual(db1.loc[4, 'open'], 1306) + self.assertEqual(db1.loc[4, 'high'], 1306.75) + self.assertEqual(db1.loc[4, 'low'], 1303.5) + self.assertEqual(db1.loc[4, 'close'], 1303.5) self.assertTrue((db1.loc[:, 'high'] >= db1.loc[:, 'low']).all()) self.assertTrue((db1.loc[:, 'volume'] >= db1.loc[:, 'cum_buy_volume']).all()) @@ -335,7 +335,7 @@ def test_const_run_volume_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (9, 10)) + self.assertEqual(db1.shape, (5, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -392,7 +392,7 @@ def test_const_run_tick_bars(self): to_csv=True, output_path='test.csv') db4 = pd.read_csv('test.csv', parse_dates=[0]) - self.assertEqual(db1.shape, (9, 10)) + self.assertEqual(db1.shape, (5, 10)) # Assert diff batch sizes have same number of bars self.assertTrue(db1.shape == db2.shape) @@ -436,8 +436,8 @@ def test_csv_format(self): np.int64(5), 'Limit order', 'B23'] # pylint: disable=protected-access - self.assertRaises(ValueError, ds.BaseRunBars._assert_csv( - pd.DataFrame(wrong_date).T)) + self.assertRaises(ValueError, ds.BaseRunBars._assert_csv, + pd.DataFrame(wrong_date).T) # pylint: disable=protected-access self.assertRaises(AssertionError, ds.BaseRunBars._assert_csv, diff --git a/mlfinlab/tests/test_sample_weights.py b/mlfinlab/tests/test_sample_weights.py index dcf8f32c5..91f88b314 100644 --- a/mlfinlab/tests/test_sample_weights.py +++ b/mlfinlab/tests/test_sample_weights.py @@ -40,14 +40,15 @@ def setUp(self): min_ret=0.005, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=self.data['side']) + side_prediction=self.data['side'], + verbose=False) def test_ret_attribution(self): """ Assert that return attribution length equals triple barrier length, check particular values """ non_nan_meta_labels = self.meta_labeled_events.dropna() - ret_weights = get_weights_by_return(non_nan_meta_labels, self.data['close']) + ret_weights = get_weights_by_return(non_nan_meta_labels, self.data['close'], verbose=False) self.assertTrue(ret_weights.shape[0] == non_nan_meta_labels.shape[0]) self.assertTrue(abs(ret_weights.iloc[0] - 0.781807) <= 1e5) self.assertTrue(abs(ret_weights.iloc[3] - 1.627944) <= 1e5) @@ -57,11 +58,11 @@ def test_time_decay_weights(self): Assert that time decay weights length equals triple barrier length, check particular values """ non_nan_meta_labels = self.meta_labeled_events.dropna() - standard_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=0.5) - no_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=1) - neg_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=-0.5) - converge_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=0) - pos_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=1.5) + standard_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=0.5, verbose=False) + no_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=1, verbose=False) + neg_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=-0.5, verbose=False) + converge_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=0, verbose=False) + pos_decay = get_weights_by_time_decay(non_nan_meta_labels, self.data['close'], decay=1.5, verbose=False) self.assertTrue(standard_decay.shape == no_decay.shape) self.assertTrue(standard_decay.shape == neg_decay.shape) diff --git a/mlfinlab/tests/test_sampling.py b/mlfinlab/tests/test_sampling.py index dfff17892..08a0e5f66 100644 --- a/mlfinlab/tests/test_sampling.py +++ b/mlfinlab/tests/test_sampling.py @@ -31,7 +31,7 @@ def setUp(self): """ Set samples_info_sets (t1), price bars """ - self.price_bars = pd.Series(index=pd.date_range(start="1/1/2018", end='1/8/2018', freq='H')) + self.price_bars = pd.Series(index=pd.date_range(start="1/1/2018", end='1/8/2018', freq='H'), dtype='float64') self.samples_info_sets = pd.DataFrame(index=self.price_bars.index[[1, 2, 5, 7, 10, 11, 12, 20]]) self.samples_info_sets['t1'] = self.samples_info_sets.index + pd.Timedelta('2H') diff --git a/mlfinlab/tests/test_sb_bagging.py b/mlfinlab/tests/test_sb_bagging.py index ed81fbd10..d27af3c2b 100644 --- a/mlfinlab/tests/test_sb_bagging.py +++ b/mlfinlab/tests/test_sb_bagging.py @@ -91,7 +91,8 @@ def setUp(self): min_ret=5e-5, num_threads=3, vertical_barrier_times=vertical_barriers, - side_prediction=self.data['side']) + side_prediction=self.data['side'], + verbose=False) meta_labeled_events.dropna(inplace=True) labels = get_bins(meta_labeled_events, self.data['close']) @@ -154,8 +155,8 @@ def test_sb_bagging_non_sample_weights_with_verbose(self): price_bars=self.price_bars_trim, oob_score=True, random_state=1, bootstrap_features=True, max_samples=30, verbose=2) - - sb_clf.fit(self.X_train, self.y_train_clf) + with self.assertWarns(UserWarning): + sb_clf.fit(self.X_train, self.y_train_clf) self.assertTrue((sb_clf.predict(self.X_train)[:10] == np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0])).all) def test_sb_bagging_with_max_features(self): @@ -171,9 +172,9 @@ def test_sb_bagging_with_max_features(self): samples_info_sets=self.samples_info_sets, price_bars=self.price_bars_trim, oob_score=True, random_state=1, bootstrap_features=True, - max_samples=30, verbose=2) - - sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],))) + max_samples=30) + with self.assertWarns(UserWarning): + sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],))) self.assertTrue((sb_clf.predict(self.X_train)[:10] == np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 0])).all) def test_sb_bagging_float_max_samples_warm_start_true(self): @@ -191,8 +192,10 @@ def test_sb_bagging_float_max_samples_warm_start_true(self): max_samples=0.3, warm_start=True) sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],)), ) + sb_clf.n_estimators += 0 - sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],)), ) + with self.assertWarns(UserWarning): + sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],)), ) sb_clf.n_estimators += 2 sb_clf.fit(self.X_train, self.y_train_clf, sample_weight=np.ones((self.X_train.shape[0],)), ) @@ -303,7 +306,9 @@ def test_sb_regressor(self): random_state=1) sb_reg.fit(self.X_train, self.y_train_reg) - sb_reg_1.fit(self.X_train, self.y_train_reg) # To raise warning and get code coverage + + with self.assertWarns(UserWarning): + sb_reg_1.fit(self.X_train, self.y_train_reg) # To raise warning and get code coverage # X_train index should be in index mapping self.assertTrue(self.X_train.index.isin(sb_reg.timestamp_int_index_mapping.index).all()) diff --git a/mlfinlab/tests/test_standard_data_structures.py b/mlfinlab/tests/test_standard_data_structures.py index 6f78d81ff..1004bcd9d 100644 --- a/mlfinlab/tests/test_standard_data_structures.py +++ b/mlfinlab/tests/test_standard_data_structures.py @@ -246,8 +246,8 @@ def test_csv_format(self): too_many_cols = ['2019-01-30', 200.00, np.int64(5), 'Limit order', 'B23'] # pylint: disable=protected-access - self.assertRaises(ValueError, - ds.StandardBars._assert_csv(pd.DataFrame(wrong_date).T)) + self.assertRaises(ValueError, ds.StandardBars._assert_csv, + pd.DataFrame(wrong_date).T) # pylint: disable=protected-access self.assertRaises(AssertionError, ds.StandardBars._assert_csv, diff --git a/mlfinlab/tests/test_structural_breaks.py b/mlfinlab/tests/test_structural_breaks.py index ed6b7ab2c..a8b503de1 100644 --- a/mlfinlab/tests/test_structural_breaks.py +++ b/mlfinlab/tests/test_structural_breaks.py @@ -34,7 +34,7 @@ def test_chow_test(self): """ min_length = 10 log_prices = np.log(self.data.close) - stats = get_chow_type_stat(log_prices, min_length=min_length) + stats = get_chow_type_stat(log_prices, min_length=min_length, verbose=True) # We drop first and last # of min_length values self.assertEqual(log_prices.shape[0] - min_length * 2, stats.shape[0]) @@ -60,8 +60,8 @@ def test_chu_stinchcombe_white_test(self): """ log_prices = np.log(self.data.close) - one_sided_test = get_chu_stinchcombe_white_statistics(log_prices, test_type='one_sided') - two_sided_test = get_chu_stinchcombe_white_statistics(log_prices, test_type='two_sided') + one_sided_test = get_chu_stinchcombe_white_statistics(log_prices, test_type='one_sided', verbose=True) + two_sided_test = get_chu_stinchcombe_white_statistics(log_prices, test_type='two_sided', verbose=True) # For the first two values we don't have enough info self.assertEqual(log_prices.shape[0] - 2, one_sided_test.shape[0]) @@ -95,20 +95,26 @@ def test_sadf_test(self): lags_array = [1, 2, 5, 7] min_length = 20 - linear_sadf = get_sadf(log_prices, model='linear', add_const=True, min_length=min_length, lags=lags_int) + linear_sadf = get_sadf(log_prices, model='linear', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) linear_sadf_no_const_lags_arr = get_sadf(log_prices, model='linear', add_const=False, min_length=min_length, - lags=lags_array) - quadratic_sadf = get_sadf(log_prices, model='quadratic', add_const=True, min_length=min_length, lags=lags_int) - - sm_poly_1_sadf = get_sadf(log_prices, model='sm_poly_1', add_const=True, min_length=min_length, lags=lags_int) - sm_poly_2_sadf = get_sadf(log_prices, model='sm_poly_2', add_const=True, min_length=min_length, lags=lags_int) - sm_power_sadf = get_sadf(log_prices, model='sm_power', add_const=True, min_length=min_length, lags=lags_int) - sm_exp_sadf = get_sadf(log_prices, model='sm_exp', add_const=True, min_length=min_length, lags=lags_int) + lags=lags_array, verbose=True) + quadratic_sadf = get_sadf(log_prices, model='quadratic', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) + + sm_poly_1_sadf = get_sadf(log_prices, model='sm_poly_1', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) + sm_poly_2_sadf = get_sadf(log_prices, model='sm_poly_2', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) + sm_power_sadf = get_sadf(log_prices, model='sm_power', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) + sm_exp_sadf = get_sadf(log_prices, model='sm_exp', add_const=True, min_length=min_length, lags=lags_int, + verbose=True) sm_power_sadf_phi = get_sadf(log_prices, model='sm_power', add_const=True, min_length=min_length, lags=lags_int, - phi=0.5) + phi=0.5, verbose=True) sm_exp_sadf_phi = get_sadf(log_prices, model='sm_exp', add_const=True, min_length=min_length, lags=lags_int, - phi=0.5) + phi=0.5, verbose=True) self.assertEqual(log_prices.shape[0] - min_length - lags_int - 1, sm_power_sadf.shape[0]) # -1 for series_diff self.assertEqual(log_prices.shape[0] - min_length - lags_int - 1, linear_sadf.shape[0]) @@ -148,7 +154,8 @@ def test_sadf_test(self): # Trivial series case. ones_series = pd.Series(index=log_prices.index, data=np.ones(shape=log_prices.shape[0])) trivial_sadf = get_sadf(ones_series, model='sm_power', add_const=True, min_length=min_length, lags=lags_int, - phi=0.5) + phi=0.5, verbose=True) + self.assertTrue((trivial_sadf.unique() == [-np.inf]).all()) # All values should be -np.inf # Test rubbish model argument. diff --git a/mlfinlab/tests/test_time_data_structures.py b/mlfinlab/tests/test_time_data_structures.py index 56ab2dae8..6ced58135 100644 --- a/mlfinlab/tests/test_time_data_structures.py +++ b/mlfinlab/tests/test_time_data_structures.py @@ -182,8 +182,8 @@ def test_csv_format(self): too_many_cols = ['2019-01-30', 200.00, np.int64(5), 'Limit order', 'B23'] # pylint: disable=protected-access - self.assertRaises(ValueError, - ds.TimeBars._assert_csv(pd.DataFrame(wrong_date).T)) + self.assertRaises(ValueError, ds.TimeBars._assert_csv, + pd.DataFrame(wrong_date).T) # pylint: disable=protected-access self.assertRaises(AssertionError, ds.TimeBars._assert_csv, diff --git a/mlfinlab/util/multiprocess.py b/mlfinlab/util/multiprocess.py index 707eced35..2e4aa79b1 100644 --- a/mlfinlab/util/multiprocess.py +++ b/mlfinlab/util/multiprocess.py @@ -69,7 +69,7 @@ def nested_parts(num_atoms, num_threads, upper_triangle=False): # Snippet 20.7 (page 310), The mpPandasObj, used at various points in the book -def mp_pandas_obj(func, pd_obj, num_threads=24, mp_batches=1, lin_mols=True, **kargs): +def mp_pandas_obj(func, pd_obj, num_threads=24, mp_batches=1, lin_mols=True, verbose=True, **kargs): """ Advances in Financial Machine Learning, Snippet 20.7, page 310. @@ -105,6 +105,7 @@ def mp_pandas_obj(func, pd_obj, num_threads=24, mp_batches=1, lin_mols=True, **k :param num_threads: (int) The number of threads that will be used in parallel (one processor per thread) :param mp_batches: (int) Number of parallel batches (jobs per core) :param lin_mols: (bool) Tells if the method should use linear or nested partitioning + :param verbose: (bool) Flag to report progress on asynch jobs :param kargs: (var args) Keyword arguments needed by func :return: (pd.DataFrame) of results """ @@ -123,12 +124,12 @@ def mp_pandas_obj(func, pd_obj, num_threads=24, mp_batches=1, lin_mols=True, **k if num_threads == 1: out = process_jobs_(jobs) else: - out = process_jobs(jobs, num_threads=num_threads) + out = process_jobs(jobs, num_threads=num_threads, verbose=verbose) if isinstance(out[0], pd.DataFrame): df0 = pd.DataFrame() elif isinstance(out[0], pd.Series): - df0 = pd.Series() + df0 = pd.Series(dtype='float64') else: return out @@ -205,7 +206,7 @@ def report_progress(job_num, num_jobs, time0, task): # Snippet 20.9.2, pg 312, Example of Asynchronous call to pythons multiprocessing library -def process_jobs(jobs, task=None, num_threads=24): +def process_jobs(jobs, task=None, num_threads=24, verbose=True): """ Advances in Financial Machine Learning, Snippet 20.9.2, page 312. @@ -216,6 +217,7 @@ def process_jobs(jobs, task=None, num_threads=24): :param jobs: (list) Jobs (molecules) :param task: (str) Task description :param num_threads: (int) The number of threads that will be used in parallel (one processor per thread) + :param verbose: (bool) Flag to report progress on asynch jobs :return: (None) """ @@ -230,7 +232,8 @@ def process_jobs(jobs, task=None, num_threads=24): # Process asynchronous output, report progress for i, out_ in enumerate(outputs, 1): out.append(out_) - report_progress(i, len(jobs), time0, task) + if verbose: + report_progress(i, len(jobs), time0, task) pool.close() pool.join() # This is needed to prevent memory leaks diff --git a/mlfinlab/util/volume_classifier.py b/mlfinlab/util/volume_classifier.py index 68c309c8a..83442c7b3 100644 --- a/mlfinlab/util/volume_classifier.py +++ b/mlfinlab/util/volume_classifier.py @@ -15,4 +15,6 @@ def get_bvc_buy_volume(close: pd.Series, volume: pd.Series, window: int = 20) -> :param window: (int): Window for std estimation uses in BVC calculation :return: (pd.Series) BVC buy volume """ - return volume * norm.cdf(close.diff() / close.diff().rolling(window=window).std()) + # .apply(norm.cdf) is used to omit Warning for norm.cdf(pd.Series with NaNs) + + return volume * (close.diff() / close.diff().rolling(window=window).std()).apply(norm.cdf) diff --git a/requirements.txt b/requirements.txt index 06e52a174..c5d62f479 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,13 @@ codecov==2.0.15 coverage==4.5.2 -cvxpy==1.0.25 +cvxpy==1.1.1 numba==0.49.1 -numpy==1.17.3 -matplotlib==3.1.1 -pandas==0.25.3 +numpy==1.18.5 +matplotlib==3.2.1 +pandas==1.0.4 pylint==2.4.3 -scikit-learn==0.21.3 -scipy==1.3.1 +scikit-learn==0.23.1 +scipy==1.4.1 sphinx==2.2.1 # needed for docs sphinx-rtd-theme==0.4.3 # needed for docs statsmodels==0.11.1 -xmlrunner==1.7.7 diff --git a/scripts/run_tests.py b/scripts/run_tests.py deleted file mode 100644 index 930927389..000000000 --- a/scripts/run_tests.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -Helper module used to tun tests -""" - -import unittest -import xmlrunner - -if __name__ == '__main__': - unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test_reports'), module=None) diff --git a/setup.cfg b/setup.cfg index b5e6c0e58..f0a72c3a1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,15 +45,14 @@ python_requires = setup_requires = setuptools install_requires = - pandas==0.25.3 - numpy==1.17.3 - xmlrunner==1.7.7 + pandas==1.0.4 + numpy==1.18.5 numba==0.49.1 - scikit-learn==0.21.3 - scipy==1.3.1 + scikit-learn==0.23.1 + scipy==1.4.1 statsmodels==0.11.1 - matplotlib==3.1.1 - cvxpy==1.0.25 + matplotlib==3.2.1 + cvxpy==1.1.1 [options.packages.find] package_dir =