Jordan Industrial Observatory
Strengthening Industrial Intelligence for enhanced evidence-based policymaking

3. Automated Data Update

The two Python/Pandas scripts below are called by the corresponding (UN Comtrade or UNIDO) front-end programs which in turn are invoked from the Data Update page. These two scripts are located in the /var/www/wordpress/jordan/prototype/scripts/ folder. They are included here to give an idea of the data structures and manipulation involved in displaying the charts.

The front-end programs are HTML/Javascripts/CSS based and they are to be found at:

  • <Wordpress root folder>/jordan/prototype/admin/comtrade_update.html
  • <Wordpress root folder>/var/www/wordpress/jordan/prototype/admin/unido_update.html

UN Comtrade


#!/home/huzaifa/anaconda3/bin/python3
#/usr/bin/python3
# Name: update_comtrade.py
# Created By: Huzaifa Zoomkawala
# Last Modified: August 10, 2021
import cgi
import cgitb; cgitb.enable()  # for troubleshooting
import os
import os.path
import datetime
import json
import pandas as pd
import sys
#------------------------------------ Global Variables
A = ['001', '011', '012', '022', '025', '034', '036', '041', '042', '043', '044', '045', '054', '057', '071', '072', '074', '075', '081', '121', '211', '212', '222', '223', '231', '244', '245', '246', '261', '263', '268', '269', '272', '273', '274', '277', '278', '291', '292', '321', '325', '333', '343', '681', '682', '683', '684', '685', '686', '687']
B = ['016', '017', '023', '024', '035', '037', '046', '047', '048', '056', '058', '059', '061', '062', '073', '091', '098', '111', '112', '122', '232', '247', '248', '251', '264', '265', '421', '422', '431']
C = ['281', '282', '283', '284', '285', '286', '287', '288', '289', '322', '334', '335', '342', '344', '345', '411', '511', '514', '515', '516', '522', '523', '524', '531', '532', '551', '592', '621', '625', '629', '633', '634', '635', '641', '661', '662', '663', '664', '667', '689']
D = ['611', '612', '613', '651', '652', '654', '655', '656', '657', '658', '659', '831', '841', '842', '843', '844', '845', '846', '848', '851']
E = ['642', '665', '666', '673', '674', '675', '676', '677', '679', '691', '692', '693', '694', '695', '696', '697', '699', '821', '893', '894', '895', '897', '898', '899']
F = ['713', '781', '782', '783', '784', '785']
G = ['266', '267', '512', '513', '533', '553', '554', '562', '571', '572', '573', '574', '575', '579', '581', '582', '583', '591', '593', '597', '598', '653', '671', '672', '678', '786', '791', '882']
H = ['711', '712', '714', '721', '722', '723', '724', '725', '726', '727', '728', '731', '733', '735', '737', '741', '742', '743', '744', '745', '746', '747', '748', '749', '761', '762', '763', '772', '773', '775', '778', '793', '811', '812', '813', '872', '873', '884', '885']
I = ['751', '752', '759', '764', '771', '774', '776', '891']
J = ['525', '541', '542', '716', '718', '792', '871', '874', '881']
K = ['351', '883', '892', '896', '961', '971']
RB = B+C
LT = D+E
MT = F+G+H
HT = I+J
manuf = RB+LT+MT+HT
MHT = MT+HT
year_col='Year'
code_col='Commodity Code'
value_col='Trade Value (US$)'
aggr_col='Aggregate Level'
countries = {
	'12': 'Algeria',
	'48': 'Bahrain',
	'818': 'Egypt',
	'275': 'Gaza and West Bank',
	'364': 'Iran',
	'368': 'Iraq',
	'376': 'Israel',
	'400': 'Jordan',
	'414': 'Kuwait',
	'422': 'Lebanon',
	'434': 'Libya',
	'504': 'Morocco',
	'512': 'Oman',
	'682': 'Saudi Arabia',
	'760': 'Syria',
	'788': 'Tunisia',
	'784': 'United Arab Emirates',
	'887': 'Yemen'
}
one_dgt = {
	"1": {"name": "Food, Beverages and Tobacco", "codes":['016', '017' '023', '024', '035',
		'037', '046', '047', '048', '056', '058', '059', '061', '062', '073', '091', '098',
		'111', '112', '122', '411', '421', '422', '431']},
	"2": {"name": "Textiles, wearing apparel and leather products", 'codes':['264','265',
		'266', '267', '611', '612', '613', '651', '652', '653', '654', '655', '656', '657',
		'658', '659', '831', '841', '842', '843', '844', '845', '846', '847', '848', '851']},
	"3": {"name": "Wood and Paper products", 'codes':['247', '248', '633', '634', '635',
		'641', '642', '251']},
	"4": {"name": "Metal products", 'codes':['281', '282', '283', '284', '285', '286', '287',
		'288', '289', '671', '672', '673', '674', '675', '676', '677', '678', '679', '678',
		'689', '691', '692', '693', '694', '695', '696', '697', '698', '699']},
	"5": {"name": "Coke, refined petroleum, non-metallic mineral products and rubber",
		'codes':['232', '322', '334', '335', '621', '625', '629', '661', '662', '663', '664',
		'665', '666', '667', '342', '344', '345']},
	"6": {"name": "Machinery, equipment and telecommunications", 'codes':['711', '712', '713',
		'714','716', '718', '721', '722', '723', '724', '725', '726', '727', '728', '731',
		'733', '735', '737', '741', '742', '743', '744', '745', '746', '747', '748', '749',
		'751', '752', '759', '761', '762', '763', '764', '771', '772', '773', '774', '775',
		'776', '778', '871', '872', '873', '874', '881', '882', '883', '884', '885']},
	"7": {"name": "Transport equipment", 'codes':['781', '782', '783', '784', '785', '786',
		'791', '792', '793']},
	"8": {"name": "Chemical and plastic products", 'codes':['512', '513', '525', '533', '511',
		'514', '515', '516', '522', '523', '524', '531', '532', '541', '542', '551', '553',
		'554', '562', '571', '572', '573', '574', '575', '579', '581', '582', '583', '591',
		'592', '593', '597', '598', '893']},
	"9": {"name": "N.E.S. (incl. furniture, recycling and publishing and printing )",
		'codes':['811', '812', '813', '899', '894', '895', '896', '897', '898', '821', '891']}
}
isos = {
	'12': 'DZA',
	'48': 'BHR',
	'818': 'EGY',
	'275': 'PSE',
	'364': 'IRN',
	'368': 'IRQ',
	'376': 'ISR',
	'400': 'JOR',
	'414': 'KWT',
	'422': 'LBN',
	'434': 'LBY',
	'504': 'MAR',
	'512': 'OMN',
	'682': 'SAU',
	'760': 'SYR',
	'788': 'TUN',
	'784': 'ARE',
	'887': 'YEM'
}
fltrd = {
	'682': 'Saudi Arabia',
	'760': 'Syria',
	'788': 'Tunisia',
	'784': 'United Arab Emirates',
	'887': 'Yemen'
}
#--------------------------------- backup
def backup(typ):
	timestamp = str(datetime.datetime.now()).split('.')
	no_ms = timestamp[0] # remove milliseconds
	day, time = no_ms.split(' ')
	if typ == 'comtrade':
		folders = ('dataframe',)
	else:
		folders = ('mht_by_manuf', 'primary_vs_manuf', 'trends_by_sector', 'trends_by_tech')
	out['output'] = []
	destfolder = '../trade/backup/'+day
	try:
		if not os.path.isdir(destfolder):
			os.makedirs(destfolder)
		for folder in folders:
			command = 'zip -r '+destfolder+'/'+folder+'.zip ../trade/'+folder+'/'
			popen = os.popen(command)
			out['output'] += popen.readlines()
			status = popen.close()
			if status != None:
				break
		if status is None:
			out['status'] = 'success'
		else:
			out['status'] = status
	except:
		out['status'] = 'error'
		out['error'] = str(sys.exc_info()[0])
