2015-03-25 5 views
0

Я делаю программу, которая просматривает файл с данными для града в США. Я успешно создал класс с объектами (все состояния) и имею сокращенное состояние штата, количество общих отчетов града и список града для каждого состояния/объекта.Как рассчитать проценты элементов в списке, отвечающем определенным критериям?

Мне нужно составить таблицу, показывающую статистику размеров града для каждого состояния. Я создал метод, который усредняет размеры града для каждого состояния, но я не могу понять, как сделать метод, который вычисляет проценты размеров града, которые попадают в определенный диапазон размеров.

Таблица имеет 5 категорий, для размеров града: < 1.25, 1.25-1.99, 2.0-2.49, 2.5-2.99,> 3.0.
Я уверен, что мне нужно сделать скользящую сумму для каждой категории, но я просто не могу понять, как это сделать с таким количеством категорий. Если бы я мог сделать скользящую сумму, это была бы просто сумма/общее количество отчетов для этого состояния.

Вот код, который я до сих пор:

class stateHail: 
 
    def __init__(self, state): 
 
     self.stateAbbr = state 
 
     self.hailReports = 0 
 
     self.hailSize = [] 
 

 
    def avgSize(self): 
 
     self.avg = (sum(self.hailSize))/self.hailReports 
 
    
 
    #def percents(self): 
 
     #??? 
 
     
 
#Creates objects needed for class 
 

 
states = [] 
 
for x in ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VA", "WA", "WV", "WI", "WY", "PR", "VA", "VI"]: 
 
    stateObject = stateHail(x) 
 
    states.append(stateObject) 
 

 
#Opens file and assigns state abbreviation, hail report number, and list of hail sizes to each object/state 
 

 
fileHail = open("90-99_hail.csv", "r") 
 
try: 
 
    for line in fileHail: 
 
     splitLine=line.split(",") 
 
     abbrFile=splitLine[7] 
 
     for x in states: 
 
      if (abbrFile==x.stateAbbr): 
 
       x.hailSize.append(float(splitLine[10])) 
 
       x.hailReports = x.hailReports + 1 
 
     
 
except: 
 
    fileHail.close() 
 

 
#Calculates average for each state 
 

 
for x in states: 
 
    if (x.hailReports>100): 
 
     x.avgSize() 
 
     print x.avg

ответ

0

Если я правильно понимаю ваш вопрос, то вы можете сохранить процент каждого диапазона в списке. Код может выглядеть следующим образом

self.percentages = [(self.hailSize[i]/self.hailReports) * 100 for i in range(5)] 
+0

Это получает первые пять размеров града, делит их на общее количество отчетов града и умножает эти цифры на 100. Для размеров града '[1,2,2,3,1,4,2,3, 1] ', что приведет к списку' [20, 40, 40, 60, 20] ', который не соответствует чему-либо значимому. – TigerhawkT3

+0

@ TigerhawkT3, danielle может быть в состоянии прояснить, но я предположил self.hailSize [i], чтобы содержать общее количество сообщенных град определенного размера. i.e self.hailSize [0] может содержать общий hailReports с размером '<1,25'. – sandy

+0

Я думаю, что 'self.hailSize' содержит список каждого записанного града. Если он трижды приветствуется, причем первый размер равен 0,7, следующий размер 1.2 и последний 1,1, 'self.hailSize' будет' [0,7,1,2,1,1] '. 'self.avgSize()' полагается на эту настройку, так или иначе. – TigerhawkT3

0

Если у вас есть список размеров града, как это: [1.1,1.1,1.6,1.6,2.1,2.6,3.1,3.1,3.1]

вы можете получить список вроде этого: [2, 2, 1, 1, 3]

из этого:

return [len([item for item in self.hailSize if small<=item<big]) for small,big in [(0,1.25), (1.25,2), (2,2.5), (2.5,3), (3,200)]] 

Кстати, вместо сохранения переменной self.hailReports для подсчета количества элементов в self.hailSize, вы можете j ust использовать len(self.hailSize). Затем сделайте avgSize() просто сделайте return sum(self.hailSize)/len(self.hailSize), а затем вам не нужно вызывать функцию для обновления переменной все время - просто получите средний размер с avgSize().