[Scipy-svn] r2764 - trunk/Lib/sandbox/timeseries/plotlib

scipy-svn at scipy.org scipy-svn at scipy.org
Mon Feb 26 16:43:19 EST 2007


Author: mattknox_ca
Date: 2007-02-26 15:43:15 -0600 (Mon, 26 Feb 2007)
New Revision: 2764

Modified:
   trunk/Lib/sandbox/timeseries/plotlib/mpl_timeseries_pgm.py
Log:
- fixed some bugs
- changed code to use frequency constants instead of freqstr for checking frequencies

Modified: trunk/Lib/sandbox/timeseries/plotlib/mpl_timeseries_pgm.py
===================================================================
--- trunk/Lib/sandbox/timeseries/plotlib/mpl_timeseries_pgm.py	2007-02-26 12:42:43 UTC (rev 2763)
+++ trunk/Lib/sandbox/timeseries/plotlib/mpl_timeseries_pgm.py	2007-02-26 21:43:15 UTC (rev 2764)
@@ -32,6 +32,7 @@
 import maskedarray as MA
 
 import timeseries
+import timeseries as TS
 from timeseries import date_array, Date, DateArray, TimeSeries
 
 import warnings
@@ -160,25 +161,38 @@
     previous = getattr(dates-1, period)
     return (current - previous).nonzero()[0]
 
+def has_level_label(label_flags):
+    """returns true if the label_flags indicate there is at least
+one label for this level"""
+    if label_flags.size == 0 or \
+       (label_flags.size == 1 and label_flags[0] == 0):
+        return False
+    else:
+        return True
 
-def _daily_finder(vmin, vmax, freqstr, aslocator):
+def _daily_finder(vmin, vmax, freq, aslocator):
 
-    if freqstr == 'B': 
+    if freq == TS.FR_BUS: 
         periodsperyear = 261
-    elif freqstr == 'D': 
+    elif freq == TS.FR_DAY: 
         periodsperyear = 365
     else: 
         raise ValueError("unexpected frequency")
 
     (vmin, vmax) = (int(vmin), int(vmax))
     span = vmax - vmin + 1
-    dates = date_array(start_date=Date(freqstr,vmin), 
-                       end_date=Date(freqstr, vmax))
+    dates = date_array(start_date=Date(freq,vmin), 
+                       end_date=Date(freq, vmax))
     default = N.arange(vmin, vmax+1) 
     # Initialize the output
     if not aslocator:
         format = N.empty(default.shape, dtype="|S10")
         format.flat = ''
