|
|
""" Add Sentinel-1 and Sentinel-2 indices to a DataFrame. """ |
|
|
import numpy as np |
|
|
from variables import s2_indices |
|
|
|
|
|
def add_s2_indices(df, L=0.5, y=0.126, a=0.3, b=0.5): |
|
|
""" Add Sentinel-2 indices to a DataFrame. |
|
|
|
|
|
Args: |
|
|
df (pandas.DataFrame): DataFrame to add indices to. |
|
|
L (float): Soil adjustment factor for SAVI. Default is 0.5. |
|
|
y (float): Atmosphere resistance factor for ARVI. Default is 0.126. |
|
|
a (float): Slope parameter for PVI. Default is 0.3. |
|
|
b (float): Intercept parameter for PVI. Default is 0.5. |
|
|
|
|
|
Returns: |
|
|
pandas.DataFrame: DataFrame with added indices. |
|
|
""" |
|
|
|
|
|
X = df.copy() |
|
|
|
|
|
if X.B4.values[0] is not None: |
|
|
|
|
|
|
|
|
X["ARI"] = (1 / X.B3) - (1 / X.B5) |
|
|
X["ARVI"] = (X.B8 - X.B4 - y * (X.B4 - X.B2)) / (X.B8 + X.B4 - y * (X.B4 - X.B2)) |
|
|
X["AVI"] = np.sign((X.B8 * (1 - X.B4) * (X.B8 - X.B4))) * np.abs((X.B8 * (1 - X.B4) * (X.B8 - X.B4))) ** (1/3) |
|
|
X["BCC"] = X.B2 / (X.B4 + X.B3 + X.B2) |
|
|
X["CCCI"] = ((X.B8 - X.B5) / (X.B8 + X.B5)) / ((X.B8 - X.B4) / (X.B8 + X.B4)) |
|
|
X["CVI"] = (X.B8 * X.B4) * (X.B3 ** 2) |
|
|
X["EVI"] = 2.5 * (X.B8 - X.B4) / (X.B8 + 6 * X.B4 - 7.5 * X.B2 + 1) |
|
|
X["ExG"] = 2 * X.B3 - X.B4 - X.B2 |
|
|
X["GNDVI"] = (X.B8 - X.B3) / (X.B8 + X.B3) |
|
|
X["IKAW"] = (X.B8 - X.B2) / (X.B8 + X.B2) |
|
|
X["MCARI"] = ((X.B5 - X.B4) - 0.2 * (X.B5 - X.B3)) * (X.B5 / X.B4) |
|
|
X["MSAVI"] = 0.5 * (2 * X.B8 + 1 - (((2 * X.B8 + 1) ** 2) - 8 * (X.B8 - X.B4)) ** 0.5) |
|
|
X["MTVI2"] = (1.5 * (1.2 * (X.B8 - X.B3) - 2.5 * (X.B4 - X.B3))) / ((((2 * X.B8 + 1)**2) - (6 * X.B8 - 5 * (X.B4**0.5))-0.5) ** 0.5) |
|
|
X["NDDI"] = (((X.B8 - X.B4) / (X.B8+X.B4)) - ((X.B3 - X.B8) / (X.B3 + X.B8))) / (((X.B8 - X.B4) / (X.B8 + X.B4)) + ((X.B3 - X.B8) / (X.B3 + X.B8))) |
|
|
X["NDMI"] = (X.B8 - X.B11) / (X.B8 + X.B11) |
|
|
X["NDVI"] = (X.B8 - X.B4) / (X.B8 + X.B4) if X.B8 is not None else 0 |
|
|
X["NDYI"] = (X.B3 - X.B2) / (X.B3 + X.B2) |
|
|
X["PSRI"] = (X.B4 - X.B2) / X.B6 |
|
|
X["PVI"] = (X.B8 - a * X.B4 - b) / ((1 + a * 2) ** (1/2)) |
|
|
X["RCC"] = X.B4 / (X.B4 + X.B3 + X.B2) |
|
|
X["RENDVI"] = (X.B6 - X.B5) / (X.B6 + X.B5) |
|
|
X["S2REP"] = 705 + 35 * ((((X.B7 + X.B4) / 2) - X.B5) / (X.B6 - X.B5)) |
|
|
X["SAVI"] = (1 + L) * (X.B8 - X.B4) / (X.B8 + X.B4 + L) |
|
|
X["SI"] = ((1 - X.B2) * (1 - X.B3) * (1 - X.B4)) ** (1/3) |
|
|
X["SIPI"] = (X.B8 - X.B1) / (X.B8 - X.B4) |
|
|
X["TCARI"] = 3 * ((X.B5 - X.B4) - 0.2 * (X.B5 - X.B3) * (X.B5 / X.B4)) |
|
|
X["TNDVI"] = ((X.B8 - X.B4) / (X.B8 + X.B4) + 0.5) ** (1/2) |
|
|
X["TTVI"] = 0.5 * ((865 - 740) * (X.B7 - X.B6) - (X.B8A - X.B6) * (783-740)) |
|
|
X["TVI"] = (((X.B8 - X.B4) / (X.B8 + X.B4)) + 0.5) ** (1/2) |
|
|
X["VARI"] = (X.B3 - X.B4) / (X.B3 + X.B4 - X.B2) |
|
|
X["VARI700"] = (X.B5 - 1.7 * X.B4 + 0.7 * X.B2) / (X.B5 + 1.3 * X.B4 - 1.3*X.B2) |
|
|
|
|
|
|
|
|
X["AWEInsh"] = 4 * (X.B3 - X.B11) - 0.25 * X.B8 + 2.75 * X.B12 |
|
|
X["AWEIsh"] = X.B2 + 2.5 * X.B3 - 1.5 * (X.B8 + X.B11) - 0.25 * X.B12 |
|
|
X["MNDWI"] = (X.B3 - X.B11) / (X.B3 + X.B11) |
|
|
X["MuWIR"] = -4 * ((X.B2 - X.B3) / (X.B2 + X.B3)) + 2 * ((X.B3 - X.B8) / (X.B3 + X.B8)) + 2 * ((X.B3 - X.B12) / (X.B3 + X.B12)) - ((X.B3 - X.B11) / (X.B3 + X.B11)) |
|
|
X["NDWI"] = (X.B3 - X.B8) / (X.B3 + X.B8) |
|
|
X["S2WI"] = (X.B5 - X.B12) / (X.B5 + X.B12) |
|
|
X["WI2015"] = 1.7204 + 171 * X.B3 + 3 * X.B4 - 70*X.B8 - 45*X.B11 - 71*X.B12 |
|
|
|
|
|
|
|
|
X["BAI"] = 1 / ((0.1 - X.B4) ** 2 + (0.06 - X.B8) ** 2) |
|
|
X["BAIM"] = 1 / ((0.05 - X.B8) ** 2) + ((0.2 - X.B12) ** 2) |
|
|
X["MIRBI"] = 10 * X.B12 -9.8 * X.B11 + 2 |
|
|
X["NBR"] = (X.B8 - X.B12) / (X.B8 + X.B12) |
|
|
X["NBRI"] = (X.B8 - X.B12) / (X.B8 + X.B12) |
|
|
X["NBRplus"] = (X.B12 - X.B8A - X.B3 - X.B2) / (X.B12 + X.B8A + X.B3 + X.B2) |
|
|
X["NBRSWIR"] = (X.B12 - X.B11 - 0.02) / (X.B12 + X.B11 + 0.1) |
|
|
X["NDSWIR"] = (X.B8 - X.B11)/(X.B8 + X.B11) |
|
|
|
|
|
|
|
|
X["NBSIMS"] = 0.36 * (X.B3 + X.B4 + X.B8) - (((X.B2 + X.B12) / X.B3) + X.B11) |
|
|
X["NDSI"] = (X.B3 - X.B11) / (X.B3 + X.B11) |
|
|
|
|
|
|
|
|
X["NBAI"] = (X.B12 - X.B11 / X.B3) / (X.B12 + X.B11 / X.B3) |
|
|
X["NDBI"] = (X.B11 - X.B8) / (X.B11 + X.B8) |
|
|
X["UI"] = (X.B12 - X.B8) / (X.B12 + X.B8) |
|
|
|
|
|
|
|
|
X["BI"] = ((X.B11 + X.B4) - (X.B8 + X.B2)) / ((X.B11 + X.B4) + (X.B8 + X.B2)) |
|
|
X["BI2"] = np.sqrt((X.B4 ** 2 + X.B3 ** 2 + X.B8 ** 2) / 3) |
|
|
X["BSI"] = ((X.B12 + X.B4) - (X.B8 + X.B2)) / ((X.B12 + X.B4) + (X.B8 + X.B2)) |
|
|
X["SATVI"] = ((X.B11 - X.B4) / (X.B11 + X.B4 + L)) * (1 + L) - (X.B12 / 2) |
|
|
else: |
|
|
for index in s2_indices: |
|
|
X[index] = 0.0 |
|
|
|
|
|
return X |
|
|
|
|
|
def add_s1_indices(df): |
|
|
""" Add Sentinel-1 indices to a DataFrame. |
|
|
|
|
|
Args: |
|
|
df (pandas.DataFrame): DataFrame to add indices to. |
|
|
|
|
|
Returns: |
|
|
pandas.DataFrame: DataFrame with added indices. |
|
|
""" |
|
|
|
|
|
X = df.copy() |
|
|
|
|
|
|
|
|
X["DPDD"] = (X.VV + X.VH) / 2 ** (1/2) |
|
|
X["DpRVIVV"] = (4 * X.VH) / (X.VV + X.VH) |
|
|
X["NDPolI"] = (X.VV - X.VH) / (X.VV + X.VH) |
|
|
X["VDDPI"] = (X.VV + X.VH) / X.VV |
|
|
X["VHVVD"] = X.VH - X.VV |
|
|
X["VHVVP"] = X.VH * X.VV |
|
|
X["VHVVR"] = X.VH / X.VV |
|
|
X["VVVHD"] = X.VV - X.VH |
|
|
X["VVVHR"] = X.VV / X.VH |
|
|
X["VVVHS"] = X.VV + X.VH |
|
|
|
|
|
return X |
|
|
|