Module gdess.operations.anomalies
Expand source code
import logging
import numpy as np
import pandas as pd
import xarray as xr
_logger = logging.getLogger(__name__)
def daily_anomalies(dataset: xr.Dataset,
varname: str = 'co2'
) -> pd.DataFrame:
"""
Parameters
----------
dataset : xarray Dataset
varname : str, default 'co2'
Returns
-------
pd.DataFrame
"""
varlist = ['time', varname]
tempds = dataset[varlist]
# Get daily values, and add additional temporal label coordinates
tempds = tempds.resample(time="D").mean()
tempds = tempds.assign_coords(doy=tempds.time.dt.strftime("%j").str.lstrip("0").astype(int))
tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y"))
ds_daily = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m"))
# Convert to pandas dataframe
df_daily = ds_daily.to_dataframe()
# --- Calculate Anomalies ---
#
"""
Daily anomaly of this data from the local monthly mean of the time-series.
That is, I want to take away the average of (eg) January 1979 from all the days in January 1979.
And I'd like to do this for every month of every year in my array."""
df_daily['daily_anomaly_from_month'] = \
(ds_daily.groupby("year_month") - ds_daily.groupby("year_month").mean("time"))[varname]
# Get each datum's departure from it's year's mean
df_daily['daily_anomaly_from_year'] = (ds_daily.groupby("year") - ds_daily.groupby("year").mean("time"))[varname]
# Get each datum's departure from the entire dataset's mean
df_daily['daily_anomaly_from_allmean'] = (ds_daily - ds_daily.mean("time"))[varname]
# Get each datum's departure from it's year's mean
df_daily['daily_anomaly_from_year'] = (ds_daily.groupby("year") - ds_daily.groupby("year").mean("time"))[varname]
df_daily = df_daily.reset_index()
return df_daily
def monthly_anomalies(dataset: xr.Dataset,
varname: str = 'co2'
) -> pd.DataFrame:
"""
Parameters
----------
dataset : xarray Dataset
varname : str, default 'co2'
Returns
-------
pd.DataFrame
"""
varlist = ['time', varname]
tempds = dataset[varlist]
# Get monthly values, and add additional temporal label coordinates
tempds = tempds.resample(time="M").mean()
tempds = tempds.assign_coords(moy=tempds.time.dt.strftime("%m"))
tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y"))
ds_monthly = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m"))
# Convert to pandas dataframe
df_monthly = ds_monthly.to_dataframe()
# --- Calculate Anomalies ---
#
# Get each datum's departure from it's year's mean"""
df_monthly['monthly_anomaly_from_year'] = \
(ds_monthly.groupby("year") - ds_monthly.groupby("year").mean("time"))[varname]
# Get each datum's departure from the entire dataset's mean"""
df_monthly['monthly_anomaly_from_allmean'] = (ds_monthly - ds_monthly.mean("time"))[varname]
df_monthly = df_monthly.reset_index()
return df_monthly
def seasonal_anomalies(dataset: xr.Dataset,
varname: str = 'co2'
) -> pd.DataFrame:
"""
Parameters
----------
dataset : xarray Dataset
varname : str, default 'co2'
Returns
-------
pd.DataFrame
"""
varlist = ['time', varname]
tempds = dataset[varlist]
# Get seasonal (quarterly, starting on December) values, and add additional temporal label coordinates
tempds = tempds.resample(time="QS-DEC").mean()
tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y"))
# add seasonal labels
tempds = tempds.assign_coords(moy=tempds.time.dt.strftime("%m").astype(int))
month_to_season_lu = np.array([
None,
'DJF', 'DJF',
'MAM', 'MAM', 'MAM',
'JJA', 'JJA', 'JJA',
'SON', 'SON', 'SON',
'DJF'
])
tempds = tempds.assign_coords(season=('time', month_to_season_lu[tempds.moy]))
ds_seasonal = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m"))
# Convert to pandas dataframe
df_seasonal = ds_seasonal.to_dataframe()
# --- Calculate Anomalies ---
#
# Get each datum's departure from the entire dataset's mean
df_seasonal['seasonal_anomaly_from_allmean'] = (ds_seasonal - ds_seasonal.mean("time"))[varname]
df_seasonal = df_seasonal.reset_index()
return df_seasonal
Functions
def daily_anomalies(dataset: xarray.core.dataset.Dataset, varname: str = 'co2') -> pandas.core.frame.DataFrame-
Parameters
dataset:xarray Datasetvarname:str, default'co2'
Returns
pd.DataFrame
Expand source code
def daily_anomalies(dataset: xr.Dataset, varname: str = 'co2' ) -> pd.DataFrame: """ Parameters ---------- dataset : xarray Dataset varname : str, default 'co2' Returns ------- pd.DataFrame """ varlist = ['time', varname] tempds = dataset[varlist] # Get daily values, and add additional temporal label coordinates tempds = tempds.resample(time="D").mean() tempds = tempds.assign_coords(doy=tempds.time.dt.strftime("%j").str.lstrip("0").astype(int)) tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y")) ds_daily = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m")) # Convert to pandas dataframe df_daily = ds_daily.to_dataframe() # --- Calculate Anomalies --- # """ Daily anomaly of this data from the local monthly mean of the time-series. That is, I want to take away the average of (eg) January 1979 from all the days in January 1979. And I'd like to do this for every month of every year in my array.""" df_daily['daily_anomaly_from_month'] = \ (ds_daily.groupby("year_month") - ds_daily.groupby("year_month").mean("time"))[varname] # Get each datum's departure from it's year's mean df_daily['daily_anomaly_from_year'] = (ds_daily.groupby("year") - ds_daily.groupby("year").mean("time"))[varname] # Get each datum's departure from the entire dataset's mean df_daily['daily_anomaly_from_allmean'] = (ds_daily - ds_daily.mean("time"))[varname] # Get each datum's departure from it's year's mean df_daily['daily_anomaly_from_year'] = (ds_daily.groupby("year") - ds_daily.groupby("year").mean("time"))[varname] df_daily = df_daily.reset_index() return df_daily def monthly_anomalies(dataset: xarray.core.dataset.Dataset, varname: str = 'co2') -> pandas.core.frame.DataFrame-
Parameters
dataset:xarray Datasetvarname:str, default'co2'
Returns
pd.DataFrame
Expand source code
def monthly_anomalies(dataset: xr.Dataset, varname: str = 'co2' ) -> pd.DataFrame: """ Parameters ---------- dataset : xarray Dataset varname : str, default 'co2' Returns ------- pd.DataFrame """ varlist = ['time', varname] tempds = dataset[varlist] # Get monthly values, and add additional temporal label coordinates tempds = tempds.resample(time="M").mean() tempds = tempds.assign_coords(moy=tempds.time.dt.strftime("%m")) tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y")) ds_monthly = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m")) # Convert to pandas dataframe df_monthly = ds_monthly.to_dataframe() # --- Calculate Anomalies --- # # Get each datum's departure from it's year's mean""" df_monthly['monthly_anomaly_from_year'] = \ (ds_monthly.groupby("year") - ds_monthly.groupby("year").mean("time"))[varname] # Get each datum's departure from the entire dataset's mean""" df_monthly['monthly_anomaly_from_allmean'] = (ds_monthly - ds_monthly.mean("time"))[varname] df_monthly = df_monthly.reset_index() return df_monthly def seasonal_anomalies(dataset: xarray.core.dataset.Dataset, varname: str = 'co2') -> pandas.core.frame.DataFrame-
Parameters
dataset:xarray Datasetvarname:str, default'co2'
Returns
pd.DataFrame
Expand source code
def seasonal_anomalies(dataset: xr.Dataset, varname: str = 'co2' ) -> pd.DataFrame: """ Parameters ---------- dataset : xarray Dataset varname : str, default 'co2' Returns ------- pd.DataFrame """ varlist = ['time', varname] tempds = dataset[varlist] # Get seasonal (quarterly, starting on December) values, and add additional temporal label coordinates tempds = tempds.resample(time="QS-DEC").mean() tempds = tempds.assign_coords(year=tempds.time.dt.strftime("%Y")) # add seasonal labels tempds = tempds.assign_coords(moy=tempds.time.dt.strftime("%m").astype(int)) month_to_season_lu = np.array([ None, 'DJF', 'DJF', 'MAM', 'MAM', 'MAM', 'JJA', 'JJA', 'JJA', 'SON', 'SON', 'SON', 'DJF' ]) tempds = tempds.assign_coords(season=('time', month_to_season_lu[tempds.moy])) ds_seasonal = tempds.assign_coords(year_month=tempds.time.dt.strftime("%Y-%m")) # Convert to pandas dataframe df_seasonal = ds_seasonal.to_dataframe() # --- Calculate Anomalies --- # # Get each datum's departure from the entire dataset's mean df_seasonal['seasonal_anomaly_from_allmean'] = (ds_seasonal - ds_seasonal.mean("time"))[varname] df_seasonal = df_seasonal.reset_index() return df_seasonal