+
+    def first_label(label_flags):
+        if label_flags[0] == 0: return label_flags[1]
+        else: return label_flags[0]
+
     # Case 1. Less than a month
     if span <= (periodsperyear//12 - 2):
         month_start = period_break(dates,'month')
@@ -190,15 +204,15 @@
             format[:] = '%d'
             format[month_start] = '%d\n%b'
             format[year_start] = '%d\n%b\n%Y'
-            if year_start.size == 0:
-                if month_start.size == 0:
+            if not has_level_label(year_start):
+                if not has_level_label(month_start):
                     if dates.size > 1: 
                         idx = 1
                     else: 
                         idx = 0
                     format[idx] = '%d\n%b\n%Y'
                 else:
-                    format[month_start[0]] = '%d\n%b\n%Y'
+                    format[first_label(month_start)] = '%d\n%b\n%Y'
     # Case 2. Less than three months        
     elif span <= periodsperyear//4:
         month_start = period_break(dates,'month')
@@ -206,36 +220,37 @@
             major = default[month_start]
             minor = default
         else:
-            week_start = (dates.day_of_week == 1)
+            week_start = period_break(dates,'week')
             year_start = period_break(dates,'year')
-#            week_start[0] = False
-#            month_start[0] = False
-#            year_start[0] = False
+
             format[week_start] = '%d'
             format[month_start] = '\n\n%b'
             format[year_start] = '\n\n%b\n%Y'
-            if year_start.size == 0:
-                if month_start.size == 0:
-                    format[week_start[0]] = '\n\n%b\n%Y'
+            if not has_level_label(year_start):
+                if not has_level_label(month_start):
+                    format[first_label(week_start)] = '\n\n%b\n%Y'
                 else:
-                    format[month_start[0]] = '\n\n%b\n%Y'
+                    format[first_label(month_start)] = '\n\n%b\n%Y'
     # Case 3. Less than 14 months ...............
     elif span <= 1.15 * periodsperyear:
-        month_start = period_break(dates,'month')
+        
         if aslocator:
-            week_start = period_break(dates, 'week')
-            minor_idx = (week_start | month_start)
-            minor_idx[0] = True
-            major = default[month_start]
+            d_minus_1 = dates-1
+
+            month_diff = N.abs(dates.month - d_minus_1.month)
+            week_diff = N.abs(dates.week - d_minus_1.week)
+            minor_idx = (month_diff + week_diff).nonzero()[0]
+
+            major = default[month_diff != 0]
             minor = default[minor_idx]
         else:
             year_start = period_break(dates,'year')
-            month_start[0] = False
-            year_start[0] = False
+            month_start = period_break(dates,'month')
+
             format[month_start] = '%b'
             format[year_start] = '%b\n%Y'
-            if not year_start.size:
-                format[month_start[0]] = '%b\n%Y'
+            if not has_level_label(year_start):
+                format[first_label(month_start)] = '%b\n%Y'
     # Case 4. Less than 2.5 years ...............
     elif span <= 2.5 * periodsperyear:
         year_start = period_break(dates,'year')
@@ -256,7 +271,7 @@
             minor = default[month_start]
         else:
             month_break = dates[month_start].month
-            jan_or_jul = month_start[(month_break == 1 | month_break == 7)]
+            jan_or_jul = month_start[(month_break == 1) | (month_break == 7)]
             format[jan_or_jul] = '%b'
             format[year_start] = '%b\n%Y'
     # Case 5. Less than 11 years ................
@@ -288,11 +303,12 @@
         formatted = (format != '')
         return dict([(d,f) for (d,f) in zip(default[formatted],format[formatted])])
 #...............................................................................
-def _monthly_finder(vmin, vmax, freqstr, aslocator):
-    if freqstr != 'M': 
+def _monthly_finder(vmin, vmax, freq, aslocator):
+    if freq != TS.FR_MTH: 
         raise ValueError("unexpected frequency")
     periodsperyear = 12
-    (vmin, vmax) = (int(vmin), int(vmax+1))
+
+    (vmin, vmax) = (int(vmin), int(vmax))
     span = vmax - vmin + 1
     #............................................
     dates = N.arange(vmin, vmax+1) 
@@ -305,10 +321,11 @@
             major = dates[year_start]
             minor = dates
         else:
+            
             format[:] = '%b'
             format[year_start] = '%b\n%Y'
 
-            if not year_start.size:
+            if not has_level_label(year_start):
                 if dates.size > 1: 
                     idx = 1
                 else: 
@@ -358,11 +375,11 @@
         formatted = (format != '')
         return dict([(d,f) for (d,f) in zip(dates[formatted],format[formatted])])
 #...............................................................................
-def _quarterly_finder(vmin, vmax, freqstr, aslocator):
-    if freqstr != 'Q': 
+def _quarterly_finder(vmin, vmax, freq, aslocator):
+    if freq != TS.FR_QTR: 
         raise ValueError("unexpected frequency")
     periodsperyear = 4  
-    (vmin, vmax) = (int(vmin), int(vmax+1))
+    (vmin, vmax) = (int(vmin), int(vmax))
     span = vmax - vmin + 1
     #............................................
     dates = N.arange(vmin, vmax+1) 
@@ -377,7 +394,7 @@
         else:
             format[:] = 'Q%q'
             format[year_start] = 'Q%q\n%Y'
-            if not year_start.size:
+            if not has_level_label(year_start):
                 if dates.size > 1: 
                     idx = 1
                 else: 
@@ -400,7 +417,6 @@
             major = dates[major_idx]
             minor = dates[year_start[(years % min_anndef == 0)]]
         else:
-            print "major_idx",major_idx
             format[major_idx] = '%Y'
     #............................................
     if aslocator:
@@ -409,8 +425,8 @@
         formatted = (format != '')
         return dict([(d,f) for (d,f) in zip(dates[formatted],format[formatted])])
 #...............................................................................
-def _annual_finder(vmin, vmax, freqstr, aslocator):
-    if freqstr != 'Q': 
+def _annual_finder(vmin, vmax, freq, aslocator):
+    if freq != TS.FR_ANN: 
         raise ValueError("unexpected frequency")   
     (vmin, vmax) = (int(vmin), int(vmax+1))
     span = vmax - vmin + 1
@@ -439,20 +455,20 @@
 
     def __init__(self, freq, minor_locator=False, dynamic_mode=True,
                  base=1, quarter=1, month=1, day=1):
-        self.freqstr = freq
+        self.freq = freq
         self.base = base
         (self.quarter, self.month, self.day) = (quarter, month, day)
         self.isminor = minor_locator
         self.isdynamic = dynamic_mode
         self.offset = 0
         #.....
-        if freq == 'A':
+        if freq == TS.FR_ANN:
             self.finder = _annual_finder
-        elif freq == 'Q':
+        elif freq == TS.FR_QTR:
             self.finder = _quarterly_finder
-        elif freq == 'M':
+        elif freq == TS.FR_MTH:
             self.finder = _monthly_finder
-        elif freq in 'BD':
+        elif freq in (TS.FR_BUS, TS.FR_DAY):
             self.finder = _daily_finder
             
     def asminor(self):
@@ -467,7 +483,7 @@
     
     def _get_default_locs(self, vmin, vmax):
         "Returns the default locations of ticks."
-        (minor, major) = self.finder(vmin, vmax, self.freqstr, True)
+        (minor, major) = self.finder(vmin, vmax, self.freq, True)
         if self.isminor:
             return minor
         return major
@@ -508,20 +524,20 @@
     
     def __init__(self, freq, minor_locator=False, dynamic_mode=True,):
         self.format = None
-        self.freqstr = freq
+        self.freq = freq
         self.locs = []
         self.formatdict = {}
         self.isminor = minor_locator
         self.isdynamic = dynamic_mode
         self.offset = 0
         #.....
-        if freq == 'A':
+        if freq == TS.FR_ANN:
             self.finder = _annual_finder
-        elif freq == 'Q':
+        elif freq == TS.FR_QTR:
             self.finder = _quarterly_finder
-        elif freq == 'M':
+        elif freq == TS.FR_MTH:
             self.finder = _monthly_finder
-        elif freq in 'BD':
+        elif freq in (TS.FR_BUS, TS.FR_DAY):
             self.finder = _daily_finder
             
     def asminor(self):
@@ -536,7 +552,7 @@
     
     def _set_default_format(self, vmin, vmax):
         "Returns the default ticks spacing."
-        self.formatdict = self.finder(vmin, vmax, self.freqstr, False)
+        self.formatdict = self.finder(vmin, vmax, self.freq, False)
         return self.formatdict
     
     def set_locs(self, locs):
@@ -550,7 +566,7 @@
         if self.isminor:
             fmt = self.formatdict.pop(x, '')
             if fmt is not '':
-                retval = Date(self.freqstr, value=int(x)).strfmt(fmt)
+                retval = Date(self.freq, value=int(x)).strfmt(fmt)
             else:
                 retval = ''
         else:
@@ -589,13 +605,13 @@
             assert hasattr(_series, "dates")
             self._series = _series.ravel()
             self.xdata = _series.dates
-            self.freqstr = _series.dates.freqstr
+            self.freq = _series.dates.freq
             self.xaxis.set_major_locator
             
         else:
             self._series = None
             self.xdata = None
-            self.freqstr = None
+            self.freq = None
         self._austoscale = False
         # Get the data to plot 
         self.legendsymbols = []
@@ -642,9 +658,9 @@
             # The argument is a DateArray............
             elif isinstance(a, (Date, DateArray)):
                 # Force to current freq
-                if self.freqstr is not None:
-                    if a.freqstr != self.freqstr:
-                        a = a.asfreq(self.freqstr)
+                if self.freq is not None:
+                    if a.freq != self.freq:
+                        a = a.asfreq(self.freq)
                 # There's an argument after
                 if len(remaining) > 0:
                     #...and it's a format string
@@ -687,11 +703,11 @@
         # Reinitialize the plot if needed ...........
         if self.xdata is None:
             self.xdata = output[0]
-            self.freqstr = self.xdata.freqstr
+            self.freq = self.xdata.freq
         # Force the xdata to the current frequency
-        elif output[0].freqstr != self.freqstr:
+        elif output[0].freq != self.freq:
             output = list(output)
-            output[0] = output[0].asfreq(self.freqstr)
+            output[0] = output[0].asfreq(self.freq)
         return output
     #............................................
     def tsplot(self,*parms,**kwargs):
@@ -715,16 +731,16 @@
         String format for major ticks ("%Y").
         """
         # Get the locator class ................. 
-        majlocator = TimeSeries_DateLocator(self.freqstr, dynamic_mode=True,
+        majlocator = TimeSeries_DateLocator(self.freq, dynamic_mode=True,
                                             minor_locator=False)
-        minlocator = TimeSeries_DateLocator(self.freqstr, dynamic_mode=True,
+        minlocator = TimeSeries_DateLocator(self.freq, dynamic_mode=True,
                                             minor_locator=True)
         self.xaxis.set_major_locator(majlocator)
         self.xaxis.set_minor_locator(minlocator)
         # Get the formatter .....................
-        majformatter = TimeSeries_DateFormatter(self.freqstr, dynamic_mode=True,
+        majformatter = TimeSeries_DateFormatter(self.freq, dynamic_mode=True,
                                                 minor_locator=False)
-        minformatter = TimeSeries_DateFormatter(self.freqstr, dynamic_mode=True,
+        minformatter = TimeSeries_DateFormatter(self.freq, dynamic_mode=True,
                                                 minor_locator=True)
         self.xaxis.set_major_formatter(majformatter)
         self.xaxis.set_minor_formatter(minformatter)




More information about the Scipy-svn mailing list