Portfolio Investment, net (BoP, current US$)

Source: worldbank.org, 03.09.2025

Year: 2024

Flag Country Value Value change, % Rank
Angola Angola -38,488,691 +15.1% 76
Albania Albania 450,839,437 +29% 43
Argentina Argentina 7,042,045,590 +29.9% 20
Armenia Armenia 118,684,878 -284% 57
Antigua & Barbuda Antigua & Barbuda 107,113,433 +138% 58
Australia Australia -29,095,907,495 -390% 105
Austria Austria -27,067,496,863 +76.7% 104
Azerbaijan Azerbaijan 1,661,271,000 +143% 34
Belgium Belgium -33,155,489,912 +60.9% 106
Bangladesh Bangladesh 185,442,306 -42.6% 52
Bulgaria Bulgaria 2,499,200,000 +87.2% 29
Bahrain Bahrain 3,553,989,362 -546% 27
Bahamas Bahamas 238,604,901 -27.7% 48
Bosnia & Herzegovina Bosnia & Herzegovina 217,935,050 -12.1% 50
Belarus Belarus 221,126,503 -162% 49
Belize Belize 643 +8.31% 68
Brazil Brazil -3,140,645,122 -66.2% 91
Brunei Brunei 729,174,199 -374% 38
Bhutan Bhutan -19,407,403 -65.4% 74
Canada Canada -57,717,931,427 -476% 109
Switzerland Switzerland 51,586,552,677 +60% 8
Chile Chile 1,988,227,087 +37% 33
China China 187,638,072,947 +225% 1
Colombia Colombia 2,454,672,694 -71.7% 31
Cape Verde Cape Verde -3,010 -51% 69
Costa Rica Costa Rica 3,053,474,766 +552% 28
Cyprus Cyprus 3,823,844,001 -7.51% 25
Czechia Czechia -8,386,349,331 -317% 96
Germany Germany 34,336,676,970 +1,771% 12
Djibouti Djibouti -11,867,664 -132% 73
Dominica Dominica 42,548,369 -496% 62
Denmark Denmark 37,044,793,460 +80.1% 11
Dominican Republic Dominican Republic -2,249,000,000 -6.79% 88
Ecuador Ecuador 4,079,946,043 +89.3% 23
Spain Spain 2,315,041,154 -113% 32
Estonia Estonia -1,239,079,867 -612% 84
Finland Finland -770,046,836 -152% 82
France France -20,715,448,893 -86.1% 102
United Kingdom United Kingdom -41,913,323,356 -120% 107
Georgia Georgia 1,113,322,520 +52.2% 36
Greece Greece -7,379,747,867 +166% 94
Grenada Grenada 153,811,174 +41.6% 53
Guatemala Guatemala -1,490,589,930 +6.7% 85
Hong Kong SAR China Hong Kong SAR China 140,745,354,361 +144% 2
Honduras Honduras -453,536,650 -231% 80
Croatia Croatia 2,486,821,793 -462% 30
Hungary Hungary 1,251,636,187 -114% 35
Indonesia Indonesia -8,245,180,259 +274% 95
India India -20,814,571,002 -32.9% 103
Iceland Iceland 356,931,101 -83.8% 46
Israel Israel 17,619,200,000 -10% 16
Italy Italy -79,374,832,060 +193% 110
Jamaica Jamaica 383,971,434 -58.4% 45
Japan Japan 92,824,398,122 -52.7% 3
Kazakhstan Kazakhstan 3,811,580,843 -24.9% 26
Cambodia Cambodia 489,462,000 +39.9% 42
St. Kitts & Nevis St. Kitts & Nevis 19,291,551 -281% 63
South Korea South Korea 50,290,500,000 +507% 9
Kuwait Kuwait 41,203,462,368 -3.97% 10
St. Lucia St. Lucia 213,688,197 -546% 51
Lesotho Lesotho 59,275,401 -50.7% 61
Lithuania Lithuania -575,679,062 -141% 81
Luxembourg Luxembourg -45,571,498,280 -12.2% 108
Latvia Latvia -2,027,253,346 +24.3% 87
Moldova Moldova 68,720,000 +633% 59
Maldives Maldives 3,345,666 -82.8% 66
Mexico Mexico 7,567,162,059 -32.8% 18
North Macedonia North Macedonia 314,649,726 +439% 47
Malta Malta 394,975,491 -92.5% 44
Montenegro Montenegro -357,039,596 -174% 79
Mozambique Mozambique -2,576,673 +102% 72
Malaysia Malaysia 18,401,421,886 +127% 15
Namibia Namibia 145,589,373 -82.6% 56
Nigeria Nigeria -13,027,259,101 +110% 100
Nicaragua Nicaragua -123,811,985 -45.3% 78
Netherlands Netherlands 63,364,461,765 +22.4% 6
Norway Norway 85,343,639,493 -7.87% 4
New Zealand New Zealand -12,427,347,143 +11.4% 99
Pakistan Pakistan 517,000,000 -662% 41
Panama Panama 696,636,870 -150% 39
Peru Peru -91,253,473 -101% 77
Philippines Philippines -3,629,227,213 -202% 92
Poland Poland -11,332,000,000 -349% 97
Portugal Portugal 17,120,162,218 +79.9% 17
Paraguay Paraguay -875,200,000 +355% 83
Palestinian Territories Palestinian Territories 148,983,594 -51.3% 55
Qatar Qatar 26,319,230,769 -10.6% 13
Romania Romania -13,664,069,076 -7.93% 101
Russia Russia -24,830,000 -101% 75
Saudi Arabia Saudi Arabia 7,302,752,054 -82.6% 19
Singapore Singapore 78,660,363,709 -19.7% 5
Solomon Islands Solomon Islands 7,652,917 +69.7% 65
El Salvador El Salvador -1,820,034,356 -1,390% 86
Suriname Suriname 64,966,643 +87.3% 60
Slovakia Slovakia -4,100,558,975 -50.5% 93
Slovenia Slovenia 3,837,011,820 -1,494% 24
Sweden Sweden 55,460,871,103 -1,834% 7
Thailand Thailand 19,976,683,649 +45.5% 14
Tajikistan Tajikistan -1,111,079 -162% 70
Timor-Leste Timor-Leste 635,884,233 +91.3% 40
Tonga Tonga 1,589,217 -1,143% 67
Trinidad & Tobago Trinidad & Tobago 153,485,739 -141% 54
Turkey Turkey -11,680,000,000 +107% 98
Ukraine Ukraine 6,627,000,000 +142% 21
Uruguay Uruguay -2,412,167,463 -285% 89
United States United States -1,069,223,000,000 -6.98% 111
Uzbekistan Uzbekistan -3,120,974,493 +214% 90
St. Vincent & Grenadines St. Vincent & Grenadines 17,429,323 -79.8% 64
Vietnam Vietnam 5,713,000,000 +380% 22
Samoa Samoa -1,871,050 -159% 71
South Africa South Africa 1,102,172,538 -83.1% 37

                    
# 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 = 'BN.KLT.PTXL.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 <- 'BN.KLT.PTXL.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))