示例#1
0
 def rate_in(self, rate_type):
     filtered_rates = self.rates.filter(rate_type=rate_type)
     if filtered_rates.count() > 0:
         return filtered_rates[0]
     else:
         rf = AgeSpecificRateFunction(disease=self.disease, region=self.region,
                                      sex=self.sex, rate_type=rate_type,
                                      notes='From Disease Model %d' % self.id)
         rf.save()
         self.rates.add(rf)
         return rf
示例#2
0
    def handle(self, *fnames, **options):
        import csv

        if len(fnames) != 1:
            raise CommandError('a single .csv file is required as input.')
        fname = fnames[0]

        print "adding rates from %s" % fname
        disease, created = Disease.objects.get_or_create(name='all causes')
        
        rate_counter = 0

        csv_file = csv.reader(open(fname))
        headings = csv_file.next()
        # check if the headings are as expected, complain if not
        if headings != ['', 'year', 'agegroup', 'sex', 'gbdregion', 'mortalityrate']:
            raise CommandError('csv file headings not as expected.')

        rates_for_region = {}

        for ii,row in enumerate(csv_file):
            params = {}
            params['rate_type'] = 'all-cause mortality data'
            params['disease'], created = Disease.objects.get_or_create(name='all-cause mortality')

            # only load mortality data from 1990 and 2005
            if not (row[1] in ['1990', '2005']):
                continue
            
            params['epoch_start'] = int(row[1])
            params['epoch_end'] = int(row[1])

            if row[2] == '0_1':
                params['age_start'] = 0
                params['age_end'] = 0
            elif row[2] == '85above':
                params['age_start'] = 85
                params['age_end'] = -99
            else:
                ages = row[2].split('-')
                params['age_start'] = int(ages[0])
                params['age_end'] = int(ages[1])

            params['sex'] = row[3]

            region_name = smart_unicode(row[4].strip(), errors='ignore')
            params['country'] = 'all in %s' % region_name
            params['region'], created = Region.objects.get_or_create(name=region_name)

            if row[5] == 'NA':
                continue
            
            params['numerator'] = float(row[5])*10.e7
            params['denominator'] = 10.e7

            rate_data, created = Rate.objects.get_or_create(**params)
            rate_counter += created

            key = str(params['region']) + params['sex'] + str(params['epoch_start'])
            if not rates_for_region.has_key(key):
                rates_for_region[key] = []
            rates_for_region[key] += [rate_data]

        print "added %d rates" % rate_counter

        for rates in rates_for_region.values():
            if len(rates) > 0:
                r = rates[0]
                rf = AgeSpecificRateFunction(disease=r.disease, region=r.region, rate_type=r.rate_type, sex=r.sex)
                rf.save()
                rf.rates = rates
                rf.save()
                print 'created age-specific rate function %d' % rf.id