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
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