#------------------------------------- fetchComtradeAPIData((r='400', rg='2', cc='TOTAL')
# Use Comtrade API (https://comtrade.un.org/data/doc/api/#DataRequests) to fetch data directly (via URL) to a DataFrame
#
# Export all 3 digit codes - https://comtrade.un.org/api/get?r=400&px=S3&ps=ALL&p=0&rg=2&cc=AG3&fmt=CSV&type=C&freq=A
# Export Total - https://comtrade.un.org/api/get?r=400&px=S3&ps=ALL&p=0&rg=2&cc=TOTAL&fmt=CSV&type=C&freq=A
# Re-export all 3 digit codes - https://comtrade.un.org/api/get?r=400&px=S3&ps=ALL&p=0&rg=3&cc=AG3&fmt=CSV&type=C&freq=A
# Re-export Total - https://comtrade.un.org/api/get?r=400&px=S3&ps=ALL&p=0&rg=3&cc=TOTAL&fmt=CSV&type=C&freq=A
#
# r: reporting area - https://comtrade.un.org/Data/cache/reporterAreas.json
# rg: trade regime (2: exports, 3: re-exports)
# cc: classification code (AG3: 3 digit SITC Rev 3, TOTAL: total)
def fetchComtradeAPIData(r='400', rg='2', cc='TOTAL'):
	url = 'https://comtrade.un.org/api/get?r='+r+'&px=S3&ps=ALL&p=0&rg='+rg+'&cc='+cc+'&fmt=CSV&type=C&freq=A'
	#print(url)
	try:
		df = pd.read_csv(url, dtype={code_col: str})
		df[year_col]=df[year_col].astype(str)
		return df
	except:
		out['status'] = 'error'
		out['error'] = str(sys.exc_info()[0])
		return None
#------------------------------------- saveIfOk
def saveIfOk(sizes, df, country_title, filename):
	if df is not None:
		read_size = df.shape[0]
		exp_size = sizes[country_title][filename]
		if (read_size == 1) and (exp_size > 1):
			out['status'] = 'error'
			out['error'] = filename+' for '+country_title+' should not be empty'
			return False
		else:
			toCSV(df, '../trade/dataframe/'+country_title+'/'+filename)
			return True
	else:
		return False # no need to set out['status'] as reaching this point means it has been already set by fetchComtradeAPIData
#------------------------------------- fetchExportData(country)
def fetchExportData(country):
	#global df_exports_tot, df_exports_3_dgt, df_reexports_tot, df_reexports_3_dgt
	sizes = json.load(open('dataframe_sizes.json'))
	out['status'] = 'success'
	if country != 'none':
		country_title = countries[country]
		if (not os.path.isdir('../trade/dataframe/'+country_title)):
			os.makedirs('../trade/dataframe/'+country_title)
		df_exports_tot = fetchComtradeAPIData(country, '2')
		if saveIfOk(sizes, df_exports_tot, country_title, 'exports_tot.csv'):
			df_exports_3_dgt = fetchComtradeAPIData(country, '2', 'AG3')
			if saveIfOk(sizes, df_exports_3_dgt, country_title, 'exports_3_dgt.csv'):
				df_reexports_tot = fetchComtradeAPIData(country, '3')
				if saveIfOk(sizes, df_reexports_tot, country_title, 'reexports_tot.csv'):
					df_reexports_3_dgt = fetchComtradeAPIData(country, '3', 'AG3')
					saveIfOk(sizes, df_reexports_3_dgt, country_title, 'reexports_3_dgt.csv')
#------------------------------------- fetchImportData(country)
def fetchImportData(country):
	#global df_imports_tot, df_imports_3_dgt, df_reimports_tot, df_reimports_3_dgt
	sizes = json.load(open('dataframe_sizes.json'))
	out['status'] = 'success'
	if country != 'none':
		country_title = countries[country]
		if (not os.path.isdir('../trade/dataframe/'+country_title)):
			os.makedirs('../trade/dataframe/'+country_title)
		df_imports_tot = fetchComtradeAPIData(country, '1')
		if saveIfOk(sizes, df_imports_tot, country_title, 'imports_tot.csv'):
			df_imports_3_dgt = fetchComtradeAPIData(country, '1', 'AG3')
			if saveIfOk(sizes, df_imports_3_dgt, country_title, 'imports_3_dgt.csv'):
				df_reimports_tot = fetchComtradeAPIData(country, '4')
				if saveIfOk(sizes, df_reimports_tot, country_title, 'reimports_tot.csv'):
					df_reimports_3_dgt = fetchComtradeAPIData(country, '4', 'AG3')
					saveIfOk(sizes, df_reimports_3_dgt, country_title, 'reimports_3_dgt.csv')
#------------------------------------- getFltrd(df_3_dgt, fltr_on)
def getFltrd(df_3_dgt, fltr_on):
	df_fltr = df_3_dgt[df_3_dgt[code_col].isin(fltr_on)]
	return df_fltr[[year_col, value_col]].groupby(year_col).sum()
#------------------------------------- getPct(df_tot, df_3_dgt, fltr_on, tot)
def getPct(df_tot, df_3_dgt, fltr_on, tot):
	df_fltr_nmrtr = df_3_dgt[df_3_dgt[code_col].isin(fltr_on)]
	# TOTAL
	if tot == 'TOTAL':
		df_fltr_denom = df_tot
	else:
		df_fltr_denom = df_3_dgt[df_3_dgt[code_col].isin(tot)]
	global df_nmrtr, df_denom
	df_nmrtr = df_fltr_nmrtr[[year_col, value_col]].groupby(year_col).sum()
	df_denom = df_fltr_denom[[year_col, value_col]].groupby(year_col).sum()
	# group and sum
	df_pct = df_nmrtr/df_denom * 100
	return df_nmrtr, df_denom, df_pct
################################ FIGURE 1: Manufactured Goods against Primary Goods ########################################
#------------------------------------- getFigure1Data(country)
def getFigure1Data(country):
	global df_exports_tot, df_exports_3_dgt, df_reexports_tot, df_reexports_3_dgt
	folder = '../trade/dataframe/'+countries[country]+'/'
	df_exports_tot = pd.read_csv(folder+'exports_tot.csv')
	df_exports_3_dgt = pd.read_csv(folder+'exports_3_dgt.csv', dtype={code_col: str})
	df_reexports_tot = pd.read_csv(folder+'reexports_tot.csv')
	df_reexports_3_dgt = pd.read_csv(folder+'reexports_3_dgt.csv', dtype={code_col: str})
