Debt service on external debt, total (TDS, current US$)

Source: worldbank.org, 03.09.2025

Year: 2023

Flag Country Value Value change, % Rank
Afghanistan Afghanistan 43,570,332 +63.9% 109
Angola Angola 12,546,609,944 -17.9% 17
Albania Albania 848,743,881 +20.3% 68
Argentina Argentina 45,837,549,043 +29% 7
Armenia Armenia 2,773,470,632 +39.3% 40
Azerbaijan Azerbaijan 1,840,914,761 +13.4% 48
Burundi Burundi 44,434,745 +33.2% 108
Benin Benin 947,958,152 +84.3% 65
Burkina Faso Burkina Faso 859,747,427 -20% 67
Bangladesh Bangladesh 7,474,102,274 +9.93% 23
Bosnia & Herzegovina Bosnia & Herzegovina 1,676,640,063 +66.2% 55
Belarus Belarus 7,950,693,278 +16.8% 21
Belize Belize 114,061,121 +48.6% 100
Bolivia Bolivia 1,712,237,744 -28.8% 53
Brazil Brazil 226,403,323,391 +80% 2
Bhutan Bhutan 138,740,434 +5.03% 97
Botswana Botswana 247,862,527 +40.2% 88
Central African Republic Central African Republic 38,058,227 +89.6% 112
China China 385,484,224,724 -10.1% 1
Côte d’Ivoire Côte d’Ivoire 3,553,321,727 +68.8% 38
Cameroon Cameroon 1,703,101,657 -5.68% 54
Congo - Kinshasa Congo - Kinshasa 491,002,573 +27.6% 75
Congo - Brazzaville Congo - Brazzaville 772,170,552 -12.1% 70
Colombia Colombia 28,562,257,965 +4.99% 11
Comoros Comoros 18,897,227 +290% 117
Cape Verde Cape Verde 162,438,732 +39.6% 93
Costa Rica Costa Rica 5,078,821,127 +95.4% 29
Djibouti Djibouti 101,220,108 +30.4% 101
Dominica Dominica 47,149,393 +15.2% 107
Dominican Republic Dominican Republic 5,129,424,790 +43% 28
Algeria Algeria 467,630,511 +56.2% 77
Ecuador Ecuador 6,652,835,136 +24.9% 24
Egypt Egypt 21,388,660,501 +19.2% 13
Eritrea Eritrea 16,131,561 +2.85% 119
Ethiopia Ethiopia 1,568,226,280 -22% 56
Fiji Fiji 218,630,181 +13.5% 89
Gabon Gabon 1,165,778,187 +102% 61
Georgia Georgia 3,556,870,342 +6.58% 37
Ghana Ghana 1,293,115,436 -72.6% 58
Guinea Guinea 304,259,010 +44.9% 84
Gambia Gambia 55,315,072 +33.5% 106
Guinea-Bissau Guinea-Bissau 57,644,913 -6.48% 104
Grenada Grenada 55,318,561 +3.83% 105
Guatemala Guatemala 1,756,249,974 -57.6% 50
Guyana Guyana 366,747,993 +158% 80
Honduras Honduras 1,742,376,947 +4.23% 51
Haiti Haiti 64,414,120 +37.1% 103
Indonesia Indonesia 58,431,864,381 -22.5% 5
India India 82,272,602,622 +25.2% 3
Iran Iran 360,691,921 +105% 82
Iraq Iraq 4,481,419,604 -3.44% 32
Jamaica Jamaica 2,427,985,643 +63.7% 43
Jordan Jordan 3,886,494,797 -15.6% 35
Kazakhstan Kazakhstan 44,600,391,623 +2.51% 8
Kenya Kenya 3,872,519,305 +16.1% 36
Kyrgyzstan Kyrgyzstan 1,179,715,925 +93.3% 60
Cambodia Cambodia 2,460,146,860 -1.52% 42
Laos Laos 1,228,324,552 +11.3% 59
Lebanon Lebanon 4,353,849,752 +14.5% 33
Liberia Liberia 124,140,392 +54.4% 99
St. Lucia St. Lucia 68,496,394 +32.7% 102
Sri Lanka Sri Lanka 2,825,291,973 -15.3% 39
Lesotho Lesotho 130,559,968 +58.9% 98
Morocco Morocco 5,790,153,208 -3.77% 26
Moldova Moldova 1,323,119,936 +91.7% 57
Madagascar Madagascar 266,457,395 +23.4% 85
Maldives Maldives 499,010,855 -28.2% 74
Mexico Mexico 54,272,728,368 -3.57% 6
North Macedonia North Macedonia 1,732,808,421 +60.2% 52
Mali Mali 359,886,925 +16.1% 83
Myanmar (Burma) Myanmar (Burma) 911,689,358 -3.64% 66
Montenegro Montenegro 782,042,297 -18.2% 69
Mongolia Mongolia 4,848,235,036 +21.8% 31
Mozambique Mozambique 4,338,656,979 -24.8% 34
Mauritania Mauritania 392,693,327 +14.5% 79
Mauritius Mauritius 1,945,348,754 +115% 47
Malawi Malawi 150,901,620 +8.96% 95
Niger Niger 191,628,588 -32.6% 91
Nigeria Nigeria 9,201,485,812 +15.3% 18
Nicaragua Nicaragua 2,347,836,241 -3.92% 45
Nepal Nepal 480,417,351 +41% 76
Pakistan Pakistan 16,008,919,940 -3.91% 14
Peru Peru 13,702,178,655 +84.3% 15
Philippines Philippines 12,981,292,386 +44% 16
Papua New Guinea Papua New Guinea 5,600,159,269 +25.8% 27
Paraguay Paraguay 1,810,880,986 -15.1% 49
Rwanda Rwanda 545,385,506 +56.4% 73
Sudan Sudan 207,473,618 +10.1% 90
Senegal Senegal 2,684,327,733 +38.1% 41
Solomon Islands Solomon Islands 29,899,520 +159% 113
Sierra Leone Sierra Leone 155,322,822 +28.6% 94
El Salvador El Salvador 9,188,471,438 +172% 19
Somalia Somalia 363,094,083 +1,719% 81
Serbia Serbia 6,063,362,907 +6.08% 25
São Tomé & Príncipe São Tomé & Príncipe 6,459,726 -19.2% 120
Suriname Suriname 646,432,637 +68.2% 71
Eswatini Eswatini 168,189,478 +97.6% 92
Syria Syria 28,676,676 +177% 114
Chad Chad 416,665,471 -0.688% 78
Togo Togo 257,417,713 +4.25% 86
Thailand Thailand 41,608,855,772 +54.5% 9
Tajikistan Tajikistan 577,057,847 +13.8% 72
Turkmenistan Turkmenistan 1,160,342,876 +2.11% 63
Timor-Leste Timor-Leste 25,137,008 +66.8% 116
Tonga Tonga 17,570,251 +58.8% 118
Tunisia Tunisia 4,926,890,664 +17.8% 30
Turkey Turkey 76,347,415,229 +10.1% 4
Tanzania Tanzania 2,242,425,233 +12.5% 46
Uganda Uganda 2,372,909,027 +154% 44
Ukraine Ukraine 7,827,741,356 -28.8% 22
Uzbekistan Uzbekistan 8,536,265,143 +19.2% 20
St. Vincent & Grenadines St. Vincent & Grenadines 38,195,486 +10.5% 111
Vietnam Vietnam 28,627,300,459 +9.19% 10
Vanuatu Vanuatu 25,487,280 +15.1% 115
Samoa Samoa 39,124,590 -0.432% 110
Kosovo Kosovo 257,044,792 -15.1% 87
Yemen Yemen 138,936,776 +19.6% 96
South Africa South Africa 22,915,998,969 -17% 12
Zambia Zambia 948,495,773 -35.3% 64
Zimbabwe Zimbabwe 1,161,955,325 +156% 62

                    
# Install missing packages
import sys
import subprocess

