Pakistan Inflation Dashboard

Underlying Inflation Measures & Monetary Policy Tracker

Author

State Bank of Pakistan Analysis

Published

September 1, 2025

Overview

Column

list(
  value = paste0(current_policy_rate, "%"),
  caption = "Unchanged since May 2025",
  color = "primary"
)
$value
[1] "11%"

$caption
[1] "Unchanged since May 2025"

$color
[1] "primary"
list(
  value = paste0(round(real_rate, 1), "%"),
  caption = "Policy Rate - Headline CPI",
  color = "success"
)
$value
[1] "5.4%"

$caption
[1] "Policy Rate - Headline CPI"

$color
[1] "success"
list(
  value = round(inflation_expectations, 1),
  caption = "Consumer Expectations Index ↓ 0.6",
  color = "info"
)
$value
[1] 66.6

$caption
[1] "Consumer Expectations Index ↓ 0.6"

$color
[1] "info"

Column

Inflation Measures

Row

Current Inflation Measures (September 2025)

# Create formatted table
table_data <- inflation_measures %>%
  mutate(
    Measure = name,
    Description = description,
    Current = paste0(sprintf("%.1f", current), "%"),
    Change = paste0(ifelse(change > 0, "+", ""), sprintf("%.1f", change), "pp"),
    Target = paste0(sprintf("%.1f", target), "%"),
    Status = status
  ) %>%
  select(Measure, Description, Current, Change, Target, Status)

# Color mapping
color_map <- c(
  "Within Target" = "#d4edda",
  "Below Target" = "#d1ecf1",
  "Above Target" = "#fff3cd",
  "Significantly Above" = "#f8d7da"
)

datatable(
  table_data,
  options = list(
    dom = 't',
    pageLength = 10,
    ordering = FALSE,
    columnDefs = list(
      list(width = '200px', targets = 0),
      list(width = '300px', targets = 1),
      list(className = 'dt-center', targets = 2:5)
    )
  ),
  rownames = FALSE,
  class = 'cell-border stripe'
) %>%
  formatStyle(
    'Status',
    backgroundColor = styleEqual(
      names(color_map),
      unname(color_map)
    ),
    fontWeight = 'bold'
  ) %>%
  formatStyle(
    'Current',
    fontWeight = 'bold',
    fontSize = '16px'
  )

Row

Target Range Explanation

Understanding the Status Colors:

  • 🟢 Within Target (Green): Inflation is within ±0.5 percentage points of the target, indicating price stability.

  • 🔵 Below Target (Blue): Inflation is more than 0.5pp below target, which may indicate weak demand or deflationary pressures.

  • 🟡 Above Target (Yellow): Inflation is 0.5-2.0pp above target, suggesting moderate price pressures that require monitoring.

  • 🔴 Significantly Above (Red): Inflation is more than 2.0pp above target, indicating substantial price pressures requiring policy action.

The State Bank of Pakistan targets inflation in the range of 5-7% to maintain price stability while supporting economic growth.

Components

Row

Inflation by Component Category

# Reorder items by value for better visualization
component_data_sorted <- component_data %>%
  arrange(value) %>%
  mutate(
    item_ordered = factor(item, levels = item),
    color = case_when(
      value > 10 ~ "#dc3545",
      value > 0 ~ "#ffc107",
      TRUE ~ "#28a745"
    )
  )

plot_ly(component_data_sorted) %>%
  add_trace(
    y = ~item_ordered,
    x = ~value,
    type = 'bar',
    orientation = 'h',
    marker = list(color = ~color),
    text = ~paste0(sprintf("%.1f", value), "%"),
    textposition = 'outside',
    textfont = list(size = 11),
    hovertemplate = paste(
      '<b>%{y}</b><br>',
      'Change: %{x:.1f}%<br>',
      '<extra></extra>'
    )
  ) %>%
  layout(
    xaxis = list(
      title = "Year-over-Year Change (%)",
      titlefont = list(size = 12)
    ),
    yaxis = list(
      title = "",
      tickfont = list(size = 10)
    ),
    showlegend = FALSE,
    margin = list(l = 150, r = 50, t = 40, b = 50)
  )

Row

Food & Beverages

food_items <- component_data %>% 
  filter(category == "Food & Beverages")