#------------------------------------- computeFigure1All(fltr_on, tot)
def computeFigure1All(fltr_on, tot):
	df_nmrtr_exports, df_denom_exports, df_pct_exports = getPct(df_exports_tot, df_exports_3_dgt, fltr_on, tot)
	if df_reexports_tot.shape[0] > 1:
		df_nmrtr_reexports, df_denom_reexports, df_pct_reexports = getPct(df_reexports_tot, df_reexports_3_dgt, fltr_on, tot)
		df_pct_netexports = df_nmrtr_exports.subtract(df_nmrtr_reexports, fill_value=0)/df_denom_exports.subtract(df_denom_reexports, fill_value=0) * 100
	else:
		df_pct_reexports = None
		df_pct_netexports = df_pct_exports
	return df_pct_exports, df_pct_reexports, df_pct_netexports
#------------------------------------- saveFigure1Files
def saveFigure1Files(country):
	iso = isos[country]
	getFigure1Data(country)
	out['status'] = 'success'
	df_pct_exports_prmry_vs_tot, df_pct_reexports_prmry_vs_tot, df_pct_netexports_prmry_vs_tot =
		computeFigure1All(A, 'TOTAL')
	df_pct_exports_manuf_vs_tot, df_pct_reexports_manuf_vs_tot, df_pct_netexports_manuf_vs_tot =
		computeFigure1All(manuf, 'TOTAL')
	dest='../trade/primary_vs_manuf'
	folder = dest+'/'+iso
	if (not os.path.isdir(folder)):
		os.makedirs(folder)
	toCSV(df_pct_exports_prmry_vs_tot, folder+'/pct_exports_prmry_vs_tot.csv', True) # index=True
	toCSV(df_pct_exports_manuf_vs_tot, folder+'/pct_exports_manuf_vs_tot.csv', True)
	if (df_pct_reexports_prmry_vs_tot is not None) and (df_pct_reexports_prmry_vs_tot.shape[0] > 1):
		toCSV(df_pct_reexports_prmry_vs_tot, folder+'/pct_reexports_prmry_vs_tot.csv', True)
		toCSV(df_pct_netexports_prmry_vs_tot, folder+'/pct_netexports_prmry_vs_tot.csv', True)
		toCSV(df_pct_reexports_manuf_vs_tot, folder+'/pct_reexports_manuf_vs_tot.csv', True)
		toCSV(df_pct_netexports_manuf_vs_tot, folder+'/pct_netexports_manuf_vs_tot.csv', True)
################################ Figure 2 ######################################
#------------------------------------- getFigure2Data(country)
def getFigure2Data(country):
	global df_exports_tot, df_exports_3_dgt, df_reexports_tot, df_reexports_3_dgt
	folder = '../trade/dataframe/'+countries[country]+'/'
	df_exports_tot = pd.read_csv(folder+'exports_tot.csv')
	df_exports_3_dgt = pd.read_csv(folder+'exports_3_dgt.csv', dtype={code_col: str})
	df_reexports_tot = pd.read_csv(folder+'reexports_tot.csv')
	df_reexports_3_dgt = pd.read_csv(folder+'reexports_3_dgt.csv', dtype={code_col: str})
#------------------------------------- computeFigure2
def computeFigure2(fltr_on, tot):
	df_nmrtr_exports, df_denom_exports, df_pct_exports = getPct(df_exports_tot, df_exports_3_dgt, fltr_on, tot)
	if df_reexports_tot.shape[0] > 1:
		df_nmrtr_reexports, df_denom_reexports, df_pct_reexports = getPct(df_reexports_tot, df_reexports_3_dgt, fltr_on, tot)
		df_pct_netexports = df_nmrtr_exports.subtract(df_nmrtr_reexports, fill_value=0)/df_denom_exports.subtract(df_denom_reexports, fill_value=0) * 100
	else:
		df_pct_reexports = None
		df_pct_netexports = df_pct_exports
	return df_pct_exports, df_pct_reexports, df_pct_netexports
#------------------------------------- computeFigure2Group
def computeFigure2Group(fltrd):
	figure2 = {}
	# First get the data sets for each country, then compute the division (MHT/manuf) and finally rename their "Trade Value (US$)" columns to country name
	for country, iso in fltrd.items():
		#print(country, iso)
		getFigure2Data(country)
		df_exports_mht_vs_manuf, df_reexports_mht_vs_manuf, df_netexports_mht_vs_manuf =
			computeFigure2(MHT, manuf)
		df_exports_mht_vs_manuf.rename(columns={"Trade Value (US$)": fltrd[country]}, inplace=True)
		if isinstance(df_reexports_mht_vs_manuf, pd.DataFrame) and (df_reexports_mht_vs_manuf.shape[0]>1):
			df_reexports_mht_vs_manuf.rename(columns={"Trade Value (US$)": fltrd[country]}, inplace=True)
			df_netexports_mht_vs_manuf.rename(columns={"Trade Value (US$)": fltrd[country]}, inplace=True)
		else:
			df_reexports_mht_vs_manuf = None
			df_netexports_mht_vs_manuf = df_exports_mht_vs_manuf
		figure2[country] = {
			'df_exports_mht_vs_manuf': df_exports_mht_vs_manuf,
			'df_reexports_mht_vs_manuf': df_reexports_mht_vs_manuf,
			'df_netexports_mht_vs_manuf': df_netexports_mht_vs_manuf
		}
	# Now combine the datasets for each country for chart
	keys = list(figure2.keys())
	keys.reverse
	key = keys.pop()
	df_exports_mht_vs_manuf = figure2[key]['df_exports_mht_vs_manuf']
	df_reexports_mht_vs_manuf = figure2[key]['df_reexports_mht_vs_manuf']
	df_netexports_mht_vs_manuf = figure2[key]['df_netexports_mht_vs_manuf']
	for key in keys:
		df_exports_mht_vs_manuf = df_exports_mht_vs_manuf.join(figure2[key]['df_exports_mht_vs_manuf'], how='outer')
		df_netexports_mht_vs_manuf = df_netexports_mht_vs_manuf.join(figure2[key]['df_netexports_mht_vs_manuf'], how='outer')
		df_reexports_mht_vs_manuf = joinDataframes(df_reexports_mht_vs_manuf, figure2[key]['df_reexports_mht_vs_manuf'])
		#if isinstance(figure2[key]['df_reexports_mht_vs_manuf'], pd.DataFrame) and
		#	(figure2[key]['df_reexports_mht_vs_manuf'].shape[0]>1):
		#	df_reexports_mht_vs_manuf = df_reexports_mht_vs_manuf.
		#		join(figure2[key]['df_reexports_mht_vs_manuf'], how='outer')
	return df_exports_mht_vs_manuf, df_reexports_mht_vs_manuf, df_netexports_mht_vs_manuf
#------------------------------------- joinDataFrames(df1, df2)
def joinDataframes(df1, df2):
	df1_ok = isinstance(df1, pd.DataFrame) and (df1.shape[0] > 1)
	df2_ok = isinstance(df2, pd.DataFrame) and (df2.shape[0] > 1)
	if df1_ok and df2_ok:
		return df1.join(df2, how='outer')
	elif df1_ok:
		return df1
	elif df2_ok:
		return df2
	else:
		return None
