|
| 1 | +from collections import defaultdict |
| 2 | +import csv |
| 3 | +from typing import Counter, DefaultDict |
| 4 | +import os |
| 5 | +from lib import ensure_dir, logger |
| 6 | + |
| 7 | + |
| 8 | +logger.info('start | part 1 main viz datasets') |
| 9 | + |
| 10 | +def output_row(region, year, region_trade, region_products, total_trade): |
| 11 | + sum_imports = sum(value.get( |
| 12 | + 'Imports') for value in region_products[year].values() if value.get('Imports')) |
| 13 | + sum_exports = sum(value.get( |
| 14 | + 'Exports') for value in region_products[year].values() if value.get('Exports')) |
| 15 | + return { |
| 16 | + 'region': region, |
| 17 | + 'year': year, |
| 18 | + 'Exports': region_trade[year].get('Exports'), |
| 19 | + 'Imports': region_trade[year].get('Imports'), |
| 20 | + 'Imports_share': region_trade[year]['Imports']/total_trade['Imports'] if region_trade[year].get('Imports') else None, |
| 21 | + 'Exports_share': region_trade[year]['Exports']/total_trade['Exports'] if region_trade[year].get('Exports') else None, |
| 22 | + 'product_revolutionempire_imports_herfindahl': sum(pow(value['Imports']/sum_imports, 2) for value in region_products[year].values()) if sum_imports != 0 else None, |
| 23 | + 'product_revolutionempire_exports_herfindahl': sum(pow(value['Exports']/sum_exports, 2) for value in region_products[year].values()) if sum_exports != 0 else None, |
| 24 | + 'product_revolutionempire_total_herfindahl': sum(pow((value['Imports']+value['Exports'])/(sum_imports + sum_exports), 2) for value in region_products[year].values()) if sum_imports != 0 or sum_exports != 0 else None |
| 25 | + } |
| 26 | + |
| 27 | + |
| 28 | +with open('../data/toflit18_all_flows.csv', 'r') as f: |
| 29 | + toflit18_flows = csv.DictReader(f) |
| 30 | + flows_fieldnames = toflit18_flows.fieldnames |
| 31 | + |
| 32 | + france_trade = DefaultDict(Counter) |
| 33 | + LaRochelle_trade = DefaultDict(Counter) |
| 34 | + Bordeaux_trade = DefaultDict(Counter) |
| 35 | + |
| 36 | + Bordeaux_products = DefaultDict( |
| 37 | + lambda: DefaultDict(Counter)) |
| 38 | + LaRochelle_products = DefaultDict( |
| 39 | + lambda: DefaultDict(Counter)) |
| 40 | + LaRochelle_partners = DefaultDict( |
| 41 | + lambda: DefaultDict(Counter)) |
| 42 | + for flow in toflit18_flows: |
| 43 | + # ATTENTION we filter out Ports Francs |
| 44 | + if flow['partner_grouping'] == 'France': |
| 45 | + continue |
| 46 | + # longitudinal absolute and share trade |
| 47 | + year = flow['year'].split( |
| 48 | + '.')[0] if "." in flow['year'] else flow['year'] |
| 49 | + if flow['best_guess_national_partner'] == "1" and flow['value'] != "": |
| 50 | + france_trade[year][flow['export_import'] |
| 51 | + ] += float(flow['value']) |
| 52 | + if flow['best_guess_region_prodxpart'] == "1" and flow['value'] != "": |
| 53 | + try: |
| 54 | + |
| 55 | + if flow['customs_region'] == "La Rochelle": |
| 56 | + LaRochelle_trade[year |
| 57 | + ][flow['export_import']] += float(flow['value']) |
| 58 | + if flow['customs_region'] == "Bordeaux": |
| 59 | + Bordeaux_trade[year |
| 60 | + ][flow['export_import']] += float(flow['value']) |
| 61 | + except ValueError as e: |
| 62 | + logger.warning(flow['value']) |
| 63 | + except KeyError as e: |
| 64 | + pass |
| 65 | + # product and partner top for La Rochelle |
| 66 | + if flow['best_guess_region_prodxpart'] == "1" and flow['value'] != "": |
| 67 | + if flow['customs_region'] == "La Rochelle": |
| 68 | + LaRochelle_products[year][flow['product_revolutionempire'] |
| 69 | + ][flow['export_import']] += float(flow['value']) |
| 70 | + LaRochelle_partners[year |
| 71 | + ][flow['partner_simplification']][flow['export_import']] += float(flow['value']) |
| 72 | + if flow['customs_region'] == "Bordeaux": |
| 73 | + Bordeaux_products[year][flow['product_revolutionempire'] |
| 74 | + ][flow['export_import']] += float(flow['value']) |
| 75 | + ensure_dir("../public/data/decline_longitudinal_data") |
| 76 | + with open("../public/data/decline_longitudinal_data/decline_longitudinal_data.csv", "w") as of: |
| 77 | + output_csv = csv.DictWriter( |
| 78 | + of, ['region', 'year', 'Exports', 'Imports', 'Exports_share', 'Imports_share', 'product_revolutionempire_imports_herfindahl', 'product_revolutionempire_exports_herfindahl', 'product_revolutionempire_total_herfindahl']) |
| 79 | + output_csv.writeheader() |
| 80 | + for year, value in sorted(france_trade.items(), key=lambda yv: yv[0]): |
| 81 | + |
| 82 | + output_csv.writerow(output_row( |
| 83 | + "La Rochelle", year, LaRochelle_trade, LaRochelle_products, value)) |
| 84 | + output_csv.writerow(output_row( |
| 85 | + "Bordeaux", year, Bordeaux_trade, Bordeaux_products, value)) |
| 86 | + output_csv.writerow({ |
| 87 | + 'region': 'France', |
| 88 | + 'year': year, |
| 89 | + 'Exports': value['Exports'], |
| 90 | + 'Imports': value['Imports'], |
| 91 | + 'Imports_share': 100, |
| 92 | + 'Exports_share': 100 |
| 93 | + }) |
| 94 | + ensure_dir("../public/data/decline_LR_products") |
| 95 | + with open("../public/data/decline_LR_products/decline_LR_products.csv", "w") as of: |
| 96 | + output_csv = csv.DictWriter( |
| 97 | + of, ['product', 'year', 'Exports', 'Imports']) |
| 98 | + output_csv.writeheader() |
| 99 | + output_csv.writerows({'product': product, 'year': year, 'Exports': value.get("Exports"), 'Imports': value.get("Imports")} for year, products in LaRochelle_products.items( |
| 100 | + ) if year in ['1750', '1789'] for product, value in products.items()) |
| 101 | + |
| 102 | + ensure_dir("../public/data/decline_LR_partners") |
| 103 | + with open("../public/data/decline_LR_partners/decline_LR_partners.csv", "w") as of: |
| 104 | + output_csv = csv.DictWriter( |
| 105 | + of, ['partner', 'year', 'Exports', 'Imports']) |
| 106 | + output_csv.writeheader() |
| 107 | + output_csv.writerows({'partner': partner, 'year': year, 'Imports': value.get('Imports'), 'Exports': value.get('Exports')} for year, partners in LaRochelle_partners.items( |
| 108 | + ) if year in ['1750', '1789'] for partner, value in partners.items()) |
| 109 | + |
| 110 | +logger.debug('done | part 1 main viz datasets') |
0 commit comments