kable(
  food_items %>% select(Item = item, `YoY Change (%)` = value),
  align = c('l', 'r'),
  format = 'html'
) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )
Item YoY Change (%)
Perishable Foods -2.5
Non-Perishable Foods 8.2
Beverages 12.5

Housing & Utilities

housing_items <- component_data %>% 
  filter(category == "Housing & Utilities")

kable(
  housing_items %>% select(Item = item, `YoY Change (%)` = value),
  align = c('l', 'r'),
  format = 'html'
) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )
Item YoY Change (%)
Electricity 25.8
Gas 35.2
Housing Rent 4.5

Transportation

transport_items <- component_data %>% 
  filter(category == "Transportation")

kable(
  transport_items %>% select(Item = item, `YoY Change (%)` = value),
  align = c('l', 'r'),
  format = 'html'
) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )
Item YoY Change (%)
Motor Fuel -8.5
Transport Services 15.3

Other Categories

other_items <- component_data %>% 
  filter(category == "Other")

kable(
  other_items %>% select(Item = item, `YoY Change (%)` = value),
  align = c('l', 'r'),
  format = 'html'
) %>%
  kableExtra::kable_styling(
    bootstrap_options = c("striped", "hover"),
    full_width = FALSE
  )
Item YoY Change (%)
Healthcare 9.8
Education 14.2
Communication 3.1

Time Series Analysis

Row

Headline vs Core Inflation

# Create ordered factor for proper chronological display
historical_data_ordered <- historical_data %>%
  mutate(month_ordered = factor(month, levels = month))

plot_ly(historical_data_ordered) %>%
  add_trace(
    x = ~month_ordered, 
    y = ~headline, 
    type = 'scatter', 
    mode = 'lines+markers',
    name = 'Headline CPI', 
    line = list(color = '#3b82f6', width = 3),
    marker = list(size = 5)
  ) %>%
  add_trace(
    x = ~month_ordered, 
    y = ~core, 
    type = 'scatter', 
    mode = 'lines+markers',
    name = 'Core CPI', 
    line = list(color = '#f59e0b', width = 3),
    marker = list(size = 5)
  ) %>%
  add_trace(
    x = ~month_ordered, 
    y = 6.5,
    type = 'scatter',
    mode = 'lines',
    name = 'Target (6.5%)',
    line = list(color = 'gray', width = 2, dash = 'dot')
  ) %>%
  layout(
    xaxis = list(
      title = "", 
      tickangle = -45,
      categoryorder = "trace",
      tickfont = list(size = 10)
    ),
    yaxis = list(
      title = "Percentage (%)",
      titlefont = list(size = 12)
    ),
    hovermode = 'x unified',
    legend = list(
      x = 0.02, 
      y = 0.98,
      bgcolor = 'rgba(255, 255, 255, 0.8)',
      bordercolor = '#e2e8f0',
      borderwidth = 1
    ),
    margin = list(l = 50, r = 20, t = 20, b = 80)
  )

Food Inflation Trend

# Create ordered factor
historical_data_ordered <- historical_data %>%
  mutate(month_ordered = factor(month, levels = month))

plot_ly(historical_data_ordered) %>%
  add_trace(
    x = ~month_ordered, 
    y = ~food, 
    type = 'scatter', 
    mode = 'lines',
    name = 'Food Inflation',
    fill = 'tozeroy',
    fillcolor = 'rgba(16, 185, 129, 0.2)',
    line = list(color = '#10b981', width = 3)
  ) %>%
  layout(
    xaxis = list(
      title = "", 
      tickangle = -45,
      categoryorder = "trace",
      tickfont = list(size = 10)
    ),
    yaxis = list(
      title = "Percentage (%)",
      titlefont = list(size = 12)
    ),
    hovermode = 'x',
    margin = list(l = 50, r = 20, t = 20, b = 80)
  )

Row

Policy Rate Evolution

# Create ordered factor
historical_data_ordered <- historical_data %>%
  mutate(month_ordered = factor(month, levels = month))

plot_ly(historical_data_ordered) %>%
  add_trace(
    x = ~month_ordered, 
    y = ~policy, 
    type = 'scatter', 
    mode = 'lines+markers',
    name = 'Policy Rate',
    line = list(color = '#ef4444', width = 4),
    marker = list(size = 7, symbol = 'diamond')
  ) %>%
  layout(
    xaxis = list(
      title = "", 
      tickangle = -45,
      categoryorder = "trace",
      tickfont = list(size = 10)
    ),
    yaxis = list(
      title = "Policy Rate (%)",
      titlefont = list(size = 12)
    ),
    hovermode = 'x',
    margin = list(l = 50, r = 20, t = 20, b = 80)
  )

