Jump to content

Thorsten Vogt

Super Seeqer
  • Posts

  • Joined

  • Last visited

  • Days Won


Everything posted by Thorsten Vogt

  1. One more comment on the post above: The within() function is creating additional samples at the beginning and the end of the capsule. These additional sample have an effect on the calculations performed in the histogram. To avoid this you can use the remove() and inverse() function to remove parts of the data when the condition is not met: In contrast to within() the remove() function will interpolate values if the distance between samples is less than the Maximum Interpolation setting of the signal. To avoid this when using remove you can combine the signal that the remove function creates with a signal that adds an "invalid" value at the beginning of each capsule so that the interpolation cannot be calculated: $invalidsAtCapsuleStart = $condition.removeLongerThan(1wk).tosamples($c -> sample($c.startkey(), SCALAR.INVALID), 1s) $signal.remove($condition.inverse()).combineWith($invalidsAtCapsuleStart) You can see the different behaviours of the three described methods in the screenshot:
  2. Hi SBC, applying the the within() function to your signal will result in a new signal that only keeps those parts of the signal where the condition is met. The filtered signal can then be used for the histogram. Regards, Thorsten
  3. Hello John, beginning in R57 you can adjust the number of characters to be displayed. https://seeq.atlassian.net/wiki/spaces/KB/pages/2344943627/What+s+New+in+R57#Customizable-formatting-for-string-labels-on-the-y-axis Regards, Thorsten
  4. Hi Victor, you can use within() for that: Regards, Thorsten
  5. Hi, you can use spy.login with the access_key parameter: spy.login(access_key="CagR-n4oQGqjlAb7e6fr3B", password="Ec9DaXnSXgaG969cjkv4d4iGdGiAah" ,url="https://myseeqserver") Regards, Thorsten
  6. Hello, you can change this by clicking on "Customize" in the Details pane and then switch the value of the dropdown in the "Samples" column: Regards, Thorsten
  7. Hi, the error means that you are referencing a variable that is not defined in your variable list. You should change your variable "$signal1" in the formula to a variable you have in your variables list: Also be aware that you cannot use a signal and a condition together on combineWith(). You can combine either signals only or conditions only. Regards, Thorsten
  8. Hello Kspring, I think you can do it that way: First create a condition based on the material signal by using toCondition(). The function creates a capsule everytime the value of the signal changes and stores the value in a defined property, in this case "Material": $signal.toCondition('Material') Next filter only for batches where the current material is produced using formula: //Create capsule of 1 day ending now $capsule = capsule(now()-1d, now()) //Get current material by selecting last value inside capsule created above $currentMaterial = $gradeCode.toScalars($capsule).last() //Only keep batches for current Material $batches.removeLongerThan(1mo).keep($c -> $c.property('Material') == $currentMaterial) Then create the condition the time range you want to aggregate over. Here I am using a monthly condition: Last step is calculating the value. The within() function is used to only keep that portions of the signal during the specified condition. $temperature.within($filteredBatches).aggregate(average(), $month, middleKey()).toDiscrete() Depending on your data you might need to do some adjustments on the timeranges I used in the formulas. Regards, Thorsten
  9. Hi Bellas, for creating the line at a certain y-value you can click on the "f(x)" button: Then click on "New Formula": Enter the formula for the trend line. In this case I am going to display the line at y=60: After executing click the "f(x)" button again and select the just created signal from the dropdown: The scatter plot now shows the line: Coloring an area above that line is not possible as far as I know. But you can color all points above that line. First you need to create a condition that identifies all points of the y-axis signal above the threshold: Next, click on the "Color" button: Select the condition from the conditions list: After closing the dialog all points identified by this condition are colored in the specific color of the condition: ? Regards, Thorsten
  10. Hi Robin, you can create a batch condition by using replace() to extract the batchnumber and toCondition() for creating the capsules for each batch: $subbatches.replace('/(\\d{1,7})NR\\d{3}/', '$1').toCondition() In the next step you can do the aggregation: $v1.aggregate(sum(), $batch.removeLongerThan(1wk), middleKey()) + $v2.aggregate(sum(), $batch.removeLongerThan(1wk), middleKey()) Regards, Thorsten
  11. Hello, you can use the merge() function for this. If a tolerance value is specified all capules beginning withing that tolerance after the end of a capsule are combined. Regards, Thorsten
  12. Hello, you can find deviations by using Value Search. The former Deviation Search Tool has been unified with Value Search in Version R50: https://support.seeq.com/space/KB/1075216533/What's+New+in+R50#Unify-Deviation-Search-and-Value-Search Regards, Thorsten
  13. Hi Javad, I got a solution based on this starting point: The following formula compares the durations of the first capsules for conditions B,C and D bounded by each capsule of condition A and sets a property on capsules of condition A indicating if these should be shown. The keep function on the end only displays capsules where the property is set to true $a.transform($a_capsule -> { $b_capsule = $b.toGroup($a_capsule).first() $c_capsule = $c.toGroup($a_capsule).first() $d_capsule = $d.toGroup($a_capsule).first() $show_a = ($b_capsule.duration() > $d_capsule.duration() and $d_capsule.duration() > $c_capsule.duration()) $a_capsule.setProperty('show', $show_a) }, 40h).keep('show', isequalTo(true) ) Changing capsule duration of B gets no capsule for result, which is expected: If you want to show another capsule for the last case, you can adjust the formula to generate another condition with the property show set to the inverse and select one of the conditions based on that value. Therefore you have to do the transform twice: $tempCondition1 = $a.transform($a_capsule -> { $b_capsule = $b.toGroup($a_capsule).first() $c_capsule = $c.toGroup($a_capsule).first() $d_capsule = $d.toGroup($a_capsule).first() $show_a = ($b_capsule.duration() > $d_capsule.duration() and $d_capsule.duration() > $c_capsule.duration()) $a_capsule.setProperty('show', $show_a) }, 40h) $tempCondition2 = $tempCondition1.transform($a_capsule -> { $d_capsule = $d.toGroup($a_capsule).first() $d_capsule.setProperty('show', not $a_capsule.property('show')) }, 40h) $tempCondition1.keep('show', isequalTo(true)) or $tempCondition2.keep('show', isequalTo(true)) As a result capsules for condition D are shown: Changing duration of capsule B to its original value show capsules of A as the result: Hope this helps. Regards, Thorsten
  14. Hi Matthias, you can try this: First, calculate the duration of each capsule using "Signal from Condition" tool: Then you can use timesince() to calculate the percentage value over the duration and also splice() to insert it into the base signal of 0% everytime the condition is met: 0%.splice(timesince($condition.removeLongerThan(40h), 1min)/$duration, $condition) Did I understand your question correctly? Regards, Thorsten
  15. Hi Yassine, maybe this post is helpful: Regards, Thorsten
  16. Hi Rohan, you can use the replace() function for this: $signal.replace('/(.{22}).*/', '$1') The snippet takes the first 22 characters and replaces the original value of the signal with the characters captured. Regards, Thorsten
  17. Hi Sivaji, actually you can search by ID using either the API/SDK or writing some code in Data Lab. In terms of API/SDK you should try the /items/{id} endpoint: In case an item exists you will get HTTP 200 as status code and details about the item in the response body. If the item does not exist you receive an HTTP 404 status code. In Data Lab you can use spy.search for this. In case of non-existing item spy.search throws an error, therefore I am iterating over the IDs: item_ids = ["FCC9F932-B328-4A7E-9300-A17331519C93", "BF769E50-B93A-4C1A-81FD-326F488CD1E1", "64832183-D97F-4E5C-81A1-C466C494DC3A", "64832183-D97F-4E5C-81A1-C466C494DC6A", "FCC9F932-B328-4A7E-9300-A17331519C91"] item_infos = [] for item_id in item_ids: try: data = spy.search({"ID": item_id}) item_infos.append("Item with ID " + item_id + " exists") except: item_infos.append("Item with ID " + item_id + " does not exist") print (item_infos) Output looks like this: ['Item with ID FCC9F932-B328-4A7E-9300-A17331519C93 exists', 'Item with ID BF769E50-B93A-4C1A-81FD-326F488CD1E1 exists', 'Item with ID 64832183-D97F-4E5C-81A1-C466C494DC3A does not exist', 'Item with ID 64832183-D97F-4E5C-81A1-C466C494DC6A exists', 'Item with ID FCC9F932-B328-4A7E-9300-A17331519C91 does not exist'] Be aware that both methods return all types of items. In case you want to search only for signals or conditions you have to make some adjustments like evaluating the returned data. Hope this helps. Regards, Thorsten
  18. Hi Kenny, you can do this by first calculating the total duration of each capsule using Signal from Condition Tool: Here "Discrete" is used as the interpolation method as interpolated values of the calculated duration between the capsules for further calculations are not needed. Next you can calculate the average duration again using Signal from Condtion: Depending on where you put the value in step 1 the calculated average can change. In the foregoing example I put the value to the start of the capsule therefore only capsules starting in the bounding condition are used for calculation. If necessary, further adjustments must be made with regard to your usecase. Regards, Thorsten
  19. Hi Dylan, you can use the aggregate function for this: $signal.aggregate(average(), ($signal > 90).removeLongerThan(1wk), durationKey()) In this example the average of the signal is calculated whenever its value is above 90 and the result is drawn as a line over the duration of each capsule. You can find more information on the function and its parameters inside formula documentation. Hope this helps. Regards, Thorsten
  20. Hi Yassine, it might be that there are invalid values in this timeframe. You can try to change your formula to $as32.validValues(). This will remove invalid values from the signal and interpolation should work again. If the gap is greater than the max interpolation setting you can use $as32.validValues().setMaxInterpolation(4weeks) which first removes invalid values and then changes the max interpolation of the signal. Regards, Thorsten
  21. Hello Bayu, you may try it this way. I set up a sample in which my forecasted value will exceed the threshold two times in the next 3 days: First step is identifying these periods by using the following formula: ($forecast > $limit).afterStart(0ns) This will create capsules with zero duration as I just need the timestamps for the points in time when the value will be exceed the limit. Next step is creating a new signal with the timestamp as the value: //Iterate over all capsules to create a signal //with the value of the timestamp at start of the capsule $limitExceeded.toSamples($c -> { //Get date of capsule start $date = $c.startKey() //Create sample for signal sample($c.startKey(), $date) }, 1s) Last step is creating the scorecard: In case you may want to display the timestamp in another format you may read this post and adjust the formula in step 2. Hope this helps. Regards, Thorsten
  22. Hi Ben, another option is using the function highpassfilter() as in the following example: $signal.highPassFilter(20min, 2min, 60).abs().agileFilter(2min) The resulting signal can then be used in Value Search to determine the deviations. Regards, Thorsten
  23. Hi Rosa, have you tried keeping just the calculated signal in the list of signals used for the export? Using the OData Feed URL for Excel (I do not have Power BI) just exports 30 values. Regards, Thorsten
  24. Hi Pat, you may use within() fo this. The following example keeps only the portions of the signal where the value of the signal is above 65: Regards, Thorsten
  25. Hi Ingrid, you try to use splice on a scalar, which is available since R51. In lesser versions you can apply splice only on signals, so changing $h to a signal first should resolve the issue: $h.tosignal().splice($l, $lfc) Regards, Thorsten
  • Create New...