August 26 personal income and outlays and the Q2 third estimate, released 9/30/26. Source: BEA.
Core PCE is 3.0% over the year in August 26, after the annual update. Real spending rose 0.6% that month. Second-quarter real GDP is 2.2%, revised up 0.7 percentage point from 1.5%. The published inflation path is lower. These spending and growth figures do not confirm a demand slump.
On 9/30/26 the Bureau of Economic Analysis published the August 26 personal income report and that third GDP estimate. The release closed the setup this blog left open on 9/26/26.
The PCE price index measures the prices people pay for goods and services, including purchases made on their behalf. Core PCE is that index without food and energy. In August 26, core PCE rose 0.2% on the month. Headline PCE, the full index, rose 0.3% on the month and 3.4% over the year.
An annual update is BEA’s yearly rewrite of recent history. This one reaches back to January 2021. On the new vintage, the history as of 9/30/26, core inflation for July 26 is 3.0% over the year, compared with 3.3% in the release published before 9/30/26. Headline inflation for that month is 3.4%, compared with 3.7% before. On this vintage, real spending in July 26 was 0.1%. The earlier release had put that month’s real spending at 0.0%.
The figures below are drawn from the committed snapshot for the 9/30/26 release. To rebuild them from this folder, run scripts/01_fetch_data.py, then scripts/02_clean_data.py, then scripts/04_compute_stats.py. The first script checks the saved FRED files and does not download a new vintage. Monthly history runs through August 26. The July 26 rates from the earlier release, and the second-estimate columns in the GDP chart, are copied from the BEA pages linked in the notes. Data come from the Bureau of Economic Analysis by way of FRED.
The charts use the committed FRED snapshot in this folder. Rebuilding checks that snapshot and does not download a later vintage. Current FRED does not keep the pre-update path. The previously published year rates for July 26, the earlier real-spending print, and the earlier saving rate are copied from the personal-income release for that month. Second-estimate GDP, private domestic final sales, and real gross domestic income are copied from the third-estimate comparison table. Food, energy, and core month changes are each index’s own change. They do not add up to the headline change. The quarterly PCE price rates in the growth section are annualized quarter-to-quarter rates. They are a different statistic from the monthly year rates. BEA’s news release does not assign a basis-point share of the core revision to the methodology changes, so this post does not quote one.
Inflation over the past year
Each line is the percent change from the same month a year earlier. Headline is the full price index. Core is that index without food and energy. At the right edge, in August 26, headline is 3.4% and core is 3.0%.
A vintage is the version of that history published as of one date. The date is the evaluation date of the dataset. It fixes which official record you are reading, and a later BEA release is a new evaluation of the same months. The lines are the vintage as of 9/30/26.
July 26 has two evaluation dates. The earlier release was published to one decimal. The other columns keep the hundredths, so July 26 now and August 26 are not the same figure. They still match when rounded to one decimal.
| July 26 earlier | July 26 now | August 26 | |
|---|---|---|---|
| Headline | 3.70% | 3.36% | 3.42% |
| Core | 3.30% | 2.98% | 3.01% |
The dashed line is the Fed’s 2% aim. Both year rates are still above it. The chart ends in August 26.
Show code
# The year rates are already in the cleaned monthly file. This cell draws them.
yoy = pd.read_csv(CLEAN_DIR / "pce_monthly.csv", index_col="date", parse_dates=True)
yoy = monthly_calendar(yoy, "2023-01-01", "2026-08-01", ["pce_price_yoy", "core_price_yoy"])
fig, ax = plt.subplots(figsize=(8.0, 4.6))
ax.plot(yoy.index, yoy["pce_price_yoy"], color=COLORS["primary"], linewidth=1.8, zorder=3)
ax.plot(yoy.index, yoy["core_price_yoy"], color=COLORS["secondary"], linewidth=1.6, zorder=3)
ax.axhline(
stats["fed_target"],
color=COLORS["fed_target"],
linestyle="--",
linewidth=0.8,
alpha=0.8,
zorder=2,
)
ax.text(
yoy.index[2],
stats["fed_target"] + 0.15,
f"Fed {fmt(stats['fed_target'])}% aim",
color=COLORS["fed_target"],
fontsize=8,
alpha=0.8,
)
last_x = yoy.index[-1]
ax.scatter(
[last_x, last_x],
[yoy["pce_price_yoy"].iloc[-1], yoy["core_price_yoy"].iloc[-1]],
s=40,
color=[COLORS["primary"], COLORS["secondary"]],
zorder=5,
edgecolors="white",
linewidth=0.8,
)
span = last_x - yoy.index[0]
ax.set_xlim(yoy.index[0] - span * 0.02, last_x + span * 0.14)
label_endpoints(
ax,
[
{
"x": last_x,
"y": yoy["pce_price_yoy"].iloc[-1],
"text": f"Headline {yoy['pce_price_yoy'].iloc[-1]:.1f}%",
"color": COLORS["primary"],
},
{
"x": last_x,
"y": yoy["core_price_yoy"].iloc[-1],
"text": f"Core {yoy['core_price_yoy'].iloc[-1]:.1f}%",
"color": COLORS["secondary"],
},
],
)
ax.set_ylabel("Percent change from a year earlier")
year_ticks(ax, yoy.index)
plt.tight_layout()
fig.savefig(IMG_DIR / "pce-yoy.png", dpi=150, bbox_inches="tight")
Source: BEA Personal Income and Outlays, price indexes via FRED headline PCE and FRED core PCE. Prior rates from the previous personal-income release.
A year rate looks back twelve months, so the annual update can move it by rewriting earlier months. The next chart is the price change in August 26 by itself.
What changed in August
A month percent change compares this month’s price index with last month’s. Headline prices in August 26 rose 0.3%, and core prices rose 0.2%. On the updated vintage, the July 26 month rates are 0.1% for headline and 0.1% for core.
A year rate compares a month with the same month a year earlier. That is the division in the table above. From July 26 to August 26, the new month enters that twelve-month window and August 2025 drops out. The year rate changes by the new month’s price change minus the price change in the month that drops out. For headline prices, August 26 rose 0.31% and August 2025 rose 0.25%, so the year rate moves by 0.06 percentage point, from 3.36% to 3.42%. Core is calculated the same way. In the table its year rate goes from 2.98% to 3.01%.
Food prices were 0.0% on the month. Energy goods and services prices rose 2.3%. Those two series are chain-type price indexes of their own. Adding them to core does not recover the headline 0.3%, and the chart does not stack them. Within August 26, energy is the large bar. Core’s 0.2% is the new month’s underlying print. It is separate from the year-rate rewrite in the chart above.
The bars run for the twelve months ending August 26. Across those months, energy prices range from -5.8% in June 26 to 11.5% in March 26. The 2.3% increase in August 26 is the latest reading in that range.
Show code
# The month changes are already in the cleaned price file. This cell draws them.
prices = pd.read_csv(CLEAN_DIR / "pce_price_monthly.csv", index_col="date", parse_dates=True)
prices = monthly_calendar(
prices,
"2025-09-01",
"2026-08-01",
["food_price_mom", "energy_price_mom", "core_price_mom"],
)
fig, ax = plt.subplots(figsize=(8.0, 4.2))
x = np.arange(len(prices))
width = 0.26
ax.bar(x - width, prices["food_price_mom"], width, color=COLORS["warning"], edgecolor="white", label="Food")
ax.bar(x, prices["energy_price_mom"], width, color=COLORS["accent"], edgecolor="white", label="Energy")
ax.bar(x + width, prices["core_price_mom"], width, color=COLORS["primary"], edgecolor="white", label="Core")
ax.axhline(0, color=COLORS["neutral"], linewidth=0.8)
ax.set_xticks(x)
ax.set_xticklabels(
[
short_year(d.strftime("%b\n%Y") if d.month in (1, 9) else d.strftime("%b"))
for d in prices.index
]
)
ax.set_ylabel("Percent change from the prior month")
ax.legend(frameon=False, loc="upper left")
plt.tight_layout()
fig.savefig(IMG_DIR / "pce-monthly.png", dpi=150, bbox_inches="tight")
Source: BEA Table 2.8.4 price indexes, via FRED food prices, FRED energy prices, and FRED core PCE.
The inflation news for August 26 is a modest core month plus a jump in energy prices. The spending figures tell a separate story.
Spending and income
Nominal spending is the cash-register total. Real spending removes the price change, so it is closer to the quantity households bought. Disposable personal income is income after personal current taxes. Real disposable income removes the price change from that after-tax income.
The dollar changes below are changes in seasonally adjusted annual-rate levels. They are not the dollars households spent or received during August 26 alone. The real PCE dollar change is in chained 2017 dollars. The percent changes are monthly rates.
In August 26, current-dollar PCE rose 0.9% and real PCE rose 0.6%. Personal income rose 0.2%, or $66.6 billion at an annual rate. Current-dollar disposable income rose 0.3%, or $68.6 billion at an annual rate, and real disposable income was 0.0%. Households spent more in real terms in a month when real after-tax income did not rise. In annual-rate dollars, current-dollar PCE rose $190.8 billion, with goods up $114.1 billion and services up $76.7 billion. Real PCE rose $92.8 billion in chained 2017 dollars.
The lines below index both real series to January 2024 = 100, so the paths can share a scale. By August 26 the spending index is 107.7 and the after-tax income index is 104.1. The saving rate, personal saving as a share of disposable income, is not on the chart. It was 4.1% in August 26 and 4.6% in revised July 26. The 3.0% figure is the July 26 rate published before the annual update. The comparison for the latest saving rate is the revised July 26 rate.
Show code
# The index is already in the cleaned file. The base month equals 100.
real = pd.read_csv(CLEAN_DIR / "real_indexes.csv", index_col="date", parse_dates=True)
real = monthly_calendar(real, "2024-01-01", "2026-08-01", ["real_pce_index", "real_dpi_index"])
fig, ax = plt.subplots(figsize=(8.0, 4.6))
ax.plot(real.index, real["real_pce_index"], color=COLORS["primary"], linewidth=1.8, zorder=3)
ax.plot(real.index, real["real_dpi_index"], color=COLORS["secondary"], linewidth=1.6, zorder=3)
last_x = real.index[-1]
ax.scatter(
[last_x, last_x],
[real["real_pce_index"].iloc[-1], real["real_dpi_index"].iloc[-1]],
s=40,
color=[COLORS["primary"], COLORS["secondary"]],
zorder=5,
edgecolors="white",
linewidth=0.8,
)
span = last_x - real.index[0]
ax.set_xlim(real.index[0] - span * 0.02, last_x + span * 0.16)
label_endpoints(
ax,
[
{
"x": last_x,
"y": real["real_pce_index"].iloc[-1],
"text": f"Real PCE {real['real_pce_index'].iloc[-1]:.1f}",
"color": COLORS["primary"],
},
{
"x": last_x,
"y": real["real_dpi_index"].iloc[-1],
"text": f"Real income {real['real_dpi_index'].iloc[-1]:.1f}",
"color": COLORS["secondary"],
},
],
)
ax.set_ylabel(f"Index, {stats['index_base']} = 100")
half_year_ticks(ax, real.index)
plt.tight_layout()
fig.savefig(IMG_DIR / "real-spending-income.png", dpi=150, bbox_inches="tight")
Source: BEA Personal Income and Outlays, via FRED real PCE and FRED real disposable income.
Real spending rose in a month when real after-tax income did not. The quarterly totals show whether that month sits inside a weaker growth revision.
The second-quarter revision
The chart compares the second and third estimates for real GDP, private domestic final sales, and real gross domestic income. Those are the aggregate growth rates in BEA’s comparison table.
Real GDP was revised from 1.5% to 2.2%. The advance estimate had also been 1.5%. Real final sales to private domestic purchasers, household consumption plus private fixed investment, went from 4.2% to 4.6%. The advance reading of that measure was 3.9%. Real gross domestic income, the income-side twin of GDP, went from 2.2% to 2.6%.
Two price rates in that same table are easy to mix up with the monthly path. The quarterly PCE price index rose at a 5.0% annual rate, revised down 0.3 percentage point from 5.3%. Core was 3.3%, revised down the same 0.3 percentage point from 3.6%. Those are quarter-to-quarter annualized rates for the spring quarter. The August 26 year rates are 3.4% and 3.0%.
First-quarter real GDP is now 2.5%, an upward revision of 0.4 percentage point. The GDP update covers the first quarter of 2021 through the first quarter of 26. The reference year remains 2017.
Show code
# Second-estimate values are copied from the BEA comparison table.
# Third-estimate GDP and private final sales are the latest FRED vintage.
revision = pd.read_csv(CLEAN_DIR / "q2_revision.csv")
order = revision.iloc[::-1].reset_index(drop=True)
y = np.arange(len(order))
height = 0.36
fig, ax = plt.subplots(figsize=(8.0, 4.2))
ax.barh(
y + height / 2,
order["second"],
height=height,
color=COLORS["light"],
edgecolor="white",
label="Second estimate",
)
ax.barh(
y - height / 2,
order["third"],
height=height,
color=COLORS["primary"],
edgecolor="white",
label="Third estimate",
)
for i, row in order.iterrows():
ax.text(row["second"] + 0.08, i + height / 2, f"{row['second']:.1f}", fontsize=8, color=COLORS["neutral"], va="center")
ax.text(row["third"] + 0.08, i - height / 2, f"{row['third']:.1f}", fontsize=8, color=COLORS["neutral"], va="center")
ax.set_yticks(y)
ax.set_yticklabels(order["measure"])
ax.set_xlabel("Percent change, seasonally adjusted annual rate")
ax.set_xlim(0, max(order["second"].max(), order["third"].max()) + 1.2)
ax.legend(frameon=False, loc="lower right")
plt.tight_layout()
fig.savefig(IMG_DIR / "q2-revision.png", dpi=150, bbox_inches="tight")
Source: BEA GDP third estimate. Latest GDP and private final sales also via FRED real GDP and FRED private domestic final purchases.
Growth was revised up along with the lower year rate. Whether 3.0% is also the recent pace is a different cut of the same price index.
The recent pace
The year rate is the change over twelve months. The three-month pace compounds only the latest three months, as if that stretch had lasted a year. On the 9/30/26 vintage, core’s three-month pace is 2.0% and the twelve-month rate is 3.0%. Both lines use that vintage. The sample ends in August 26.
Show code
# The twelve-month rate and the three-month pace are already in the cleaned file.
pace = pd.read_csv(CLEAN_DIR / "core_pace.csv", index_col="date", parse_dates=True)
pace = monthly_calendar(pace, "2023-01-01", "2026-08-01", ["core_price_yoy", "core_3m"])
fig, ax = plt.subplots(figsize=(8.0, 4.6))
ax.plot(pace.index, pace["core_price_yoy"], color=COLORS["primary"], linewidth=1.8, zorder=3)
ax.plot(pace.index, pace["core_3m"], color=COLORS["warning"], linewidth=1.6, zorder=3)
ax.axhline(
stats["fed_target"],
color=COLORS["fed_target"],
linestyle="--",
linewidth=0.8,
alpha=0.8,
)
last_x = pace.index[-1]
ax.scatter(
[last_x, last_x],
[pace["core_price_yoy"].iloc[-1], pace["core_3m"].iloc[-1]],
s=40,
color=[COLORS["primary"], COLORS["warning"]],
zorder=5,
edgecolors="white",
linewidth=0.8,
)
span = last_x - pace.index[0]
ax.set_xlim(pace.index[0] - span * 0.02, last_x + span * 0.18)
y_12 = float(pace["core_price_yoy"].iloc[-1])
y_3m = float(pace["core_3m"].iloc[-1])
label_endpoints(
ax,
[
{
"x": last_x,
"y": y_12,
"text": f"12-month {y_12:.1f}%",
"color": COLORS["primary"],
},
],
)
# The three-month pace ends on the aim line, so its label sits above the point.
label_y = y_3m + 0.35
ax.plot(
[last_x, last_x],
[y_3m, label_y],
color=COLORS["light"],
linewidth=0.6,
zorder=4,
)
ax.text(
last_x,
label_y,
f" 3-month {y_3m:.1f}%",
fontsize=8,
color=COLORS["warning"],
va="center",
fontweight="bold",
)
ax.set_ylabel("Percent")
year_ticks(ax, pace.index)
plt.tight_layout()
fig.savefig(IMG_DIR / "core-pace.png", dpi=150, bbox_inches="tight")
Source: BEA core PCE price index, via FRED.
The three-month pace sits on the 2% aim. The year rate is still 3.0%. The short line is only the latest three months.
The September setup is closed
The 9/26/26 post stopped before this print. The print is now in. Core PCE is 3.0% over the year after the annual update. Real spending rose 0.6% in August 26. Second-quarter real GDP is 2.2%, revised up from 1.5%. The lower published inflation path came with the rewritten history. The spending and growth figures do not confirm a demand slump.
What it means for
For the Fed. On 9/16/26 the Federal Reserve set the funds rate at 3.75 to 4.00 percent. The September projections put the median for the end of 26 at 4.1%. 12 of 18 participants looked for exactly one more increase in 26. Those projections sit one quarter point above the current range’s midpoint. They were submitted before 9/30/26, and they are participant projections, not a Committee vote. This release does not rewrite them. The decision at the next meeting is not in this dataset.
For households. Prices are still up 3.0% on the core year rate and 3.4% on the headline year rate. Real after-tax income was unchanged in August 26, at 0.0%. Real spending rose anyway.
For investors. The federal funds target range remains 3.75 to 4.00 percent. Policy rates influence borrowing costs and the rates investors use to discount future cash flows. This release changes the published inflation path. It does not, by itself, change the policy setting.
What to watch
- The September consumer price index on 10/14/26.
- The September producer price index on 10/15/26.
- The next FOMC decision on 10/28/26.
- September PCE and the first look at third-quarter GDP on 10/29/26.
None of those prints is in this post.
Limitations
- An annual-update break is a rewrite of history. The size of that rewrite is separate from the August 26 month change.
- Hard-to-price services are a weak read on the cyclical pressure in market prices. BEA’s release does not publish a contribution split for those categories here, so this post does not quote one.
- Food, energy, and core month changes do not add up to the headline percent change.
- The second-estimate bars exist because BEA printed the comparison. They are not a second FRED vintage stored beside the new one.
- September prices and the October policy decision sit outside this file.
Methodology
| Series | What this post uses it for | Source |
|---|---|---|
| PCE price index | Headline inflation, on the year chart | FRED PCEPI |
| Core PCE price index | Inflation excluding food and energy, on the year, month, and pace charts | FRED PCEPILFE |
| Food PCE price index | Food’s own monthly price change | FRED DFXARG3M086SBEA |
| Energy PCE price index | Energy goods and services monthly price change | FRED DNRGRG3M086SBEA |
| Real PCE | Quantity of spending, on the index chart | FRED PCEC96 |
| Real disposable personal income | After-tax income adjusted for prices, on the index chart | FRED DSPIC96 |
| Saving rate | Latest level and revised prior-month level, in the text only | FRED PSAVERT |
| Real GDP growth | Latest quarterly percent change, checked against the BEA table | FRED A191RL1Q225SBEA |
| Private domestic final purchases | Latest quarterly percent change for household plus business spending at home | FRED PB0000031Q225SBEA |
| Personal income and outlays | The monthly prints, dollar changes, and annual-update note | BEA personal income release |
| GDP third estimate | The second-versus-third comparison, including real GDI | BEA GDP third estimate |
Data current as of 9/30/26. August personal income and outlays, and the second-quarter third estimate, both released 9/30/26.