#------------------------------------- saveFigure2Files
def saveFigure2Files():
	out['status'] = 'success'
	df_exports_mht_vs_manuf, df_reexports_mht_vs_manuf, df_netexports_mht_vs_manuf = computeFigure2Group(isos)
	folder='../trade/mht_by_manuf'
	if (not os.path.isdir(folder)):
		os.makedirs(folder)
	toCSV(df_exports_mht_vs_manuf.T, folder+'/exports_mht_vs_manuf.csv', 'iso')
	toCSV(df_reexports_mht_vs_manuf.T, folder+'/reexports_mht_vs_manuf.csv', 'iso')
	toCSV(df_netexports_mht_vs_manuf.T, folder+'/netexports_mht_vs_manuf.csv', 'iso')
################################ Figure 3: #####################################
#------------------------------------- getFigure3Data(country)
def getFigure3Data(country):
	global df_exports_3_dgt, df_reexports_3_dgt
	folder = '../trade/dataframe/'+countries[country]+'/'
	out['status'] = 'success'
	df_exports_3_dgt = pd.read_csv(folder+'exports_3_dgt.csv', dtype={code_col: str})
	df_reexports_3_dgt = pd.read_csv(folder+'reexports_3_dgt.csv', dtype={code_col: str})
#------------------------------------- computeFigure3Group(fltrd=countries)
def computeFigure3Group(fltrd=countries):
	figure3 = {}
	categories = {'RB': RB, 'LT': LT, 'MT': MT, 'HT': HT}
	for country in fltrd:
		figure3[country]={ 'exports': {}, 'reexports': {}, 'netexports': {}}
		getFigure3Data(country)
		for key, category in categories.items():
			figure3[country]['exports'][key] = getFltrd(df_exports_3_dgt, category)
			if df_reexports_3_dgt.shape[0] > 1:
				figure3[country]['reexports'][key] = getFltrd(df_reexports_3_dgt, category)
				figure3[country]['netexports'][key] = getFltrd(df_exports_3_dgt, category).
					subtract(getFltrd(df_reexports_3_dgt, category))
			else:
				figure3[country]['reexports'][key] = None
				figure3[country]['netexports'][key] = getFltrd(df_exports_3_dgt, category)
	return figure3
#------------------------------------- saveFigure3Files
def saveFigure3Files():
	figure3 = computeFigure3Group(isos)
	tech_sctrs = ['RB', 'LT', 'MT', 'HT']
	out['status'] = 'success'
	for country, datahash in figure3.items():
		iso = isos[country]
		#print(iso)
		for typ in datahash.keys():
			if datahash[typ]['RB'] is not None:
				#print(typ)
				dest='../trade/trends_by_tech'
				folder = dest+'/'+iso+'/'+typ
				if (not os.path.isdir(folder)):
					os.makedirs(folder)
				for tech_sctr in tech_sctrs:
					toCSV(datahash[typ][tech_sctr], folder+'/'+tech_sctr+'.csv', True)
					#datahash[typ][tech_sctr].to_csv(folder+'/'+tech_sctr+'.csv')
################################ Figure 4: #####################################
#------------------------------------- getFigure4Data(country)
def getFigure4Data(country):
	global df_exports_3_dgt, df_reexports_3_dgt, df_imports_3_dgt, df_reimports_3_dgt
	folder = '../trade/dataframe/'+countries[country]+'/'
	df_exports_3_dgt = pd.read_csv(folder+'exports_3_dgt.csv', dtype={code_col: str})
	df_reexports_3_dgt = pd.read_csv(folder+'reexports_3_dgt.csv', dtype={code_col: str})
	df_imports_3_dgt = pd.read_csv(folder+'imports_3_dgt.csv', dtype={code_col: str})
	df_reimports_3_dgt = pd.read_csv(folder+'reimports_3_dgt.csv', dtype={code_col: str})
#------------------------------------- computeFigure4Group(fltrd=countries)
def computeFigure4Group(fltrd=countries):
	figure4 = {}
	categories = {}
	for category in one_dgt.keys():
		categories[category] = one_dgt[category]['codes']
	for country in fltrd:
		figure4[country]={ 'exports': {}, 'reexports': {}, 'netexports': {},
			'imports': {}, 'reimports': {}, 'netimports': {}}
		getFigure4Data(country)
		for key, category in categories.items():
			figure4[country]['exports'][key] = getFltrd(df_exports_3_dgt, category)
			if df_reexports_3_dgt.shape[0] > 1:
				figure4[country]['reexports'][key] = getFltrd(df_reexports_3_dgt, category)
				figure4[country]['netexports'][key] = getFltrd(df_exports_3_dgt, category).
					subtract(getFltrd(df_reexports_3_dgt, category))
			else:
				figure4[country]['reexports'][key] = None
				figure4[country]['netexports'][key] = getFltrd(df_exports_3_dgt, category)
			figure4[country]['imports'][key] = getFltrd(df_imports_3_dgt, category)
			if df_reimports_3_dgt.shape[0] > 1:
				figure4[country]['reimports'][key] = getFltrd(df_reimports_3_dgt, category)
				figure4[country]['netimports'][key] = getFltrd(df_imports_3_dgt, category).
					subtract(getFltrd(df_reimports_3_dgt, category))
			else:
				figure4[country]['reimports'][key] = None
				figure4[country]['netimports'][key] = getFltrd(df_imports_3_dgt, category)
	return figure4
#------------------------------------- saveFigure4Files
def saveFigure4Files():
	out['status'] = 'success'
	figure4 = computeFigure4Group(isos)
	one_dgt_sctrs = list(map(str, range(1,10)))
	for country, datahash in figure4.items():
		iso = isos[country]
		#print(iso)
		for typ in datahash.keys():
			if datahash[typ]['1'] is not None:
				#print(typ)
				dest='../trade/trends_by_sector'
				folder = dest+'/'+iso+'/'+typ
				if (not os.path.isdir(folder)):
					os.makedirs(folder)
				for sctr in one_dgt_sctrs:
					toCSV(datahash[typ][sctr], folder+'/'+sctr+'.csv', True)
					#datahash[typ][sctr].to_csv(folder+'/'+sctr+'.csv')
#------------------------------------- toCSV
def toCSV(df, fil, index=False):
	if isinstance(df, pd.DataFrame):
		checkAndRemove(fil)
		if type(index) is bool:
			df.to_csv(fil, index=index)
		else: # if index is not True/False it is the index_label
			df.to_csv(fil, index_label=index)
#------------------------------------- checkAndRemove(fil)
def checkAndRemove(fil):
	if os.path.exists(fil):
		os.remove(fil)
#------------------------------------- saveStatus()
def saveStatus():
	status = {}
	status['status'] = form.getvalue('status', 'none')
	status['date'] = str(datetime.datetime.today()).split(' ')[0]
	if not status['status'] in ('none', 'success'):
		status['country'] = form.getvalue('country', 'none')
	try:
		json.dump(status, open('comtrade_status.json','w'))
	except:
		out['status'] = 'error'
		out['error'] = str(sys.exc_info()[0])
#--------------------------------- MAIN
print("Content-type: text/json")
print()
form = cgi.FieldStorage(keep_blank_values=True)
action = form.getvalue('action', 'none')
#folder = form.getvalue('folder','../instance')
out= { 'action': action }
if action == 'backup_comtrade':
	backup('comtrade')
elif action == 'backup_chartdata':
	backup('chartdata')
elif action == 'fetch_exports':
	country = form.getvalue('country', 'none')
	out['country'] = country
	fetchExportData(country)