Inflation Differential

# Create ordered factor and calculate differential
historical_data_diff <- historical_data %>%
  mutate(
    month_ordered = factor(month, levels = month),
    diff = headline - core
  )

plot_ly(historical_data_diff) %>%
  add_trace(
    x = ~month_ordered, 
    y = ~diff, 
    type = 'bar',
    name = 'Headline - Core Differential',
    marker = list(
      color = ~diff,
      colorscale = list(
        c(0, 'rgb(239, 68, 68)'),   # Red for negative
        c(0.5, 'rgb(255, 255, 255)'),  # White for zero
        c(1, 'rgb(34, 197, 94)')    # Green for positive
      ),
      showscale = FALSE
    ),
    hovertemplate = paste(
      '<b>%{x}</b><br>',
      'Differential: %{y:.2f}pp',
      '<extra></extra>'
    )
  ) %>%
  layout(
    xaxis = list(
      title = "", 
      tickangle = -45,
      categoryorder = "trace",
      tickfont = list(size = 10)
    ),
    yaxis = list(
      title = "Differential (pp)",
      titlefont = list(size = 12)
    ),
    hovermode = 'x',
    margin = list(l = 50, r = 20, t = 20, b = 80)
  )

About

Row

About This Dashboard

Purpose

This dashboard tracks multiple measures of inflation in Pakistan to provide a comprehensive view of price pressures in the economy, similar to the Federal Reserve Bank of Atlanta’s Underlying Inflation Dashboard.

Data Sources

  • State Bank of Pakistan (SBP) - Monetary policy and inflation data
  • Pakistan Bureau of Statistics (PBS) - Consumer Price Index
  • International Monetary Fund (IMF) - Economic indicators

Update Frequency

Monthly - Data is updated following the release of official CPI figures, typically in the first half of each month.

Methodology

Inflation measures are color-coded based on their distance from the SBP’s target range of 5-7%:

  • 🟢 Green (Within Target): ±0.5pp from target
  • 🟡 Yellow (Above Target): 0.5-2.0pp above target
  • 🔴 Red (Significantly Above): >2.0pp above target
  • 🔵 Blue (Below Target): >0.5pp below target

Key Indicators

Headline CPI

Overall consumer price inflation measuring the average change in prices paid by consumers for a basket of goods and services.

Core CPI

Excludes volatile food and energy prices to show underlying inflation trends. This measure is closely watched by the State Bank of Pakistan for monetary policy decisions.

Food Inflation

Measures price changes in food and beverages, which constitute a significant portion of household expenditure in Pakistan.

Policy Rate

The State Bank of Pakistan’s benchmark interest rate, used to control inflation and influence economic activity. Current rate: 11.0%

Real Interest Rate

The policy rate adjusted for inflation (Policy Rate - Headline CPI). Positive real rates help control inflation by encouraging savings over spending.

Recent Developments

Monetary Policy Actions (2024-2025)

  • June 2024: Started rate cutting cycle from 22%
  • Multiple cuts: Reduced rates by 1,100 basis points total
  • May 2025: Final cut to 11%
  • June-September 2025: Held rates steady at 11%

Key Factors

Disinflation Success: - Inflation fell from 30% peak to current 5.6% - Food prices moderated significantly - Core inflation remains elevated at 7%

Ongoing Challenges: - Energy tariff adjustments (gas +35%, electricity +26%) - Flood-related agricultural impacts - Global commodity price volatility - Exchange rate pressures

Outlook: The State Bank expects inflation to stabilize in the 5-7% target range, with continued focus on maintaining positive real interest rates to anchor inflation expectations.

Contact & Feedback

For questions, suggestions, or feedback about this dashboard:

📧 Email: analytics@example.com
🌐 Website: www.sbp.org.pk
📱 Twitter: @StateBank_Pak


Dashboard Version: 1.0
Last Updated: September 2025
Next Update: Mid-October 2025

This dashboard is for informational purposes only and does not constitute financial advice or policy guidance from the State Bank of Pakistan.

Back to top