Jump to content

Shamus C

Super Seeqer
  • Posts

  • Joined

  • Last visited

  • Days Won


Shamus C last won the day on September 22

Shamus C had the most liked content!

Personal Information

  • Company
  • Title
    Principal Analytics Engineer
  • Level of Seeq User
    Seeq Super-User

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

Shamus C's Achievements


Apprentice (3/14)

  • Dedicated Rare
  • Reacting Well Rare
  • Conversation Starter Rare
  • First Post Rare
  • Collaborator Rare

Recent Badges



  1. Currently there is not a way inside of Seeq formula to access a signal or condition's metadata for use in a formula. This comes up when users would like to do things like plot a special property that has been added to a signal from an external system such as OSIsoft Pi AF. There is a simple way to add these properties as scalars inside of Seeq DataLab however using the example notebook below. The key pieces are to make sure to include the all_properties=True flag in the spy.search() command and then to define your new signal names in your metadata dataframe Push Signal Metadata as Scalars.ipynb
  2. Can you see the forecast signal ever crossing your empty threshold. You can visually mark your lower limit on the trend by creating a Scalar value in formula
  3. There is also a way to complete this inside of Seeq Formula. As a warning as rates change over the years these formulas could get longer and longer as you splice in new rate schedules against old rate schedules. Below is a formula for a rate schedule with a Winter Rate & Summer Off/Mid/High Rates. You could expand this to weekends and weekdays as well if needed $Summer = periods(6months, 1year, "2020-05-01T00:00:00","US/Pacific") $Winter = periods(6months, 1 year, "2020-11-01T00:00:00","US/Pacific").setProperty('Rate',0.10) $SummerHighPeak = (shifts(16, 5, "US/Pacific") and $Summer).setProperty('Rate',0.18) $SummerMidPeak = (shifts(14, 2,"US/Pacific") and $Summer).setProperty('Rate',0.16) $SummerOffPeak = ($Summer -($SummerHighPeak or $SummerMidPeak)).setProperty('Rate',0.12) $AllPeriods = CombineWith($Winter, $SummerHighPeak, $SummerMidPeak, $SummerOffPeak) $AllPeriods.toSignal('Rate').setUnits('$')
  4. You can also re-create the same effect at the past() operator in offline situations or in older versions by modifying the formula to remove the period of time that there is data in the original source signal $LowerLimit = 0% $AboveLowerLimit = $forecast > $LowerLimit $AboveLowerLimit - isvalid($original)
  5. Another common question through the support portal this morning that is of general interest To help with this example I am going to create a quick polynomial prediction using Data from Area C in the example set. Our target is going to be to try to predict compressor power as a function of all of the input weather signals If you wanted to re-create this prediction model in excel or another tool you need the coefficients from block #1 in the screenshot above and the y-intercept from block #2 in the screenshot. Inside of the workbench tool you will see rounded values for each of the coefficients and intercepts but the full values are available when you copy them to the clipboard by clicking the little button highlighted in red. To fill out the example in excel the formula will look like the following $temperature^2 * -0.000230 + $temperature * 0.0607 + $WB^2 * 0.000646 + $WB * -0.101 + 6.5946 A final point to mention here is that for multi-variable regressions with many input signals it is important to take a minute and evaluate the p-values listed in the coefficient table. If the p-values for any coefficient are above 0.05 it is best practices to rethink if that signal needs to be included in the model at all or if you may need to perform data data cleansing or re-alignment to create a better performing model. Good blog post on P-values - https://medium.com/analytics-vidhya/understanding-the-p-value-in-regression-1fc2cd2568af Great reference post on how to optimize regression models using time shifting -
  6. Sam, You can pretty easily forecast the value from now till you empty setpoint and then display the result as a Capsule on the screen as well as a Time/Duration in a Scorecard/Table and have all the results update in real-time For my example I am going to use some example data but this should look very similar for your use case Step 1 - Create a Forecasted Value - This function may not work on exactly as you expect on historical data depending on your datasource $signal.forecastLinear(1.5h,5d) //Train in the last 1.5 hours of data //Project 5 days into the future Step 2 - Create a condition that captures the time between now() and when you fall below your "empty" threshold. This step will only work for online data as it is using the past() operator $LowerLimit = 0% $AboveLowerLimit = $fv > $LowerLimit $AboveLowerLimit - past() Step 3 - Create a Scorecard to Quantify the time between now and full and display it in a table. This uses the "Condition" mode in the Tables view and a Condition scorecard type
  7. In Seeq version 52 and beyond we have introduced scheduled notebooks which opens up a new world of signals calculated using purely python and pushed into the seeq system on a schedule. These scheduled executions can be really powerful but also can place huge loads on the entire Seeq system if your notebooks are not designed with scheduled execution in mind. Attached is a notebook with some of our current thoughts on best practices to minimize the load on the system and not request and push the same sets of data over and over again with each notebook execution. General Calculation Plan Query our calculated signal name between now - Lookback length (1day) Find the last timestamp of our calculated signal Query the input signals to our calculation for the time range between that last timestamp and now Run our python script on our input signals to generate a new range of values for our calculated signal Push results back into Seeq for range between last timestamp and now Schedule next execution (15 min) Scenarios/methods you may want to avoid include pulling a month of data for all input signals, calculating values and then pushing results back on a 15 minute schedule. This will result in needlessly reading and writing the same data points over and over again. Example Scheduled Signal Calculation (1).ipynb
  8. Great question today from the support channel that I wanted to share along with a helpful spreadsheet. As much as I spend my days getting people out of Excel, sometimes it comes in really handy for creating signals from lookup tables. Attached to this Post is an excel sheet I put together where you can input a rate schedule and pricing tiers for Summer/Winter and On/Mid/Off peak pricing. The last sheet in the excel file is setup to be exported to CSV which can then be quickly imported back into Seeq for use in analysis and integration anywhere it would be helpful. Step 1 - In the excel sheet fill out the Lookup Tables sheet to match your utility rate schedule Step 2 - Export the "Output Table - Save as CSV" to a new CSV file Step 3 - Import to Seeq using the Import CSV tool making sure to fill out your timezone, Step interpolation, unit of measure ($) and under optional settings you may want to add the "Lenient daylight Savings" option to ignore those pesky clock changes. Electric Tier Pricing Worksheet.xlsx
  9. Starting in Seeq Version R52 Data Lab notebooks can be run on a schedule which opens up a world of new interesting possibilities. One of those possibilities is to create a simple script that pulls data from a Web API source and pushes it into the Seeq data cache on a schedule. This can be a great way to prototype out a data connection prior to building a full featured connector using the Connector SDK This example notebook pulls from the USGS which has information on river levels, temperatures, turbidity etc and pushes those signals for multiple sites into the Seeq system. The next logical step would be to make a notebook to organize these signals into an asset tree. Curious to see what this inspires other to do and to connect to. If there are additional public resources of interest put them in the thread for ideas. USGS Upload Example.ipynb
  10. Sometimes you want to clean up and remove an asset tree built using Seeq Data Lab from a Workbook so that you can restart or do something else. Below is the quickest way to remove an unwanted Tree Step 1 - In Workbench click in the info icon for the Asset Tree Step 2 - Copy the ID value to your clipboard. This may be located in a different place or under the advanced subsection in prior versions of Seeq Step 3 - Open the API Reference page from the Menu in the upper right corner Step 4 - Navigate down to the Trees/assets/{id} delete endpoint expand it, paste in the ID you copied in Step 2 and then click the Try it Out button You should receive a 200 confirmation response code and your Tree will no longer show up in your workbench analysis.
  11. Great question through the support portal today I am going to try to generalize for everyone. This requires joining two conditions and I am going to show how to do it in a using the simple tools and then how to combine it all together into one formula. Step 1 - Create a Value Search which matches you product code ABC. Once trick here is to search for "ABC*" that will return string results for anything starting with ABC and ending with any other series of characters. The * is part of Regex notation which you can use when searching strings inside the Value Search tool - https://seeq.atlassian.net/wiki/spaces/KB/pages/146637020/Regex+Searches Step 2 - Create a Condition for each batch using formula and the toCondition() function. This will create a capsule every time the value of our string signal changes. $mp.toCondition() Step 3 - Combine conditions together using the Composite Condition Tool and the intersection join Alternate Single Formula - Combine the steps in a multi-line formula $AllBatches = $mp.toCondition() $ProductRuns = $mp.contains("ABC") $AllBatches and $ProductRuns
  12. Yasmin, This should be pretty straight forward using the integral function in formula Step 1 - Create a condition that marks the start and end time for when you want to calculate the integral. This could be done with a value search or manual condition Step 2 - Use the integral function to calculate the new signal $signal.integral($condition.removeLongerThan(5d)).convertUnits('kWh')
  13. Question through the support channel Great use case which can be captured in a two quick steps Step 1 - Create a signal in the Formula tool with your custom aggregation. In this case we are going to use the periods() function to create capsules every 15 minutes and the delta() function to plot the change indensity from the start of the 15minute capsule to the end of the 15 minute capsule. Another alternative is to use the range() function which would return the absolute min - max of any values within the 15 minute interval. $myInterval = 15min $delta = $signal.aggregate(delta(),periods($myInterval),durationkey()) abs($delta) Step 2 - Create a Value Search to identify the periods of interest where the density change signal exceeds your desired threshold
  14. A follow-up on this post. As of Seeq version R48 there is no longer a limit on the number of capsules which can be displayed in chain view. So if you were interested in signal scrunching as a work around that is no longer needed. https://seeq.atlassian.net/wiki/spaces/KB/pages/736035141/What+s+New+in+R22.0.48 With a couple of our new functions this calculation is a lot simpler This requires a Manual Condition with a single capsule so that we know the starting point where we will calculate delays from. $delay = timesince($ManualCondition,1min,$Running) $signal.within($running).move(-$delay,30days)
  15. Final variation on this theme How do I calculates a running time since the last sample in my signal $cond = $VariableSampleRateSignal.toCondition().setMaximumDuration(30d) $cond.timeSince(1min)
  • Create New...