elif action == 'fetch_imports':
	country = form.getvalue('country', 'none')
	out['country'] = country
	fetchImportData(country)
elif action == 'fig1':
	country = form.getvalue('country', 'none')
	out['country'] = country
	saveFigure1Files(country)
elif action == 'fig2':
	saveFigure2Files()
elif action == 'fig3':
	saveFigure3Files()
elif action == 'fig4':
	saveFigure4Files()
elif action == 'save_status':
	saveStatus()
else:
	out['error'] = "No valid action specified: "+action
print(json.dumps(out, indent=3))

UNIDO


#!/home/huzaifa/anaconda3/bin/python3
#/usr/bin/python3
# Name: update_unido.py
# Created By: Huzaifa Zoomkawala
# Last Modified: September 4, 2021
import cgi
import cgitb; cgitb.enable()  # for troubleshooting
import datetime
import os
import os.path
import time
import json
import pandas as pd
import shutil
import sys
#------------------------------------ Global Variables
colset = {
	'indstat': {'Table Code', 'Country Code', 'Year', 'ISIC', 'ISIC Combination', 'Value', 'Table Definition Code', 'Source Code', 'Unit'},
	'mva': {'Variable Code', 'Country Code', 'Year', 'Value', 'Unit'}
}
varcols = { 'indstat': 'Table Code', 'mva': 'Variable Code' }
varset = {
	'indstat': {'01', '04', '20', '31'},
	'mva': {'GdpCud', 'MvaCud', 'GdpCod', 'MvaCod', 'Pop'}
}
units = { '#', '$'}
minsize = { 'indstat2' : 50e3, 'indstat4': 100e3, 'indstat4_4': 48e3, 'mva': 3e3 }
countries = {
	'indstat': {'048', '368', '422', '504', '414', '012', '434', '760', '792', '682',
	'275', '512', '887', '784', '400', '788', '376', '818', '364', '634'},
	'mva': {'048', '368', '422', '504', '414', '012', '434', '760', '792', 'WOR',
		'682', '275', '512', '887', '784', '400', '788', '376', '818', '364', '634'}
}
isic_set = {
	'indstat2': {'22', '26', '25', '33', '19', '36', '29', '34', '35', '15', '20',
	'30', '16', '37', 'D', '28', '23', '27', '18', '31', '32', '24', '21', '17'},
	'indstat4_4': {'2811', '2520', '3319', '1702', '1062', '1075', '1313', '2310',
	'3091', '1061', '2652', '2750', '239', '2030', '2660', '2815', '2610', '2910',
	'1623', '1104', '2591', '2431', '321', '1511', '2393', '1071', '243', '2930',
	'1512', '162', '251', '2211', '2816', '3012', '309', '2821', '1920', '301',
	'2100', '259', '2822', '1010', '1073', '3020', '1311', '2731', '2710', '273',
	'2732', '1391', '1811', '2012', '3290', '1080', '3311', '3211', '2513', '2511',
	'281', '2029', '106', '3212', '1520', '3250', '3312', '3313', '3092', '1709',
	'2817', '1050', '2512', '2640', '1910', '2396', '170', '2219', '1102', '181',
	'1072', '1393', '1200', '1410', '131', '139', '3011', '1622', '3100', '2825',
	'2392', '2733', '1101', '282', '110', '2021', '2395', '1392', '1040', '2829',
	'2399', '3030', '1621', '2630', '1312', '3230', '331', '2818', '2013', '151',
	'2599', '221', '201', '2819', '1430', '3320', '2011', '1610', '2432', '2790',
	'2420', 'C', '1820', '2220', '1394', '3220', '2826', '1103', '1812', '2391',
	'2920', '3315', '1020', '2022', '1079', '2410', '3240', '2720', '3040', '3099',
	'1420', '3314', '2620', '2813', '1629', '2812', '107', '1701', '2651', '2823',
	'2592', '2593', '2824', '2023', '1030', '265', '2680', '202', '1074', '1399',
	'2394', '2740', '2670', '2814'},
	'indstat4': {'2694', '1553', '3430', '2924', '2811', '1532', '2520', '3190',
	'2925', '2310', '2610', '2330', '2413', '2919', '1511', '2930', '1512', '251',
	'3693', '2211', '242', '2926', 'D', '1920', '3511', '1911', '2109', '1730',
	'1810', '2731', '191', '2913', '2710', '273', '2732', '3520', '1711', '3610',
	'3311', '3140', '3120', '359', '2511', '3591', '3699', '281', '292', '210',
	'1549', '1721', '2029', '1722', '1552', '1520', '2320', '2693', '3312', '3313',
	'2102', '3530', '241', '3210', '3599', '2691', '2915', '369', '2219', '2922',
	'153', '2912', '2101', '3130', '2230', '2222', '2927', '2421', '1729', '1531',
	'1543', '3420', '3692', '2010', '3710', '2021', '2411', '2412', '2929', '3694',
	'222', '2892', '3230', '331', '151', '1912', '1600', '221', '2914', '172',
	'3320', '2692', '2696', '3512', '3150', '1820', '1723', '2921', '2891',
	'1514', '3220', '2422', '2429', '3720', '2695', '3410', '1533', '1712', '2423',
	'3000', '1541', '3592', '2022', '2893', '2430', '2923', '2424', '3691', '2221',
	'2519', '2720', '269', '1551', '351', '3330', '1554', '2212', '2813', '2899',
	'155', '171', '2812', '1542', '154', '2023', '1513', '291', '202', '2699',
	'3110', '289', '2911', '1544', '2213'}
}
# for convertTech and related routines
isic_indstat = dict(
	indstat2 = dict(
		lt = ['15', '16', '17', '18', '19', '20', '21', '22', '36', '37'],
		ml = ['23', '25', '26', '27', '28'],
		mht = ['24', '29', '30', '31', '32', '33', '34'],
		lt_incl = [],
		ml_incl = [],
		mht_incl = [],
		lt_excl = [],
		ml_excl = [],
		mht_excl = []
	),
	indstat4 = dict(
		lt = ['15', '16', '17', '18', '19', '20', '21', '22', '36', '37'],
		ml = ['23', '25', '26', '27', '28'],
		mht = ['24', '29', '30', '31', '32', '33', '34', '35'],
		lt_incl = [],
		ml_incl = ['351'],
		mht_incl = [],
		lt_excl = [],
		ml_excl = [],
		mht_excl = ['351']
	),
	indstat4_4 = dict(
		lt = ['10', '11', '12', '13', '14', '15', '16', '17', '18', '25', '31'],
		ml = ['22', '23', '24', '32', '33'],
		mht = ['20', '21', '26', '27', '28', '29', '30'],
		lt_incl = [],
		ml_incl = ['301'],
		mht_incl = ['252', '325'],
		lt_excl = ['252'],
		ml_excl = ['325'],
		mht_excl = ['301']
	)
)
#------------------------------------ checkDB
def checkDB(dbtype, df):
	out['status'] = 'error'
	out['error'] = 'unspecified'
	if dbtype.startswith('indstat'):
		refcols = colset['indstat']
		varcol = varcols['indstat']
		varlist = varset['indstat']
		refcountries = countries['indstat']
	else:
		refcols = colset['mva']
		varcol = varcols['mva']
		varlist = varset['mva']
		refcountries = countries['mva']
	cols = set(df.columns)
	if refcols.issubset(cols):
		if minsize[dbtype] < df.shape[0]: df_countries = set(df['Country Code']) if dbtype == 'indstat4_4': countries_cond = df_countries.issubset(refcountries) else: countries_cond = (df_countries == refcountries) if countries_cond: df_vars = set(df[varcol]) if df_vars == varlist: df_units = set(df['Unit']) if df_units == units: if dbtype == 'mva': out['status'] = 'success' else: df_isics = set(df['ISIC']) refisics = isic_set[dbtype] len_common = len(refisics.intersection(df_isics)) len_all = len(refisics) pct_intersect = round(len_common/len_all * 100) if pct_intersect > 85:
								out['status'] = 'success'
							else:
								out['error'] = 'ISIC codes in data file do not match those for '+dbtype
					else:
						out['error'] =	'Unit for data file is not correct. Make sure US Dollar is chosen instead of Local Currency'
				else:
					out['error'] =	'Variables in data file are not chosen according to specification for '+dbtype
			else:
				if dbtype == 'mva':
					out['error'] = 'Countries in data set should only be from MENA region or the World (as a region)'
				else:
					out['error'] = 'Countries in data set should only be from MENA region'
		else:
			out['error'] =	f'Too few rows in data file: Expected minimum {minsize[dbtype]:,.0f} and found {df.shape[0]:,.0f}'
	else:
		out['error'] = 'Columns in data file not correct: please check specification for '+dbtype
#--------------------------------- saveAsCSV
def saveAsCSV(dbtype, df):
	df_country = pd.read_csv('country.csv', dtype={'numeric': str})
	df_country.set_index('numeric', inplace=True)
	out['status'] == 'success'
	df_with_iso = df.merge(df_country, left_on='Country Code', right_on=df_country.index, how='left')
	if dbtype == 'mva':
		df_mva = df_with_iso[['Year', 'iso', 'Variable Code', 'Value']]
		df_mva.rename(columns={'Year': 'year', 'Variable Code': 'var', 'Value': 'value'}, inplace=True)
		# recode 'var/Variable Code'
		df_mva.loc[df_mva['var']=='GdpCud', 'var']='gdp'
		df_mva.loc[df_mva['var']=='MvaCud', 'var']='mva'
		df_mva.loc[df_mva['var']=='GdpCod', 'var']='gdpcons'
		df_mva.loc[df_mva['var']=='MvaCod', 'var']='mvacons'
		df_mva.loc[df_mva['var']=='Pop', 'var']='pop'
		df_mva.to_csv(datafolder+'/mva.csv', index=False)
	else: # indstat2 or indstat4 or indstat4_4
		if dbtype == 'indstat2':
			isic = 'isic2'
		else:
			isic = 'isic4'
		df_indstat = df_with_iso[['Year', 'iso', 'Table Code', 'ISIC', 'Value']]
		df_indstat.rename(columns={'Year': 'year', 'Table Code': 'var', 'ISIC': isic, 'Value': 'value'}, inplace=True)
		# recode 'var/Variable Code'
		df_indstat.loc[df_indstat['var']=='01','var']='est'
		df_indstat.loc[df_indstat['var']=='04','var']='emp'
		df_indstat.loc[df_indstat['var']=='20','var']='va'
		df_indstat.loc[df_indstat['var']=='31','var']='fem'
		df_indstat.to_csv(datafolder+'/'+dbtype+'.csv', index=False)
#--------------------------------- listFiles
def listFiles():
	out['files'] = { fil.split('.csv')[0]: time.strftime('%m/%d/%Y', time.gmtime(os.path.getmtime(datafolder+'/'+fil)))
		for fil in filter(lambda x: x.endswith("csv"), os.listdir(datafolder)) }
	out['status'] = 'success'
#--------------------------------- get_specifics (for convertTech)
def get_specifics(indstat, group):
	if indstat == '2':
		df_indstat = df_indstat2
		overall_group = 'D'
		isic_col = 'isic2'
		isic_maxlen = 2
	elif indstat == '4':
		df_indstat = df_indstat4
		overall_group = 'D'
		isic_col = 'isic4'
		isic_maxlen = 4
	else: # indstat == '4_4':
		df_indstat = df_indstat4_4
		overall_group = 'C'
		isic_col = 'isic4'
		isic_maxlen = 4
	if group == 'overall':
		cond = df_indstat[isic_col] == overall_group
		cond_add = None
	else: # group == 'lt' or 'mt' or 'mht':
		cond = df_indstat[isic_col].str[:2].isin(isic_indstat['indstat'+indstat][group]) &
			   (df_indstat[isic_col].str.len() == isic_maxlen) &
			   ~df_indstat[isic_col].str[:3].isin(isic_indstat['indstat'+indstat][group+'_excl'])
		cond_add = df_indstat[isic_col].isin(isic_indstat['indstat'+indstat][group+'_incl'])
	return df_indstat, cond, cond_add, isic_col
#--------------------------------- calc_shr_add_indemp (for ConvertTech)
### additional (included) ISICs
def calc_shr_add_indemp(df_indstat, cond_add, isic_col, ind='fem'):
	df_add_ind = df_indstat[(df_indstat['iso'] != 'WLD') & (df_indstat['var'] == ind) & cond_add]
	df_add_emp = df_indstat[(df_indstat['iso'] != 'WLD') & (df_indstat['var'] == 'emp') & cond_add]
	df_add_ind.rename(columns = {isic_col:'isic'}, inplace = True)
	df_add_emp.rename(columns = {isic_col:'isic'}, inplace = True)
	df_add_ind = df_add_ind[['year', 'iso', 'isic', 'value']].set_index(['year', 'iso', 'isic'])
	df_add_emp = df_add_emp[['year', 'iso', 'isic', 'value']].set_index(['year', 'iso', 'isic'])
	return df_add_ind, df_add_emp
#----------------------------------- makeTSCopy
def makeTSCopy(folder, filename):
	timestamp = str(datetime.datetime.now()).split('.')
	no_ms = timestamp[0] # remove milliseconds
	day, time = no_ms.split(' ')
	minute = ':'.join(time.split(':')[:2])
	dest = folder+'/backup/'+day+' '+minute
	if not os.path.isdir(dest):
		os.makedirs(dest)
	if os.path.isfile(folder+'/'+filename):
		shutil.copyfile(folder+'/'+filename, dest+'/'+filename)