def install(package):
subprocess.check_call([sys.executable, "-m", "pip", "install", package])

# Required packages
for package in ['wbdata', 'country_converter']:
try:
__import__(package)
except ImportError:
install(package)

# Import libraries
import wbdata
import country_converter as coco
from datetime import datetime

# Define World Bank indicator code
dataset_code = 'DT.TDS.DECT.CD'

# Download data from World Bank API
data = wbdata.get_dataframe({dataset_code: 'value'},
date=(datetime(1960, 1, 1), datetime.today()),
parse_dates=True,
keep_levels=True).reset_index()

# Extract year
data['year'] = data['date'].dt.year

# Convert country names to ISO codes using country_converter
cc = coco.CountryConverter()
data['iso2c'] = cc.convert(names=data['country'], to='ISO2', not_found=None)
data['iso3c'] = cc.convert(names=data['country'], to='ISO3', not_found=None)

# Filter out rows where ISO codes could not be matched — likely not real countries
data = data[data['iso2c'].notna() & data['iso3c'].notna()]

# Sort for calculation
data = data.sort_values(['iso3c', 'year'])

# Calculate YoY absolute and percent change
data['value_change'] = data.groupby('iso3c')['value'].diff()
data['value_change_percent'] = data.groupby('iso3c')['value'].pct_change() * 100

