Source code for fundamentals.stats.rolling_window_sigma_clip
#!/usr/bin/env python
# encoding: utf-8
"""
*given a sorted list of values, median sigma-clip values based on a window of values either side of each value (rolling window) and return the array mask*
Author
: David Young
Date Created
: January 1, 2021
"""
from builtins import object
import sys
import os
os.environ["TERM"] = "vt100"
from fundamentals import tools
[docs]
def rolling_window_sigma_clip(log, array, clippingSigma, windowSize):
"""*given a sorted list of values, median sigma-clip values based on a window of values either side of each value (rolling window) and return the array mask*
**Key Arguments:**
- `log` -- logger
- `array` -- the array to clean up (arrays of length < 5 are not clipped but returned unmasked)
- `clippingSigma` -- the minimum sigma to clip (using median-absolute distribution as sigma proxy)
- `windowSize` -- the size of the window to use when calculating the median distribution (window of 11 will use 5 values each side of the value in question)
**Usage:**
```python
from fundamentals.stats import rolling_window_sigma_clip
arrayMask = rolling_window_sigma_clip(
log=self.log,
array=myArray,
clippingSigma=2.2,
windowSize=11)
## JUST KEEP UNMASKED VALUES
try:
myArray = [e for e, m in zip(
myArray, arrayMask) if m == False]
except:
myArray = []
```
"""
log.debug("starting the ``rolling_window_sigma_clip`` function")
from astropy.stats import sigma_clip, mad_std
midWindow = int((windowSize + 1) / 2)
# ACCOMODATE SMALL LIST SIZES
if len(array) < 5:
return len(array) * [False]
elif len(array) < windowSize:
masked = sigma_clip(
array,
sigma_lower=clippingSigma,
sigma_upper=clippingSigma,
maxiters=7,
cenfunc="median",
stdfunc=mad_std,
)
return list(masked.mask)
startOfWindow = 0
endOfWindow = windowSize
maskedArray = []
dataIndex = 0
while len(array) >= endOfWindow:
arrayWindow = array[startOfWindow:endOfWindow]
startOfWindow += 1
endOfWindow += 1
masked = sigma_clip(
arrayWindow,
sigma_lower=clippingSigma,
sigma_upper=clippingSigma,
maxiters=7,
cenfunc="median",
stdfunc=mad_std,
)
if dataIndex == 0:
# 0,1,2...midWindow-1
maskedArray += list(masked.mask)[0:midWindow]
dataIndex += midWindow
elif len(array) == endOfWindow - 1:
# -midWindow...-2,-1
maskedArray += list(masked.mask)[-midWindow:]
dataIndex += midWindow
else:
maskedArray += [list(masked.mask)[midWindow - 1]]
dataIndex += 1
log.debug("completed the ``rolling_window_sigma_clip`` function")
return maskedArray