Consumer Expectations Survey - CES

Data - ECB

Last data update: 01 sept. 2026, 01:21

Last compile: 02 sept. 2026, 23:01

Var_label

Code
CES |>
  group_by(Var, Var_label) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()
Var Var_label Nobs
c1010 Inflation perceptions over the previous 12 months (qualitative) 1040
c1020 Inflation perceptions over the previous 12 months (% change) 1040
c1110 Inflation expectations over the next 12 months (qualitative) 1040
c1120 Inflation expectations over the next 12 months (% change) 1040
c1150 Inflation expectations/uncertainty 12 months ahead (probabilistic bins) 1040
c1210 Inflation expectations 3 years ahead (qualitative) 1040
c1220 Inflation expectations 3 years ahead (% change) 1040
e2010 Inflation expectations 5 years ahead (qualitative) 960
e2020 Inflation expectations 5 years ahead (% change) 960

Breakdown_label

All

Code
CES |>
  group_by(Breakdown, Breakdown_label) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()
Breakdown Breakdown_label Nobs
Age 18-34 years 460
Age 35-54 years 460
Age 55-70 years 460
Country AT 460
Country BE 460
Country DE 460
Country EL 460
Country ES 460
Country FI 460
Country FR 460
Country IE 460
Country IT 460
Country NL 460
Country PT 460
Income 1 460
Income 2 460
Income 3 460
Income 4 460
Income 5 460
Wave NA 460

Country

Code
CES |>
  filter(Breakdown == "Country") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  group_by(geo, Geo) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()
geo Geo Nobs
AT Austria 460
BE Belgium 460
DE Germany 460
EL Greece 460
ES Spain 460
FI Finland 460
FR France 460
IE Ireland 460
IT Italy 460
NL Netherlands 460
PT Portugal 460

wave

Code
CES |>
  wave_to_date() |>
  group_by(date) |>
  summarise(Nobs = n()) |>
  arrange(desc(date)) |>
  print_table_conditional()

All Europe (Wave)

% change

Mean

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Wave",
         Var %in% c("c1020", "c1120", "c1220")) |>
  transmute(date, Var_label, OBS_VALUE = Mean/100) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = Var_label)) + 
  theme_minimal() + xlab("") + ylab("Mean (%)") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  theme(legend.position = c(0.33, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

Median

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Wave",
         Var %in% c("c1020", "c1120", "c1220")) |>
  transmute(date, Var_label, OBS_VALUE = Median/100) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = Var_label)) + 
  theme_minimal() + xlab("") + ylab("Median (%)") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  theme(legend.position = c(0.33, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

qualitative

Net percentage

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Wave",
         Var %in% c("c1010", "c1110", "c1210")) |>
  transmute(date, Var_label, OBS_VALUE = Net_perc/100) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = Var_label)) + 
  theme_minimal() + xlab("") + ylab("Net_perc (%)") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 100, 5),
                     labels = percent_format(a = 1)) + 
  theme(legend.position = c(0.33, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

Up

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Wave",
         Var %in% c("c1010", "c1110", "c1210")) |>
  transmute(date, Var_label, OBS_VALUE = Net_perc/100) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = Var_label)) + 
  theme_minimal() + xlab("") + ylab("Up (%)") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 100, 5),
                     labels = percent_format(a = 1)) + 
  theme(legend.position = c(0.33, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

Down

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Wave",
         Var %in% c("c1010", "c1110", "c1210")) |>
  transmute(date, Var_label, OBS_VALUE = Down/100) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = Var_label)) + 
  theme_minimal() + xlab("") + ylab("Up (%)") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 100, 1),
                     labels = percent_format(a = 1)) + 
  theme(legend.position = c(0.33, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

France, Germany, Italy, Spain

1-year

Mean

All

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1020") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Mean/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations over the next 12 months\n% change, Mean") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

October 2021-

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1020") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Mean/100) |>
  filter(date >= as.Date("2021-10-01")) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations over the next 12 months\n% change, Mean") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "1 month"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

Median

All

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1020") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Median/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations over the next 12 months\n% change, Median") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

October 2021-

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1020") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Median/100) |>
  filter(date >= as.Date("2021-10-01")) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations over the next 12 months\n% change, Median") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "1 month"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

3-year

Mean

All

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1220") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Mean/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations 3 years ahead\n% change, Mean") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

October 2021-

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1220",
         date >= as.Date("2021-10-01")) |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Mean/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations 3 years ahead\n% change, Mean") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "1 month"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, 1),
                     labels = percent_format(a = 1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

Median

All

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1220") |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Median/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations 3 years ahead\n% change, Median") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "2 months"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, .2),
                     labels = percent_format(a = .1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())

October 2021-

Code
CES |>
  wave_to_date() |>
  filter(Breakdown == "Country",
         Var == "c1220",
         date >= as.Date("2021-10-01")) |>
  rename(geo = Breakdown_label) |>
  left_join(geo, by = "geo") |>
  add_flag_color("Geo") |>
  mutate(OBS_VALUE = Median/100) |>
  rename(Ref_area = Geo) |>
  ggplot() + geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  theme_minimal() + xlab("") + ylab("Inflation expectations 3 years ahead\n% change, Median") +
  scale_x_date(breaks = seq.Date(as.Date("2019-12-01"), Sys.Date(), "1 month"),
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-20, 20, .2),
                     labels = percent_format(a = .1)) + 
  scale_color_identity() + add_flags +
  theme(legend.position = c(0.75, 0.90),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        legend.title = element_blank())