In [1]:
%pylab inline
import os
import sys
from pytides.tide import Tide
from matplotlib import dates as mdates
#--default matplotlib 
rcParams['mathtext.default'] = 'regular'
rcParams['legend.fontsize']  = 8
rcParams['axes.labelsize']   = 8
rcParams['xtick.labelsize']  = 8
rcParams['ytick.labelsize']  = 8
rcParams['figure.subplot.wspace'] = 0.35
rcParams['figure.subplot.hspace'] = 0.35
months   = mdates.MonthLocator()  # every day
weeks   = mdates.WeekdayLocator(byweekday=MO, interval=1) #--every week
days   = mdates.DayLocator()  # every day
hours   = mdates.HourLocator()  # every hour
monthsFmt = mdates.DateFormatter('%m')
daysFmt = mdates.DateFormatter('%d')
weeksFmt = mdates.DateFormatter('%m/%d')
def set_daysFmt(ax):
    ax.xaxis.set_major_locator(days)    
    ax.xaxis.set_minor_locator(hours)
    ax.xaxis.set_major_formatter(daysFmt)
def set_weeksFmt(ax):
    ax.xaxis.set_major_locator(weeks)    
    ax.xaxis.set_minor_locator(days)
    ax.xaxis.set_major_formatter(weeksFmt)
def set_monthsFmt(ax):
    ax.xaxis.set_major_locator(months)    
    ax.xaxis.set_minor_locator(days)
    ax.xaxis.set_major_formatter(monthsFmt)


Populating the interactive namespace from numpy and matplotlib

Read and process data


In [2]:
#function to parse data and normalize it
def parse_data(fname):
    data_dtype = dtype([('datetime','a20'),('head','f4')])
    raw = loadtxt(fname, delimiter=',', dtype=data_dtype, comments='#')
    dtime = []
    dv = []
    for [d,v] in raw:
        dt = datetime.datetime.strptime(d, '%m/%d/%Y %H:%M:%S')
        dtime.append(dt)
        dv.append(v)
    dtime = array(dtime)
    dv = array(dv)
    dv -= average(dv)
    return dtime, dv

In [3]:
data_dir = os.path.join('data')
vakey_time, vakey_tide = parse_data(os.path.join(data_dir,'VAKey_6min.csv'))
vakey_tide /= 3.28081 #--convert from ft to m
time_min = vakey_time[0]
time_max = vakey_time[-1]
dt_sec = (vakey_time[1] - vakey_time[0]).total_seconds()
#--create time_all
tstep = datetime.timedelta(seconds=dt_sec)
dt = time_min
time_all = []
while dt <= time_max:
    time_all.append(dt)
    dt += tstep
time_all = array(time_all)
#--deering estates tidal data - already in meters
de_time, de_tide = parse_data(os.path.join(data_dir,'DE_Tide.csv'))
#--plot raw normalized data
ax = subplot(1,1,1)
ax.plot(vakey_time, vakey_tide, linewidth=2)
ax.plot(de_time, de_tide, linewidth=0.75, color='red')
set_weeksFmt(ax)
ylabel('Elevation, m')
show()


Prepare a list of datetimes, each 6 minutes apart, for a the period of the dataset.


In [4]:
total_hours = float((time_all[-1] - time_all[0]).total_seconds()) / (60. * 60.)
nsamples = time_all.shape[0]
hours = linspace(0.,float(total_hours),nsamples)
times = Tide._times(time_all[0], hours)

Calculate error in predicted tide


In [5]:
def ptide_error(obsv,simv):
    resid = subtract(simv,obsv)
    me = average(resid)
    rmse = std(resid)
    return me, rmse

In [6]:
##Fit the tidal data to the harmonic model using Pytides
pvakey_tide = Tide.decompose(vakey_tide, t=vakey_time)
##Predict the tides using the Pytides model.
pvakey_prediction = pvakey_tide.at(times)

In [7]:
#--plot predicted data
me, rmse = ptide_error(vakey_tide,pvakey_prediction)
ctxt = '{0} - ME: {1:7.2g} meters, RMSE: {2:7.2g} meters'.format('Tide', me, rmse)
ax = subplot(1,1,1)
ax.plot(vakey_time, vakey_tide, linewidth=0.75, color='red', zorder=10)
ax.plot(vakey_time, pvakey_prediction, linewidth=3, color='black', zorder=9)
ax.text(0.0, 1.01, ctxt, ha='left', va='bottom', size=8, transform=ax.transAxes)
set_weeksFmt(ax)
ylabel('Elevation, m')
show()
ax = subplot(1,1,1)
ax.plot(vakey_tide, (pvakey_prediction-vakey_tide), linewidth=0.0, marker='o', markersize=2, color='black')
show()



In [12]:
for idx,c in enumerate(pvakey_tide.model['constituent']):
    print '  {0:10s} {1: 7.3f} {2: 7.1f} deg.'.format(c.name, pvakey_tide.model['amplitude'][idx], pvakey_tide.model['phase'][idx])


  Z0           0.000   180.0 deg.
  M2           0.605   173.8 deg.
  S2          59.138   253.6 deg.
  N2           2.422   283.5 deg.
  K1          59.535    50.1 deg.
  M4           0.006   124.4 deg.
  O1           0.671   345.4 deg.
  M6           0.009    98.2 deg.
  MK3          0.008    65.5 deg.
  S4           0.002    65.1 deg.
  MN4          0.002    97.7 deg.
  nu2          2.528   173.4 deg.
  S6           0.001    90.8 deg.
  mu2          0.577   308.0 deg.
  2N2          0.386    61.3 deg.
  OO1          0.059   257.1 deg.
  lambda2      1.971   321.1 deg.
  S1          114.975   228.4 deg.
  M1           1.046   138.5 deg.
  J1           0.330   112.2 deg.
  rho1         1.820   353.7 deg.
  Q1           1.673   106.8 deg.
  T2          25.588   260.2 deg.
  R2          45.488    66.2 deg.
  2Q1          0.068    50.9 deg.
  P1          61.092    39.7 deg.
  2SM2         0.010   239.4 deg.
  M3           0.002    59.2 deg.
  L2           1.827   213.0 deg.
  2MK3         0.004    77.3 deg.
  K2          14.117    70.3 deg.
  M8           0.001   352.2 deg.
  MS4          0.002   155.7 deg.

In [ ]: