subsample reloads calculated values as inputs, so a reform's baseline reads the reform's results
维护者通常 3 天内回复
还没有人认领这个 Issue。
评估
调研方向
Start in simulations/simulation.py around Simulation.subsample (:2330), _get_exportable_input_periods (:2213-2214), to_input_dataframe (:2254-2268), the dataset rebuild (:2408-2410), and the baseline branch (:2430-2444). Run the issue's reproduction to see the baseline change after calculating first. The fix should export inputs plus structural variables, then add regression tests for baseline equality and get_input_periods after subsample.
由索引模型根据 Issue 内容生成。
描述
Problem
Simulation.subsample reloads every value the simulation holds as an input, calculated values included. After it:
- A reform simulation's baseline reads values calculated under the reform. The rebuilt baseline branch starts from the rebuilt simulation's stored values, so any variable calculated before
subsampleis a baseline input holding the reform's result. Reform-vs-baseline comparisons of those variables, and of everything computed from them, show no change. - Input presence is lost.
Holder.get_input_periodscounts the reloaded values as inputs, so a calculated default looks like a supplied column. policyengine-us PR #10447 decides behaviour from whether a dataset suppliesunemployment_compensation_start_month, and has to drop that variable's calculated defaults before callingsubsample.
Where (3.32.27)
simulations/simulation.py:2330:df = self.to_input_dataframe(include_computed_variables=True). With that flag,_get_exportable_input_periodsreturnsholder.get_known_periods()(:2213-2214), which includes calculated periods, andto_input_dataframeexports each (:2254-2268).:2408-2410: the subsampled frame becomes the dataset,_user_input_keysis reset, andbuild_from_dataset()sets every exported column as an input.:2430-2444: the baseline branch is rebuilt withget_branch("baseline"), which starts from the values the rebuilt simulation holds (get_branchdocstring,:1961-1966), then is rebound to the baseline system.
The comment at :2328-2329 gives the reason for the flag: keeping formula-backed structural variables such as ids (#498).
Reproduction (policyengine-core 3.32.27, policyengine-us 2.63.3)
import numpy as np
import pandas as pd
from policyengine_core.reforms import Reform
from policyengine_us import Microsimulation
from policyengine_us.data.dataset_schema import USSingleYearDataset
ids = np.arange(1, 41)
groups = ("household", "tax_unit", "spm_unit", "family", "marital_unit")
dataset = USSingleYearDataset(
person=pd.DataFrame(
{"person_id": ids, "age": np.full(ids.size, 40),
"employment_income": np.linspace(0, 200_000, ids.size)}
| {f"person_{group}_id": ids for group in groups}
),
household=pd.DataFrame(
{"household_id": ids, "state_fips": np.full(ids.size, 48),
"household_weight": np.ones(ids.size)}
),
**{group: pd.DataFrame({f"{group}_id": ids}) for group in groups[1:]},
time_period=2024,
)
reform = Reform.from_dict(
{f"gov.irs.deductions.standard.amount.{status}": {"2024-01-01.2100-12-31": 99_000}
for status in ("SINGLE", "JOINT", "HEAD_OF_HOUSEHOLD", "SEPARATE", "SURVIVING_SPOUSE")},
country_id="us",
)
for calculate_first in (False, True):
sim = Microsimulation(dataset=dataset, reform=reform)
if calculate_first:
sim.calculate("standard_deduction", 2024)
sim.subsample(n=20, seed="repro", quantize_weights=False)
print(
f"calculated first: {calculate_first}; "
f"reform {sim.calculate('standard_deduction', 2024).values.mean():,.0f}; "
f"baseline {sim.baseline.calculate('standard_deduction', 2024).values.mean():,.0f}"
)
Output:
calculated first: False; reform 99,000; baseline 14,600
calculated first: True; reform 99,000; baseline 99,000
Suggested fix
Export inputs, not every calculated value: the set_input record (include_computed_variables=False) plus the structural variables a rebuild needs (ids, entity links and weights, formula-backed or not, per #498). Calculated values are then recalculated on the subsample. Regression tests:
- the reproduction above: the baseline result after
subsampleis the same whether or not the reform result was calculated first; get_input_periodsof a variable that was only calculated is empty aftersubsample, and a variable set withset_inputkeeps its periods.
Callers that calculate before subsampling are affected; those that subsample straight after building are not. I have not checked which callers do which.
Related: #605 (the input record after build_from_populations), #632 (a neutralized input lost from the baseline), #522 (the baseline branch's system after subsample).
🤖 Generated with Claude Code
- 主要语言
- Python
- 星标
- 22
- 派生
- 30
- 平均合并
- 4 天 16 小时
- 30 天内合并 PR
- 35
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
PolicyEngine/policyengine-core 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 76/100
PolicyEngine/policyengine-core#605 · 1 条评论 ·
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
PolicyEngine/policyengine-core#549 ·
维护者通常 3 天内回复
-
`restore_simulation` silently drops memberless group entities可能已有人在做 @Adelagric 于 46 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
PolicyEngine/policyengine-core#547 ·
维护者通常 3 天内回复
-
难度 4/5 3-5 天 新手友好度 28/100
PolicyEngine/policyengine-core#634 ·
维护者通常 3 天内回复
-
难度 4/5 3-5 天 新手友好度 45/100
PolicyEngine/policyengine-core#632 · 1 条评论 ·
维护者通常 3 天内回复
查看 PolicyEngine/policyengine-core 的全部 Issue
相似的 Issue
-
ci enhancement testing
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
area/config comp/tools P2 platform/telegram type/bug
难度 2/5 1-3 小时 新手友好度 74/100
NousResearch/hermes-agent#145412 ·
维护者通常 1 天内回复
-
[oblt-aw][autodoc] Update docs for security org scaffolding and Docs AI menu permission changes可能已有人在做 @github-actions 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 75/100
维护者通常 1 天内回复
-
curriculum documentation quality
难度 2/5 1-3 小时 新手友好度 76/100
githubnext/gh-aw-workshop#5039 ·
维护者通常 1 天内回复
-
Community project: hosted MOSS-Image studio with a visual JSON layout builder (no ComfyUI needed)未关闭
难度 1/5 1-3 小时 新手友好度 65/100
OpenMOSS/MOSS-Image#27 · 1 条评论 ·
维护者通常 1 天内回复