# Calculate ranks (higher GDP per capita = better rank)
data['rank'] = data.groupby('year')['value'].rank(ascending=False, method='dense')

# Calculate rank change from previous year
data['rank_change'] = data.groupby('iso3c')['rank'].diff()

# Select desired columns
final_df = data[['country', 'iso2c', 'iso3c', 'year', 'value',
'value_change', 'value_change_percent', 'rank', 'rank_change']].copy()

# Optional: Add labels as metadata (could be useful for export or UI)
column_labels = {
'country': 'Country name',
'iso2c': 'ISO 2-letter country code',
'iso3c': 'ISO 3-letter country code',
'year': 'Year',
'value': 'GDP per capita (current US$)',
'value_change': 'Year-over-Year change in value',
'value_change_percent': 'Year-over-Year percent change in value',
'rank': 'Country rank by GDP per capita (higher = richer)',
'rank_change': 'Change in rank from previous year'
}

# Display first few rows
print(final_df.head(10))

# Optional: Save to CSV
#final_df.to_csv("gdp_per_capita_cleaned.csv", index=False)
                    
                
                    
# Check and install required packages
required_packages <- c("WDI", "countrycode", "dplyr")

for (pkg in required_packages) {
  if (!requireNamespace(pkg, quietly = TRUE)) {
    install.packages(pkg)
  }
}

# Load the necessary libraries
library(WDI)
library(dplyr)
library(countrycode)

# Define the dataset code (World Bank indicator code)
dataset_code <- 'DT.TDS.DECT.CD'

# Download data using WDI package
dat <- WDI(indicator = dataset_code)

# Filter only countries using 'is_country' from countrycode
# This uses iso2c to identify whether the entry is a recognized country
dat <- dat %>%
  filter(countrycode(iso2c, origin = 'iso2c', destination = 'country.name', warn = FALSE) %in%
           countrycode::codelist$country.name.en)

# Ensure dataset is ordered by country and year
dat <- dat %>%
  arrange(iso3c, year)

# Rename the dataset_code column to "value" for easier manipulation
dat <- dat %>%
  rename(value = !!dataset_code)

# Calculate year-over-year (YoY) change and percentage change
dat <- dat %>%
  group_by(iso3c) %>%
  mutate(
    value_change = value - lag(value),                              # Absolute change from previous year
    value_change_percent = 100 * (value - lag(value)) / lag(value) # Percent change from previous year
  ) %>%
  ungroup()

# Calculate rank by year (higher value => higher rank)
dat <- dat %>%
  group_by(year) %>%
  mutate(rank = dense_rank(desc(value))) %>% # Rank countries by descending value
  ungroup()

# Calculate rank change (positive = moved up, negative = moved down)
dat <- dat %>%
  group_by(iso3c) %>%
  mutate(rank_change = rank - lag(rank)) %>% # Change in rank compared to previous year
  ungroup()

# Select and reorder final columns
final_data <- dat %>%
  select(
    country,
    iso2c,
    iso3c,
    year,
    value,
    value_change,
    value_change_percent,
    rank,
    rank_change
  )

# Add labels (variable descriptions)
attr(final_data$country, "label") <- "Country name"
attr(final_data$iso2c, "label") <- "ISO 2-letter country code"
attr(final_data$iso3c, "label") <- "ISO 3-letter country code"
attr(final_data$year, "label") <- "Year"
attr(final_data$value, "label") <- "GDP per capita (current US$)"
attr(final_data$value_change, "label") <- "Year-over-Year change in value"
attr(final_data$value_change_percent, "label") <- "Year-over-Year percent change in value"
attr(final_data$rank, "label") <- "Country rank by GDP per capita (higher = richer)"
attr(final_data$rank_change, "label") <- "Change in rank from previous year"

# Print the first few rows of the final dataset
print(head(final_data, 10))