In Warp 10, finding the first tick of a time series can be tricky. This article shows you a simple solution with WarpScript.
When you fetch data, Warp 10 FETCH always starts from the end
and walks back in time. Fetching the last data point is easy. Fetching the first data point is less obvious. As you asked us for a solution, here is a way to do it.
Learn more about FETCH function. |
FETCH basics
[ $ReadToken "classname" {} NOW -1 ] FETCH
will fetch the last point of a stored GTS. To do this, Warp 10 needs to open the right file and decompress the data. Fetching one point or one thousand points does not make a big difference.
The idea to find the first point is to fetch 1000 points one month ago, if there are 1000 points, fetch 1000 points two months ago, or before the first tick of the points, you found… until you do not find 1000 points. Then make a dichotomy until you find strictly less than 1000 points, and return the first one.
Implementation
The macro takes 4 parameters:
- The read token
- A GTS that will be your selector (possibly empty)
- An offset to define the time step you will jump (it depends on your data)
- A batch size (1000 is a good one)
If you know your data is around 1 million per month for a few years, a one-month time step and a 10000 data points batch size are reasonable. It really depends on your data.
This macro is useful… So we made it available on WarpFleet resolver. You can use it with @senx/gts/first
. You can review the code here.
Going further with attributes
If you never write in the past, and you often need the first data point for your analysis, you can store the first timestamp in a GTS attribute. It will be ready for the next time you need the first point of your GTS!
On a one million point series, this method fetches 4006 data points on the first iteration and the second iteration is immediate.
All these operations could be done on a list of GTS, with LMAP or a FOREACH.
Discover the Lambda functions and use the power of WarpScript in simple JSON API deployments. |
Alternatively, you can set an attribute after you push the first point of your GTS (for example, with the meta endpoint). But beware that if you delete the first point or write in the past, the value of this attribute might not reflect what you think it should (unless you update it).
Conclusion
If you know your series is small enough, FETCH all data points and call FIRSTTICK, then store the first tick in the series attributes. If you don't know exactly, use @senx/gts/first
macro.
Read more
Thinking in WarpScript – Fetch data within a temporal or a count range
Build a WarpScript extension which embeds a C library
Protecting your Macros and Functions with Capabilities
Electronics engineer, fond of computer science, embedded solution developer.