On Mon, 2012-05-14 at 23:38 -0400, bob gailer wrote: [...] > I would set up a SQLite database with a table of 4 numeric columns: > year, month, rainfall, firearea > Use SQL to select the desired date range and do the max and avg > calculations: > select year, avg(firearea), max(rainfall) from table where year = 1973 > and month between 6 and 8) > > you can use dictionaries but that will be harder. Here a start > (untested). Assumes data are correct.
Clearly if the data is to be stored for a long time and have various (currently unknown) queries passed over it then year a database it the right thing -- though I would probably choose a non-SQL database. If the issues is to just do quick calculations over the data in the file format then nothing wrong with using dictionaries or parallel arrays à la: with open ( 'yearmonthrainfire.txt' ) as infile : climateindexname = infile.readline ( ).split ( ) data = [ line.split ( ) for line in infile.readlines ( ) ] years = sorted ( { item[0] for item in data } ) months = [ 'Jan' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' , 'Sep' , 'Oct' , 'Nov' , 'Dec' ] dataByYear = { year : [ ( float ( item[2] ) , float ( item[3] ) ) for item in data if item[0] == year ] for year in years } dataByMonth = { month : [ ( float ( item[2] ) , float ( item[3] ) ) for item in data if item[1] == month ] for month in months } averagesByYear = { year : ( sum ( dataByYear[year][0] ) / len ( dataByYear[year][0] ) , sum ( dataByYear[year][1] ) / len ( dataByYear[year][1] ) ) for year in years } averagesByMonth = { month : ( sum ( dataByMonth[month][0] ) / len ( dataByMonth[month][0] ) , sum ( dataByMonth[month][1] ) / len ( dataByMonth[month][1] ) ) for month in months } for year in years : print ( year , averagesByYear[year][0] , averagesByYear[year][1] ) for month in months : print ( month , averagesByMonth[month][0] , averagesByMonth[month][1] ) The cost of the repetition in the code here is probably minimal compared to the disc access costs. On the other hand this is a small data set so time is probably not a big issue. -- Russel. ============================================================================= Dr Russel Winder t: +44 20 7585 2200 voip: sip:russel.win...@ekiga.net 41 Buckmaster Road m: +44 7770 465 077 xmpp: rus...@winder.org.uk London SW11 1EN, UK w: www.russel.org.uk skype: russel_winder
signature.asc
Description: This is a digitally signed message part
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor