def populate_organization_level_data(country, organizations=None): """ Populate data on funding by organization type """ if organizations is None: organizations = get_organizations_indexed_by_name() # load appeals, analyze each one appeals = fts_queries.fetch_appeals_json_for_country_as_dataframe(country) funding_dataframes_by_appeal = [] for appeal_id, appeal_row in appeals.iterrows(): # first check if there is any funding at all (otherwise API calls will get upset) if appeal_row['funding'] == 0: continue # query funding by recipient, including "carry over" from previous years funding_by_recipient = fts_queries.fetch_funding_json_for_appeal_as_dataframe( appeal_id, grouping='Recipient', alias='organisation') funding_by_recipient['year'] = appeal_row['year'] funding_dataframes_by_appeal.append(funding_by_recipient) if funding_dataframes_by_appeal: # combine the data across appeals funding_by_recipient_overall = pd.concat(funding_dataframes_by_appeal) # now roll up by organization type and year grouped = funding_by_recipient_overall.join( organizations.type).groupby(['type', 'year']) funding_by_type_year = grouped.funding.sum() else: funding_by_type_year = pd.Series() # just an empty Series for year in range(YEAR_START, YEAR_END + 1): ngo_funding = 0. private_org_funding = 0. un_agency_funding = 0. if (ORG_TYPE_NGOS, year) in funding_by_type_year: ngo_funding = funding_by_type_year[(ORG_TYPE_NGOS, year)] if (ORG_TYPE_PRIVATE_ORGS, year) in funding_by_type_year: private_org_funding = funding_by_type_year[(ORG_TYPE_PRIVATE_ORGS, year)] if (ORG_TYPE_UN_AGENCIES, year) in funding_by_type_year.index: un_agency_funding = funding_by_type_year[(ORG_TYPE_UN_AGENCIES, year)] add_row_to_values('FY190', country, year, ngo_funding) add_row_to_values('FY200', country, year, private_org_funding) add_row_to_values('FY210', country, year, un_agency_funding)
def populate_organization_level_data(country, organizations=None): """ Populate data on funding by organization type """ if organizations is None: organizations = get_organizations_indexed_by_name() # load appeals, analyze each one appeals = fts_queries.fetch_appeals_json_for_country_as_dataframe(country) funding_dataframes_by_appeal = [] for appeal_id, appeal_row in appeals.iterrows(): # first check if there is any funding at all (otherwise API calls will get upset) if appeal_row['funding'] == 0: continue # query funding by recipient, including "carry over" from previous years funding_by_recipient = fts_queries.fetch_funding_json_for_appeal_as_dataframe( appeal_id, grouping='Recipient', alias='organisation') funding_by_recipient['year'] = appeal_row['year'] funding_dataframes_by_appeal.append(funding_by_recipient) if funding_dataframes_by_appeal: funding_by_recipient_overall = pd.concat(funding_dataframes_by_appeal) # now roll up by organization type funding_by_type = funding_by_recipient_overall.join(organizations.type).groupby(['type', 'year']).funding.sum() else: funding_by_type = pd.Series() # just an empty Series for year in range(YEAR_START, YEAR_END + 1): ngo_funding = 0. private_org_funding = 0. un_agency_funding = 0. if (ORG_TYPE_NGOS, year) in funding_by_type: ngo_funding = funding_by_type[(ORG_TYPE_NGOS, year)] if (ORG_TYPE_PRIVATE_ORGS, year) in funding_by_type: private_org_funding = funding_by_type[(ORG_TYPE_PRIVATE_ORGS, year)] if (ORG_TYPE_UN_AGENCIES, year) in funding_by_type.index: un_agency_funding = funding_by_type[(ORG_TYPE_UN_AGENCIES, year)] add_row_to_values('FY190', country, year, ngo_funding) add_row_to_values('FY200', country, year, private_org_funding) add_row_to_values('FY210', country, year, un_agency_funding)
def populate_organization_level_data(country, organizations=None): if organizations is None: organizations = get_organizations_indexed_by_name() # load appeals, analyze each one appeals = fts_queries.fetch_appeals_json_for_country_as_dataframe(country) funding_dataframes_by_appeal = [] for appeal_id, appeal_row in appeals.iterrows(): # first check if there is any funding at all (otherwise API calls will get upset) if appeal_row['funding'] == 0: continue # query funding by recipient, including "carry over" from previous years funding_by_recipient = fts_queries.fetch_funding_json_for_appeal_as_dataframe( appeal_id, grouping='Recipient', alias='organisation') funding_by_recipient['year'] = appeal_row['year'] funding_dataframes_by_appeal.append(funding_by_recipient) if not funding_dataframes_by_appeal: return funding_by_recipient_overall = pd.concat(funding_dataframes_by_appeal) # now roll up by organization type funding_by_type = funding_by_recipient_overall.join(organizations.type).groupby(['type', 'year']).sum() for (org_type, year), row in funding_by_type.iterrows(): if org_type == ORG_TYPE_NGOS: add_row_to_values('FY190', country, year, row['funding']) elif org_type == ORG_TYPE_PRIVATE_ORGS: add_row_to_values('FY200', country, year, row['funding']) elif org_type == ORG_TYPE_UN_AGENCIES: add_row_to_values('FY210', country, year, row['funding']) else: # note that some organizations (e.g. Red Cross/Red Crescent) fall outside the 3 indicator categories print 'Ignoring funding for organization type ' + org_type
""" Take in an appeal ID and generate a type "G" FTS report: Donor Funding USD % of Grand Total Uncommitted pledges USD """ import fts_queries import pandas as pd import argparse import sys parser = argparse.ArgumentParser(description='Produce a FTS type "G" report for a given appeal') parser.add_argument('appeal_id', type=int) args = parser.parse_args() appeal_id = args.appeal_id funding_by_donor = fts_queries.fetch_funding_json_for_appeal_as_dataframe(appeal_id, grouping='Donor', alias='donor') pledges_by_donor = fts_queries.fetch_pledges_json_for_appeal_as_dataframe(appeal_id, grouping='Donor', alias='donor') merged = pd.merge(funding_by_donor, pledges_by_donor, left_index=True, right_index=True, how='inner') merged['fraction_of_total'] = merged.funding / merged.funding.sum() merged.to_csv(sys.stdout, index=True, encoding='utf-8')
Funding USD - contributions + commitments, including carry-over from previous year """ import fts_queries import argparse import sys parser = argparse.ArgumentParser(description='Produce a report on funding by agency type for a given appeal') parser.add_argument('appeal_id', type=int) args = parser.parse_args() appeal_id = args.appeal_id # load organizations dataset organizations = fts_queries.fetch_organizations_json_as_dataframe() # we'll be joining on name (sadly) so make that the index organizations = organizations.set_index('name') # extract out the types Series organizations_type = organizations.type # query funding, which includes "carry over" from previous years funding_by_recipient =\ fts_queries.fetch_funding_json_for_appeal_as_dataframe(appeal_id, grouping='Recipient', alias='organisation') # join the funding with the organization type joined = funding_by_recipient.join(organizations_type) # now roll up by organization type aggregated = joined.groupby('type').sum() aggregated.to_csv(sys.stdout, index=True, encoding='utf-8')