Mercurial > hg > nsaunier > traffic-intelligence
comparison python/utils.py @ 31:c000f37c316d
moved tests to independent file, added chi2 computation
| author | Nicolas Saunier <nico@confins.net> |
|---|---|
| date | Sat, 13 Feb 2010 19:46:33 -0500 |
| parents | ca8e716cc231 |
| children | 48e56179c39e |
comparison
equal
deleted
inserted
replaced
| 30:418b41056e6c | 31:c000f37c316d |
|---|---|
| 2 ''' Generic utilities.''' | 2 ''' Generic utilities.''' |
| 3 | 3 |
| 4 #from numpy import * | 4 #from numpy import * |
| 5 #from pylab import * | 5 #from pylab import * |
| 6 | 6 |
| 7 from moving import Point,Interval | 7 import moving |
| 8 | 8 |
| 9 __metaclass__ = type | 9 __metaclass__ = type |
| 10 | 10 |
| 11 commentChar = '#'; | 11 commentChar = '#'; |
| 12 | 12 |
| 13 ######################### | 13 ######################### |
| 14 # simple statistics | |
| 15 ######################### | |
| 16 | |
| 17 def computeChi2(expected, observed): | |
| 18 '''Returns the Chi2 statistics''' | |
| 19 result = 0. | |
| 20 for e, o in zip(expected, observed): | |
| 21 result += ((e-o)*(e-o))/e | |
| 22 return result | |
| 23 | |
| 24 class histogram: | |
| 25 '''Class to represent a sample of a distribution for a continuous random variable | |
| 26 with the number of observations for each interval''' | |
| 27 | |
| 28 | |
| 29 | |
| 30 ######################### | |
| 14 # maths section | 31 # maths section |
| 15 ######################### | 32 ######################### |
| 16 | 33 |
| 17 def segmentIntersection(p1, p2, p3, p4): | 34 def segmentIntersection(p1, p2, p3, p4): |
| 18 '''Returns the intersecting point of the segments [p1, p2] and [p3, p4], None otherwise | 35 '''Returns the intersecting point of the segments [p1, p2] and [p3, p4], None otherwise''' |
| 19 | |
| 20 >>> segmentIntersection(Point(0,0),Point(1,1), Point(0,1), Point(1,2)) | |
| 21 >>> segmentIntersection(Point(0,1),Point(1,0), Point(0,2), Point(2,1)) | |
| 22 >>> segmentIntersection(Point(0,0),Point(2,0), Point(1,-1),Point(1,1)) | |
| 23 (1.000000,0.000000) | |
| 24 >>> segmentIntersection(Point(0,1),Point(2,0),Point(1,1),Point(1,2)) | |
| 25 ''' | |
| 26 from numpy import matrix | 36 from numpy import matrix |
| 27 from numpy.linalg import linalg, det | 37 from numpy.linalg import linalg, det |
| 28 | 38 |
| 29 dp1 = p2-p1#[s1[0][1]-s1[0][0], s1[1][1]-s1[1][0]] | 39 dp1 = p2-p1#[s1[0][1]-s1[0][0], s1[1][1]-s1[1][0]] |
| 30 dp2 = p4-p3#[s2[0][1]-s2[0][0], s2[1][1]-s2[1][0]] | 40 dp2 = p4-p3#[s2[0][1]-s2[0][0], s2[1][1]-s2[1][0]] |
| 36 | 46 |
| 37 if linalg.det(A) == 0:#crossProduct(ds1, ds2) == 0: | 47 if linalg.det(A) == 0:#crossProduct(ds1, ds2) == 0: |
| 38 return None | 48 return None |
| 39 else: | 49 else: |
| 40 intersection = linalg.solve(A,B) | 50 intersection = linalg.solve(A,B) |
| 41 if (Interval(p1.x, p2.x, True).contains(intersection[0,0]) | 51 if (moving.Interval(p1.x, p2.x, True).contains(intersection[0,0]) |
| 42 and Interval(p3.x, p4.x, True).contains(intersection[0,0]) | 52 and moving.Interval(p3.x, p4.x, True).contains(intersection[0,0]) |
| 43 and Interval(p1.y, p2.y, True).contains(intersection[1,0]) | 53 and moving.Interval(p1.y, p2.y, True).contains(intersection[1,0]) |
| 44 and Interval(p3.y, p4.y, True).contains(intersection[1,0])): | 54 and moving.Interval(p3.y, p4.y, True).contains(intersection[1,0])): |
| 45 return Point(intersection[0,0], intersection[1,0]) | 55 return moving.Point(intersection[0,0], intersection[1,0]) |
| 46 else: | 56 else: |
| 47 return None | 57 return None |
| 48 | 58 |
| 49 def crossProduct(l1, l2): | 59 def crossProduct(l1, l2): |
| 50 return l1[0]*l2[1]-l1[1]*l2[0] | 60 return l1[0]*l2[1]-l1[1]*l2[0] |
| 63 # file I/O section | 73 # file I/O section |
| 64 ######################### | 74 ######################### |
| 65 | 75 |
| 66 def openCheck(filename, option = 'r', quit = False): | 76 def openCheck(filename, option = 'r', quit = False): |
| 67 '''Open file filename in read mode by default | 77 '''Open file filename in read mode by default |
| 68 and checks it is open | 78 and checks it is open''' |
| 69 | |
| 70 >>> f = openCheck('non_existant_file.txt') | |
| 71 File non_existant_file.txt could not be opened. | |
| 72 ''' | |
| 73 try: | 79 try: |
| 74 return open(filename, option) | 80 return open(filename, option) |
| 75 except IOError: | 81 except IOError: |
| 76 print 'File %s could not be opened.' % filename | 82 print 'File %s could not be opened.' % filename |
| 77 if quit: | 83 if quit: |
| 85 while (len(s) > 0) and s.startswith(commentChar): | 91 while (len(s) > 0) and s.startswith(commentChar): |
| 86 s = f.readline() | 92 s = f.readline() |
| 87 return s.strip() | 93 return s.strip() |
| 88 | 94 |
| 89 def removeExtension(filename, delimiter = '.'): | 95 def removeExtension(filename, delimiter = '.'): |
| 90 '''Returns the filename minus the extension (all characters after last .) | 96 '''Returns the filename minus the extension (all characters after last .)''' |
| 91 >>> removeExtension('test-adfasdf.asdfa.txt') | |
| 92 'test-adfasdf.asdfa' | |
| 93 >>> removeExtension('test-adfasdf') | |
| 94 'test-adfasdf' | |
| 95 ''' | |
| 96 i = filename.rfind(delimiter) | 97 i = filename.rfind(delimiter) |
| 97 if i>0: | 98 if i>0: |
| 98 return filename[:i] | 99 return filename[:i] |
| 99 else: | 100 else: |
| 100 return filename | 101 return filename |
| 129 from shapely.geometry import Polygon | 130 from shapely.geometry import Polygon |
| 130 | 131 |
| 131 tmp = array(poly.exterior) | 132 tmp = array(poly.exterior) |
| 132 plot(tmp[:,0], tmp[:,1], options) | 133 plot(tmp[:,0], tmp[:,1], options) |
| 133 | 134 |
| 135 | |
| 136 ######################### | |
| 137 # running tests | |
| 138 ######################### | |
| 139 | |
| 134 if __name__ == "__main__": | 140 if __name__ == "__main__": |
| 135 import doctest | 141 import doctest |
| 136 import unittest | 142 import unittest |
| 137 #suite = doctest.DocFileSuite('tests/ubc_utils.txt') | 143 suite = doctest.DocFileSuite('tests/utils.txt') |
| 138 suite = doctest.DocTestSuite() | 144 #suite = doctest.DocTestSuite() |
| 139 unittest.TextTestRunner().run(suite) | 145 unittest.TextTestRunner().run(suite) |
| 140 #doctest.testmod() | 146 #doctest.testmod() |
| 141 #doctest.testfile("example.txt") | 147 #doctest.testfile("example.txt") |
