Ignore:
Timestamp:
07/09/15 12:27:04 (9 years ago)
Author:
tim
Message:

.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/nanownlib/stats.py

    r4 r6  
    227227        yield (sid,[dict(r) for r in probes])
    228228
     229
     230def subseries(db, probe_type, unusual_case, size=None, offset=None, field='packet_rtt'):
     231    cursor = db.conn.cursor()
     232    cursor.execute("SELECT max(c) FROM (SELECT count(sample) c FROM probes WHERE type=? GROUP BY test_case)", (probe_type,))
     233    population_size = cursor.fetchone()[0]
     234
     235    if size == None or size > population_size:
     236        size = population_size
     237    if offset == None or offset >= population_size or offset < 0:
     238        offset = numpy.random.random_integers(0,population_size-1)
     239
     240    query="""
     241      SELECT %(field)s AS unusual_case,
     242             (SELECT avg(%(field)s) FROM probes,analysis
     243              WHERE analysis.probe_id=probes.id AND probes.test_case!=:unusual_case AND probes.type=:probe_type AND sample=u.sample) AS other_cases
     244      FROM   (SELECT probes.sample,%(field)s FROM probes,analysis
     245              WHERE analysis.probe_id=probes.id AND probes.test_case =:unusual_case AND probes.type=:probe_type) u
     246      LIMIT :size OFFSET :offset
     247    """ % {"field":field}
     248   
     249    params = {"probe_type":probe_type, "unusual_case":unusual_case, "offset":offset, "size":size}
     250    cursor.execute(query, params)
     251    for row in cursor:
     252        size -= 1
     253        yield dict(row)
     254
     255    if size > 0:
     256        params['offset'] = 0
     257        params['size'] = size
     258        cursor.execute(query, params)
     259        for row in cursor:
     260            yield dict(row)
     261   
     262
    229263# if test_cases=None, include all of them.  Otherwise, include only the specified test cases.
    230264def samples2Distributions(samples, field, test_cases=None):
     
    270304
    271305
     306def bootstrap3(estimator, db, probe_type, unusual_case, subseries_size, num_trials):
     307    ret_val = []
     308    for t in range(num_trials):
     309        ret_val.append(estimator(subseries(db, probe_type, unusual_case, subseries_size)))
     310
     311    return ret_val
     312
     313
    272314# Returns the test case name that clearly has higher RTT; otherwise, returns None
    273315def boxTest(params, test_cases, samples):
     
    329371# Returns 1 if unusual_case is unusual in the expected direction
    330372#         0 otherwise
    331 def midhingeTest(params, unusual_case, greater, samples):
    332     diffs = list(samples2MeanDiffs(samples, 'packet_rtt', unusual_case))
     373def midhingeTest(params, greater, samples):
     374    diffs = [s['unusual_case']-s['other_cases'] for s in samples]
    333375
    334376    mh = midhinge(diffs, params['distance'])
Note: See TracChangeset for help on using the changeset viewer.