Revision: 7746
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7746&view=rev
Author:   sameerd
Date:     2009-09-11 20:58:27 +0000 (Fri, 11 Sep 2009)

Log Message:
-----------
Added a recs_join function to join a single column of multiple record arrays

Modified Paths:
--------------
    trunk/matplotlib/lib/matplotlib/cbook.py
    trunk/matplotlib/lib/matplotlib/mlab.py

Modified: trunk/matplotlib/lib/matplotlib/cbook.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/cbook.py    2009-09-11 20:48:10 UTC (rev 
7745)
+++ trunk/matplotlib/lib/matplotlib/cbook.py    2009-09-11 20:58:27 UTC (rev 
7746)
@@ -1626,7 +1626,48 @@
     import matplotlib.mlab as mlab
     return mlab.quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y)
 
+def align_iterators(func, *iterables):
+    """ 
+        This generator takes a bunch of iterables that are ordered by func
+        It sends out ordered tuples (func(row), [rows from all iterators 
matching func(row)])
+        
+        It is used by mlab.recs_join to join record arrays
+    """
+    class myiter:
+        def __init__(self, it):
+            self.it = it
+            self.key = self.value = None
+            self.iternext()
 
+        def iternext(self):
+            try:
+                self.value = self.it.next()
+                self.key = func(self.value)
+            except StopIteration:
+                self.value = self.key = None
+
+        def __call__(self, key):
+            retval = None
+            if key == self.key:
+                retval = self.value
+                self.iternext()
+            elif self.key and key > self.key:
+                raise ValueError, "Iterator has been left behind"
+            return retval
+
+    # This can be made more efficient by not computing the minimum key for 
each iteration
+    iters = [myiter(it) for it in iterables]
+    minvals = minkey = True
+    while 1:
+        minvals = (filter(None, [it.key for it in iters]))
+        if minvals:
+            minkey = min(minvals)
+            yield (minkey, [it(minkey) for it in iters])
+        else:
+            break
+
+
+
 if __name__=='__main__':
     assert( allequal([1,1,1]) )
     assert(not  allequal([1,1,0]) )

Modified: trunk/matplotlib/lib/matplotlib/mlab.py
===================================================================
--- trunk/matplotlib/lib/matplotlib/mlab.py     2009-09-11 20:48:10 UTC (rev 
7745)
+++ trunk/matplotlib/lib/matplotlib/mlab.py     2009-09-11 20:58:27 UTC (rev 
7746)
@@ -91,6 +91,9 @@
 :meth:`rec_join`
     join two record arrays on sequence of fields
 
+:meth:`recs_join`
+    a simple join of multiple recarrays using a single column as a key
+
 :meth:`rec_groupby`
     summarize data by groups (similar to SQL GROUP BY)
 
@@ -139,7 +142,7 @@
 """
 
 from __future__ import division
-import csv, warnings, copy, os
+import csv, warnings, copy, os, operator
 
 import numpy as np
 ma = np.ma
@@ -1880,7 +1883,29 @@
 
     return newrec
 
+def recs_join(key, name, recs,missing=0.):
+    """ 
+    *key* is the column name that acts as a key
+    *name* is the name that we want to join
+    *missing" is what the missing fields are replaced by
+    *recarrays* is a list of record arrays to join
 
+    returns a record array with columns [rowkey, name1, name2, ... namen]
+
+    >>> r = recs_join("date", "close", recs=[r0, r1], missing=0.)
+
+    """
+    results = []
+    def extract(r):
+        if r is None: return missing
+        else: return r[name]
+
+    for rowkey, row in cbook.align_iterators(operator.attrgetter(key), 
*[iter(r) for r in recs]):
+        results.append([rowkey] + map(extract, row))
+    names = ",".join([key] + ["%s%d" % (name, d) for d in range(len(recs))])
+    return np.rec.fromrecords(results, names=names)
+
+
 def csv2rec(fname, comments='#', skiprows=0, checkrows=0, delimiter=',',
             converterd=None, names=None, missing='', missingd=None,
             use_mrecords=False):


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to