#--------------------------------- calc_shr_indemp (for ConvertTech)
def calc_shr_indemp(indstat, group, ind='fem', pct=1):
	df_indstat, cond, cond_add, isic_col = get_specifics(indstat, group)
	df_ind = df_indstat[(df_indstat['iso'] != 'WLD') & (df_indstat['var'] == ind) & cond]
	df_emp = df_indstat[(df_indstat['iso'] != 'WLD') & (df_indstat['var'] == 'emp') & cond]
	if group == 'overall':
		fields_include = ['year', 'iso', 'value']
		fields_index = ['year', 'iso']
		df_ind = df_ind[fields_include].set_index(fields_index)
		df_emp = df_emp[fields_include].set_index(fields_index)
	else:
		df_ind['isic'] = df_ind[isic_col].str[:2]
		df_ind = df_ind.groupby(['year', 'iso', 'isic']).sum()
		df_emp['isic'] = df_emp[isic_col].str[:2]
		df_emp = df_emp.groupby(['year', 'iso', 'isic']).sum()
	df_shr_indemp = ((df_ind/df_emp) * pct).dropna()
	if group != 'overall':
		df_add_ind, df_add_emp = calc_shr_add_indemp(df_indstat, cond_add, isic_col, ind)
		if df_add_ind.shape[0] > 0:
			df_shr_indemp = df_shr_indemp.append(((df_add_ind/df_add_emp) * pct).dropna())
			df_ind = df_ind.append(df_add_ind)
			df_emp = df_emp.append(df_add_emp)
		# Add group total
		df_shr_indemp_tot = (df_ind.groupby(['year', 'iso']).sum()/df_emp.groupby(['year', 'iso']).sum()*pct).dropna()
		df_shr_indemp_tot['isic'] = group
		df_shr_indemp_tot.reset_index(inplace=True)
		df_shr_indemp_tot.set_index(['year','iso', 'isic'], inplace=True)
		df_shr_indemp = df_shr_indemp.append(df_shr_indemp_tot)
	destfolder = tblnfolder+'/indstat'+indstat
	if not os.path.isdir(destfolder):
		os.makedirs(destfolder)
	filename = ind+'_emp_'+group+'.csv'
	makeTSCopy(destfolder, filename)
	df_shr_indemp.to_csv(destfolder+'/'+filename)
	#return df_shr_indemp
#--------------------------------- convertTech
def convertTech():
	indstats = ('2', '4', '4_4')
	groups = ('overall', 'lt', 'ml', 'mht')
	for ind in ('va', 'fem'):
		if ind == 'va':
			pct = 1
		else:
			pct = 100
		for indstat in indstats:
			for group in groups:
				calc_shr_indemp(indstat, group, ind, pct)
#--------------------------------- MVA_MVACONS (convertNoTech)
def MVA_MVACONS(destfolder):
	for var in ['mva', 'mvacons']:
		df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == var)]
		filename = var+'.csv'
		makeTSCopy(destfolder, filename)
		df_mva_fltrd[['year', 'iso', 'value']].to_csv(destfolder+'/'+filename, index=None)
#--------------------------------- MVA_GrowthRate (convertNoTech)
def MVA_GrowthRate(destfolder):
	df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'mvacons')]
	df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_growth = (df_mva_fltrd / df_mva_fltrd.shift() * 100).dropna()
	df_growth.reset_index(inplace=True)
	min_year = min(df_growth['year'])
	df_growth_shift = df_growth[df_growth['year']!=min_year]
	filename = 'mva_growth.csv'
	makeTSCopy(destfolder, filename)
	df_growth_shift.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- GDP_GrowthRate (convertNoTech)
def GDP_GrowthRate(destfolder):
	df_gdp_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'gdpcons')]
	df_gdp_fltrd = df_gdp_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_growth = (df_gdp_fltrd / df_gdp_fltrd.shift() * 100).dropna()
	df_growth.reset_index(inplace=True)
	min_year = min(df_growth['year'])
	df_growth_shift = df_growth[df_growth['year']!=min_year]
	filename = 'gdp_growth.csv'
	makeTSCopy(destfolder, filename)
	df_growth_shift.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- Pop_GrowthRate (convertNoTech)
def Pop_GrowthRate(destfolder):
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_pop_fltrd = df_pop_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_growth = (df_pop_fltrd / df_pop_fltrd.shift() * 100).dropna()
	df_growth.reset_index(inplace=True)
	min_year = min(df_growth['year'])
	df_growth_shift = df_growth[df_growth['year']!=min_year]
	filename = 'pop_growth.csv'
	makeTSCopy(destfolder, filename)
	df_growth_shift.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- ShareofMVAinGDP (convertNoTech)
def ShareofMVAinGDP(destfolder):
	df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'mva')]
	df_gdp_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'gdp')]
	df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_gdp_fltrd = df_gdp_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_shr_mva_gdp = df_mva_fltrd/df_gdp_fltrd * 100
	filename = 'share_mva_gdp.csv'
	makeTSCopy(destfolder, filename)
	df_shr_mva_gdp.to_csv(destfolder+'/'+filename)
#--------------------------------- MVAperCapita (convertNoTech)
def MVAperCapita(destfolder):
	df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'mva')]
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_pop_fltrd = df_pop_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_mva_pcap = df_mva_fltrd/df_pop_fltrd
	filename = 'mva_pcap.csv'
	makeTSCopy(destfolder, filename)
	df_mva_pcap.to_csv(destfolder+'/'+filename)
#--------------------------------- MVACONSperCapita (convertNoTech)
def MVACONSperCapita(destfolder):
	df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'mvacons')]
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_pop_fltrd = df_pop_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_mva_pcap = df_mva_fltrd/df_pop_fltrd
	filename = 'mvacons_pcap.csv'
	makeTSCopy(destfolder, filename)
	df_mva_pcap.to_csv(destfolder+'/'+filename)
#--------------------------------- GDPperCapita (convertNoTech)
def GDPperCapita(destfolder):
	df_gdp_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'gdp')]
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_gdp_fltrd = df_gdp_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_pop_fltrd = df_pop_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_gdp_pcap = df_gdp_fltrd/df_pop_fltrd
	filename = 'gdp_pcap.csv'
	makeTSCopy(destfolder, filename)
	df_gdp_pcap.to_csv(destfolder+'/'+filename)
#--------------------------------- GDPCONSperCapita (convertNoTech)
def GDPCONSperCapita(destfolder):
	df_gdp_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'gdpcons')]
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_gdp_fltrd = df_gdp_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_pop_fltrd = df_pop_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
	df_gdp_pcap = df_gdp_fltrd/df_pop_fltrd
	filename = 'gdpcons_pcap.csv'
	makeTSCopy(destfolder, filename)
	df_gdp_pcap.to_csv(destfolder+'/'+filename)
#--------------------------------- ShareWorldMVA (convertNoTech)
def ShareWorldMVA(destfolder):
	df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'mva')]
	df_mva_wld = df_mva[(df_mva['iso'] == 'WLD') & (df_mva['var'] == 'mva')]
	df_shr_mva_wld = pd.DataFrame(columns = ['year', 'iso', 'value'])
	df_mva_wld = df_mva_wld[['year', 'value']].set_index(['year'])
	isos = df_mva_fltrd.iso.unique()
	for iso in isos:
		df_mva_iso = df_mva_fltrd[df_mva_fltrd.iso == iso][['year', 'value']].set_index(['year'])
		df_share_wld_iso = df_mva_iso/df_mva_wld * 100
		df_share_wld_iso['iso'] = iso
		df_share_wld_iso.reset_index(inplace=True)
		df_shr_mva_wld = df_shr_mva_wld.append(df_share_wld_iso)
	filename = 'mva_share_world.csv'
	makeTSCopy(destfolder, filename)
	df_shr_mva_wld.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- ShareWorldGDP (convertNoTech)
