woensdag 9 april 2014

Wanted: matching world maps of EEZs and marine productivity

I want to show to my students that only a minority of fish are caught in the high seas, and it would be nice to compare a world map of EEZs to a world map of marine and coastal productivity. So far I've found two sources of such information:
For the time being I combined those but the result is not exactly pretty:

(Click on the picture for a closer look.)

The problem is that
  1. The two maps have different centres (Pacific Ocean for GRID-Arendal, Atlantic Ocean for the EEZ map)
  2. The two maps have different projection methods (Gall-Bertin for GRID-Arendal, and I haven't the faintest idea how to project the EEZ map as such in QGIS)
Are there any maps (preferably shapefiles with the same coordinate systems) of fishing yields and EEZs? Preferably with the Pacific Ocean in the centre? I know the latter is not standard but the Pacific is way more interesting than the Atlantic in this respect.

donderdag 3 april 2014

A simple Python script to make a literature table

Geeky post again - no math this time, but computer code.

I'm sure people have done this before, but I thought it would be a nice opportunity to practice my Python skills to write a small script for the following problem.. Usually when I read a scientific article I watch out for the following elements:
  • Innovation: what does the study do what others haven't done before?
  • Method: what method did they use?
  • Data: where did they get their data from?
  • Results: what are the main results?
  • Relevance: who benefits from this research, and how?
I also like to place the research in one of the four quadrants in this post. I find it helpful to make an overview of these questions in a table:

1st authorYearJournalQuadrantInnovationMethodDataResultsRelevance
Kompas2005Journal of Productivity Analysis4Estimates efficiency gains quota trade for Southeast Trawl Fishery, AUStochastic frontier analysisAFMA and ABARE survey dataITQs gave efficiency gainsPolicy debate on ITQs
Kompas2006Pacific Economic Bulletin3Estimates optimal effort levels and allocation across speciesMultifleet, multispecies, multiregion bioeconomic modelSPC dataEffort reduction needed; optimal stocks larger than BMSYPolicy debate on MEY

But here's the problem: I usually make my notes in a bibtex file (as a good geek should), which looks like this:

@ARTICLE{Kompas2006PacEconBull,
  author = {Kompas, T. and Che, T.N.},
  title = {Economic profit and optimal effort in the Western and Central Pacific tuna fisheries},
  journal = {Pacific Economic Bulletin},
  year = {2006},
  volume = {21},
  pages = {46-62},
  number = {3},
  data = {SPC data},
  innovation = {Estimates optimal effort levels and allocation across species},
  quadrant = {3},
  keywords = {tuna; bioeconomic model; optimisation; Pacific},
  method = {Multifleet, multispecies, multiregion bioeconomic model},
  results = {Effort reduction needed; optimal stocks larger than BMSY},
  relevance = {Policy debate on MEY}
}

@ARTICLE{Kompas2005JProdAnalysis,
  author = {Kompas, Tom and Che, Tuong Nhu},
  title = {Efficiency gains and cost reductions from individual transferable quotas: A stochastic cost frontier for the Australian South East fishery},
  journal = {Journal of Productivity Analysis},
  year = {2005},
  volume = {23},
  pages = {285-307},
  number = {3},
  quadrant = {3},
  data = {AFMA and ABARE survey data},
  innovation = {Estimates efficiency gains quota trade for Southeast Trawl Fishery, AU},
  keywords = {individual transferable quotas; stochastic cost frontier; fishery efficiency; ITQs},
  method = {Stochastic frontier analysis},
  relevance = {Policy debate on ITQs.},
  results = {ITQs gave efficiency gains}
}
I don't want to copy it all by hand, so I wrote this little script in Python to convert all entries in the bibtex file to a csv file:

import csv
from bibtexparser.bparser import BibTexParser
from dicttoxml import dicttoxml
from operator import itemgetter

def readFirstAuthor(inpList,num):
    author1 = ""
    x = inpList[num]['author']
    for j in x:
        if j != ',':
            author1+=j
        else:
            break
    return author1

def selectDict(inpList,name):
    outObj = []
    for i in range(len(inpList)):
        if name in inpList[i]['author'] and \
            inpList[i]['type']=='article':
            outObj.append(inpList[i])
    return(outObj)

def selectFieldsDict(inpList,fieldNames):
    outObj = []
    for i in range(len(inpList)):
        temp = {}
        for n in fieldNames:
            if n == 'author':
                author1 = readFirstAuthor(inpList,i)
                temp['author'] = author1
            else:
                if n in inpList[i]:
                    temp[n] = inpList[i][n]
                else:
                    temp[n] = 'blank'
        outObj.append(temp)
    return(outObj)

fieldnames = ['author','year','journal','quadrant',\
    'innovation','method','data','results','relevance']

with open('BibTexFile.bib', 'r') as bibfile:
    bp = BibTexParser(bibfile)
    
record_list = bp.get_entry_list()
record_dict = bp.get_entry_dict()

dictSelection = selectDict(record_list,'Kompas')

fieldSelection = selectFieldsDict(dictSelection,fieldnames)


test = sorted(fieldSelection, key=itemgetter('year'))


test_file = open('output.csv','wb')
csvwriter = csv.DictWriter(test_file, delimiter=',',\
    fieldnames=fieldnames)
csvwriter.writerow(dict((fn,fn) for fn in fieldnames))
for row in test:
     csvwriter.writerow(row)
test_file.close()

If you are a Python developer: any comments on this are welcome. I'm sure it's not perfect.