The zoo package consists of the methods for totally ordered indexed observations. It aims at performing calculations containing irregular time series of numeric vectors, matrices & factors. The zoo package interfaces to all other time series packages on CRAN. This makes it easy to pass the time series objects between zoo & other time series packages. The zoo package is an infrastructure that tries to do all basic things well, but it doesn’t provide modeling functionality. The below set of exercises makes you understand some of zoo concepts.

The initial environment setup required to work on these exercises is as follows.

Install zoo package – `install.packages("zoo")`

Attach the package – `require("zoo")`

Download the Dataset – `ZooData`

read.table(** Filepath**, header = TRUE, sep=",",stringsAsFactors = FALSE) -> inData

Answers to the exercises are available here.

**Exercise 1**

Coerce the ` inData `

object as zoo object into ` wZ`

.

Check the class of the object ` wZ `

Observe the index of the object ` wZ `

.

**Exercise 2**

Create a zoo object ` Z `

from the ` inData `

with ` ‘Date’ `

column as the index

**Exercise 3**

Get the ratio of ` Z$DeliveryVolume to Z$TotalVolume `

Did you get the non-numeric operation error ? There is a small catch to remember, Zoo objects need to be a matrix. If there is a character string in at least one of the values, the complete Zoo object is considered as matrix of ‘character’ type. Now make a numeric zoo object, create Zoo object` Z `

with only numeric columns from ` inData `

Create a Zoo object (Z) with `inData[3:10]`

with index as Date Column

Extract only the data (without index) of zoo object Z

Get the ratio of `Z$Deliverable.Qty to Z$Total.Traded.Quantity`

**Exercise 4**

Get the mean of ` Z$DeliveryVolume to Z$TotalVolume `

per quarter, by using Aggregate function.

as.yearqtr – function returns the Quarter of a given date.

Get the mean of ` Z$DeliveryVolume to Z$TotalVolume `

per month, by using Aggregate function.

as.yearmon – function returns the Year Month of a given date.

**Exercise 5**

Create ` Z1`

object with only price related columns (Date as index). Cols – 3:6

Create ` Z2 `

with all other quantity related columns (Date as index). Cols – 3,8:10

Merge the objects ` Z1 & Z2 to Z3 `

check if merged output ` Z3 `

is same as ` Z `

**Exercise 6**

Extract only the rows from 2015-Feb-01 to 2015-Feb-15 from Zoo object ` Z `

**Exercise 7**

Volume Weighted Average Price (VWAP) = Sum of (Price * Volume)/Sum of Volume

myVwap <- function (x) {

sum(x[,1]*x[,2])/sum(x[,2])

}

Find VWAP with ` Close `

as Price, ` TotalVolume `

as Volume with data of 5 prior days. Store the result in object ` ZT `

e.g. Find the VWAP of 2015-01-07 with 2015-Jan-01 to 2015-01-07.

Find VWAP with ` Close `

as Price, ` DeliveryVolume `

as Volume with data of 5 prior days. Store the result object ` ZD `

Merge the objects ` Z with ZT, ZD `

and save result in ` R `

**Exercise 8**

Replace the NAs in ` R[,"ZT"] `

with the monthly mean of ` ZT `

e.g. NAs of Jan month in ` R[,"ZT"] `

should be replaced with Jan months mean of ` R[,"ZT"] `

**Exercise 9**

Subtract the mean of each month’s VWAP ` ZT`

from ` close `

price of each ` R `

row

**Exercise 10**

Check the rownames of object ` Z `

.

Surprised, to see NULL ?, Zoo object stores the index separately and if you want to retrieve use ` index`

function.Now, you know how to get index and data, make a data frame `DT `

from Zoo object ` Z `

, with all the columns of ` Z `

+ new column `dt`

, which contains the date of each row.

Image by Kevin1086 (Own work) [CC BY-SA 3.0], via Wikimedia Commons.

Victor Ordu says

Exercise 3 (Last line) – Those variables don’t seem to exist in “inData”…