def ShareWorldGDP(destfolder):
	df_gdp_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'gdp')]
	df_gdp_wld = df_mva[(df_mva['iso'] == 'WLD') & (df_mva['var'] == 'gdp')]
	df_shr_gdp_wld = pd.DataFrame(columns = ['year', 'iso', 'value'])
	df_gdp_wld = df_gdp_wld[['year', 'value']].set_index(['year'])
	isos = df_gdp_fltrd.iso.unique()
	for iso in isos:
		df_gdp_iso = df_gdp_fltrd[df_gdp_fltrd.iso == iso][['year', 'value']].set_index(['year'])
		df_share_wld_iso = df_gdp_iso/df_gdp_wld * 100
		df_share_wld_iso['iso'] = iso
		df_share_wld_iso.reset_index(inplace=True)
		df_shr_gdp_wld = df_shr_gdp_wld.append(df_share_wld_iso)
	filename = 'gdp_share_world.csv'
	makeTSCopy(destfolder, filename)
	df_shr_gdp_wld.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- ShareWorldPop (convertNoTech)
def ShareWorldPop(destfolder):
	df_pop_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == 'pop')]
	df_pop_wld = df_mva[(df_mva['iso'] == 'WLD') & (df_mva['var'] == 'pop')]
	df_shr_pop_wld = pd.DataFrame(columns = ['year', 'iso', 'value'])
	df_pop_wld = df_pop_wld[['year', 'value']].set_index(['year'])
	isos = df_pop_fltrd.iso.unique()
	for iso in isos:
		df_pop_iso = df_pop_fltrd[df_pop_fltrd.iso == iso][['year', 'value']].set_index(['year'])
		df_share_wld_iso = df_pop_iso/df_pop_wld * 100
		df_share_wld_iso['iso'] = iso
		df_share_wld_iso.reset_index(inplace=True)
		df_shr_pop_wld = df_shr_pop_wld.append(df_share_wld_iso)
	filename = 'pop_share_world.csv'
	makeTSCopy(destfolder, filename)
	df_shr_pop_wld.to_csv(destfolder+'/'+filename, index=False)
#--------------------------------- MVA_MVACONSperEmp (convertNoTech)
def MVA_MVACONSperEmp(tblnfolder):
	for var in ['mva', 'mvacons']:
		filename = var+'_emp.csv'
		## indstat2
		df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == var)]
		df_emp_indstat2 = df_indstat2[(df_indstat2['iso'] != 'WLD') & (df_indstat2['var'] == 'emp') &
									  (df_indstat2['isic2'] == 'D')]
		df_emp_indstat2=df_emp_indstat2[['year', 'iso', 'value']].set_index(['year', 'iso'])
		df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
		destfolder = tblnfolder+'/indstat2'
		makeTSCopy(destfolder, filename)
		(df_mva_fltrd/df_emp_indstat2).to_csv(destfolder+'/'+filename)
		## indstat4
		df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == var)]
		df_emp_indstat4 = df_indstat4[(df_indstat4['iso'] != 'WLD') & (df_indstat4['var'] == 'emp') &
									  (df_indstat4['isic4'] == 'D')]
		df_emp_indstat4=df_emp_indstat4[['year', 'iso', 'value']].set_index(['year', 'iso'])
		df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
		destfolder = tblnfolder+'/indstat4'
		makeTSCopy(destfolder, filename)
		(df_mva_fltrd/df_emp_indstat4).to_csv(destfolder+'/'+filename)
		## indstat4_4
		df_mva_fltrd = df_mva[(df_mva['iso'] != 'WLD') & (df_mva['var'] == var)]
		df_emp_indstat4_4 = df_indstat4_4[(df_indstat4_4['iso'] != 'WLD') & (df_indstat4_4['var'] == 'emp') &
									  (df_indstat4_4['isic4'] == 'C')]
		df_emp_indstat4_4=df_emp_indstat4_4[['year', 'iso', 'value']].set_index(['year', 'iso'])
		df_mva_fltrd = df_mva_fltrd[['year', 'iso', 'value']].set_index(['year', 'iso'])
		destfolder = tblnfolder+'/indstat4'
		makeTSCopy(destfolder, filename)
		(df_mva_fltrd/df_emp_indstat4_4).to_csv(destfolder+'/'+filename)
#--------------------------------- convertNoTech
def convertNoTech():
	destfolder = tblnfolder+'/mva'
	MVA_MVACONS(destfolder)
	MVA_GrowthRate(destfolder)
	GDP_GrowthRate(destfolder)
	Pop_GrowthRate(destfolder)
	ShareofMVAinGDP(destfolder)
	MVAperCapita(destfolder)
	MVACONSperCapita(destfolder)
	GDPperCapita(destfolder)
	GDPCONSperCapita(destfolder)
	ShareWorldMVA(destfolder)
	ShareWorldGDP(destfolder)
	ShareWorldPop(destfolder)
	MVA_MVACONSperEmp(tblnfolder)
#--------------------------------- transferToDB
def transferToDB():
	command = 'cd '+datafolder+';mysql -ujordanio -pjordaniopwd jordanio < import.sql'
	popen = os.popen(command)
	status = popen.close()
	if status is None:
		out['status'] = 'success'
	else:
		out['status'] = 'error'
		out['error'] = status
#--------------------------------- MAIN
print("Content-type: text/json")
print()
form = cgi.FieldStorage(keep_blank_values=True)
action = form.getvalue('action', 'none')
out= { 'action': action }
datafolder = '../production/data'
tblnfolder = '../production/tabulation'
if action == 'import':
	fileitem = form['datafile']
	try:
		df = pd.read_excel(fileitem.file, dtype={'Table Code': str, 'Country Code': str}, na_values=['...'])
		dbtype = form.getvalue('db_type')
		checkDB(dbtype, df)
		if out['status'] != 'error':
			saveAsCSV(dbtype, df)
	except:
		out['status'] = 'error'
		out['error'] = str(sys.exc_info()[0])
elif action == 'listfiles':
	listFiles()
elif action == 'convert':
	out['status'] = 'success'
	try:
		df_mva = pd.read_csv(datafolder+'/'+'mva.csv')
		df_indstat2 = pd.read_csv(datafolder+'/'+'indstat2.csv')
		df_indstat4 = pd.read_csv(datafolder+'/'+'indstat4.csv')
		df_indstat4_4 = pd.read_csv(datafolder+'/'+'indstat4_4.csv')
		convertTech()
		convertNoTech()
		transferToDB()
	except:
		out['status'] = 'error'
		out['error'] = str(sys.exc_info()[0])
else:
	out['error'] = "No valid action specified: "+action
print(json.dumps(out, indent=3))

The above Python scripts create files in certain folders. If the Observatory application is being initialized from scratch on a new host, those folders (and their descendants) need to have write permissions set as follows:

chmod -R 777 /var/www/wordpress/jordan/prototype/production
chmod -R 777 /var/www/wordpress/jordan/prototype/scripts
chmod -R 777 /var/www/wordpress/jordan/prototype/trade

The two Python/Pandas scripts below are called by the corresponding
(UN Comtrade or UNIDO) front-end programs which in turn are invoked from
the Data Update page.
These two scripts are located in the <Wordpress root folder>/jordan/prototype/scripts/ folder:

 

  • <Wordpress root folder>/jordan/prototype/scripts/update_comtrade.py
  • <Wordpress root folder>/jordan/prototype/scripts/update_unido.py

The front-end programs that call these scripts are HTML/Javascripts/CSS based and they are to be found at:

  • <Wordpress root folder>/jordan/prototype/admin/comtrade_update.html
  • <Wordpress root folder>/jordan/prototype/admin/unido_update.html

Leave a Comment

Your email address will not be published.