Repository: pvlib/pvanalytics

Issue:
Quantify power losses due to snow cover
Hi, I've developed a method to quantify utility-scale power losses due to snow cover (presented at the 2023 PVSC and the 2023 EUPVSEC - [PVSC_Proceedings_2023.pdf](https://github.com/pvlib/pvanalytics/files/13282907/PVSC_Full_Proceedings_2023.1.pdf) and
[EUPVSEC_2023.pdf](https://github.com/pvlib/pvanalytics/files/13282910/EPJ_SNOW_2023_SHORT.pdf). Several potential collaborators have asked for a code implementation. The implementation would include anonymized example data provided by a utility partner, and would use the functions provided in clipping.py along with performance modeling functions hosted by pvlib. It would most likely be an example .ipynb, with the potential to create a new module pvanalytics.snow to house functions that solve for effective transmission of the snow cover and the fractional area of opaque snow cover. Would pv-analytics be willing to host this?

Discussion:
@cwhanse: > Would pv-analytics be willing to host this?

I'll say yes. There's great interest in this topic. A snow loss algorithm may be a bit different than other algorithms in pvanalytics. The inputs would be time series (power, voltage, etc.) but the output is likely to be a time series at a coarser scale (e.g. daily). 

My other reaction is that `snow` would go into a new family of modules, perhaps `pvanalytics.losses.snow`, to accompany other types of loss calculators (clipping, soiling, etc.)

Solution patch:
diff --git a/docs/api.rst b/docs/api.rst
index 78d482fa..fd1c9150 100644
--- a/docs/api.rst
+++ b/docs/api.rst
@@ -69,7 +69,7 @@ There is function for calculating the component sum for GHI, DHI,
 and DNI, and correcting for nighttime periods. Using this function, we can
 estimate one irradiance field using the two other irradiance fields.
 This can be useful for comparison, as well as to
-calculate missing data fields. 
+calculate missing data fields.
 
 .. autosummary::
    :toctree: generated/
@@ -269,6 +269,19 @@ Functions for labeling shadows.
 
    features.shading.fixed
 
+Snow
+----
+
+Functions for identifying and quantifying the effects of snow.
+
+.. autosummary::
+   :toctree: generated/
+
+   features.snow.get_irradiance_sapm
+   features.snow.get_irradiance_imp
+   features.snow.categorize
+   features.snow.get_transmission
+
 System
 ======
 
diff --git a/docs/examples/snow-detection/README.rst b/docs/examples/snow-detection/README.rst
new file mode 100644
index 00000000..43f93201
--- /dev/null
+++ b/docs/examples/snow-detection/README.rst
@@ -0,0 +1,4 @@
+Snow
+----
+
+Examples for identifying the effects of snow.
\ No newline at end of file
diff --git a/docs/examples/snow-detection/snow-mode.py b/docs/examples/snow-detection/snow-mode.py
new file mode 100644
index 00000000..280df69d
--- /dev/null
+++ b/docs/examples/snow-detection/snow-mode.py
@@ -0,0 +1,564 @@
+"""
+Quantifying the effects of snow cover
+=====================================
+
+We classify the effect of snow on a PV system's DC array. Snow on an array's
+modules may reduce string voltage and/or string current, by reducing or
+blocking irradiance from reaching the cells. These effects may vary across
+the array since snow cover may not be uniform.
+
+In this analysis, all differences between measured power and power modeled
+from snow-free irradiance measurements are ascribed to the effects of snow. The
+effect of snow is classified into one of five categories:
+
+    * Mode 0: Indicates periods with enough opaque snow that the system is not
+      producing power. Specifically, Mode 0 is when the measured voltage is
+      below the lower bound of the inverter's MPPT range but the voltage
+      modeled using measured irradiance and ideal transmission is above the
+      lower bound of the inverter's MPPT range.
+    * Mode 1: Indicates periods when the system has non-uniform snow which
+      affects all strings. Mode 1 is assigned when both operating voltage and
+      current are reduced. Operating voltage is reduced when snow causes
+      mismatch. Current is decreased due to reduced transmission.
+    * Mode 2: Indicates periods when the system has non-uniform snow which
+      affects some strings, causing mismatch for some modules,
+      but not reducing light transmission for other modules.
+    * Mode 3: Indicates periods when the the system has snow that reduces
+      light transmission but doesn't create mismatch. Operating voltage is
+      consistent with snow-free conditions but current is reduced.
+    * Mode 4: Voltage and current are consistent with snow-free conditions.
+
+    * Mode -1: Indicates periods when it is unknown if or how snow impacts
+      power output. Mode -1 includes periods when:
+
+          1. Voltage modeled using measured irradiance and ideal transmission
+             is outside the inverter's MPPT range, OR
+          2. Measured voltage exceeds the upper bound of the inverter's MPPT
+             algorithm.
+
+The procedure involves four steps:
+    1. Model the module's maximum power current (Imp) and voltage (Vmp)
+       assuming that all the measured POA irradiance reaches the module's
+       cells.
+    2. Use the modeled Imp and measured Imp, determine the fraction of
+       plane-of-array irradiance that reaches the module's cells. This fraction
+       is called the transmittance.
+    3. Model the Vmp that would result from the POA irradiance reduced by
+       the transmittance.
+    4. Classify the effect of snow using the ratio of modeled Vmp (from step 3)
+       and measured Vmp.
+We demonstrate this analysis using measurements made at the combiner boxes
+for a utility-scale system.
+
+"""
+
+# %% Import packages
+
+import pathlib
+import pandas as pd
+import numpy as np
+
+import pvlib
+import matplotlib.pyplot as plt
+import matplotlib.dates as mdates
+import matplotlib.patches as mpatches
+from matplotlib.lines import Line2D
+
+import pvanalytics
+
+# Functions needed for the analysis procedure
+from pvanalytics.features import snow
+
+pvanalytics_dir = pathlib.Path(pvanalytics.__file__).parent
+
+# %%
+# Read in 15-minute DC voltage, DC current and AC power data.
+# DC voltage and DC current are measured at the input to the inverter from
+# one combiner box. AC power is measured at the inverter output.
+# Module temperature is collected by a back-of-module sensor.
+# Plane-of-array irradiance data is collected by a heated pyranometer.
+# Data sample was provided by an electric utility. Solar position and other
+# data were added by Sandia to avoid publishing a geographic location.
+
+# Load in utility data
+data_file = pvanalytics_dir / 'data' / 'snow_data.csv'
+data = pd.read_csv(data_file, index_col='Timestamp', parse_dates=True)
+
+# Explore utility datatset
+print('Utility-scale dataset')
+print('Start: {}'.format(data.index[0]))
+print('End: {}'.format(data.index[-1]))
+print('Columns : ' + ', '.join(data.columns))
+
+voltage_col = 'INV1 CB2 Voltage [V]'
+power_col = 'INV1 AC Power [kW]'
+current_col = 'INV1 CB2 Current [A]'
+
+
+# %%
+# Retrieve and print system inverter specs and DC electrical configuration
+
+cec_inverter_db = pvlib.pvsystem.retrieve_sam('CECInverter')
+my_inverter = cec_inverter_db["Yaskawa_Solectria_Solar__PVI_60TL_480__480V_"]
+
+max_ac_power = my_inverter['Paco']*0.001  # convert from W to kW
+mppt_low_voltage = my_inverter['Mppt_low']  # [V]
+mppt_high_voltage = my_inverter['Mppt_high']  # [V]
+
+print(f"Inverter AC power rating: {max_ac_power} kW")
+print(f"Inverter MPPT range: {mppt_low_voltage} V - {mppt_high_voltage} V")
+
+num_str_per_cb = 4
+num_mods_per_str = 18
+
+
+# %%
+# Plot AC power relative to inverter nameplate limits. We are looking for
+# periods of clipping, as these values are outside of MPP operating
+# conditions. In these data, there is no clipping so no need to filter
+# points out.
+
+fig, ax = plt.subplots(figsize=(10, 6))
+ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
+ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
+ax.plot(data[power_col], '.-', alpha=0.5, fillstyle='full',
+        label='AC Power [kW]')
+ax.axhline(max_ac_power, c='r', ls='--')
+ax.text(0.02, max_ac_power - 5, 'Maximum AC power: {} kW'.format(max_ac_power),
+        transform=ax.get_yaxis_transform())
+ax.set_xlabel('Date', fontsize='large')
+ax.set_ylabel('AC Power [kW]', fontsize='large')
+ax.legend()
+fig.tight_layout()
+plt.show()
+
+# %%
+# Model DC voltage and power. Here we use the SAPM. Alternatively, one
+# could use a single diode model.
+
+# SAPM coefficients derived from data from CFV Solar Test Laboratory, 2013.
+sapm_coeffs = {
+        "Cells_in_Series": 72,
+        "Isco": 9.36992857142857,
+        "Voco": 46.78626811224489,
+        "Impo": 8.895117736670294,
+        "Vmpo": 37.88508962264151,
+        "Aisc": 0.0002,
+        "Aimp": -0.0004,
+        "C0": 1.0145,
+        "C1": -0.0145,
+        "Bvoco": -0.1205,
+        "Mbvoc": 0,
+        "Bvmpo": -0.1337,
+        "Mbvmp": 0,
+        "N": 1.0925,
+        "C2": -0.4647,
+        "C3": -11.900781,
+        "FD": 1,
+        "A": -3.4247,
+        "B": -0.0951,
+        "C4": np.nan,
+        "C5": np.nan,
+        "IXO": np.nan,
+        "IXXO": np.nan,
+        "C6": np.nan,
+        "C7": np.nan,
+    }
+
+# Model cell temperature using the SAPM model.
+
+irrad_ref = 1000
+data['Cell Temp [C]'] = pvlib.temperature.sapm_cell_from_module(
+    data['Module Temp [C]'], data['POA [W/m²]'], deltaT=3)
+
+# %%
+# Demonstrate the transmission calculation and plot the result.
+
+# We scale measured current to that of a single string, assuming
+# that all strings have the same current.
+
+string_current = data['INV1 CB2 Current [A]'] / num_str_per_cb
+
+# Use SAPM to model effective irradiance from single-string current.
+
+
+modeled_e_e1 = snow.get_irradiance_sapm(
+    data['Cell Temp [C]'], string_current, sapm_coeffs['Impo'],
+    sapm_coeffs['C0'], sapm_coeffs['C1'], sapm_coeffs['Aimp'])
+
+T1 = snow.get_transmission(data['POA [W/m²]'], modeled_e_e1, string_current)
+
+
+fig, ax = plt.subplots(figsize=(10, 6))
+date_form = mdates.DateFormatter("%m/%d")
+ax.xaxis.set_major_formatter(date_form)
+
+ax.plot(T1, '.-', alpha=0.5, c='b', fillstyle='full')
+
+ax.set_ylabel('Transmission', fontsize='large')
+ax.set_xlabel('Date', fontsize='large')
+fig.tight_layout()
+plt.show()
+
+# %%
+# Visualize measured and modeled DC voltage.
+
+# Model DC output of a single module without the effect of snow.
+# Here we use the pyranometer irradiance.
+model_no_snow = pvlib.pvsystem.sapm(data['POA [W/m²]'],
+                                    data['Cell Temp [C]'],
+                                    sapm_coeffs)
+
+# Replaced modeled voltage with NaN when no voltage was measured to make
+# comparision between modeled and measured easier.
+
+model_no_snow.loc[data['INV1 CB2 Voltage [V]'].isna(), 'v_mp'] = np.nan
+
+# Scale modeled Vmp to that of a string
+modeled_vmp_no_snow = model_no_snow['v_mp'] * num_mods_per_str
+
+
+# Model DC output of a single module with the effect of snow.
+# Here we use the pyranmeter irradiance reduced by the estimated transmission.
+model_with_snow = pvlib.pvsystem.sapm(data['POA [W/m²]'] * T1,
+                                      data['Cell Temp [C]'],
+                                      sapm_coeffs)
+
+# Scale modeled Vmp to that of a string
+modeled_vmp_with_snow = model_with_snow['v_mp'] * num_mods_per_str
+
+fig, ax = plt.subplots(figsize=(10, 6))
+date_form = mdates.DateFormatter("%H:%M")
+ax.xaxis.set_major_formatter(date_form)
+
+ax.plot(modeled_vmp_no_snow, '.-', c='b', fillstyle='full', label='No snow')
+ax.plot(modeled_vmp_with_snow, '.-', c='r', fillstyle='full',
+        label='With snow')
+ax.scatter(data.index, data[voltage_col], s=3, c='k', label='Measured')
+
+ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
+ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
+
+ax.axhline(mppt_high_voltage, c='r', ls='--')
+ax.text(0.02, mppt_high_voltage - 30,
+        'Maximum MPPT voltage: {} V'.format(mppt_high_voltage),
+        transform=ax.get_yaxis_transform())
+ax.axhline(mppt_low_voltage, c='g', ls='--')
+ax.text(0.02, mppt_low_voltage + 20,
+        'Minimum MPPT voltage: {} V'.format(mppt_low_voltage),
+        transform=ax.get_yaxis_transform())
+
+ax.legend(fontsize='large')
+ax.set_ylabel('Voltage [V]', fontsize='large')
+ax.set_xlabel('Date', fontsize='large')
+
+fig.tight_layout()
+plt.show()
+
+# %%
+# We write a function to assign snow categories, so that we could loop over
+# additional combiner boxes.
+
+
+def assign_snow_modes(voltage, current, temp_cell, effective_irradiance,
+                      coeffs, min_dcv, max_dcv, threshold_vratio,
+                      threshold_transmission, num_mods_per_str,
+                      num_str_per_cb, temp_ref=25, irrad_ref=1000):
+
+    '''
+    Categorizes each data point as Mode 0-4 based on transmission and the
+    ratio between measured and modeled votlage.
+
+    This function illustrates a workflow to get to snow mode:
+
+    1. Model effective irradiance based on measured current using the SAPM.
+    2. Calculate transmission.
+    3. Model voltage from measured irradiance reduced by transmission. Assume
+       that all strings are producing voltage.
+    4. Determine the snow mode for each point in time.
+
+    Parameters
+    ----------
+    voltage : array
+        Voltage [V] measured at inverter.
+    current : array
+        Current [A] measured at combiner.
+    temp_cell : array
+        Cell temperature. [degrees C]
+    effective_irradiance : array
+        Snow-free POA irradiance measured by a heated pyranometer. [W/m²]
+    coeffs : dict
+        A dict defining the SAPM parameters, used for pvlib.pvsystem.sapm.
+    min_dcv : float
+        The lower voltage bound on the inverter's maximum power point
+        tracking (MPPT) algorithm. [V]
+    max_dcv : numeric
+        Upper bound voltage for the MPPT algorithm. [V]
+    threshold_vratio : float
+        The lower bound on vratio that is found under snow-free conditions,
+        determined empirically.
+    threshold_transmission : float
+        The lower bound on transmission that is found under snow-free
+        conditions, determined empirically.
+    num_mods_per_str : int
+        Number of modules in series in each string.
+    num_str_per_cb : int
+        Number of strings in parallel at the combiner.
+
+    Returns
+    -------
+    my_dict : dict
+        Keys are ``'transmission'``,
+        ``'modeled_voltage_with_calculated_transmission'``,
+        ``'modeled_voltage_with_ideal_transmission'``,
+        ``'vmp_ratio'``, and ``'mode'``.
+
+        'transmission' is the fracton of POA irradiance that is estimated
+        to reach the cells, after being reduced by snow cover.
+
+        'modeled_voltage_with_calculated_transmission' is the Vmp modeled
+        with POA irradiance x transmission
+
+        'modeled_voltage_with_ideal_transmission' is the Vmp modeled with
+        POA irradiance and assuming transmission is 1.
+
+        'vmp_ratio' is modeled_voltage_with_calculated_transmission divided
+        by measured voltage.
+
+        'mode' is the snow mode assigned.
+        See :py:func:`pvanalytics.features.snow.categorize`
+
+    '''
+
+    # Calculate transmission
+    modeled_e_e = snow.get_irradiance_sapm(
+        temp_cell, current / num_str_per_cb, coeffs['Impo'],
+        coeffs['C0'], coeffs['C1'], coeffs['Aimp'])
+
+    transmission = snow.get_transmission(effective_irradiance, modeled_e_e,
+                                         current / num_str_per_cb)
+
+    # Model voltage for a single module, scale up to array
+    modeled_voltage_with_calculated_transmission =\
+        pvlib.pvsystem.sapm(effective_irradiance*transmission, temp_cell,
+                            coeffs)['v_mp'] * num_mods_per_str
+    modeled_voltage_with_ideal_transmission =\
+        pvlib.pvsystem.sapm(effective_irradiance, temp_cell,
+                            coeffs)['v_mp'] * num_mods_per_str
+
+    mode, vmp_ratio = snow.categorize(
+        transmission, voltage, modeled_voltage_with_calculated_transmission,
+        modeled_voltage_with_ideal_transmission, min_dcv, max_dcv,
+        threshold_vratio, threshold_transmission)
+
+    result = pd.DataFrame(
+        index=voltage.index,
+        data={
+            'transmission': transmission,
+            'modeled_voltage_with_calculated_transmission':
+                modeled_voltage_with_calculated_transmission,
+            'modeled_voltage_with_ideal_transmission':
+                modeled_voltage_with_ideal_transmission,
+            'vmp_ratio': vmp_ratio,
+            'mode': mode})
+
+    return result
+
+
+# %%
+# Demonstrate transmission, modeled voltage calculation and mode categorization
+# on voltage, current pair.
+
+# threshold_vratio and threshold_transmission were empirically determined
+# using data collected on this system over five summers. Transmission and
+# vratio were calculated for all data collected in the summer (under the
+# assumption that there was no snow present at this time), and histograms
+# of the spread of transmission and vratio values were made.
+# threshold_vratio is the lower bound on the 95th percentile of all vratios
+# calculated for summer data - as in, 95% of all data collected in the summer
+# has a vratio that is higher than threshold_vratio. threshold_transmission
+# is the same value, but for transmission calculated from data recorded
+# during the summer.
+
+threshold_vratio = 0.933
+threshold_transmission = 0.598
+
+# Calculate the transmission, model the voltage, and categorize snow mode.
+# Use the SAPM to calculate transmission and model the voltage.
+
+inv_cb = 'INV1 CB2'
+
+snow_results = assign_snow_modes(data[voltage_col], data[current_col],
+                                 data['Cell Temp [C]'],
+                                 data['POA [W/m²]'], sapm_coeffs,
+                                 mppt_low_voltage, mppt_high_voltage,
+                                 threshold_vratio,
+                                 threshold_transmission,
+                                 num_mods_per_str,
+                                 num_str_per_cb)
+
+# Plot transmission
+
+fig, ax = plt.subplots(figsize=(10, 6))
+date_form = mdates.DateFormatter("%m/%d")
+ax.xaxis.set_major_formatter(date_form)
+
+ax.plot(snow_results['transmission'], '.-',
+        label='INV1 CB2 Transmission')
+ax.set_xlabel('Date', fontsize='large')
+ax.legend()
+fig.tight_layout()
+plt.show()
+
+# %%
+# Look at voltage ratio.
+
+fig, ax = plt.subplots(figsize=(10, 6))
+date_form = mdates.DateFormatter("%m/%d")
+ax.xaxis.set_major_formatter(date_form)
+
+ax.plot(snow_results['vmp_ratio'], label='INV1 CB2 Voltage Ratio')
+
+ax.set_xlabel('Date', fontsize='large')
+ax.set_ylabel('Voltage Ratio (measured/modeled)', fontsize='large')
+ax.axhline(1, c='k', alpha=0.1, ls='--')
+ax.legend()
+fig.tight_layout()
+plt.show()
+
+# %%
+# Calculate total DC power loss as the difference between modeled and measured
+# power. Total power loss includes losses caused by snow and by other factors,
+# e.g., shading from structures.
+
+model_results = pvlib.pvsystem.sapm(data['POA [W/m²]'],
+                                    data['Cell Temp [C]'],
+                                    sapm_coeffs)
+
+
+modeled_power = model_results['p_mp'] * num_str_per_cb * num_mods_per_str
+measured_power = data['INV1 CB2 Voltage [V]'] * data['INV1 CB2 Current [A]']
+loss_total = np.maximum(modeled_power - measured_power, 0)
+
+# Calculate snow losses. Snow loss occurs when the mode is 0, 1, 2, or 3.
+# When the snow loss occurs we assume that all the DC power loss is due to
+# snow.
+snow_loss_filter = snow_results['mode'].isin([0, 1, 2, 3])
+loss_snow = loss_total.copy()
+loss_snow[~snow_loss_filter] = 0.0
+
+
+# %%
+# Plot measured and modeled power, and show snow mode with colored bars.
+
+N = 6
+alpha = 0.5
+cmap = plt.get_cmap('plasma', N)
+
+fig, ax = plt.subplots(figsize=(10, 6))
+date_form = mdates.DateFormatter("%m/%d")
+ax.xaxis.set_major_formatter(date_form)
+exclude = modeled_power.isna() | snow_results['mode'].isna()
+temp = data[~exclude]
+
+# Plot each day individually so we are not exaggerating losses
+days_mapped = temp.index.map(lambda x: x.date())
+days = np.unique(temp.index.date)
+grouped = temp.groupby(temp.index.date)
+
+for d in days:
+    temp_grouped = grouped.get_group(d)
+    model_power = modeled_power[temp_grouped.index]
+    meas_power = measured_power[temp_grouped.index]
+    mode = snow_results['mode'][temp_grouped.index]
+    ax.plot(model_power, c='k', ls='--')
+    ax.plot(meas_power, c='k')
+    ax.fill_between(temp_grouped.index, meas_power,
+                    model_power, color='k', alpha=alpha)
+
+    chng_pts = np.ravel(np.where(mode.values[:-1]
+                                 - mode.values[1:] != 0))
+
+    if len(chng_pts) == 0:
+        ax.axvspan(temp_grouped.index[0], temp_grouped.index[-1],
+                   color=cmap.colors[mode.at[temp_grouped.index[-1]]],
+                   alpha=alpha)
+    else:
+        set1 = np.append([0], chng_pts)
+        set2 = np.append(chng_pts, [-1])
+
+        for start, end in zip(set1, set2):
+            my_index = temp_grouped.index[start:end]
+            ax.axvspan(
+                temp_grouped.index[start], temp_grouped.index[end],
+                color=cmap.colors[mode.at[temp_grouped.index[end]]],
+                alpha=alpha, ec=None)
+
+# Add different colored intervals to legend
+handles, labels = ax.get_legend_handles_labels()
+
+modeled_line = Line2D([0], [0], label='Modeled power', color='k', ls='--')
+measured_line = Line2D([0], [0], label='Measured power', color='k')
+handles.append(measured_line)
+handles.append(modeled_line)
+
+for i in [-1, 0, 1, 2, 3, 4]:  # modes
+    color_idx = i + 1
+    my_patch = mpatches.Patch(color=cmap.colors[color_idx], label=f'Mode {i}',
+                              alpha=alpha)
+    handles.append(my_patch)
+
+ax.set_xlabel('Date', fontsize='large')
+ax.set_ylabel('DC Power [W]', fontsize='large')
+ax.legend(handles=handles, fontsize='large', loc='upper left')
+ax.set_title('Snow modes for INV1 CB2',
+             fontsize='large')
+fig.tight_layout()
+plt.show()
+
+# %%
+# Calculate daily DC energy loss due to snow as a percentage of potential
+# (modeled) DC power.
+
+# DataFrame so that we can group by days.
+loss_df = pd.DataFrame(data={'modeled_power': modeled_power,
+                             'loss_snow': loss_snow})
+
+# Read in daily snowfall is measured at 7:00 am of each day.
+# Daily snowfall will be plotted beside losses, for context.
+
+snowfall_file = pvanalytics_dir / 'data' / 'snow_snowfall.csv'
+snowfall = pd.read_csv(snowfall_file, index_col='DATE', parse_dates=True)
+snowfall['SNOW'] *= 1/(10*2.54)  # convert from mm depth to inches
+snowfall.index = snowfall.index + pd.Timedelta('7H')
+
+
+days_mapped = loss_df.index.map(lambda x: x.date())
+days = np.unique(days_mapped)
+loss_df_gped = loss_df.groupby(days_mapped)
+
+snow_loss_daily = pd.Series(index=days, dtype=float)
+
+for d in days:
+    temp = loss_df_gped.get_group(d)
+    snow_loss_daily.at[d] = 100 * temp['loss_snow'].sum() / \
+        temp['modeled_power'].sum()
+
+# Plot daily DC energy loss and daily snowfall totals.
+fig, ax = plt.subplots(figsize=(10, 6))
+ax2 = ax.twinx()
+snow_loss_daily.plot(kind='bar', ax=ax, width=-0.4, align='edge',
+                     label='Snow loss (%)')
+snowfall['SNOW'].plot(kind='bar', ax=ax2,  width=0.4, alpha=0.2,
+                      align='edge',
+                      label='Snow fall in prior 24 hours')
+
+ax.legend(loc='upper left')
+ax2.legend(loc='upper right')
+ax.set_ylabel('DC energy loss [%]', fontsize='large')
+ax2.set_ylabel('Inches')
+date_form = mdates.DateFormatter("%m/%d")
+ax.xaxis.set_major_formatter(date_form)
+ax.set_title('Daily energy loss and snowfall', fontsize='large')
+fig.tight_layout()
+plt.show()
diff --git a/docs/index.rst b/docs/index.rst
index 305dcb31..be4e5b43 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -57,6 +57,8 @@ library status.
     features of data rather than properties of the system that produced the
     data.
   - :py:mod:`features.shading` functions for identifying shadows.
+  - :py:mod:`features.snow` functions for identifying snow coverage and
+    classifying the effects of snow coverage.
 
 - :py:mod:`system` identification of PV system characteristics from data
   (e.g. nameplate power, tilt, azimuth)
diff --git a/docs/whatsnew/0.2.1.rst b/docs/whatsnew/0.2.1.rst
index b54d3aef..e4432e00 100644
--- a/docs/whatsnew/0.2.1.rst
+++ b/docs/whatsnew/0.2.1.rst
@@ -1,12 +1,15 @@
 .. _whatsnew_021:
 
-0.2.1 (not yet released)
-------------------------
+Breaking Changes
+~~~~~~~~~~~~~~~~
 
 
 Enhancements
 ~~~~~~~~~~~~
 * Compatibility with numpy 2.0. (:pull:`211`)
+* Added functions :py:func:`~pvanalytics.features.snow.categorize`
+  and :py:func:`~pvanalytics.features.snow.get_transmission` to categorize
+  data by the effect of snow on DC voltage and current. (:pull:`209`)
 
 
 Bug Fixes
@@ -20,12 +23,14 @@ Requirements
 
 Documentation
 ~~~~~~~~~~~~~
-
+* Added a gallery example for snow effects categorization (:pull:`209`)
 
 Testing
 ~~~~~~~
 
 
-
 Contributors
 ~~~~~~~~~~~~
+* Cliff Hansen (:ghuser:`cwhanse`)
+* Emma Cooper (:ghuser:`eccoope`)
+* Kevin Anderson (:ghuser:`kandersolar`)
diff --git a/pvanalytics/data/snow_data.csv b/pvanalytics/data/snow_data.csv
new file mode 100644
index 00000000..bbc081a5
--- /dev/null
+++ b/pvanalytics/data/snow_data.csv
@@ -0,0 +1,577 @@
+Timestamp,POA [W/m²],INV1 CB2 Voltage [V],INV1 CB2 Current [A],INV1 AC Power [kW],Module Temp [C],Ambient Temp [C],apparent_zenith,zenith,apparent_elevation,elevation,azimuth,equation_of_time,aoi
+1/5/2022 0:00,1.069027,,,,-11.67601,-8.526217,160.0099802,160.0099802,-70.0099802,-70.0099802,3.164023188,-5.244508919,156.3326313
+1/5/2022 0:15,1.218347,,,,-10.71838,-7.358494,159.6165864,159.6165864,-69.61658636,-69.61658636,13.13832831,-5.249180892,159.6415873
+1/5/2022 0:30,0.5797986,,,,-9.996516,-6.536161,158.7670349,158.7670349,-68.76703493,-68.76703493,22.59251819,-5.253852055,162.8599405
+1/5/2022 0:45,0.6020421,,,,-9.189205,-5.791483,157.5139686,157.5139686,-67.51396865,-67.51396865,31.26630312,-5.258522407,165.9233878
+1/5/2022 1:00,0.2589272,,,,-8.529516,-5.298972,155.9217677,155.9217677,-65.92176773,-65.92176773,39.04886195,-5.263191949,168.7032133
+1/5/2022 1:15,0.02859372,,,,-8.239856,-5.170183,154.0546547,154.0546547,-64.05465466,-64.05465466,45.94790818,-5.267860679,170.9328509
+1/5/2022 1:30,0.02541689,,,,-8.140345,-4.9114,151.9697154,151.9697154,-61.96971537,-61.96971537,52.04068144,-5.272528597,172.1285747
+1/5/2022 1:45,-0.08419616,,,,-8.281861,-5.063289,149.7144041,149.7144041,-59.71440411,-59.71440411,57.43305431,-5.277195701,171.8228698
+1/5/2022 2:00,-0.393975,,,,-8.922639,-5.946322,147.3267452,147.3267452,-57.32674522,-57.32674522,62.23423946,-5.281861993,170.1546961
+1/5/2022 2:15,-0.3066016,,,,-9.644333,-6.723111,144.8366899,144.8366899,-54.83668992,-54.83668992,66.54437534,-5.28652747,167.6654856
+1/5/2022 2:30,0.003177027,,,,-10.00414,-7.043106,142.2677294,142.2677294,-52.26772938,-52.26772938,70.4500626,-5.291192133,164.7529653
+1/5/2022 2:45,0.1096092,,,,-10.09863,-7.008945,139.6383646,139.6383646,-49.63836461,-49.63836461,74.02398846,-5.29585598,161.6182219
+1/5/2022 3:00,0.1064322,,,,-10.28779,-7.137044,136.9633118,136.9633118,-46.96331177,-46.96331177,77.32630553,-5.300519011,158.3587062
+1/5/2022 3:15,0,,,,-10.70247,-7.4041,134.2544414,134.2544414,-44.25444143,-44.25444143,80.40655734,-5.305181226,155.0244272
+1/5/2022 3:30,0,,,,-11.10306,-7.509205,131.5214919,131.5214919,-41.52149194,-41.52149194,83.30559608,-5.309842624,151.6430417
+1/5/2022 3:45,0,,,,-11.41071,-7.805861,128.7726081,128.7726081,-38.77260809,-38.77260809,86.05727438,-5.314503204,148.2309676
+1/5/2022 4:00,0,,,,-11.81071,-8.3981,126.0147472,126.0147472,-36.01474716,-36.01474716,88.68985754,-5.319162966,144.7985898
+1/5/2022 4:15,0,,,,-12.17561,-8.920567,123.2539857,123.2539857,-33.25398571,-33.25398571,91.22716995,-5.323821909,141.352862
+1/5/2022 4:30,0,,,,-12.04299,-8.910183,120.4957554,120.4957554,-30.4957554,-30.4957554,93.68951073,-5.328480032,137.8986929
+1/5/2022 4:45,0.0873676,,,,-11.5078,-8.678711,117.745026,117.745026,-27.74502603,-27.74502603,96.09438101,-5.333137335,134.4397265
+1/5/2022 5:00,0.0873676,,,,-10.52836,-8.186017,115.006449,115.006449,-25.00644895,-25.00644895,98.45706135,-5.337793817,130.9788028
+1/5/2022 5:15,0.3177018,,,,-9.649034,-7.738228,112.2844733,112.2844733,-22.28447328,-22.28447328,100.7910688,-5.342449479,127.5182442
+1/5/2022 5:30,1.345465,,,,-8.792339,-7.476972,109.5834414,109.5834414,-19.58344138,-19.58344138,103.1085198,-5.347104318,124.0600414
+1/5/2022 5:45,2.12069,,,,-7.662806,-7.020505,106.907668,106.907668,-16.90766795,-16.90766795,105.4204193,-5.351758334,120.6059778
+1/5/2022 6:00,2.10169,,,,-6.689061,-6.506834,104.2615091,104.2615091,-14.26150905,-14.26150905,107.7368895,-5.356411528,117.1577195
+1/5/2022 6:15,1.979401,,,,-5.890139,-5.942461,101.6494226,101.6494226,-11.6494226,-11.6494226,110.0673501,-5.361063898,113.716882
+1/5/2022 6:30,1.512287,,,,-5.264884,-5.4799,99.07602147,99.07602147,-9.076021475,-9.076021475,112.4206586,-5.365715443,110.2850834
+1/5/2022 6:45,1.440562,,,,-4.775061,-5.103017,96.54612261,96.54612261,-6.546122613,-6.546122613,114.8052157,-5.370366163,106.8639894
+1/5/2022 7:00,2.279092,256.2846,0,0,-4.283155,-4.373294,94.06479171,94.06479171,-4.064791715,-4.064791715,117.2290397,-5.375016058,103.4553554
+1/5/2022 7:15,2.822341,387.1234,0.009913795,0.03965517,-3.770317,-3.570317,91.63738283,91.63738283,-1.637382831,-1.637382831,119.6998123,-5.379665127,100.0610659
+1/5/2022 7:30,3.26234,496.5162,0.05814388,0.2396552,-3.314744,-2.990978,88.88434591,89.26957455,1.115654086,0.730425447,122.224897,-5.384313369,96.6831757
+1/5/2022 7:45,4.394756,502.8697,0.09823009,0.4480469,-2.867678,-2.717878,86.74411978,86.96740093,3.255880221,3.032599069,124.8113275,-5.388960784,93.32395469
+1/5/2022 8:00,6.341689,530.4985,0.1273504,0.5377905,-2.22215,-2.649089,84.58420803,84.73727491,5.415791971,5.262725087,127.46577,-5.39360737,89.9859364
+1/5/2022 8:15,9.50158,561.6168,0.2346538,0.7470469,-1.911483,-2.950828,82.47008808,82.58600432,7.529911917,7.413995675,130.1944527,-5.398253129,86.67197452
+1/5/2022 8:30,17.47532,602.7585,0.4330846,1.234256,-1.847694,-3.278228,80.42740483,80.52079695,9.572595166,9.479203048,133.0030643,-5.402898057,83.38530861
+1/5/2022 8:45,27.68384,637.2244,0.7064382,1.875128,-1.20765,-3.001067,78.47080161,78.54925099,11.52919839,11.45074901,135.8966212,-5.407542157,80.12963996
+1/5/2022 9:00,54.13859,673.6044,1.579364,3.752917,-0.5778555,-2.383795,76.61142434,76.6793292,13.38857566,13.3206708,138.8793022,-5.412185426,76.90922295
+1/5/2022 9:15,82.93109,704.5355,2.593245,5.989615,-0.2303111,-1.635106,74.85917941,74.9193122,15.14082059,15.0806878,141.9542537,-5.416827864,73.72897367
+1/5/2022 9:30,85.68211,706.6226,2.719244,6.307815,-0.05290556,-1.241533,73.22350256,73.27772668,16.77649744,16.72227332,145.1233734,-5.42146947,70.59459794
+1/5/2022 9:45,81.89581,697.9531,2.58131,5.977227,-0.04693333,-1.089439,71.71361241,71.76324678,18.28638759,18.23675322,148.3870801,-5.426110245,67.51274519
+1/5/2022 10:00,95.24964,703.9135,2.981795,6.816117,0.08261666,-0.8457611,70.3385461,70.38456601,19.6614539,19.61543399,151.7440837,-5.430750186,64.49119034
+1/5/2022 10:15,112.4451,709.1207,3.439897,7.802028,1.059355,-0.5234833,69.10708379,69.15023865,20.89291621,20.84976135,155.191178,-5.435389295,61.53904574
+1/5/2022 10:30,90.24828,685.5192,2.701441,6.158053,2.073883,-0.2815389,68.02760802,68.06849424,21.97239198,21.93150576,158.723076,-5.440027569,58.667007
+1/5/2022 10:45,74.26115,672.4007,2.174359,4.964887,2.179517,-0.1622222,67.10792152,67.14702967,22.89207848,22.85297033,162.3323147,-5.444665009,55.88762932
+1/5/2022 11:00,83.69518,683.1378,2.574858,5.837101,2.522033,0.09223889,66.3550408,66.39278752,23.6449592,23.60721248,166.0092571,-5.449301614,53.21562444
+1/5/2022 11:15,99.909,696.4601,3.292742,7.416766,3.147772,0.3917778,65.77498303,65.81173347,24.22501697,24.18826653,169.7422076,-5.453937383,50.668161
+1/5/2022 11:30,98.77921,693.6614,3.262419,7.335231,3.411294,0.6336111,65.37256281,65.40864715,24.62743719,24.59135285,173.5176551,-5.458572316,48.26512977
+1/5/2022 11:45,83.96643,682.2324,2.69451,6.107737,3.670956,0.9635667,65.15121599,65.1869423,24.84878401,24.8130577,177.3206424,-5.463206412,46.02931048
+1/5/2022 12:00,75.41232,674.7064,2.398623,5.462979,3.766117,1.2543,65.11286688,65.14853175,24.88713312,24.85146825,181.1352427,-5.467839671,43.98634836
+1/5/2022 12:15,60.06609,663.1763,1.897936,4.347672,3.567539,1.436278,65.25785116,65.29374924,24.74214884,24.70625076,184.9451127,-5.472472091,42.16441147
+1/5/2022 12:30,60.27884,662.4284,1.920557,4.386229,3.597144,1.699072,65.58490222,65.62133555,24.41509778,24.37866445,188.7340819,-5.477103673,40.59338117
+1/5/2022 12:45,55.42746,659.1337,1.733645,3.990028,3.739917,2.029994,66.0912023,66.12849042,23.9087977,23.87150958,192.486725,-5.481734416,39.30345001
+1/5/2022 13:00,60.47979,663.8647,1.877099,4.311738,3.987206,2.356395,66.77249324,66.81098491,23.22750676,23.18901509,196.1888756,-5.486364319,38.32308946
+1/5/2022 13:15,57.50068,661.16,1.802328,4.182762,4.210311,2.586161,67.62323636,67.66332436,22.37676364,22.33667564,199.8280439,-5.490993381,37.67653018
+1/5/2022 13:30,35.39885,646.2947,1.074775,2.640988,3.990505,2.598294,68.63680638,68.67894713,21.36319362,21.32105287,203.3937128,-5.495621602,37.38113534
+1/5/2022 13:45,28.48105,637.3043,0.8426348,2.128207,3.593911,2.434733,69.80570244,69.8504434,20.19429756,20.1495566,206.8775064,-5.500248982,37.44523577
+1/5/2022 14:00,20.0643,606.9224,0.5859998,1.553771,3.281367,2.274872,71.12175953,71.16977904,18.87824047,18.83022096,210.2732375,-5.50487552,37.86700599
+1/5/2022 14:15,12.03206,576.1127,0.338365,1.001472,2.953317,2.202833,72.57634264,72.62851036,17.42365736,17.37148964,213.5768501,-5.509501215,38.63471555
+1/5/2022 14:30,11.54156,573.7137,0.3043655,0.9327453,2.747917,2.1629,74.16050709,74.21797976,15.83949291,15.78202024,216.7862801,-5.514126066,39.72827872
+1/5/2022 14:45,11.7781,569.4493,0.3009109,0.9341089,2.681978,2.153795,75.8651053,75.92948624,14.1348947,14.07051376,219.9012636,-5.518750074,41.12165469
+1/5/2022 15:00,10.06,560.8682,0.2601818,0.8278282,2.672578,2.213839,77.68080531,77.7544261,12.31919469,12.2455739,222.9231137,-5.523373237,42.78549423
+1/5/2022 15:15,7.197282,540.0151,0.1728114,0.6499579,2.686544,2.323233,79.59794876,79.6844036,10.40205124,10.3155964,225.8544879,-5.527995555,44.68951649
+1/5/2022 15:30,5.768328,514.1613,0.1070335,0.5219374,2.7563,2.476383,81.60605832,81.71131395,8.393941679,8.288686046,228.6991653,-5.532617027,46.8043233
+1/5/2022 15:45,5.069704,493.3478,0.1075626,0.4881411,2.870844,2.608283,83.69241156,83.82739972,6.30758844,6.172600281,231.4618417,-5.537237653,49.1025799
+1/5/2022 16:00,3.499427,502.7438,0.06652238,0.2983333,3.047011,2.931589,85.83759391,86.02528487,4.162406094,3.974715128,234.1479513,-5.541857432,51.55964113
+1/5/2022 16:15,1.945011,434.3824,0.01136363,0.065,3.282778,3.387633,87.99919082,88.29799103,2.000809179,1.70200897,236.7635209,-5.546476363,54.15376525
+1/5/2022 16:30,0.5525505,340.6613,0,0,3.454261,3.5978,90.06162196,90.63893768,-0.061621963,-0.638937682,239.315055,-5.551094447,56.86605663
+1/5/2022 16:45,0,,,,3.559789,3.683561,93.04193034,93.04193034,-3.041930344,-3.041930344,241.8094527,-5.555711682,59.68025419
+1/5/2022 17:00,0,,,,3.618305,3.767767,95.50114027,95.50114027,-5.501140274,-5.501140274,244.2539569,-5.560328067,62.58244916
+1/5/2022 17:15,0,,,,3.639333,3.789972,98.01107599,98.01107599,-8.011075994,-8.011075994,246.6561323,-5.564943603,65.56078245
+1/5/2022 17:30,0,,,,3.5844,3.761444,100.566549,100.566549,-10.56654901,-10.56654901,249.0238707,-5.569558289,68.60515264
+1/5/2022 17:45,0,,,,3.468411,3.7482,103.1626359,103.1626359,-13.16263587,-13.16263587,251.3654271,-5.574172123,71.70695119
+1/5/2022 18:00,0,,,,3.353839,3.74555,105.7946349,105.7946349,-15.79463491,-15.79463491,253.6894812,-5.578785107,74.85882824
+1/5/2022 18:15,0,,,,3.341539,3.734205,108.4580189,108.4580189,-18.45801889,-18.45801889,256.0052303,-5.583397237,78.05449088
+1/5/2022 18:30,0,,,,3.3907,3.7541,111.1483837,111.1483837,-21.14838375,-21.14838375,258.3225149,-5.588008515,81.28853285
+1/5/2022 18:45,0,,,,3.377056,3.73785,113.8613906,113.8613906,-23.86139061,-23.86139061,260.6519824,-5.59261894,84.55629
+1/5/2022 19:00,0,,,,3.361028,3.661195,116.5927002,116.5927002,-26.59270018,-26.59270018,263.0052944,-5.597228511,87.85371867
+1/5/2022 19:15,0,,,,3.371022,3.600578,119.3378982,119.3378982,-29.33789817,-29.33789817,265.3953899,-5.601837228,91.17729502
+1/5/2022 19:30,0,,,,3.375444,3.532639,122.092406,122.092406,-32.09240601,-32.09240601,267.836816,-5.60644509,94.52392911
+1/5/2022 19:45,0,,,,3.327011,3.430722,124.8513733,124.8513733,-34.85137329,-34.85137329,270.346143,-5.611052095,97.89089222
+1/5/2022 20:00,0,,,,3.144139,3.343006,127.6095461,127.6095461,-37.60954614,-37.60954614,272.9424885,-5.615658245,101.275756
+1/5/2022 20:15,0,,,,2.824372,3.250855,130.3611005,130.3611005,-40.36110046,-40.36110046,275.6481769,-5.620263538,104.6763388
+1/5/2022 20:30,0,,,,2.491167,3.118528,133.0994285,133.0994285,-43.09942852,-43.09942852,278.4895693,-5.624867974,108.0906579
+1/5/2022 20:45,0,,,,2.307678,3.000839,135.8168632,135.8168632,-45.81686321,-45.81686321,281.4981041,-5.629471551,111.5168881
+1/5/2022 21:00,0,,,,1.7709,2.888272,138.5043145,138.5043145,-48.50431447,-48.50431447,284.7115857,-5.634074271,114.9533208
+1/5/2022 21:15,0,,,,0.9201111,2.717283,141.1507886,141.1507886,-51.15078862,-51.15078862,288.175743,-5.638676131,118.3983237
+1/5/2022 21:30,0.06509745,,,,0.4537278,2.50225,143.7427523,143.7427523,-53.74275231,-53.74275231,291.9460388,-5.643277131,121.8503002
+1/5/2022 21:45,0.1349576,,,,0.6946833,2.38955,146.2632927,146.2632927,-56.26329269,-56.26329269,296.0895819,-5.647877272,125.3076418
+1/5/2022 22:00,0.1238432,,,,1.349,2.426222,148.6910297,148.6910297,-58.69102971,-58.69102971,300.6867509,-5.652476551,128.7686717
+1/5/2022 22:15,0.05398305,,,,1.658111,2.46515,150.9987618,150.9987618,-60.9987618,-60.9987618,305.8316263,-5.657074969,132.2315734
+1/5/2022 22:30,0,,,,1.763967,2.424556,153.1519076,153.1519076,-63.15190758,-63.15190758,311.6294226,-5.661672525,135.6942925
+1/5/2022 22:45,0,,,,1.856689,2.288389,155.1070126,155.1070126,-65.10701258,-65.10701258,318.1877443,-5.666269219,139.1543958
+1/5/2022 23:00,0,,,,1.776428,2.0909,156.8109898,156.8109898,-66.81098985,-66.81098985,325.5971129,-5.670865049,142.6088625
+1/5/2022 23:15,0,,,,1.535172,1.8706,158.2023623,158.2023623,-68.20236227,-68.20236227,333.8966969,-5.675460016,146.0537531
+1/5/2022 23:30,0,,,,1.226222,1.668444,159.2162637,159.2162637,-69.21626372,-69.21626372,343.0276065,-5.680054119,149.4836677
+1/5/2022 23:45,0,,,,0.9569556,1.491645,159.7943856,159.7943856,-69.79438564,-69.79438564,352.791736,-5.684647357,152.8908142
+1/6/2022 0:00,0,,,,0.8543167,1.358478,159.8983151,159.8983151,-69.8983151,-69.8983151,2.850582577,-5.689239729,156.2633153
+1/6/2022 0:15,0,,,,0.9645444,1.310061,159.5206818,159.5206818,-69.52068181,-69.52068181,12.78949135,-5.693831235,159.581949
+1/6/2022 0:30,0,,,,1.079178,1.24485,158.6875128,158.6875128,-68.6875128,-68.6875128,22.22564132,-5.698421875,162.81345
+1/6/2022 0:45,0,,,,1.060778,1.163022,157.4502224,157.4502224,-67.45022243,-67.45022243,30.89710642,-5.703011648,165.8957789
+1/6/2022 1:00,0,,,,0.8913778,0.9668722,155.872344,155.872344,-65.87234396,-65.87234396,38.6887511,-5.707600553,168.7041632
+1/6/2022 1:15,0,,,,0.6817,0.7114444,154.0176946,154.0176946,-64.01769456,-64.01769456,45.60363267,-5.71218859,170.9772092
+1/6/2022 1:30,0,,,,0.4881722,0.5320611,151.9432901,151.9432901,-61.94329006,-61.94329006,51.7153087,-5.716775758,172.228597
+1/6/2022 1:45,0.03334815,,,,0.1596667,0.3558556,149.6967072,149.6967072,-59.69670723,-59.69670723,57.12722889,-5.721362057,171.9652171
+1/6/2022 2:00,0.05716803,,,,0.001344444,0.3103889,147.3161755,147.3161755,-57.31617547,-57.31617547,61.94721819,-5.725947485,170.3098671
+1/6/2022 2:15,0.02381988,,,,0.01885555,0.2290167,144.8318681,144.8318681,-54.83186809,-54.83186809,66.27472768,-5.730532044,167.8178318
+1/6/2022 2:30,0.004763797,,,,-0.08493889,0.07783333,142.2674833,142.2674833,-52.26748331,-52.26748331,70.19609273,-5.735115731,164.8985503
+1/6/2022 2:45,0.0349345,,,,-0.3250833,-0.003361111,139.6417018,139.6417018,-49.64170179,-49.64170179,73.78396835,-5.739698546,161.7569403
+1/6/2022 3:00,0.0301707,,,,-0.6285222,-0.1409111,136.9693899,136.9693899,-46.96938989,-46.96938989,77.09859244,-5.74428049,158.4912929
+1/6/2022 3:15,0,,,,-0.7735777,-0.3065833,134.262541,134.262541,-44.26254103,-44.26254103,80.18964506,-5.74886156,155.151661
+1/6/2022 3:30,0,,,,-0.8563611,-0.5573056,131.5309929,131.5309929,-41.53099293,-41.53099293,83.09813033,-5.753441757,151.7655725
+1/6/2022 3:45,-0.870305,,,,-1.239194,-0.9946111,128.7829702,128.7829702,-38.78297016,-38.78297016,85.85805003,-5.75802108,148.3493045
+1/6/2022 4:00,-0.7924885,,,,-2.046611,-1.26925,126.0254938,126.0254938,-36.02549377,-36.02549377,88.49780732,-5.762599529,144.913123
+1/6/2022 4:15,0.150866,,,,-2.45495,-1.252161,123.2646911,123.2646911,-33.26469111,-33.26469111,91.04135004,-5.767177102,141.4638881
+1/6/2022 4:30,0.2318532,,,,-2.031011,-1.122422,120.506034,120.506034,-30.50603405,-30.50603405,93.50908601,-5.7717538,138.0064355
+1/6/2022 4:45,0.1588037,,,,-1.796811,-1.093739,117.7545241,117.7545241,-27.75452406,-27.75452406,95.91861128,-5.776329622,134.5443522
+1/6/2022 5:00,-0.1746864,,,,-2.581,-1.304094,115.0148372,115.0148372,-25.01483716,-25.01483716,98.28528904,-5.780904567,131.0804328
+1/6/2022 5:15,-0.1746864,,,,-3.530378,-1.726,112.2914414,112.2914414,-22.29144143,-22.29144143,100.6227084,-5.785478635,127.6169628
+1/6/2022 5:30,0.07146155,,,,-3.995489,-2.037511,109.5886934,109.5886934,-19.58869345,-19.58869345,102.9430492,-5.790051825,124.1559021
+1/6/2022 5:45,0.07146155,,,,-4.192728,-2.136161,106.9109183,106.9109183,-16.9109183,-16.9109183,105.2573723,-5.794624136,120.6990078
+1/6/2022 6:00,-0.4811659,,,,-4.746555,-2.377461,104.2624792,104.2624792,-14.26247918,-14.26247918,107.5758506,-5.799195569,117.2479226
+1/6/2022 6:15,-0.4811659,,,,-5.632017,-2.750128,101.6478386,101.6478386,-11.64783857,-11.64783857,109.9079496,-5.803766121,113.804241
+1/6/2022 6:30,0,,,,-6.101083,-3.141011,99.07161176,99.07161176,-9.071611763,-9.071611763,112.26257,-5.808335794,110.3695612
+1/6/2022 6:45,0.3683806,,,,-5.895072,-3.007511,96.53861652,96.53861652,-6.538616524,-6.538616524,114.6481538,-5.812904586,106.94553
+1/6/2022 7:00,1.753085,465.6378,0.05166665,0.2045833,-5.184039,-2.581906,94.0539182,94.0539182,-4.053918196,-4.053918196,117.0727599,-5.817472497,103.5338838
+1/6/2022 7:15,7.846389,579.4651,0.2396296,0.7656943,-4.676161,-2.451144,91.62286978,91.62286978,-1.622869781,-1.622869781,119.544111,-5.822039526,100.136488
+1/6/2022 7:30,13.07112,606.8611,0.3791394,1.127288,-3.681178,-2.106211,88.86790167,89.25114862,1.132098328,0.748851384,122.069613,-5.826605673,96.7553773
+1/6/2022 7:45,11.46397,595.8135,0.3493397,1.041687,-2.338272,-1.384739,86.72249887,86.94478783,3.277501126,3.055212166,124.6563446,-5.831170936,93.39280068
+1/6/2022 8:00,11.37953,595.637,0.3593444,1.061731,-1.682683,-0.6361,84.55773518,84.7102004,5.442264824,5.289799597,127.3110202,-5.835735317,90.05126904
+1/6/2022 8:15,20.92199,633.3779,0.6507094,1.736692,-1.431672,-0.2329889,82.43870217,82.55419577,7.561297831,7.445804233,130.0399202,-5.840298813,86.73361145
+1/6/2022 8:30,31.02679,665.817,0.9613208,2.427358,-1.287094,-0.1538167,80.39092055,80.48398567,9.609079445,9.516014327,132.8487904,-5.844861425,83.44304047
+1/6/2022 8:45,33.68489,668.6655,1.068126,2.666219,-1.283078,-0.1502722,78.42899627,78.50717542,11.57100373,11.49282458,135.7427093,-5.849423151,80.18322752
+1/6/2022 9:00,43.01748,671.0504,1.406,3.368666,-1.228089,-0.15465,76.56406813,76.63173887,13.43593187,13.36826113,138.7259226,-5.853983992,76.9583938
+1/6/2022 9:15,82.23788,696.3527,2.636667,6.069334,-0.9912722,-0.1533,74.80604994,74.86597263,15.19395006,15.13402737,141.8016481,-5.858543946,73.77341838
+1/6/2022 9:30,220.22,724.9883,7.398665,16.082,-0.3129,-0.07955556,73.16439474,73.21842504,16.83560526,16.78157496,144.9718582,-5.863103014,70.63396592
+1/6/2022 9:45,413.4356,722.2573,13.893,29.34867,3.148522,0.3541445,71.64834674,71.69779835,18.35165326,18.30220165,148.2370476,-5.867661194,67.54664006
+1/6/2022 10:00,523.0793,710.5743,17.58734,36.607,7.507367,0.5718889,70.26697664,70.31282109,19.73302336,19.68717891,151.5960008,-5.872218486,64.51916528
+1/6/2022 10:15,497.6176,704.0493,17.13833,35.65067,10.18374,0.5465444,69.02910586,69.0720897,20.97089414,20.9279103,155.0455814,-5.87677489,61.56059896
+1/6/2022 10:30,327.9948,707.1246,11.093,23.613,8.779006,0.2662278,67.94316545,67.98388277,22.05683455,22.01611723,158.5805631,-5.881330405,58.68157798
+1/6/2022 10:45,194.5929,711.5383,6.341667,14.26667,5.652555,-0.15175,67.01701301,67.05595246,22.98298699,22.94404754,162.19353,-5.88588503,55.89459663
+1/6/2022 11:00,214.22,711.0153,7.534,16.55766,5.101833,-0.1208944,66.25772497,66.29530146,23.74227503,23.70469854,165.8748742,-5.890438765,53.21430663
+1/6/2022 11:15,212.72,713.975,7.25,15.567,4.473161,-0.09305555,65.67138151,65.70795856,24.32861849,24.29204144,169.6129075,-5.89499161,50.65782242
+1/6/2022 11:30,150.7271,715.8734,4.661,10.209,3.266678,-0.1179333,65.26286102,65.29876719,24.73713898,24.70123281,173.3941015,-5.899543563,48.24499397
+1/6/2022 11:45,154.7395,718.2617,4.751667,10.409,2.884389,-0.05601111,65.03566116,65.07120285,24.96433884,24.92879715,177.2034561,-5.904094624,45.99858462
+1/6/2022 12:00,191.0155,720.735,5.908,12.78,3.574139,0.1450556,64.99176341,65.02723538,25.00823659,24.97276462,181.0249773,-5.908644793,43.94426195
+1/6/2022 12:15,176.3237,718.3493,5.514334,11.94933,3.901961,0.2318444,65.1315534,65.16724819,24.8684466,24.83275181,184.8422338,-5.913194069,42.11027241
+1/6/2022 12:30,198.5793,719.1923,6.394333,13.676,3.511139,0.1229111,65.45380512,65.49002235,24.54619488,24.50997765,188.6389502,-5.917742451,40.52664897
+1/6/2022 12:45,290.4542,720.9183,9.143668,19.05433,4.509261,0.2223056,65.95573071,65.99278691,24.04426929,24.00721309,192.3995872,-5.92228994,39.22382118
+1/6/2022 13:00,459.5916,715.4033,13.065,26.46833,7.645878,0.6094444,66.63309053,66.67133074,23.36690947,23.32866926,196.1098611,-5.926836534,38.23058271
+1/6/2022 13:15,622.8762,710.2863,16.93266,33.62899,10.93925,1.051105,67.48035327,67.52016549,22.51964673,22.47983451,199.7571685,-5.931382232,37.57155194
+1/6/2022 13:30,561.97,704.54,15.84066,31.25867,12.42031,1.271606,68.49089086,68.53272521,21.50910914,21.46727479,203.3308881,-5.935927036,37.2645035
+1/6/2022 13:45,481.5651,705.393,12.90133,25.44934,11.93007,1.187817,69.65719104,69.70158648,20.34280896,20.29841352,206.822553,-5.940470942,37.3181464
+1/6/2022 14:00,483.7181,710.305,11.096,21.633,9.879911,1.092128,70.97107091,71.01869399,19.02892909,18.98130601,210.2259015,-5.945013952,37.73094321
+1/6/2022 14:15,329.8465,712.1003,7.743999,15.45033,6.309933,0.8539444,72.42387368,72.47557712,17.57612632,17.52442288,213.5368196,-5.949556065,38.49132326
+1/6/2022 14:30,170.5367,714.27,4.875667,10.46766,3.367805,0.462,74.00663209,74.06354743,15.99336791,15.93645257,216.7532028,-5.95409728,39.57922403
+1/6/2022 14:45,202.6853,718.38,5.062666,10.48767,2.126528,0.4375167,75.7101795,75.77387082,14.2898205,14.22612918,219.8747619,-5.958637597,40.96851137
+1/6/2022 15:00,198.7523,716.2584,4.406333,9.021998,1.022578,0.4257222,77.5251753,77.59790957,12.4748247,12.40209043,222.9027984,-5.963177014,42.62966318
+1/6/2022 15:15,88.30872,692.2283,2.038333,4.548,-0.1268333,0.1095833,79.44197682,79.52723421,10.55802318,10.47276579,225.8399696,-5.967715532,44.53218611
+1/6/2022 15:30,32.48571,664.7483,0.9749998,2.424,-0.9756,-0.1854444,81.45018034,81.55370731,8.549819662,8.446292693,228.6900634,-5.97225315,46.64646273
+1/6/2022 15:45,21.3757,644.4483,0.6283333,1.688,-1.584767,-0.3650444,83.53729228,83.66954046,6.462707722,6.330459541,231.4577911,-5.976789868,48.94495417
+1/6/2022 16:00,12.29699,593.8734,0.384,1.112666,-2.008689,-0.5742278,85.68462157,85.86732871,4.315378428,4.132671289,234.1486072,-5.981325684,51.40283782
+1/6/2022 16:15,2.404122,537.0034,0.097,0.3433333,-2.556733,-0.8131389,87.85236122,88.14006696,2.147638779,1.859933038,236.7685621,-5.985860599,53.99822485
+1/6/2022 16:30,0.03652245,360.2563,0.005,0.02033333,-3.218555,-1.002267,89.93008641,90.48115023,0.069913586,-0.481150231,239.324185,-5.990394611,56.71210194
+1/6/2022 16:45,-0.6955609,199.4125,0,0,-3.940455,-1.180394,92.88436174,92.88436174,-2.884361738,-2.884361738,241.8224005,-5.99492772,59.52811631
+1/6/2022 17:00,-1.327597,,,,-4.779561,-1.423322,95.34385248,95.34385248,-5.343852484,-5.343852484,244.2704764,-5.999459927,62.43228927
+1/6/2022 17:15,-0.8559415,,,,-5.574255,-1.881789,97.85411258,97.85411258,-7.854112576,-7.854112576,246.6760008,-6.003991229,65.41270938
+1/6/2022 17:30,-0.1651498,,,,-5.637055,-1.994622,100.4099367,100.4099367,-10.40993674,-10.40993674,249.0468873,-6.008521627,68.45923677
+1/6/2022 17:45,0.06193225,,,,-5.223094,-1.685056,103.0063861,103.0063861,-13.00638614,-13.00638614,251.3914097,-6.01305112,71.5632352
+1/6/2022 18:00,0,,,,-4.897984,-1.664944,105.6387449,105.6387449,-15.63874492,-15.63874492,253.7182639,-6.017579707,74.71733546
+1/6/2022 18:15,0,,,,-4.805539,-2.037028,108.3024726,108.3024726,-18.30247257,-18.30247257,256.0366592,-6.022107389,77.91523162
+1/6/2022 18:30,0.05399175,,,,-4.699616,-2.121411,110.9931525,110.9931525,-20.99315253,-20.99315253,258.356444,-6.026634164,81.1515093
+1/6/2022 18:45,0.1460928,,,,-4.188828,-1.883894,113.706434,113.706434,-23.706434,-23.706434,260.6882673,-6.031160032,84.42149998
+1/6/2022 19:00,0.142916,,,,-3.781661,-1.863556,116.4379661,116.4379661,-26.43796615,-26.43796615,263.0437858,-6.035684992,87.72115859
+1/6/2022 19:15,0.09051446,,,,-3.564644,-1.855772,119.1833235,119.1833235,-29.18332345,-29.18332345,265.4359242,-6.040209043,91.04696224
+1/6/2022 19:30,0.03969956,,,,-3.360522,-1.843117,121.9379164,121.9379164,-31.93791643,-31.93791643,267.8792035,-6.044732187,94.39582391
+1/6/2022 19:45,0,,,,-3.307083,-2.002172,124.6968841,124.6968841,-34.69688405,-34.69688405,270.3901521,-6.049254421,97.76501946
+1/6/2022 20:00,0.03652399,,,,-3.326667,-2.142222,127.4549624,127.4549624,-37.45496244,-37.45496244,272.9878243,-6.053775744,101.1521267
+1/6/2022 20:15,0.03652399,,,,-3.679128,-2.282317,130.2063185,130.2063185,-40.20631851,-40.20631851,275.694452,-6.058296158,104.5549718
+1/6/2022 20:30,-0.4017676,,,,-4.785517,-2.724183,132.9443376,132.9443376,-42.94433755,-42.94433755,278.5362634,-6.062815661,107.9715816
+1/6/2022 20:45,-0.4017676,,,,-6.021272,-3.315283,135.6613489,135.6613489,-45.6613489,-45.6613489,281.5445079,-6.067334252,111.400142
+1/6/2022 21:00,0,,,,-6.608911,-3.839411,138.348265,138.348265,-48.34826497,-48.34826497,284.7567227,-6.071851932,114.8389582
+1/6/2022 21:15,0.1206796,,,,-6.675761,-4.2051,140.9941047,140.9941047,-50.99410466,-50.99410466,288.2182611,-6.076368699,118.2864143
+1/6/2022 21:30,0.5700672,,,,-6.226028,-4.1685,143.585364,143.585364,-53.58536398,-53.58536398,291.9840602,-6.080884553,121.7409337
+1/6/2022 21:45,0.5684883,,,,-5.569361,-3.876767,146.1051865,146.1051865,-56.10518654,-56.10518654,296.1205015,-6.085399493,125.2009329
+1/6/2022 22:00,0.1191007,,,,-5.240917,-3.751111,148.5322917,148.5322917,-58.53229168,-58.53229168,300.7069744,-6.089913519,128.664766
+1/6/2022 22:15,0,,,,-5.202689,-3.779806,150.8396433,150.8396433,-60.83964329,-60.83964329,305.8362607,-6.09442663,132.1306566
+1/6/2022 22:30,0.1921536,,,,-5.120828,-3.797378,152.992922,152.992922,-62.99292201,-62.99292201,311.6119734,-6.098938827,135.596602
+1/6/2022 22:45,0.349368,,,,-4.9167,-3.74395,154.9490657,154.9490657,-64.94906569,-64.94906569,318.1399735,-6.103450107,139.0602387
+1/6/2022 23:00,0.4525908,,,,-4.678333,-3.578739,156.6555301,156.6555301,-66.65553006,-66.65553006,325.5093684,-6.107960472,142.5186406
+1/6/2022 23:15,0.4287716,,,,-4.36555,-3.339061,158.0515004,158.0515004,-68.05150035,-68.05150035,333.7591757,-6.112469919,145.9680018
+1/6/2022 23:30,0.1572153,,,,-4.06965,-3.140022,159.0727579,159.0727579,-69.07275786,-69.07275786,342.8328902,-6.11697845,149.4031161
+1/6/2022 23:45,0.02382012,,,,-3.903128,-3.0482,159.6613655,159.6613655,-69.66136549,-69.66136549,352.538143,-6.121486062,152.8164826
+1/7/2022 0:00,0,,,,-3.945294,-3.111194,159.7787147,159.7787147,-69.7787147,-69.7787147,2.544555466,-6.125992756,156.1966801
+1/7/2022 0:15,0,,,,-4.135767,-3.2714,159.4165764,159.4165764,-69.41657638,-69.41657638,12.44488755,-6.130498531,159.5252331
+1/7/2022 0:30,0,,,,-4.413628,-3.410861,158.5997021,158.5997021,-68.5997021,-68.5997021,21.85980196,-6.135003387,162.7701567
+1/7/2022 0:45,0,,,,-4.751283,-3.588239,157.3782555,157.3782555,-67.37825551,-67.37825551,30.52616891,-6.139507322,165.8716898
+1/7/2022 1:00,0,,,,-4.948961,-3.717261,155.8148765,155.8148765,-65.81487645,-65.81487645,38.32475767,-6.144010338,168.7090469
+1/7/2022 1:15,0.004763506,,,,-4.887533,-3.768133,153.9729277,153.9729277,-63.97292774,-63.97292774,45.25398145,-6.148512432,171.0261639
+1/7/2022 1:30,0.06351496,,,,-4.578439,-3.650817,151.9093163,151.9093163,-61.9093163,-61.9093163,51.38361199,-6.153013604,172.3343032
+1/7/2022 1:45,0.05875145,,,,-4.295455,-3.460572,149.6717159,149.6717159,-59.67171586,-59.67171586,56.81454014,-6.157513855,172.1135939
+1/7/2022 2:00,0,,,,-4.181111,-3.423255,147.2985464,147.2985464,-57.29854644,-57.29854644,61.65307999,-6.162013182,170.469711
+1/7/2022 2:15,0,,,,-4.04805,-3.35715,144.8201966,144.8201966,-54.82019658,-54.82019658,65.99789954,-6.166511587,167.973194
+1/7/2022 2:30,0,,,,-3.927517,-3.319933,142.2605693,142.2605693,-52.26056932,-52.26056932,69.93500024,-6.171009068,165.0458944
+1/7/2022 2:45,0,,,,-3.876806,-3.341105,139.6385254,139.6385254,-49.63852536,-49.63852536,73.5369579,-6.175505625,161.8965335
+1/7/2022 3:00,0.1063942,,,,-3.730611,-3.193894,136.9690828,136.9690828,-46.96908282,-46.96908282,76.86406438,-6.180001257,158.6241182
+1/7/2022 3:15,0.1063942,,,,-3.566517,-3.2481,134.2643602,134.2643602,-44.26436017,-44.26436017,79.96611591,-6.184495964,155.2786547
+1/7/2022 3:30,0,,,,-3.585561,-3.5801,131.5342967,131.5342967,-41.53429672,-41.53429672,82.88425555,-6.188989744,151.8874872
+1/7/2022 3:45,0,,,,-3.660883,-3.788189,128.787199,128.787199,-38.78719903,-38.78719903,85.65262603,-6.193482599,148.466718
+1/7/2022 4:00,0,,,,-3.711022,-3.924017,126.0301539,126.0301539,-36.03015394,-36.03015394,88.29976344,-6.197974527,145.0264729
+1/7/2022 4:15,0,,,,-3.765744,-4.024689,123.2693413,123.2693413,-33.26934133,-33.26934133,90.84973634,-6.202465527,141.5735049
+1/7/2022 4:30,0,,,,-3.805211,-4.08745,120.5102749,120.5102749,-30.51027488,-30.51027488,93.32305985,-6.2069556,138.1125675
+1/7/2022 4:45,0,,,,-3.823356,-4.1241,117.7579891,117.7579891,-27.75798911,-27.75798911,95.73742446,-6.211444744,134.6471844
+1/7/2022 5:00,0,,,,-3.837055,-4.134967,115.0171859,115.0171859,-25.01718591,-25.01718591,98.10827616,-6.215932959,131.1801001
+1/7/2022 5:15,0,,,,-3.841733,-4.118455,112.2923534,112.2923534,-22.29235335,-22.29235335,100.4492768,-6.220420245,127.7135599
+1/7/2022 5:30,0,,,,-3.835744,-4.093961,109.5878632,109.5878632,-19.58786319,-19.58786319,102.7726701,-6.2249066,124.2494902
+1/7/2022 5:45,0,,,,-3.826711,-4.075395,106.9080517,106.9080517,-16.90805169,-16.90805169,105.0895744,-6.229392026,120.7896199
+1/7/2022 6:00,0,,,,-3.813189,-4.049628,104.2572899,104.2572899,-14.25728994,-14.25728994,107.4102139,-6.23387652,117.3355667
+1/7/2022 6:15,0,,,,-3.786167,-4.020878,101.6400456,101.6400456,-11.64004564,-11.64004564,109.7441016,-6.238360082,113.8889029
+1/7/2022 6:30,0,,,,-3.755328,-4.020289,99.0609372,99.0609372,-9.060937199,-9.060937199,112.1001827,-6.242842713,110.4512057
+1/7/2022 6:45,0,,,,-3.75075,-4.067333,96.5247838,96.5247838,-6.524783799,-6.524783799,114.486942,-6.247324411,107.0241019
+1/7/2022 7:00,0.1333893,,,,-3.768922,-4.11775,94.03665107,94.03665107,-4.036651067,-4.036651067,116.9124804,-6.251805175,103.6093082
+1/7/2022 7:15,1.181461,,,,-3.781889,-4.139067,91.6018916,91.6018916,-1.601891599,-1.601891599,119.3845635,-6.256285007,100.2086701
+1/7/2022 7:30,3.561775,,,,-3.771578,-4.132672,88.84559647,89.22618216,1.154403534,0.773817837,121.9106413,-6.260763904,96.82420164
+1/7/2022 7:45,8.125428,,,,-3.727695,-4.0965,86.69453792,86.91555572,3.30546208,3.084444278,124.4978393,-6.265241866,93.45813015
+1/7/2022 8:00,15.33006,338.6569,0,0,-3.633405,-4.018922,84.52470533,84.67642607,5.475294672,5.323573925,127.1529221,-6.269718893,90.11294327
+1/7/2022 8:15,20.75788,419.4476,0,0,-3.496767,-3.910428,82.40062052,82.5156052,7.599379477,7.4843948,129.8822244,-6.274194984,86.79144489
+1/7/2022 8:30,20.92868,409.8139,0,0,-3.389678,-3.859578,80.34762993,80.44030983,9.652370067,9.559690169,132.691551,-6.278670139,83.49682
+1/7/2022 8:45,26.04571,429.5949,0,0,-3.263778,-3.802072,78.38028705,78.45815352,11.61971295,11.54184648,135.5860446,-6.283144358,80.23270958
+1/7/2022 9:00,34.30027,497.926,0,0.02164949,-3.050278,-3.631178,76.50971866,76.57712255,13.49028134,13.42287745,138.5700198,-6.287617639,77.00330106
+1/7/2022 9:15,38.87812,516.2335,0,0.1257035,-2.811244,-3.443845,74.74584473,74.80553093,15.25415527,15.19446907,141.6467679,-6.292089982,73.81343604
+1/7/2022 9:30,48.53915,517.5884,0.03416667,0.2648874,-2.575578,-3.34465,73.09813579,73.15195029,16.90186421,16.84804971,144.8183376,-6.296561387,70.66873745
+1/7/2022 9:45,57.60896,496.1731,0.08416667,0.3608333,-2.353633,-3.289017,71.57586268,71.62511271,18.42413732,18.37488729,148.0853009,-6.301031853,67.5757628
+1/7/2022 10:00,61.17714,494.354,0.1,0.4,-2.12685,-3.179144,70.18813112,70.23378362,19.81186888,19.76621638,151.4465178,-6.30550138,64.54218576
+1/7/2022 10:15,67.70007,508.5787,0.09999999,0.4042453,-1.890939,-3.092628,68.94380546,68.98660353,21.05619454,21.01339647,154.898922,-6.309969967,61.5770086
+1/7/2022 10:30,86.6965,527.4274,0.09999999,0.4542453,-1.5688,-2.962233,67.85136705,67.89190211,22.14863295,22.10809789,158.4373473,-6.314437614,58.69080949
+1/7/2022 10:45,105.7074,484.3116,0.2775281,0.5685393,-1.170594,-2.688039,66.91873024,66.95748867,23.08126976,23.04251133,162.0544238,-6.318904319,55.89602226
+1/7/2022 11:00,110.4,508.8279,0.5285807,0.7638025,-0.2566889,-2.39105,66.15303306,66.19042782,23.84696694,23.80957218,165.7405702,-6.323370084,53.20723948
+1/7/2022 11:15,110.3226,600.3652,0.6010526,0.9645616,0.9650667,-2.223567,65.56042024,65.59681305,24.43957976,24.40318695,169.4841025,-6.327834906,50.64152293
+1/7/2022 11:30,105.6924,615.5881,0.5980769,1.076221,1.531144,-2.169106,65.14583513,65.18155281,24.85416487,24.81844719,173.2714705,-6.332298786,48.21868431
+1/7/2022 11:45,105.2917,611.0892,0.7674047,1.229192,1.803978,-2.064967,64.91283804,64.94818519,25.08716196,25.05181481,177.0876264,-6.336761723,45.96147428
+1/7/2022 12:00,102.1628,521.4692,1.238661,1.552269,2.223839,-1.841322,64.86346792,64.89873735,25.13653208,25.10126265,180.9165035,-6.341223717,43.89558818
+1/7/2022 12:15,96.32237,487.8633,1.503,1.949667,2.138933,-1.650233,64.99816008,65.03364219,25.00183992,24.96635781,184.7415761,-6.345684766,42.0493581
+1/7/2022 12:30,143.7885,544.625,2.117333,3.093,2.360611,-1.527828,65.31572837,65.35172023,24.68427163,24.64827977,188.5464588,-6.350144871,40.45297807
+1/7/2022 12:45,165.7928,616.5817,2.362,3.757,3.183956,-1.329194,65.81341351,65.85022862,24.18658649,24.14977138,192.3154924,-6.354604032,39.13712612
+1/7/2022 13:00,126.437,675.2277,1.725333,3.102333,3.010217,-1.220033,66.48699265,66.52497224,23.51300735,23.47502776,196.0342716,-6.359062246,38.13093098
+1/7/2022 13:15,112.4722,678.9883,1.520666,2.794333,2.219894,-1.238211,67.33093975,67.37046697,22.66906025,22.62953303,199.6900757,-6.363519515,37.45941154
+1/7/2022 13:30,127.631,690.219,1.716333,3.155667,1.911044,-1.23505,68.33862155,68.38014018,21.66137845,21.61985982,203.2721767,-6.367975837,37.14076453
+1/7/2022 13:45,142.3569,702.334,1.920333,3.537667,2.127306,-1.192778,69.5025119,69.54655236,20.4974881,20.45344764,206.7720154,-6.372431212,37.18408321
+1/7/2022 14:00,129.9533,700.301,1.777666,3.304667,2.230717,-1.139111,70.8144075,70.86162449,19.1855925,19.13837551,210.183255,-6.376885639,37.5881179
+1/7/2022 14:15,96.34621,687.5457,1.318666,2.509666,1.553089,-1.146722,72.26562728,72.31685659,17.73437272,17.68314341,213.5017248,-6.381339119,38.34145064
+1/7/2022 14:30,74.638,681.9157,0.9909998,1.960667,0.5257334,-1.187556,73.84717903,73.90352709,16.15282097,16.09647291,216.7252807,-6.38579165,39.42402939
+1/7/2022 14:45,138.0183,676.8654,1.554667,2.864333,0.005088889,-1.185894,75.54987474,75.61286664,14.45012526,14.38713336,219.8536106,-6.390243232,40.80961084
+1/7/2022 15:00,210.6866,687.2197,2.321667,4.185999,0.4677333,-0.9690334,77.36436283,77.43620166,12.63563717,12.56379834,222.8880069,-6.394693864,42.46848361
+1/7/2022 15:15,133.4755,684.4459,1.562333,2.978333,0.8207667,-0.9459,79.28101351,79.36506732,10.71898649,10.63493268,225.8311295,-6.399143546,44.36992699
+1/7/2022 15:30,39.6675,638.4503,0.5606666,1.237666,-0.6053944,-1.447078,81.28949199,81.39129215,8.710508005,8.60870785,228.6867779,-6.403592278,46.48409228
+1/7/2022 15:45,24.70225,599.2067,0.3756666,0.8899999,-2.619289,-1.903339,83.37752198,83.5070556,6.622478019,6.492944397,231.459682,-6.408040058,48.78322763
+1/7/2022 16:00,13.65703,577.9257,0.2163688,0.6248298,-3.859317,-2.128983,85.52709594,85.70492283,4.472904063,4.295077171,234.1553197,-6.412486887,51.24232695
+1/7/2022 16:15,5.189687,550.6369,0.09412222,0.3302681,-4.439567,-2.284311,87.70085374,87.97786121,2.299146257,2.022138789,236.7797671,-6.416932764,53.83935084
+1/7/2022 16:30,0.9972842,479.1688,0.01575343,0.06643835,-3.997772,-2.350583,89.79429283,90.31924064,0.20570717,-0.319240645,239.3395813,-6.421377688,56.55516657
+1/7/2022 16:45,0.08257575,425.5,0,0,-3.394628,-2.5242,92.72282151,92.72282151,-2.722821515,-2.722821515,241.8417147,-6.425821659,59.37332925
+1/7/2022 17:00,-1.47368,,,,-3.952356,-2.8963,95.18273411,95.18273411,-5.18273411,-5.18273411,244.2934623,-6.430264677,62.27979073
+1/7/2022 17:15,-1.47368,,,,-4.831272,-3.140772,97.69344973,97.69344973,-7.693449725,-7.693449725,246.702438,-6.43470674,65.26258823
+1/7/2022 17:30,0,,,,-5.08535,-3.217594,100.2497459,100.2497459,-10.24974594,-10.24974594,249.0765791,-6.439147849,68.31154473
+1/7/2022 17:45,-0.0698717,,,,-5.22455,-3.3523,102.8466682,102.8466682,-12.84666817,-12.84666817,251.4241806,-6.443588002,71.41799775
+1/7/2022 18:00,-1.043298,,,,-5.717044,-3.599972,105.479486,105.479486,-15.47948599,-15.47948599,253.7539563,-6.4480272,74.57456021
+1/7/2022 18:15,-0.973426,,,,-5.798061,-3.740672,108.1436452,108.1436452,-18.14364521,-18.14364521,256.0751297,-6.452465442,77.77491462
+1/7/2022 18:30,0,,,,-5.366611,-3.80415,110.8347163,110.8347163,-20.83471628,-20.83471628,258.3975587,-6.456902727,81.01363988
+1/7/2022 18:45,-0.0873381,,,,-5.516122,-4.058444,113.5483359,113.5483359,-23.54833588,-23.54833588,260.7318967,-6.461339055,84.28606441
+1/7/2022 19:00,-0.1222733,,,,-6.121878,-4.428844,116.280141,116.280141,-26.28014097,-26.28014097,263.0897969,-6.465774426,87.58814297
+1/7/2022 19:15,-0.1397457,,,,-6.474306,-4.740767,119.025694,119.025694,-29.02569396,-29.02569396,265.4841726,-6.470208838,90.91635475
+1/7/2022 19:30,-0.1048104,,,,-6.710128,-4.997944,121.7803934,121.7803934,-31.78039341,-31.78039341,267.9295207,-6.474642291,94.26761669
+1/7/2022 19:45,0,,,,-7.022356,-5.234372,124.5393665,124.5393665,-34.53936645,-34.53936645,270.4423304,-6.479074786,97.63921024
+1/7/2022 20:00,0,,,,-7.249239,-5.508744,127.2973377,127.2973377,-37.29733767,-37.29733767,273.0415955,-6.48350632,101.0287204
+1/7/2022 20:15,-0.3144808,,,,-7.446567,-5.80825,130.0484632,130.0484632,-40.04846319,-40.04846319,275.749458,-6.487936895,104.4339818
+1/7/2022 20:30,-0.9958563,,,,-7.947661,-6.117278,132.7861191,132.7861191,-42.78611906,-42.78611906,278.592016,-6.492366509,107.8530315
+1/7/2022 20:45,-0.7687314,,,,-8.494005,-6.359033,135.5026284,135.5026284,-45.50262839,-45.50262839,281.600333,-6.496795162,111.2840679
+1/7/2022 21:00,-0.6194314,,,,-8.854767,-6.520661,138.1889028,138.1889028,-48.18890282,-48.18890282,284.8116811,-6.501222853,114.7254102
+1/7/2022 21:15,-0.697252,,,,-9.295989,-6.715178,140.83397,140.83397,-50.83396999,-50.83396999,288.2710391,-6.505649582,118.17546
+1/7/2022 21:30,-0.992618,,,,-9.554094,-6.920817,143.4243507,143.4243507,-53.42435065,-53.42435065,292.0328177,-6.510075348,121.6326615
+1/7/2022 21:45,-2.555346,,,,-10.12879,-7.241678,145.9432396,145.9432396,-55.94323955,-55.94323955,296.1626662,-6.514500152,125.0954567
+1/7/2022 22:00,-2.036005,,,,-10.68048,-7.560995,148.3694495,148.3694495,-58.36944948,-58.36944948,300.7389742,-6.518923991,128.562232
+1/7/2022 22:15,-0.3779792,,,,-10.33177,-7.470278,150.6761034,150.6761034,-60.67610339,-60.67610339,305.8532019,-6.523346867,132.0312515
+1/7/2022 22:30,-0.06987845,,,,-9.950922,-7.371833,152.8291381,152.8291381,-62.82913807,-62.82913807,311.6073192,-6.527768778,135.5005661
+1/7/2022 22:45,0.0111197,,,,-10.01073,-7.491661,154.7858799,154.7858799,-64.78587992,-64.78587992,318.1053708,-6.532189724,138.9678826
+1/7/2022 23:00,0.03494857,,,,-9.893439,-7.519978,156.494329,156.494329,-66.49432896,-66.49432896,325.4349315,-6.536609704,142.4303715
+1/7/2022 23:15,-0.1858671,,,,-9.8712,-7.587089,157.8943451,157.8943451,-67.8943451,-67.8943451,333.6346919,-6.541028718,145.8843623
+1/7/2022 23:30,-0.209696,,,,-10.19898,-7.762411,158.9223867,158.9223867,-68.92238674,-68.92238674,342.6503142,-6.545446765,149.3248448
+1/7/2022 23:45,0,,,,-10.25116,-7.8838,159.5209391,159.5209391,-69.52093905,-69.52093905,352.2949862,-6.549863846,152.7446124
+1/8/2022 0:00,-0.2970718,,,,-10.36102,-8.056595,159.6512624,159.6512624,-69.65126244,-69.65126244,2.246449041,-6.554279958,156.1327035
+1/8/2022 0:15,-0.2970718,,,,-10.60195,-8.284994,159.3043251,159.3043251,-69.30432513,-69.30432513,12.10514725,-6.558695103,159.471394
+1/8/2022 0:30,-0.4622878,,,,-10.71136,-8.447406,158.503626,158.503626,-68.50362605,-68.50362605,21.4956895,-6.563109279,162.7299861
+1/8/2022 0:45,-0.4972368,,,,-11.06382,-8.654256,157.2980608,157.2980608,-67.29806078,-67.29806078,30.15417616,-6.567522486,165.8510112
+1/8/2022 1:00,-0.03494901,,,,-11.11996,-8.750794,155.7493326,155.7493326,-65.74933264,-65.74933264,37.95752069,-6.571934724,168.7177184
+1/8/2022 1:15,0,,,,-10.72502,-8.775811,153.9203022,153.9203022,-63.92030218,-63.92030218,44.89952719,-6.576345991,171.0795546
+1/8/2022 1:30,-0.2271561,,,,-10.60435,-8.904612,151.8677283,151.8677283,-61.86772825,-61.86772825,51.04609424,-6.580756288,172.4456016
+1/8/2022 1:45,-1.15326,,,,-11.08099,-9.171284,149.639355,149.639355,-59.63935497,-59.63935497,56.49542668,-6.585165614,172.2679762
+1/8/2022 2:00,-1.329587,,,,-11.75401,-9.452066,147.2737774,147.2737774,-57.27377739,-57.27377739,61.35220788,-6.589573968,170.634122
+1/8/2022 2:15,-0.5607475,,,,-11.97044,-9.577711,144.8015915,144.8015915,-54.80159153,-54.80159153,65.71422745,-6.59398135,168.131389
+1/8/2022 2:30,-0.6052343,,,,-12.13846,-9.721811,142.2469023,142.2469023,-52.24690226,-52.24690226,69.66708338,-6.59838776,165.1947854
+1/8/2022 2:45,-0.6576563,,,,-12.50051,-9.945933,139.6287502,139.6287502,-49.62875016,-49.62875016,73.28322402,-6.602793197,162.0367859
+1/8/2022 3:00,-1.3693,,,,-13.12477,-10.34272,136.9623063,136.9623063,-46.96230634,-46.96230634,76.62296267,-6.60719766,158.7569723
+1/8/2022 3:15,-1.628208,,,,-13.96871,-10.84715,134.2598162,134.2598162,-44.25981618,-44.25981618,79.7361902,-6.61160115,155.4052077
+1/8/2022 3:30,-0.5067173,,,,-14.61965,-11.09577,131.5313227,131.5313227,-41.53132272,-41.53132272,82.66417465,-6.616003664,152.0085948
+1/8/2022 3:45,-0.3129166,,,,-14.72328,-11.10042,128.7852165,128.7852165,-38.78521654,-38.78521654,85.44119086,-6.620405204,148.5830261
+1/8/2022 4:00,-0.3097402,,,,-14.6243,-11.10162,126.0286522,126.0286522,-36.02865216,-36.02865216,88.09590237,-6.624805769,145.1384664
+1/8/2022 4:15,-0.03494641,,,,-14.57242,-11.14842,123.2678638,123.2678638,-33.26786377,-33.26786377,90.65249517,-6.629205357,141.6815473
+1/8/2022 4:30,0,,,,-14.15417,-11.13223,120.5084084,120.5084084,-30.50840837,-30.50840837,93.13158999,-6.63360397,138.2169314
+1/8/2022 4:45,0,,,,-13.89198,-11.09788,117.7553549,117.7553549,-27.75535485,-27.75535485,95.550971,-6.638001605,134.7480724
+1/8/2022 5:00,0,,,,-14.18661,-11.17035,115.0134322,115.0134322,-25.01343218,-25.01343218,97.92616692,-6.642398263,131.2776604
+1/8/2022 5:15,0,,,,-14.44067,-11.26411,112.2871495,112.2871495,-22.28714947,-22.28714947,100.2709126,-6.646793943,127.8078971
+1/8/2022 5:30,-0.1223483,,,,-14.41698,-11.36823,109.5808945,109.5808945,-19.58089454,-19.58089454,102.5975167,-6.651188645,124.3406732
+1/8/2022 5:45,-0.3066581,,,,-14.34408,-11.46503,106.8990157,106.8990157,-16.89901565,-16.89901565,104.9171556,-6.655582367,120.8776871
+1/8/2022 6:00,-0.1843099,,,,-14.31771,-11.51355,104.2458926,104.2458926,-14.24589256,-14.24589256,107.240106,-6.659975111,117.4205303
+1/8/2022 6:15,-0.2923628,,,,-14.76622,-11.83004,101.6259989,101.6259989,-11.62599887,-11.62599887,109.5759296,-6.664366875,113.9707514
+1/8/2022 6:30,-2.575647,,,,-15.92494,-12.76758,99.0439567,99.0439567,-9.043956696,-9.043956696,111.9336175,-6.668757658,110.5299056
+1/8/2022 6:45,-3.352647,,,,-17.29004,-14.04743,96.50458731,96.50458731,-6.504587309,-6.504587309,114.3216985,-6.673147461,107.0995988
+1/8/2022 7:00,-0.001648,405.2158,0.01970803,0.1029197,-18.28233,-14.9612,94.01295723,94.01295723,-4.012957232,-4.012957232,116.7483174,-6.677536282,103.6815274
+1/8/2022 7:15,4.056357,556.1341,0.06970803,0.3542354,-18.72362,-15.40866,91.5744193,91.5744193,-1.574419302,-1.574419302,119.221284,-6.681924122,100.277516
+1/8/2022 7:30,10.58355,610.482,0.1438016,0.5754961,-18.94737,-15.72746,88.81738686,89.1946504,1.182613142,0.8053496,121.7480943,-6.68631098,96.88955751
+1/8/2022 7:45,20.03842,674.0253,0.2806017,0.8281804,-18.67734,-15.92859,86.66020871,86.87968405,3.339791287,3.120315951,124.3359224,-6.690696854,93.5198569
+1/8/2022 8:00,53.7159,712.7328,0.5639276,1.317298,-17.23039,-15.48065,84.48509871,84.6359357,5.51490129,5.364064302,126.9915848,-6.695081746,90.17087799
+1/8/2022 8:15,118.4393,712.9135,1.060974,2.160605,-15.0431,-14.27914,82.35582928,82.47022076,7.644170716,7.529779236,129.7214726,-6.699465654,86.84539892
+1/8/2022 8:30,178.7119,727.8467,1.70792,3.267678,-12.56351,-12.68872,80.29752422,80.38976198,9.702475781,9.610238019,132.531452,-6.703848578,83.54657655
+1/8/2022 8:45,229.1344,744.0621,2.403464,4.43831,-9.7091,-10.86712,78.32467001,78.40218232,11.67532999,11.59781768,135.4267316,-6.708230517,80.27802086
+1/8/2022 9:00,283.3393,742.9146,3.183663,5.727341,-6.632256,-9.698561,76.4483767,76.51548173,13.5516233,13.48451827,138.4116971,-6.712611471,77.04388503
+1/8/2022 9:15,340.4345,737.559,4.049728,7.135538,-3.476189,-9.229922,74.67856917,74.73799312,15.32143083,15.26200688,141.4897151,-6.71699144,73.84897261
+1/8/2022 9:30,397.3871,734.9936,4.948856,8.591103,-0.6373556,-8.824478,73.02473571,73.07831296,16.97526429,16.92168704,144.6629123,-6.721370422,70.6988644
+1/8/2022 9:45,448.8757,740.6627,5.799555,10.00797,1.997194,-8.212961,71.49617483,71.54520493,18.50382517,18.45479507,147.9319396,-6.725748418,67.6000713
+1/8/2022 10:00,496.998,744.7946,6.598347,11.35083,4.388484,-7.733106,70.1020287,70.14747317,19.8979713,19.85252683,151.2957333,-6.730125427,64.56021591
+1/8/2022 10:15,545.2042,742.1495,7.356701,12.59512,6.355134,-7.279706,68.8512063,68.89380427,21.1487937,21.10619573,154.7512975,-6.734501449,61.58824516
+1/8/2022 10:30,587.3698,739.6846,8.013463,13.71229,7.31905,-6.8926,67.75224112,67.79258089,22.24775888,22.20741911,158.2935256,-6.738876482,58.69467861
+1/8/2022 10:45,625.1849,735.5093,8.627288,14.775,7.956905,-6.943189,66.81310603,66.85167147,23.18689397,23.14832853,161.9150923,-6.743250527,55.89188993
+1/8/2022 11:00,663.0563,731.7748,9.188962,15.77063,9.277022,-6.302939,66.04100243,66.07820433,23.95899757,23.92179567,165.606441,-6.747623583,53.1944134
+1/8/2022 11:15,696.7172,728.2745,9.66405,16.59958,10.44983,-5.504172,65.44214114,65.47833923,24.55785886,24.52166077,169.3558878,-6.75199565,50.61925963
+1/8/2022 11:30,725.6235,724.3461,10.12142,17.32495,12.53246,-5.148506,65.02153166,65.05705089,24.97846834,24.94294911,173.1498572,-6.756366727,48.18620445
+1/8/2022 11:45,749.7322,721.3585,10.56052,18.00509,15.51984,-4.740611,64.78279775,64.81794078,25.21720225,25.18205922,176.9732482,-6.760736813,45.91798949
+1/8/2022 12:00,769.2346,689.2787,11.56418,18.60409,16.51859,-4.404428,64.7280361,64.76309375,25.2719639,25.23690625,180.8099156,-6.765105909,43.84034308
+1/8/2022 12:15,779.9653,645.754,13.07733,19.363,17.58196,-3.612078,64.8577315,64.89299192,25.1422685,25.10700808,184.6432336,-6.769474014,41.98169019
+1/8/2022 12:30,782.1226,664.85,12.818,19.53,19.63173,-2.644939,65.17073684,65.2064945,24.82926316,24.7935055,188.4567006,-6.773841126,40.37239528
+1/8/2022 12:45,783.1979,709.5833,11.64067,19.19733,18.84575,-2.716406,65.66432011,65.70088538,24.33567989,24.29911462,192.2345324,-6.778207247,39.04339647
+1/8/2022 13:00,784.975,725.1216,11.42,19.17167,15.61306,-3.587117,66.33427343,66.37198371,23.66572657,23.62801629,195.9621973,-6.782572374,38.02417062
+1/8/2022 13:15,780.9112,727.6367,11.346,19.129,14.00154,-3.869656,67.17507388,67.21430743,22.82492612,22.78569257,199.6268537,-6.786936509,37.34015025
+1/8/2022 13:30,765.2518,727.3134,11.177,18.92133,13.82588,-3.610361,68.18008064,68.22127484,21.81991936,21.77872516,203.2176641,-6.79129965,37.00996526
+1/8/2022 13:45,740.9526,726.7657,10.708,18.299,14.56244,-2.793789,69.3417511,69.38542778,20.6582489,20.61457222,206.725976,-6.795661796,37.04309952
+1/8/2022 14:00,709.5437,620.98,12.18467,15.79634,13.53716,-1.912639,70.65185897,70.69866099,19.34814103,19.30133901,210.1453771,-6.800022949,37.43859094
+1/8/2022 14:15,671.825,441.404,15.7,13.63367,6.257056,-1.29185,72.10169639,72.15244264,17.89830361,17.84755736,213.4716405,-6.804383106,38.18516698
+1/8/2022 14:30,630.3785,379.8184,16.26266,13.11433,-0.3917278,-1.087939,73.68224376,73.7380157,16.31775624,16.2619843,216.7025844,-6.808742267,39.26277307
+1/8/2022 14:45,581.6162,417.499,13.15166,12.01033,-2.716489,-1.364267,75.38428938,75.44657347,14.61571062,14.55342653,219.8378758,-6.813100432,40.64504035
+1/8/2022 15:00,483.0581,524.0798,8.609937,10.20707,-3.975006,-1.509856,77.19846832,77.26940462,12.80153168,12.73059538,222.8788004,-6.817457602,42.30205125
+1/8/2022 15:15,262.1823,657.8612,5.115272,8.424401,-4.714045,-2.453372,79.11516078,79.19800734,10.88483922,10.80199266,225.8280238,-6.821813774,44.20284253
+1/8/2022 15:30,64.45077,713.389,3.642,6.856,-6.03235,-3.901322,81.1240961,81.2241747,8.8759039,8.775825302,228.6893601,-6.826168948,46.3173219
+1/8/2022 15:45,12.33504,588.8594,1.779109,3.455068,-8.106678,-5.397406,83.21320354,83.34005287,6.786796463,6.659947126,231.4675607,-6.830523125,48.61751553
+1/8/2022 16:00,5.303792,434.3088,0.3371089,0.7417347,-9.913333,-6.731661,85.36511951,85.53817616,4.63488049,4.461823845,234.1681294,-6.834876303,51.07822796
+1/8/2022 16:15,1.399042,438.295,0.1483333,0.4066667,-11.47135,-7.768722,87.54477142,87.81148363,2.455228582,2.188516371,236.7971715,-6.839228483,53.67726569
+1/8/2022 16:30,0.03017192,483.3435,0.03333334,0.135,-12.78197,-8.635422,89.65401458,90.15331943,0.345985424,-0.153319431,239.3612744,-6.843579663,56.39537499
+1/8/2022 16:45,-0.662256,497.6038,0,0,-13.73166,-9.240155,92.55742059,92.55742059,-2.557420591,-2.557420591,241.8674207,-6.847929843,59.21601862
+1/8/2022 17:00,-0.662256,,,,-14.38842,-9.818117,95.01789625,95.01789625,-5.017896248,-5.017896248,244.3229351,-6.852279023,62.12507955
+1/8/2022 17:15,0.0476446,,,,-14.86515,-10.43469,97.52919851,97.52919851,-7.529198507,-7.529198507,246.7354593,-6.856627203,65.11054476
+1/8/2022 17:30,-0.03971964,,,,-15.17625,-10.84608,100.0860875,100.0860875,-10.08608745,-10.08608745,249.1129567,-6.860974381,68.16220148
+1/8/2022 17:45,0.1223278,,,,-15.38373,-11.07439,102.6835924,102.6835924,-12.68359242,-12.68359242,251.4637454,-6.865320558,71.27136256
+1/8/2022 18:00,0.2478162,,,,-15.46451,-11.23753,105.316968,105.316968,-15.31696804,-15.31696804,253.796559,-6.869665732,74.43062456
+1/8/2022 18:15,0.03812412,,,,-15.66088,-11.59304,107.981646,107.981646,-17.98164604,-17.98164604,256.1206373,-6.874009904,77.63365998
+1/8/2022 18:30,0,,,,-16.08951,-12.13976,110.6731834,110.6731834,-20.67318342,-20.67318342,258.4458498,-6.878353073,80.87504241
+1/8/2022 18:45,0.03018606,,,,-16.45156,-12.34192,113.3872038,113.3872038,-23.38720378,-23.38720378,260.7828559,-6.882695239,84.15009861
+1/8/2022 19:00,0.1970177,,,,-16.55363,-12.35369,116.1193312,116.1193312,-26.11933119,-26.11933119,263.1433079,-6.8870364,87.45478438
+1/8/2022 19:15,0.1668316,,,,-16.66676,-12.79165,118.8651152,118.8651152,-28.86511519,-28.86511519,265.5401094,-6.891376557,90.78558216
+1/8/2022 19:30,0,,,,-16.94557,-13.31894,121.6199414,121.6199414,-31.61994137,-31.61994137,267.987736,-6.89571571,94.13941391
+1/8/2022 19:45,0,,,,-17.07684,-13.32877,124.3789238,124.3789238,-34.3789238,-34.3789238,270.50264,-6.900053856,97.51356765
+1/8/2022 20:00,0.1191648,,,,-17.17077,-13.27779,127.1367741,127.1367741,-37.13677406,-37.13677406,273.1037572,-6.904390997,100.9056364
+1/8/2022 20:15,0.1191648,,,,-17.27254,-13.51332,129.8876357,129.8876357,-39.88763567,-39.88763567,275.8131427,-6.908727132,104.3134642
+1/8/2022 20:30,0.009533565,,,,-17.46061,-13.81308,132.6248733,132.6248733,-42.62487328,-42.62487328,278.6567673,-6.91306226,107.7350994
+1/8/2022 20:45,0.009533565,,,,-17.63806,-13.97781,135.3408011,135.3408011,-45.34080113,-45.34080113,281.6655108,-6.917396381,111.1687531
+1/8/2022 21:00,0.01748044,,,,-17.65191,-14.04951,138.0263269,138.0263269,-48.02632694,-48.02632694,284.8763828,-6.921729494,114.6127597
+1/8/2022 21:15,0.1303134,,,,-17.55046,-14.23335,140.6704833,140.6704833,-50.67048329,-50.67048329,288.3339888,-6.926061599,118.0655388
+1/8/2022 21:30,0.619807,,,,-16.90331,-14.26877,143.2598113,143.2598113,-53.25981125,-53.25981125,292.0922125,-6.930392695,121.5255561
+1/8/2022 21:45,1.827706,,,,-15.7325,-13.88346,145.7775515,145.7775515,-55.77755152,-55.77755152,296.2159671,-6.934722783,124.9912802
+1/8/2022 22:00,2.787635,,,,-14.3485,-12.8051,148.2026045,148.2026045,-58.20260449,-58.20260449,300.7826323,-6.939051861,128.4611302
+1/8/2022 22:15,1.694152,,,,-13.05991,-11.82164,150.508246,150.508246,-60.508246,-60.508246,305.8823267,-6.943379928,131.9334121
+1/8/2022 22:30,0.2590311,,,,-12.40802,-11.60614,152.6606631,152.6606631,-62.66066313,-62.66066313,311.6153395,-6.947706986,135.4062307
+1/8/2022 22:45,0.03178115,,,,-12.63093,-11.55431,154.6175669,154.6175669,-64.61756688,-64.61756688,318.0838331,-6.952033032,138.8773648
+1/8/2022 23:00,0,,,,-13.36034,-11.64495,156.3275025,156.3275025,-66.32750245,-66.32750245,325.3737408,-6.956358068,142.3440827
+1/8/2022 23:15,0,,,,-13.96755,-11.90703,157.7310151,157.7310151,-67.73101511,-67.73101511,333.5232612,-6.960682091,145.8028508
+1/8/2022 23:30,0.1541228,,,,-13.96076,-12.05774,158.7652675,158.7652675,-68.76526745,-68.76526745,342.4800142,-6.965005102,149.2488568
+1/8/2022 23:45,0.1604783,,,,-13.51169,-11.79733,159.3732147,159.3732147,-69.37321466,-69.37321466,352.0625567,-6.969327101,152.6751907
+1/9/2022 0:00,0.00635551,,,,-13.40725,-11.5301,159.5160487,159.5160487,-69.51604875,-69.51604875,1.956718267,-6.973648086,156.0713534
+1/9/2022 0:15,0,,,,-13.64297,-11.567,159.1839923,159.1839923,-69.18399233,-69.18399233,11.77085741,-6.977968058,159.4203756
+1/9/2022 0:30,0,,,,-13.71872,-11.48884,158.3993186,158.3993186,-68.39931861,-68.39931861,21.13396252,-6.982287015,162.6928527
+1/9/2022 0:45,0.00953331,,,,-13.92492,-11.60888,157.2096426,157.2096426,-67.20964257,-67.20964257,29.78179551,-6.986604958,165.8336218
+1/9/2022 1:00,1.361695,,,,-13.54214,-11.50422,155.6756914,155.6756914,-65.67569141,-65.67569141,37.58767099,-6.990921886,168.7300181
+1/9/2022 1:15,2.817148,,,,-11.59972,-9.968322,153.859777,153.859777,-63.85977698,-63.85977698,44.54084117,-6.995237799,171.1372049
+1/9/2022 1:30,2.249904,,,,-9.700678,-8.435923,151.8184707,151.8184707,-61.81847071,-61.81847071,50.70326112,-6.999552696,172.5623888
+1/9/2022 1:45,1.645994,,,,-8.824189,-7.863945,149.5995597,149.5995597,-59.59955966,-59.59955966,56.17033197,-7.003866576,172.4283366
+1/9/2022 2:00,1.453575,,,,-8.324639,-7.297378,147.2417973,147.2417973,-57.24179734,-57.24179734,61.0449906,-7.008179439,170.8029834
+1/9/2022 2:15,1.262848,,,,-7.924272,-6.700695,144.7759784,144.7759784,-54.77597844,-54.77597844,65.42405382,-7.012491286,168.2922197
+1/9/2022 2:30,1.159624,,,,-7.296667,-6.223367,142.2264061,142.2264061,-52.22640607,-52.22640607,69.39264612,-7.016802114,165.3450002
+1/9/2022 2:45,0.9118455,,,,-6.514361,-5.847961,139.6122999,139.6122999,-49.61229988,-49.61229988,73.02303898,-7.021111925,162.1774742
+1/9/2022 3:00,0.6290829,,,,-5.891955,-5.596139,136.9489849,136.9489849,-46.94898489,-46.94898489,76.37553346,-7.025420716,158.8896408
+1/9/2022 3:15,0.5400403,,,,-5.426033,-5.423083,134.248835,134.248835,-44.24883498,-44.24883498,79.50009253,-7.029728489,155.5311169
+1/9/2022 3:30,0.6019191,,,,-5.103567,-5.246367,131.5219988,131.5219988,-41.52199881,-41.52199881,82.43809439,-7.034035242,152.1287033
+1/9/2022 3:45,0.4430993,,,,-4.891228,-5.078378,128.7769529,128.7769529,-38.7769529,-38.7769529,85.22393638,-7.038340975,148.6980477
+1/9/2022 4:00,0.6146593,,,,-4.699261,-4.842522,126.0209213,126.0209213,-36.02092129,-36.02092129,87.88640345,-7.042645688,145.2489319
+1/9/2022 4:15,0.5177783,,,,-4.485039,-4.637522,123.2601941,123.2601941,-33.26019413,-33.26019413,90.44979533,-7.04694938,141.7878528
+1/9/2022 4:30,0.2287135,,,,-4.312117,-4.544483,120.5003732,120.5003732,-30.50037323,-30.50037323,92.93483623,-7.05125205,138.3193726
+1/9/2022 4:45,0.2318901,,,,-4.174628,-4.452839,117.7465632,117.7465632,-27.74656319,-27.74656319,95.35940302,-7.055553699,134.8468692
+1/9/2022 5:00,0.2239488,,,,-4.059383,-4.344995,115.0035212,115.0035212,-25.00352119,-25.00352119,97.73910684,-7.059854325,131.3729738
+1/9/2022 5:15,0.5130196,,,,-3.927867,-4.205622,112.2757784,112.2757784,-22.27577839,-22.27577839,100.0877558,-7.064153929,127.8998411
+1/9/2022 5:30,0.784606,,,,-3.75625,-4.044583,109.5677396,109.5677396,-19.56773962,-19.56773962,102.4177239,-7.06845251,124.4293238
+1/9/2022 5:45,0.7512316,,,,-3.581239,-3.868789,106.8837659,106.8837659,-16.88376594,-16.88376594,104.7402463,-7.072750067,120.9630882
+1/9/2022 6:00,0.6447884,,,,-3.415433,-3.689111,104.2282465,104.2282465,-14.22824648,-14.22824648,107.0656535,-7.0770466,117.5026978
+1/9/2022 6:15,0.4891289,,,,-3.236506,-3.508717,101.6056614,101.6056614,-11.60566142,-11.60566142,109.4035569,-7.081342108,114.0496763
+1/9/2022 6:30,0.2667922,,,,-2.910433,-3.441333,99.02063728,99.02063728,-9.020637284,-9.020637284,111.7629946,-7.085636592,110.6055561
+1/9/2022 6:45,0.6082185,,,,-2.442728,-3.547633,96.477998,96.477998,-6.477998003,-6.477998003,114.1525409,-7.08993005,107.1719214
+1/9/2022 7:00,0.8956422,,,,-2.557844,-3.571678,93.98281163,93.98281163,-3.982811631,-3.982811631,116.5803859,-7.094222483,103.7504471
+1/9/2022 7:15,3.072767,387.8831,0.0569149,0.1739361,-2.628611,-3.3921,91.54043189,91.54043189,-1.540431886,-1.540431886,119.0543852,-7.098513889,100.3429366
+1/9/2022 7:30,8.81303,415.2222,0.2065084,0.4788142,-2.292044,-3.19885,88.78323124,89.15653644,1.216768756,0.843463563,121.5820824,-7.102804269,96.95136092
+1/9/2022 7:45,21.56192,427.5607,0.5023713,0.8650631,-1.863439,-2.979739,86.61948882,86.8371601,3.380511176,3.162839899,124.1707021,-7.107093621,93.57790213
+1/9/2022 8:00,30.89223,447.6251,0.7532163,1.17422,-1.424039,-2.725489,84.43890244,84.58872078,5.561097559,5.41127922,126.8271147,-7.111381945,90.22499964
+1/9/2022 8:15,25.76554,437.6198,0.6206141,1.025439,-1.259967,-2.494806,82.30432179,82.41803822,7.695678209,7.581961775,129.5577697,-7.115669242,86.8954053
+1/9/2022 8:30,25.84596,435.9352,0.5874832,0.9969805,-1.161594,-2.344511,80.24060192,80.33234219,9.759398079,9.667657813,132.3685963,-7.11995551,83.59224726
+1/9/2022 8:45,35.99024,451.5883,0.9061007,1.359082,-1.176889,-2.213256,78.26214844,78.33926618,11.73785156,11.66073382,135.2648715,-7.124240749,80.31910403
+1/9/2022 9:00,32.7191,450.0129,0.8504952,1.288767,-1.329556,-2.044894,76.38005012,76.44682513,13.61994988,13.55317487,138.251054,-7.128524959,77.08009398
+1/9/2022 9:15,37.71581,451.7602,0.9896302,1.445263,-1.142839,-1.827717,74.60423562,74.66337224,15.39576438,15.33662776,141.3305876,-7.132808139,73.87998217
+1/9/2022 9:30,51.26643,459.1383,1.303992,1.81,-0.55685,-1.645961,72.94421131,72.99753043,17.05578869,17.00246957,144.5056789,-7.137090289,70.72430676
+1/9/2022 9:45,42.73662,450.0847,1.038259,1.510488,-0.2955389,-1.599039,71.40930438,71.45809668,18.59069562,18.54190332,147.7770587,-7.141371408,67.61953165
+1/9/2022 10:00,31.53484,440.6633,0.7415429,1.161647,-0.30645,-1.531078,70.00869492,70.05391575,19.99130508,19.94608425,151.143741,-7.145651496,64.57322804
+1/9/2022 10:15,31.07614,442.0604,0.7312346,1.153801,-0.2672722,-1.374339,68.75133825,68.7937222,21.24866175,21.2062778,154.6028002,-7.149930552,61.59428735
+1/9/2022 10:30,36.09766,445.5299,0.8779284,1.32785,-0.1983556,-1.21085,67.6458218,67.68595369,22.3541782,22.31404631,158.1491894,-7.154208577,58.6931705
+1/9/2022 10:45,52.39709,455.2073,1.303918,1.807421,-0.1203889,-1.112961,66.70017882,66.7385397,23.29982118,23.2614603,161.7756263,-7.158485569,55.88219139
+1/9/2022 11:00,64.61899,465.7863,1.663139,2.219054,-0.02253889,-1.0043,65.92167582,65.9586741,24.07832418,24.0413259,165.4725763,-7.162761527,53.17582673
+1/9/2022 11:15,68.83768,468.8048,1.848625,2.41598,0.07267223,-0.8706111,65.31659121,65.35258447,24.68340879,24.64741553,169.228353,-7.167036453,50.59103739
+1/9/2022 11:30,69.20121,468.2476,1.887293,2.458967,0.13605,-0.7171834,64.8900019,64.92531307,25.1099981,25.07468693,173.0293506,-7.171310345,48.14756563
+1/9/2022 11:45,56.9426,461.7179,1.501948,2.046467,0.1126556,-0.6008278,64.64559585,64.6805256,25.35440415,25.3194744,176.86041,-7.175583202,45.86814758
+1/9/2022 12:00,56.80862,462.2952,1.458844,2.006563,0.1285778,-0.5316556,64.58552784,64.62036486,25.41447216,25.37963514,180.7053017,-7.179855025,43.77854968
+1/9/2022 12:15,68.8506,469.1627,1.863639,2.451175,0.1907889,-0.4643889,64.71033185,64.74536197,25.28966815,25.25463803,184.5472937,-7.184125813,41.9072969
+1/9/2022 12:30,82.78529,471.9665,2.334018,2.924021,0.2629667,-0.3776389,65.01889899,65.05441403,24.98110101,24.94558597,188.3697623,-7.188395565,40.28493357
+1/9/2022 12:45,99.85497,475.1663,2.862092,3.4589,0.3741944,-0.2492056,65.50852315,65.54483032,24.49147685,24.45516968,192.1567928,-7.192664281,38.94266952
+1/9/2022 13:00,89.62246,475.0538,2.693471,3.311073,0.4039389,-0.1354278,66.17500964,66.21244243,23.82499036,23.78755757,195.8937221,-7.196931961,37.91034308
+1/9/2022 13:15,55.17453,462.2144,1.613204,2.173238,0.3310167,-0.07841667,67.01283643,67.05176816,22.98716357,22.94823184,199.5675842,-7.201198603,37.21381395
+1/9/2022 13:30,37.38332,451.7408,0.9267408,1.437777,0.2778445,-0.03804445,68.01535268,68.05621431,21.98464732,21.94378569,203.1674296,-7.205464209,36.87215661
+1/9/2022 13:45,37.25303,453.8198,0.927223,1.472868,0.3871111,-0.01590556,69.17499674,69.21830151,20.82500326,20.78169849,206.6845107,-7.209728777,36.89525229
+1/9/2022 14:00,41.64345,457.6722,1.079572,1.652161,0.6049278,0.02986111,70.48351672,70.52989565,19.51648328,19.47010435,210.11234,-7.213992306,37.28242643
+1/9/2022 14:15,39.3651,456.8824,1.029052,1.579552,0.7462167,0.1289778,71.93217538,71.98243056,18.06782462,18.01756944,213.4466349,-7.218254797,38.02254449
+1/9/2022 14:30,35.24826,456.2649,0.8736153,1.402661,0.8213111,0.2454944,73.51192329,73.56711137,16.48807671,16.43288863,216.6851777,-7.222516249,39.09553592
+1/9/2022 14:45,32.03051,460.0766,0.7254503,1.231116,0.9793278,0.3769445,75.21352267,75.27509191,14.78647733,14.72490809,219.8276164,-7.226776661,40.47488938
+1/9/2022 15:00,22.40017,451.11,0.4576428,0.8928917,1.0494,0.4924555,77.02759281,77.09762123,12.97240719,12.90237877,222.8752332,-7.231036034,42.13046376
+1/9/2022 15:15,13.03565,448.6428,0.2574566,0.6145698,0.9437389,0.5760167,78.94452094,79.02615886,11.05547906,10.97384114,225.8307016,-7.235294366,44.03103764
+1/9/2022 15:30,7.546001,491.0407,0.1322314,0.4409091,0.8371111,0.6136222,80.95409567,81.05246109,9.045904327,8.947538914,228.6978539,-7.239551657,46.14626264
+1/9/2022 15:45,5.510188,529.8298,0.08489208,0.3482014,0.7872722,0.6512445,83.04444003,83.16863962,6.955559969,6.831360378,231.4814656,-7.243807908,48.44793385
+1/9/2022 16:00,3.456938,519.7018,0.03489209,0.1482014,0.7574278,0.6798667,85.19879549,85.36719696,4.801204506,4.63280304,234.1870699,-7.248063116,50.9106605
+1/9/2022 16:15,1.259233,362.2063,0,0,0.6990889,0.6826167,87.38422079,87.64104313,2.615779212,2.358956871,236.8208038,-7.252317282,53.5120916
+1/9/2022 16:30,0.1730865,219.288,0,0,0.6839667,0.7227722,89.50910226,89.98349588,0.490897741,0.016504116,239.3892875,-7.256570406,56.23285099
+1/9/2022 16:45,0,,,,0.6773111,0.74395,92.3882684,92.3882684,-2.3882684,-2.3882684,241.8995366,-7.260822487,59.05630889
+1/9/2022 17:00,0,,,,0.6896945,0.7746056,94.84944825,94.84944825,-4.84944825,-4.84944825,244.3589076,-7.265073524,61.96828012
+1/9/2022 17:15,0,,,,0.7283,0.8204167,97.36146799,97.36146799,-7.361467993,-7.361467993,246.7750727,-7.269323518,64.95670267
+1/9/2022 17:30,0,,,,0.7478889,0.8272333,99.91906989,99.91906989,-9.919069888,-9.919069888,249.156023,-7.273572467,68.01132953
+1/9/2022 17:45,0,,,,0.7464667,0.7939722,102.5172669,102.5172669,-12.51726686,-12.51726686,251.5101019,-7.277820372,71.12345046
+1/9/2022 18:00,0,,,,0.7157778,0.77275,105.1512983,105.1512983,-15.15129826,-15.15129826,253.8460649,-7.282067231,74.28564733
+1/9/2022 18:15,0,,,,0.7197889,0.7926,107.8165814,107.8165814,-17.81658136,-17.81658136,256.1731698,-7.286313045,77.49158416
+1/9/2022 18:30,0,,,,0.7552,0.8033444,110.5086592,110.5086592,-20.50865924,-20.50865924,258.5012996,-7.290557813,80.73583078
+1/9/2022 18:45,0,,,,0.7590055,0.8400834,113.2231419,113.2231419,-23.22314189,-23.22314189,260.8411218,-7.294801535,84.01371359
+1/9/2022 19:00,0,,,,0.7670722,0.8812444,115.9556398,115.9556398,-25.95563984,-25.95563984,263.2042901,-7.299044209,87.32119077
+1/9/2022 19:15,0,,,,0.7748778,0.8736111,118.7016889,118.7016889,-28.70168894,-28.70168894,265.6037001,-7.303285837,90.65474916
+1/9/2022 19:30,0,,,,0.7825111,0.8762611,121.4566608,121.4566608,-31.45666084,-31.45666084,268.0538086,-7.307526417,94.0113168
+1/9/2022 19:45,0,,,,0.8273,0.8817611,124.2156554,124.2156554,-34.21565537,-34.21565537,270.5710334,-7.311765948,97.38818927
+1/9/2022 20:00,0,,,,0.7757056,0.7750056,126.9733696,126.9733696,-36.97336963,-36.97336963,273.1742547,-7.316004431,100.7829685
+1/9/2022 20:15,0,,,,0.6372445,0.6124055,129.7239328,129.7239328,-39.72393282,-39.72393282,275.8854435,-7.320241865,104.193509
+1/9/2022 20:30,0,,,,0.6011944,0.5915889,132.460696,132.460696,-42.46069601,-42.46069601,278.730446,-7.32447825,107.6178707
+1/9/2022 20:45,0,,,,0.7408056,0.8735278,135.175962,135.175962,-45.17596205,-45.17596205,281.7399608,-7.328713584,111.0542785
+1/9/2022 21:00,0,,,,0.8743111,1.126167,137.8606316,137.8606316,-47.86063163,-47.86063163,284.950737,-7.332947869,114.5010827
+1/9/2022 21:15,0,,,,0.9024944,1.153844,140.5037386,140.5037386,-50.50373864,-50.50373864,288.4070082,-7.337181102,117.9567215
+1/9/2022 21:30,0,,,,0.9392444,1.252283,143.0918401,143.0918401,-53.09184009,-53.09184009,292.1621308,-7.341413285,121.419683
+1/9/2022 21:45,0,,,,1.027428,1.58825,145.6082176,145.6082176,-55.60821764,-55.60821764,296.2802784,-7.345644416,124.8884627
+1/9/2022 22:00,0.1222684,,,,1.113867,2.017889,148.0318537,148.0318537,-58.03185366,-58.03185366,300.8378119,-7.349874495,128.3615136
+1/9/2022 22:15,0.1953116,,,,1.076989,2.221778,150.3361708,150.3361708,-60.33617084,-60.33617084,305.9234904,-7.354103522,131.837184
+1/9/2022 22:30,0.3985631,,,,1.089172,2.086005,152.4876008,152.4876008,-62.48760081,-62.48760081,311.6358885,-7.358331496,135.3136337
+1/9/2022 22:45,1.03692,,,,1.201961,1.98915,154.4442351,154.4442351,-64.44423507,-64.44423507,318.0752274,-7.362558416,138.7887144
+1/9/2022 23:00,1.41484,,,,1.361289,2.035178,156.1551642,156.1551642,-66.15516422,-66.15516422,325.3256989,-7.366784283,142.2597931
+1/9/2022 23:15,1.082945,,,,1.361522,1.920817,157.5616281,157.5616281,-67.56162815,-67.56162815,333.4248568,-7.371009096,145.7234744
+1/9/2022 23:30,0.465252,,,,1.065783,1.708306,158.6015182,158.6015182,-68.60151819,-68.60151819,342.3220768,-7.375232854,149.1751456
+1/9/2022 23:45,0.08574665,,,,0.6295056,1.495756,159.2183041,159.2183041,-69.21830414,-69.21830414,351.8410932,-7.379455557,152.6081948
+1/10/2022 0:00,0,,,,0.05334444,1.249272,159.3731701,159.3731701,-69.37317006,-69.37317006,1.675766729,-7.383677205,156.0125874
+1/10/2022 0:15,0,,,,-0.4892444,0.97405,159.0556506,159.0556506,-69.05565063,-69.05565063,11.44256091,-7.387897797,159.3721118
+1/10/2022 0:30,0,,,,-0.7173667,0.7203611,158.2868237,158.2868237,-68.28682371,-68.28682371,20.775247,-7.392117333,162.6586604
+1/10/2022 0:45,0,,,,-0.7944222,0.4369389,157.1130159,157.1130159,-67.11301594,-67.11301594,29.4096738,-7.396335812,165.819389
+1/10/2022 1:00,0,,,,-1.066556,0.1304667,155.5939425,155.5939425,-65.59394255,-65.59394255,37.21582893,-7.400553235,168.7457735
+1/10/2022 1:15,0,,,,-1.391644,-0.1779611,153.7913219,153.7913219,-63.79132188,-63.79132188,44.17849131,-7.404769599,171.1989224
+1/10/2022 1:30,0,,,,-1.754378,-0.4308056,151.7614987,151.7614987,-61.7614987,-61.7614987,50.35561925,-7.408984906,172.6845485
+1/10/2022 1:45,0,,,,-2.028239,-0.5691778,149.5522748,149.5522748,-59.55227482,-59.55227482,55.83970285,-7.413199154,172.5946448
+1/10/2022 2:00,0,,,,-2.195017,-0.7263556,147.2025446,147.2025446,-57.20254458,-57.20254458,60.73182145,-7.417412344,170.9761666
+1/10/2022 2:15,0,,,,-2.3734,-1.00645,144.7432918,144.7432918,-54.74329178,-54.74329178,65.12772605,-7.421624475,168.4554746
+1/10/2022 2:30,0,,,,-2.690961,-1.396917,142.1990133,142.1990133,-52.1990133,-52.1990133,69.11199733,-7.425835545,165.4963043
+1/10/2022 2:45,0,,,,-3.095078,-1.788644,139.5891066,139.5891066,-49.58910663,-49.58910663,72.75667967,-7.430045556,162.3183675
+1/10/2022 3:00,0,,,,-3.387289,-2.036833,136.9290511,136.9290511,-46.92905114,-46.92905114,76.12202714,-7.434254507,159.0219046
+1/10/2022 3:15,0,,,,-3.382306,-2.182945,134.2313505,134.2313505,-44.23135054,-44.23135054,79.25805131,-7.438462396,155.6561767
+1/10/2022 3:30,0,,,,-3.229517,-2.317889,131.5062608,131.5062608,-41.5062608,-41.5062608,82.20622485,-7.442669225,152.2476202
+1/10/2022 3:45,0,,,,-3.423872,-2.480894,128.7623462,128.7623462,-38.76234619,-38.76234619,85.00105735,-7.446874991,148.811602
+1/10/2022 4:00,0,,,,-3.889989,-2.664594,126.006902,126.006902,-36.00690199,-36.00690199,87.6714485,-7.451079696,145.3576995
+1/10/2022 4:15,0,,,,-4.36165,-2.860628,123.2462759,123.2462759,-33.24627587,-33.24627587,90.24180766,-7.455283338,141.892261
+1/10/2022 4:30,0,,,,-4.661489,-3.063028,120.4861159,120.4861159,-30.48611592,-30.48611592,92.73296009,-7.459485917,138.4197398
+1/10/2022 4:45,-0.1921244,,,,-5.099833,-3.314428,117.7315637,117.7315637,-27.73156372,-27.73156372,95.162874,-7.463687433,134.9434315
+1/10/2022 5:00,-0.331865,,,,-5.619717,-3.599161,114.9874058,114.9874058,-24.9874058,-24.9874058,97.54724245,-7.467887885,131.4659043
+1/10/2022 5:15,-0.1397406,,,,-5.727172,-3.761294,112.2581964,112.2581964,-22.25819638,-22.25819638,99.89994681,-7.472087273,127.9892631
+1/10/2022 5:30,0,,,,-5.737972,-3.888778,109.5483582,109.5483582,-19.54835817,-19.54835817,102.2334269,-7.476285596,124.5153198
+1/10/2022 5:45,0,,,,-5.996439,-4.031561,106.8622659,106.8622659,-16.86226586,-16.86226586,104.5589772,-7.480482854,121.045707
+1/10/2022 6:00,0,,,,-6.216061,-4.148594,104.2043187,104.2043187,-14.20431866,-14.20431866,106.886983,-7.484679047,117.581959
+1/10/2022 6:15,0,,,,-6.455728,-4.293417,101.579004,101.579004,-11.57900402,-11.57900402,109.2271062,-7.488874173,114.1255733
+1/10/2022 6:30,0,,,,-6.314078,-4.456339,98.99095347,98.99095347,-8.990953474,-8.990953474,111.5884333,-7.493068234,110.6780585
+1/10/2022 6:45,0.01905953,,,,-5.833139,-4.530222,96.44499426,96.44499426,-6.444994262,-6.444994262,113.9795855,-7.497261228,107.2409762
+1/10/2022 7:00,0.692495,383.188,0.02409638,0.0987952,-5.634478,-4.550517,93.94619658,93.94619658,-3.946196579,-3.946196579,116.4087993,-7.501453155,103.8159793
+1/10/2022 7:15,4.051762,526.9511,0.1061139,0.4018654,-5.548989,-4.618139,91.49991566,91.49991566,-1.499915657,-1.499915657,118.8839779,-7.505644014,100.4048493
+1/10/2022 7:30,12.19816,595.6187,0.2772382,0.8527027,-5.502817,-4.685505,88.74308961,89.11183062,1.256910393,0.888169376,121.4127142,-7.509833805,97.00953462
+1/10/2022 7:45,26.1817,650.2922,0.5858189,1.496214,-5.593117,-4.756772,86.57236112,86.78797831,3.427638884,3.212021685,124.0022847,-7.514022528,93.63219392
+1/10/2022 8:00,53.04212,674.6829,1.191891,2.648305,-5.328667,-4.744622,84.38610992,84.53477988,5.61389008,5.465220119,126.6596159,-7.518210183,90.27524166
+1/10/2022 8:15,63.54718,672.733,1.516714,3.262005,-4.698855,-4.707622,82.24609794,82.3590603,7.75390206,7.640939701,129.3912175,-7.522396768,86.94140286
+1/10/2022 8:30,68.67855,673.4453,1.789825,3.803138,-4.078267,-4.803972,80.17686814,80.26805733,9.823131859,9.731942665,132.2030838,-7.526582283,83.63377649
+1/10/2022 8:45,128.1625,690.8863,3.159209,6.298739,-3.396989,-4.881983,78.19273215,78.26941617,11.80726785,11.73058383,135.1005621,-7.530766729,80.35590904
+1/10/2022 9:00,258.7075,707.278,6.407966,12.33971,-1.426189,-4.716417,76.30475321,76.37116799,13.69524679,13.62883201,138.0881864,-7.534950104,77.1118836
+1/10/2022 9:15,302.9229,703.8668,7.857469,15.01594,1.02055,-4.513289,74.52286273,74.58168769,15.47713727,15.41831231,141.1694794,-7.539132409,73.90642621
+1/10/2022 9:30,342.8206,706.5677,8.353184,16.15252,2.246606,-4.417528,72.85658549,72.90962625,17.14341451,17.09037375,144.3467293,-7.543313642,70.74503199
+1/10/2022 9:45,401.7205,709.0213,9.823538,19.08778,4.194889,-4.218417,71.31527845,71.36381565,18.68472155,18.63618435,147.6207487,-7.547493803,67.63411743
+1/10/2022 10:00,304.8503,716.7634,7.813375,15.29169,3.4033,-4.382744,69.90816105,69.95314311,20.09183895,20.04685689,150.9906296,-7.551672893,64.58120197
+1/10/2022 10:15,205.1662,730.3998,5.165438,10.36973,-0.04825,-4.857044,68.64423667,68.68639313,21.35576333,21.31360687,154.4535178,-7.55585091,61.59512133
+1/10/2022 10:30,267.5282,735.8053,6.616628,13.21098,-0.7569278,-5.012455,67.53214852,67.57206034,22.46785148,22.42793966,158.0044251,-7.560027854,58.6862778
+1/10/2022 10:45,523.0055,724.6243,14.00415,27.09476,3.920489,-4.552516,66.57999208,66.61813722,23.42000792,23.38186278,161.6361109,-7.564203725,55.86692575
+1/10/2022 11:00,483.6143,719.5889,13.37476,25.8814,7.599189,-4.255789,65.7951007,65.83188497,24.2048993,24.16811503,165.3390608,-7.568378522,53.15148506
+1/10/2022 11:15,218.3991,735.9229,5.694468,11.52701,3.228567,-4.7219,65.18382195,65.21960064,24.81617805,24.78039936,169.101582,-7.572552245,50.55686817
+1/10/2022 11:30,266.6568,747.065,6.320264,12.6918,0.2843722,-4.821116,64.75130134,64.78639523,25.24869866,25.21360477,172.9100341,-7.576724894,48.10278596
+1/10/2022 11:45,360.4281,749.3061,9.423651,18.70288,1.362289,-4.67395,64.50129188,64.53599953,25.49870812,25.46400047,176.7491948,-7.580896468,45.81197248
+1/10/2022 12:00,446.2309,738.8746,11.98311,23.68973,5.042383,-4.289011,64.43600668,64.4706146,25.56399332,25.5293854,180.6027444,-7.585066966,43.71023729
+1/10/2022 12:15,516.1099,734.2482,13.68329,27.06325,6.931684,-3.955055,64.55602868,64.59082031,25.44397132,25.40917969,184.4538384,-7.589236389,41.82621238
+1/10/2022 12:30,666.6237,744.389,16.89801,34.13988,8.079233,-3.915461,64.86028636,64.8955508,25.13971364,25.1044492,188.2857249,-7.593404736,40.19063136
+1/10/2022 12:45,836.6114,745.2263,18.96199,38.32774,11.36502,-3.718539,65.34609814,65.38213937,24.65390186,24.61786063,192.0823531,-7.597572006,38.83498756
+1/10/2022 13:00,849.2806,738.7607,18.70629,37.07943,12.64396,-3.686628,66.0092806,66.04642819,23.9907194,23.95357181,195.828924,-7.601738199,37.78949435
+1/10/2022 13:15,849.4475,731.1484,19.22781,37.45869,15.15191,-3.299989,66.84431043,66.88293272,23.15568957,23.11706728,199.5123429,-7.605903315,37.08045254
+1/10/2022 13:30,689.2693,725.7772,16.70634,32.56181,13.95149,-3.339422,67.84452422,67.88504574,22.15547578,22.11495426,203.1215461,-7.610067353,36.72739307
+1/10/2022 13:45,401.7318,731.951,11.21815,22.17096,7.797722,-3.889472,69.00233867,69.04526406,20.99766133,20.95473594,206.6476895,-7.614230313,36.74060166
+1/10/2022 14:00,248.8409,743.2861,7.27232,14.49127,3.417867,-4.0823,70.30947361,70.3554221,19.69052639,19.6445779,210.08421,-7.618392194,37.11969131
+1/10/2022 14:15,209.2755,747.0358,5.687728,11.34636,1.027011,-4.301672,71.75715982,71.80691679,18.24284018,18.19308321,213.4267703,-7.622552997,37.85365794
+1/10/2022 14:30,138.7578,744.8886,3.675613,7.419622,-1.688361,-4.709672,73.33631555,73.39091307,16.66368445,16.60908693,216.6731183,-7.62671272,38.92240107
+1/10/2022 14:45,112.0935,743.9083,3.05655,6.338306,-3.195194,-4.9793,75.03767452,75.09852316,14.96232548,14.90147684,219.8228855,-7.630871363,40.29924949
+1/10/2022 15:00,110.0491,735.4326,3.003352,6.220262,-2.988489,-5.111539,76.85183776,76.92095457,13.14816224,13.07904543,222.877353,-7.635028926,41.95382054
+1/10/2022 15:15,84.4995,718.4418,2.096101,4.409246,-3.576683,-5.452211,78.76919653,78.84962656,11.23080347,11.15037344,225.8392058,-7.639185409,43.85461866
+1/10/2022 15:30,85.69917,733.3431,2.810674,5.6119,-4.267167,-5.605467,80.77959378,80.87625722,9.220406217,9.123742779,228.7122967,-7.64334081,45.97102661
+1/10/2022 15:45,71.49798,719.3654,2.496457,5.001792,-4.142139,-5.439145,82.8713346,82.9929227,7.128665401,7.007077303,231.5014291,-7.647495131,48.27459921
+1/10/2022 16:00,28.72262,665.4918,0.7309195,1.728717,-4.668067,-5.321567,85.02822755,85.19209275,4.971772451,4.807907253,234.2121682,-7.651648369,50.73974444
+1/10/2022 16:15,8.039383,600.9518,0.2523111,0.7754,-6.170833,-5.369822,87.21931115,87.46664759,2.78068885,2.533352409,236.8506855,-7.655800525,53.34395059
+1/10/2022 16:30,0.6811908,557.5711,0.0611111,0.235,-7.765211,-5.613572,89.35947568,89.80987801,0.640524316,0.190121991,239.4236369,-7.659951599,56.06771768
+1/10/2022 16:45,0.03334783,561.4745,0,0,-8.945694,-5.943511,92.21547284,92.21547284,-2.215472839,-2.215472839,241.9380735,-7.66410159,58.89432343
+1/10/2022 17:00,-0.08735405,,,,-9.4763,-6.182117,94.67749769,94.67749769,-4.677497692,-4.677497692,244.4013861,-7.668250497,61.80951533
+1/10/2022 17:15,-0.1048252,,,,-9.784122,-6.464261,97.19036524,97.19036524,-7.19036524,-7.19036524,246.8212791,-7.67239832,64.80118376
+1/10/2022 17:30,-1.440561,,,,-10.57104,-7.003133,99.74879961,99.74879961,-9.748799609,-9.748799609,249.2057739,-7.67654506,67.85904905
+1/10/2022 17:45,-2.712758,,,,-11.73181,-7.986522,102.347797,102.347797,-12.34779702,-12.34779702,251.5632408,-7.680690714,70.97437961
+1/10/2022 18:00,-0.195458,,,,-11.89225,-8.36065,104.9825812,104.9825812,-14.98258119,-14.98258119,253.9024594,-7.684835284,74.13974428
+1/10/2022 18:15,1.497619,,,,-10.66256,-7.672122,107.6485546,107.6485546,-17.64855459,-17.64855459,256.2327073,-7.688978768,77.34880028
+1/10/2022 18:30,0.9736995,,,,-9.324455,-7.27885,110.341246,110.341246,-20.34124596,-20.34124596,258.5638831,-7.693121167,80.59611515
+1/10/2022 18:45,0.8054042,,,,-8.122817,-7.230422,113.0562511,113.0562511,-23.05625114,-23.05625114,260.906664,-7.697262479,83.87701639
+1/10/2022 19:00,0.2351132,,,,-7.357272,-7.237372,,,,,,,
+1/10/2022 19:15,-2.423988,,,,-7.488067,-7.472116,,,,,,,
+1/10/2022 19:30,-5.39413,,,,-8.607639,-8.047572,,,,,,,
+1/10/2022 19:45,-6.316714,,,,-10.22274,-9.069683,,,,,,,
+1/10/2022 20:00,-5.722897,,,,-11.68762,-10.1064,,,,,,,
+1/10/2022 20:15,-3.769511,,,,-12.80632,-10.84562,,,,,,,
+1/10/2022 20:30,-3.452007,,,,-13.68255,-11.46631,,,,,,,
+1/10/2022 20:45,-2.206551,,,,-13.97515,-11.35991,,,,,,,
+1/10/2022 21:00,0.2080746,,,,-13.39726,-10.4194,,,,,,,
+1/10/2022 21:15,0.2080833,,,,-12.32311,-9.299583,,,,,,,
+1/10/2022 21:30,-1.345389,,,,-11.53553,-8.764911,,,,,,,
+1/10/2022 21:45,-1.42481,,,,-11.19843,-8.651484,,,,,,,
+1/10/2022 22:00,-0.2970335,,,,-11.02538,-8.529866,,,,,,,
+1/10/2022 22:15,-0.04924034,,,,-11.01999,-8.61165,,,,,,,
+1/10/2022 22:30,0.02700322,,,,-10.84902,-8.547039,,,,,,,
+1/10/2022 22:45,0.06671461,,,,-10.64079,-8.525689,,,,,,,
+1/10/2022 23:00,0.0603609,,,,-10.38599,-8.548889,,,,,,,
+1/10/2022 23:15,-0.01747335,,,,-10.26169,-8.659889,,,,,,,
+1/10/2022 23:30,-0.01747335,,,,-10.3576,-8.866811,,,,,,,
+1/10/2022 23:45,0,,,,-10.43267,-9.007706,,,,,,,
diff --git a/pvanalytics/data/snow_snowfall.csv b/pvanalytics/data/snow_snowfall.csv
new file mode 100644
index 00000000..48aec755
--- /dev/null
+++ b/pvanalytics/data/snow_snowfall.csv
@@ -0,0 +1,7 @@
+DATE,SNOW
+2022-01-05,0.0
+2022-01-06,0.0
+2022-01-07,38.0
+2022-01-08,25.0
+2022-01-09,0.0
+2022-01-10,0.0
diff --git a/pvanalytics/features/snow.py b/pvanalytics/features/snow.py
new file mode 100644
index 00000000..c3b542db
--- /dev/null
+++ b/pvanalytics/features/snow.py
@@ -0,0 +1,260 @@
+import numpy as np
+
+
+def get_irradiance_sapm(temp_cell, i_mp, imp0, c0, c1, alpha_imp,
+                        irrad_ref=1000, temp_ref=25):
+    """
+    Model effective irradiance from current at maximum power and cell
+    temperature.
+
+    Solves Eqn. 2 from [1]_.
+
+    Parameters
+    ----------
+    temp_cell : array-like
+        Temperature of cells inside module. [degrees C]
+    i_mp : array-like
+        Maximum power current at the resolution of a single module. [A]
+    imp0 : float
+        Short-circuit current at reference condition. [A]
+    c0, c1 : float
+        Empirically determined coefficients relating ``i_mp`` to effective
+        irradiance.
+    alpha_imp : float
+        Normalized temperature coefficient for short-circuit current. [1/°C]
+    irrad_ref : float, default 1000
+        Reference irradiance. [W/m2]
+    temp_ref : float, default 25
+        Reference cell temperature. [degrees C]
+
+    Returns
+    -------
+    effective_irradiance : array-like
+        Effective irradiance. [W/m2]
+
+    References
+    ----------
+    .. [1] D. L. King, E.E. Boyson, and J.A. Kratochvil, "Photovoltaic Array
+       Performance Model", SAND2004-3535, Sandia National Laboratories,
+       Albuquerque, NM, 2004.
+    """
+
+    a = imp0*c1*(1 + alpha_imp*(temp_cell - temp_ref))
+    b = imp0*c0*(1 + alpha_imp*(temp_cell - temp_ref))
+    c = -i_mp
+    discriminant = np.square(b) - 4*a*c
+    effective_irradiance = (-b + np.sqrt(discriminant))/(2*a) * irrad_ref
+    return effective_irradiance
+
+
+def get_irradiance_imp(i_mp, imp0, irrad_ref=1000):
+    """
+    Model effective irradiance from maximum power current.
+
+    Assumes a linear relationship between effective irradiance and maximum
+    power current, i.e., Eqn. 8 from [1]_.
+
+    Parameters
+    ----------
+    i_mp : array-like
+        Maximum power current at the resolution of a single module. [A]
+    imp0 : float
+        Short-circuit current at reference condition. [A]
+    irrad_ref : float
+        The reference irradiance used to determine ``imp0``. [W/m2]
+
+    Returns
+    -------
+    effective_irradiance : array-like
+        Effective irradiance. [W/m2]
+
+    References
+    ----------
+    .. [1] C. F. Abe, J. B. Dias, G. Notton, G. A. Faggianelli, G. Pigelet,
+       and D. Ouvrard, "Estimation of the effective irradiance and bifacial
+       gain for PV arrays using the maximum power current", IEEE Journal of
+       Photovoltaics, 2022, pp. 432-441. :doi:`10.1109/JPHOTOV.2023.3242117`
+    """
+    return i_mp / imp0 * irrad_ref
+
+
+def get_transmission(measured_e_e, modeled_e_e, current_dc):
+
+    """
+    Estimate transmission as the ratio of modeled effective irradiance to
+    measured irradiance.
+
+    Measured irradiance should be in the array's plane and represent snow-free
+    conditions. For example, the measured irradiance could be obtained with a
+    heated plane-of-array pyranometer. When necessary, the irradiance should be
+    adjusted for reflections and spectral content.
+
+    Parameters
+    ----------
+    measured_e_e : array-like
+        Plane-of-array irradiance without the effect of snow. [W/m2]
+    modeled_e_e : array-like
+        Effective irradiance modeled from measured current at maximum power.
+        [W/m2]
+    current_dc : array-like
+        Measured DC current at the resolution of a single module. [A]
+
+    Returns
+    -------
+    T : array-like
+        Effective transmission. [unitless] Returns NaN where measured DC
+        current is NaN and where measured irradiance is zero. Returns zero
+        where measured current is zero. Returns 1 where the ratio between
+        measured and modeled irradiance exceeds 1.
+
+    References
+    ----------
+    .. [1] E. C. Cooper, J. L. Braid and L. Burnham, "Identifying the
+       Electrical Signature of Snow in Photovoltaic Inverter Data," 2023 IEEE
+       50th Photovoltaic Specialists Conference (PVSC), San Juan, PR, USA,
+       2023, pp. 1-5. :doi:`10.1109/PVSC48320.2023.10360065`
+    """
+    transmission = modeled_e_e / measured_e_e
+    # no transmission if no current
+    transmission[np.isnan(current_dc)] = np.nan
+    transmission[current_dc == 0] = 0
+    # no transmission if no irradiance
+    transmission[measured_e_e == 0] = np.nan
+    # bound transmission between 0 and 1
+    transmission[transmission < 0] = np.nan
+    transmission[transmission > 1] = 1
+
+    return transmission
+
+
+def categorize(transmission, measured_voltage,
+               modeled_voltage_with_snow,
+               modeled_voltage_no_snow,
+               min_dcv, max_dcv, threshold_vratio, threshold_transmission):
+
+    """
+    Categorizes electrical behavior into a snow-related mode.
+
+    Parameters
+    ----------
+    transmission : array-like
+        Fraction of plane-of-array irradiance that can reach the array's cells
+        through the snow cover. [dimensionless]
+    measured_voltage : array-like
+        Measured DC voltage. [V]
+    modeled_voltage_with_snow : array-like
+        DC voltage modeled using measured plane-of-array irradiance reduced by
+        calculated transmission. [V]
+    modeled_voltage_no_snow : array-like
+        DC voltage modeled using measured plane-of-array irradiance and
+        assuming transmission equals 1. [V]
+    min_dcv : float
+        The lower voltage bound on the inverter's maximum power point
+        tracking (MPPT) algorithm. [V]
+    max_dcv : float
+        The upper voltage bound on the inverter's maximum power point
+        tracking (MPPT) algorithm. [V]
+    threshold_vratio : float
+        The lower bound for vratio that is representative of snow-free
+        conditions. Determined empirically. Depends on system configuration and
+        site conditions. [unitless]
+    threshold_transmission : float
+        The lower bound on transmission that is found under snow-free
+        conditions, determined empirically. [unitless]
+
+    Returns
+    -------
+    mode : array-like
+        ``mode`` is ``None`` when any of the inputs used to determine ``mode``
+        is ``nan``.
+    vmp_ratio : array-like
+        Ratio between measured DC voltage and DC voltage modeled with
+        calculated transmission.
+
+    Notes
+    -----
+    Modes are defined in [1]_:
+
+    * Mode 0: Indicates periods with enough opaque snow that the system is not
+      producing power. Specifically, Mode 0 is when the measured voltage is
+      below the lower bound of the inverter's MPPT range but the voltage
+      modeled using measured irradiance and ideal transmission is above the
+      lower bound of the inverter's MPPT range.
+    * Mode 1: Indicates periods when the system has non-uniform snow which
+      affects all strings. Mode 1 is assigned when both operating voltage and
+      current are reduced. Operating voltage is reduced when snow causes
+      mismatch and current is decreased due to reduced transmission.
+    * Mode 2: Indicates periods when the system has non-uniform snow which
+      causes mismatch for some modules, but doesn't reduce light transmission
+      to other modules.
+    * Mode 3: Indicates periods when the the system has snow that reduces
+      light transmission but doesn't create mismatch. Operating voltage is
+      consistent with snow-free conditions but current is reduced.
+    * Mode 4: Voltage and current are consistent with snow-free conditions.
+
+    * Mode -1: Indicates periods where it is unknown if or how snow impacts
+      power output. Mode -1 includes periods when:
+
+          1. Voltage modeled using measured irradiance and ideal transmission
+             is outside the inverter's MPPT range, OR
+          2. measured voltage exceeds the upper bound of the inverter's MPPT
+             algorithm.
+
+      Mode -1 is added in this function to cover a case that was not addressed
+      in [1]_.
+
+    Mode is None when measured values (voltage, current, irradiance or
+    temperature) are either missing or produce modeled voltage that is
+    invalid.
+
+    References
+    ----------
+    .. [1] E. C. Cooper, J. L. Braid and L. M. Burnham, "Identifying the
+       Electrical Signature of Snow in Photovoltaic Inverter Data," 2023 IEEE
+       50th Photovoltaic Specialists Conference (PVSC), San Juan, PR, USA,
+       2023, pp. 1-5, :doi:`10.1109/PVSC48320.2023.10360065`.
+    """
+    umin_meas = measured_voltage >= min_dcv
+    umax_meas = measured_voltage < max_dcv
+
+    umin_model = modeled_voltage_no_snow >= min_dcv
+    umax_model = modeled_voltage_no_snow < max_dcv
+
+    # Voltage is modeled as NaN if transmission = 0, but V = 0 makes more sense
+    modeled_voltage_with_snow_copy = np.where(
+        transmission == 0, 0, modeled_voltage_with_snow)
+
+    with np.errstate(divide='ignore'):
+        vmp_ratio =\
+            measured_voltage /\
+            modeled_voltage_with_snow_copy
+
+    # take care of divide by zero
+    vmp_ratio = np.where(modeled_voltage_with_snow_copy == 0, 1,
+                         vmp_ratio)
+
+    # vmp_ratio discriminates between states (1,2) and (3,4)
+    uvr = np.where(vmp_ratio >= threshold_vratio, 3, 1)
+
+    # transmission discriminates within (1,2) and (3,4)
+    utrans = np.where(transmission >= threshold_transmission, 1, 0)
+
+    # None if transmission, vmp_ratio, modeled_voltage_no_snow,
+    # modeled_voltage_with_snow_copy, or measured_voltage is nan
+
+    # 0 if umin_meas is 0, i.e., measurement indicate no power
+    # state 1, 2, 3, 4 defined by uvr + utrans
+    mode = umin_meas * (uvr + utrans)
+
+    # -1 if umax_model is 0
+    # -1 if umax_meas is 0 or umin_meas is 0
+    mode = np.where(~umin_model | ~umax_model | ~umax_meas, -1, mode)
+
+    # replace nan with None
+    mode = np.where(np.isnan(vmp_ratio) | np.isnan(transmission) |
+                    np.isnan(measured_voltage) |
+                    np.isnan(modeled_voltage_with_snow_copy) |
+                    np.isnan(modeled_voltage_no_snow),
+                    None, mode)
+
+    return mode, vmp_ratio


Test patch:
diff --git a/pvanalytics/tests/features/test_snow.py b/pvanalytics/tests/features/test_snow.py
new file mode 100644
index 00000000..8d62f5a9
--- /dev/null
+++ b/pvanalytics/tests/features/test_snow.py
@@ -0,0 +1,77 @@
+import numpy as np
+import pandas as pd
+from numpy.testing import assert_array_equal
+from pandas.testing import assert_series_equal
+from pvanalytics.features import snow
+
+
+def test_get_irradiance_sapm():
+    # solve Ee^2 + 2 Ee - 3 = 0
+    c0, c1 = (2, 1)
+    imp0 = 6.
+    alpha_imp = -2. / 3
+    temp_cell = 26.
+    # effective irradiance = i_mp / factor
+    i_mp = np.array([6., 0., np.nan])
+    result = snow.get_irradiance_sapm(temp_cell, i_mp, imp0, c0, c1, alpha_imp)
+    expected = np.array([1000., 0., np.nan])  # from suns to W/m2
+    assert_array_equal(result, expected)
+    # test with Series
+    i_mp = pd.Series(data=i_mp)
+    temp_cell = pd.Series(index=i_mp.index, data=26.)
+    result = snow.get_irradiance_sapm(temp_cell, i_mp, imp0, c0, c1, alpha_imp)
+    assert_series_equal(result, pd.Series(index=i_mp.index, data=expected))
+
+
+def test_get_irradiance_imp():
+    # solve Ee = Imp / Imp0
+    imp0 = 6.
+    i_mp = np.array([6., 0., np.nan])
+    result = snow.get_irradiance_imp(i_mp, imp0)
+    expected = np.array([1000., 0, np.nan])
+    assert_array_equal(result, expected)
+    # test with Series
+    i_mp = pd.Series(data=i_mp)
+    result = snow.get_irradiance_imp(i_mp, imp0)
+    assert_series_equal(result, pd.Series(index=i_mp.index, data=expected))
+
+
+def test_get_transmission():
+    # solve modeled_ee / measured_ee, subject to i_mp>0, with bounds
+    # T[T.isna()] = np.nan
+    # T[i_mp == 0] = 0
+    # T[T < 0] = np.nan
+    # T[T > 1] = 1
+    measured_ee = pd.Series(data=[1., 0.5, 1., -1., np.nan])
+    modeled_ee = pd.Series(data=[1., 1., 1., 1., 1.])
+    i_mp = pd.Series(data=[1., 1., 0., 1., 1.])
+    result = snow.get_transmission(measured_ee, modeled_ee, i_mp)
+    expected = pd.Series(data=[1., 1., 0., np.nan, np.nan])
+    assert_series_equal(result, expected)
+
+
+def test_categorize():
+    measured_voltage = np.array([400., 450., 350., 420., 420., 495., 270.,
+                                 200., 850., 0., 700.])
+    modeled_voltage_with_calculated_transmission = np.array([np.nan, 500, 700,
+                                                             700, 600, 550,
+                                                             300, 200, 600,
+                                                             0, 700])
+    modeled_voltage_with_ideal_transmission = np.array([700, 600, 700, 750,
+                                                        700, 700, 350, 250,
+                                                        600, 400, 850])
+    transmission = np.array([0.5, np.nan, 0.5, 0.9, 0.5, 0.9, 0.9, 0.9, 1, 0,
+                             0.9])
+
+    min_dcv = 300
+    max_dcv = 800
+    threshold_vratio = 0.7
+    threshold_transmission = 0.6
+
+    expected = np.array([None, None, 1, 2, 3, 4, 0, -1, -1, 0, -1])
+    result, _ = snow.categorize(transmission, measured_voltage,
+                                modeled_voltage_with_calculated_transmission,
+                                modeled_voltage_with_ideal_transmission,
+                                min_dcv, max_dcv, threshold_vratio,
+                                threshold_transmission)
+    assert_array_equal(result, expected)