Supported platforms
The Scala client uses the Nexosis API Java package - tested with Scala 2.12.x.
Add this dependency to build.sbt
:
resolvers +=
Resolver.sonatypeRepo("public")
// https://mvnrepository.com/artifact/com.nexosis/nexosisclient-java
libraryDependencies += "com.nexosis" % "nexosisclient-java" % "1.1.2"
The NexosisClient
has several constructor overloads.
To use the default constructor, create an environment variable called NEXOSIS_API_KEY
and set it equal to your API Key. This also uses the default API Endpoint base URI https://ml.nexosis.com/v1
.
val client = new NexosisClient()
Initialize the client with an API key.
val client = new NexosisClient(
sys.env("NEXOSIS_API_KEY")
)
Initialize the client with an API key and endpoint.
val client = new NexosisClient(
sys.env("NEXOSIS_API_KEY"),
sys.env("NEXOSIS_BASE_TEST_URL")
)
Currently, there are two ways to upload data to the Nexosis API.
DataSetData
CVS doesn’t yet support the MetaData object so one column must be named timestamp to run a forecasting or impact session. All dates must be in an ISO 8601 format. If no time-zone is specified, it is assumed to be UTC.
timeStamp,sales,transactions
2012-12-31 00:00:00,2922.13,459
2013-01-01 00:00:00,1500.56,195
2013-01-02 00:00:00,4078.52,696
2013-01-03 00:00:00,4545.69,743
2013-01-04 00:00:00,4872.63,797
2013-01-05 00:00:00,2420.81,367
2013-01-06 00:00:00,1664.22,241
2013-01-07 00:00:00,3693.01,647
2013-01-08 00:00:00,3874.89,653
2013-01-09 00:00:00,4134.05,700
2013-01-10 00:00:00,4314.94,723
...etc...
Given the csv file above, the FileInputStream can be passed to the create()
method to upload the data.
val csvFile = new FileInputStream("./SampleData.csv")
client.getDataSets.create("SampleDataSet", csvFile)
Here’s an example of creating a DataSet using the DataSetData
Model object, using generated random data:
// Generate a dataset
val rand = new Random
val startDate = DateTime.parse("2016-08-01T00:00:00Z")
val endDate = DateTime.parse("2017-03-26T00:00:00Z")
val rows: util.List[util.Map[String, String]] =
new util.ArrayList[util.Map[String, String]]()
val daysCount = Days.daysBetween(startDate, endDate).getDays()
(0 until daysCount).map(startDate.plusDays(_)).foreach { timeStamp =>
val row: util.Map[String, String] =
new util.HashMap[String, String]()
row.put("timestamp", timeStamp.toDateTimeISO().toString())
row.put("sales", (rand.nextDouble() * 100).toString)
row.put("promotion", false.toString)
rows.add(row)
}
// Create and add all the rows to the DataSet.
val dataSet = new DataSetData
dataSet.setData(rows)
// Setup metadata that describes the dataset columns.
// For time-series, we want to indicate a TIMESTAMP column
// Indicate the sales column is the TARGET to forcast over
// The promotion column is a boolean indicating if the date is a promotional period
val cols = new Columns
cols.setColumnMetadata("timestamp", DataType.DATE, DataRole.TIMESTAMP)
cols.setColumnMetadata("sales", DataType.NUMERIC, DataRole.TARGET)
cols.setColumnMetadata("promotion", DataType.LOGICAL, DataRole.FEATURE)
// Add the Columns Metadata to the DataSet
dataSet.setColumns(cols)
// Send the dataset to the API endpoint
client.getDataSets.create("SampleDataSet", dataSet)
To retrieve all DataSets, just call list()
val dataSetList = client.getDataSets.list()
dataSetList.getItems.forEach { item =>
println(item.getDataSetName)
To retrieve all DataSets that contains sales
in the dataset name, call list(filter)
val dataSetList = client.getDataSets.list("sales")
dataSetList.getItems.forEach { item =>
println(item.getDataSetName)
To generate forecasts, the platform needs to know the DataSet name to build the forecasting models off of, a target column indicating what columns the model should be predicting, a prediction interval, and the start and end date of the desired prediction dates.
val session = client.getSessions.createForecast(
"OtherDataSet",
"sales",
DateTime.parse("2017-03-25T0:00:00Z"),
DateTime.parse("2017-04-24T0:00:00Z"),
ResultInterval.DAY
)
// Save the session ID's to check status and retireve results when ready
val sessionId = session.getSessionId()
To analyze the impact of a past event, the platform needs to know the DataSet name to build the forecasting models off of, a target column indicating what columns the model will analyze, a prediction interval, and the start and end date of the event.
val session = nexosisClient.getSessions().analyzeImpact(
"websiteTraffic",
"new-big-announcement",
"hits",
DateTime.parse("2016-11-26T00:00:00Z"),
DateTime.parse("2016-12-25T00:00:00Z"),
ResultInterval.DAY
)
// Save the session ID's to check status and retireve results when ready
val sessionId = response.getSessionId();
// After starting a Session...
val status = client.getSessions.getStatus(sessionId)
var results: SessionResult
// Loop until the STARTED status changes
while (status.getStatus == SessionStatus.STARTED ) {
results = client.getSessions.getResults(sessionId)
Thread.sleep(5000)
}
// Retrieve the Results.
If you run into issues using this client library, create a new issue in github. Please include code to reproduce the error if possible.