From e4a05f3ce6ff13f670e957c9457d76f52ac5c690 Mon Sep 17 00:00:00 2001 From: hub-gif <2487812171@qq.com> Date: Fri, 17 Apr 2026 14:48:32 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pipeline):=20=E7=A7=BB=E9=99=A4=20csv?= =?UTF-8?q?=5Fschema=20=E7=AD=89=E6=A0=B9=E7=9B=AE=E5=BD=95=E4=B8=AD?= =?UTF-8?q?=E8=BD=AC=EF=BC=8C=E7=BB=9F=E4=B8=80=E4=BB=8E=20pipeline.csv=20?= =?UTF-8?q?=E5=AD=90=E5=8C=85=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 csv_schema.py、csv_header_rewrite.py、matrix_group_label.py(无引用) - 全库改为 from pipeline.csv.schema / pipeline.csv.header_rewrite;文档字符串同步 - 与此前 jd_competitor_report 去中转同一策略 Made-with: Cursor --- .../jd_pc_search/comment/jd_item_comment_export.py | 2 +- .../jd_pc_search/detail/jd_detail_buyer_extraction.py | 2 +- backend/crawler_copy/jd_pc_search/jd_pipeline_export.py | 4 ++-- backend/crawler_copy/jd_pc_search/scenario_filter.py | 2 +- .../crawler_copy/jd_pc_search/search/jd_h5_search_parse.py | 2 +- .../jd_pc_search/search/jd_h5_search_requests.py | 2 +- backend/pipeline/competitor_report/comment_sentiment.py | 2 +- backend/pipeline/competitor_report/constants.py | 2 +- backend/pipeline/competitor_report/consumer_feedback.py | 2 +- backend/pipeline/competitor_report/list_mix.py | 2 +- backend/pipeline/competitor_report/llm_group_payloads.py | 2 +- backend/pipeline/competitor_report/matrix_md.py | 2 +- backend/pipeline/csv_header_rewrite.py | 3 --- backend/pipeline/csv_schema.py | 3 --- backend/pipeline/dataset_nonempty.py | 2 +- backend/pipeline/demos/chapter8_text_mining_probe.py | 2 +- backend/pipeline/demos/run_report_llm_chapters_demo.py | 2 +- backend/pipeline/export_job.py | 2 +- backend/pipeline/ingest.py | 2 +- backend/pipeline/jd/detail_ware_regen.py | 2 +- backend/pipeline/jd/merged_regen.py | 4 ++-- backend/pipeline/jd/runner.py | 2 +- .../management/commands/refresh_jd_merged_total_sales.py | 2 +- .../management/commands/rewrite_pipeline_csv_headers.py | 6 +++--- backend/pipeline/matrix_group_label.py | 3 --- backend/pipeline/row_serialize.py | 2 +- backend/pipeline/tests/test_buyer_offer_export_csv.py | 2 +- backend/pipeline/tests/test_competitor_brief.py | 2 +- backend/pipeline/views/product_views.py | 2 +- 29 files changed, 30 insertions(+), 39 deletions(-) delete mode 100644 backend/pipeline/csv_header_rewrite.py delete mode 100644 backend/pipeline/csv_schema.py delete mode 100644 backend/pipeline/matrix_group_label.py diff --git a/backend/crawler_copy/jd_pc_search/comment/jd_item_comment_export.py b/backend/crawler_copy/jd_pc_search/comment/jd_item_comment_export.py index 70316e9..f52e31a 100644 --- a/backend/crawler_copy/jd_pc_search/comment/jd_item_comment_export.py +++ b/backend/crawler_copy/jd_pc_search/comment/jd_item_comment_export.py @@ -16,7 +16,7 @@ from typing import Any _BACKEND_ROOT = Path(__file__).resolve().parents[3] if str(_BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(_BACKEND_ROOT)) -from pipeline.csv_schema import COMMENT_CSV_COLUMNS, COMMENT_ROW_DICT_KEYS # noqa: E402 +from pipeline.csv.schema import COMMENT_CSV_COLUMNS, COMMENT_ROW_DICT_KEYS # noqa: E402 def write_comments_flat_csv(path: Path | str, rows: list[dict[str, Any]]) -> None: diff --git a/backend/crawler_copy/jd_pc_search/detail/jd_detail_buyer_extraction.py b/backend/crawler_copy/jd_pc_search/detail/jd_detail_buyer_extraction.py index 6148a2a..b1a294b 100644 --- a/backend/crawler_copy/jd_pc_search/detail/jd_detail_buyer_extraction.py +++ b/backend/crawler_copy/jd_pc_search/detail/jd_detail_buyer_extraction.py @@ -17,7 +17,7 @@ import json import re from typing import Any -from pipeline.csv_schema import strip_buyer_ranking_line_prefix +from pipeline.csv.schema import strip_buyer_ranking_line_prefix def _s(x: Any) -> str: diff --git a/backend/crawler_copy/jd_pc_search/jd_pipeline_export.py b/backend/crawler_copy/jd_pc_search/jd_pipeline_export.py index 8dc0c68..cedceb6 100644 --- a/backend/crawler_copy/jd_pc_search/jd_pipeline_export.py +++ b/backend/crawler_copy/jd_pc_search/jd_pipeline_export.py @@ -12,7 +12,7 @@ from io import StringIO from pathlib import Path from typing import Any -from pipeline.csv_schema import ( # noqa: E402 +from pipeline.csv.schema import ( # noqa: E402 MERGED_CSV_COLUMNS, remap_merged_row_english_detail_keys_to_csv_headers, ) @@ -54,7 +54,7 @@ def normalize_merged_rows_for_export(rows: list[dict[str, str]]) -> None: 整合表落盘前:搜索侧「榜单类文案」与「榜单排名」去掉 ``榜单/曝光:`` 前缀, 与 ``strip_buyer_ranking_line_prefix`` / 入库规则一致。 """ - from pipeline.csv_schema import strip_buyer_ranking_line_prefix # noqa: WPS433 + from pipeline.csv.schema import strip_buyer_ranking_line_prefix # noqa: WPS433 hot_key = "榜单类文案" rank_key = "榜单排名" diff --git a/backend/crawler_copy/jd_pc_search/scenario_filter.py b/backend/crawler_copy/jd_pc_search/scenario_filter.py index 3e99287..3fa208a 100644 --- a/backend/crawler_copy/jd_pc_search/scenario_filter.py +++ b/backend/crawler_copy/jd_pc_search/scenario_filter.py @@ -17,7 +17,7 @@ from typing import Any _BACKEND_ROOT = Path(__file__).resolve().parents[2] if str(_BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(_BACKEND_ROOT)) -from pipeline.csv_schema import JD_SEARCH_CSV_HEADERS # noqa: E402 +from pipeline.csv.schema import JD_SEARCH_CSV_HEADERS # noqa: E402 # 与 CSV 导出列名一致(jd_h5_search_requests.CSV_FIELDS 子集) _SCENARIO_TEXT_FIELDS: tuple[str, ...] = ( diff --git a/backend/crawler_copy/jd_pc_search/search/jd_h5_search_parse.py b/backend/crawler_copy/jd_pc_search/search/jd_h5_search_parse.py index f1a9ade..5e63743 100644 --- a/backend/crawler_copy/jd_pc_search/search/jd_h5_search_parse.py +++ b/backend/crawler_copy/jd_pc_search/search/jd_h5_search_parse.py @@ -17,7 +17,7 @@ from urllib.parse import parse_qs, urlparse _BACKEND_ROOT = Path(__file__).resolve().parents[3] if str(_BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(_BACKEND_ROOT)) -from pipeline.csv_schema import JD_SEARCH_CSV_HEADERS as JD_EXPORT_COLUMN_HEADERS # noqa: E402 +from pipeline.csv.schema import JD_SEARCH_CSV_HEADERS as JD_EXPORT_COLUMN_HEADERS # noqa: E402 _JD_PC_SEARCH_DIR = Path(__file__).resolve().parent diff --git a/backend/crawler_copy/jd_pc_search/search/jd_h5_search_requests.py b/backend/crawler_copy/jd_pc_search/search/jd_h5_search_requests.py index 6877401..abfc57b 100644 --- a/backend/crawler_copy/jd_pc_search/search/jd_h5_search_requests.py +++ b/backend/crawler_copy/jd_pc_search/search/jd_h5_search_requests.py @@ -65,7 +65,7 @@ _BACKEND_ROOT = Path(__file__).resolve().parents[3] if str(_BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(_BACKEND_ROOT)) from common.jd_delay_utils import parse_request_delay_range, sleep_pc_search_request_gap -from pipeline.csv_schema import JD_SEARCH_CSV_HEADERS as JD_EXPORT_COLUMN_HEADERS # noqa: E402 +from pipeline.csv.schema import JD_SEARCH_CSV_HEADERS as JD_EXPORT_COLUMN_HEADERS # noqa: E402 _JD_PC_SEARCH_DIR = Path(__file__).resolve().parent if str(_JD_PC_SEARCH_DIR) not in sys.path: diff --git a/backend/pipeline/competitor_report/comment_sentiment.py b/backend/pipeline/competitor_report/comment_sentiment.py index 107a8da..30b2152 100644 --- a/backend/pipeline/competitor_report/comment_sentiment.py +++ b/backend/pipeline/competitor_report/comment_sentiment.py @@ -7,7 +7,7 @@ import re from collections import Counter from typing import Any -from pipeline.csv_schema import MERGED_FIELD_TO_CSV_HEADER +from pipeline.csv.schema import MERGED_FIELD_TO_CSV_HEADER from .constants import ( _COMMENT_CSV_BODY, diff --git a/backend/pipeline/competitor_report/constants.py b/backend/pipeline/competitor_report/constants.py index 821d433..6196935 100644 --- a/backend/pipeline/competitor_report/constants.py +++ b/backend/pipeline/competitor_report/constants.py @@ -1,7 +1,7 @@ """CSV 表头键、运行默认调参与关注词/场景配置(与 ``pipeline.competitor_report.jd_report`` 顶层一致)。""" from __future__ import annotations -from pipeline.csv_schema import ( +from pipeline.csv.schema import ( COMMENT_CSV_COLUMNS, JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER, diff --git a/backend/pipeline/competitor_report/consumer_feedback.py b/backend/pipeline/competitor_report/consumer_feedback.py index 39cacb7..e8a4a9f 100644 --- a/backend/pipeline/competitor_report/consumer_feedback.py +++ b/backend/pipeline/competitor_report/consumer_feedback.py @@ -1,7 +1,7 @@ """评价与合并表按细类矩阵对齐:带前缀行、SKU→细类映射、按细类消费者反馈分组。""" from __future__ import annotations -from pipeline.csv_schema import MERGED_FIELD_TO_CSV_HEADER +from pipeline.csv.schema import MERGED_FIELD_TO_CSV_HEADER from .comment_sentiment import _iter_comment_text_units from .constants import ( diff --git a/backend/pipeline/competitor_report/list_mix.py b/backend/pipeline/competitor_report/list_mix.py index 2ef927f..42eebf3 100644 --- a/backend/pipeline/competitor_report/list_mix.py +++ b/backend/pipeline/competitor_report/list_mix.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections import Counter from typing import Any -from pipeline.csv_schema import JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER +from pipeline.csv.schema import JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER from .constants import ( _LEGACY_LIST_BRAND_TITLE_KEY, diff --git a/backend/pipeline/competitor_report/llm_group_payloads.py b/backend/pipeline/competitor_report/llm_group_payloads.py index a6acb08..941c0d4 100644 --- a/backend/pipeline/competitor_report/llm_group_payloads.py +++ b/backend/pipeline/competitor_report/llm_group_payloads.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections import Counter from typing import Any -from pipeline.csv_schema import JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER +from pipeline.csv.schema import JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER from .comment_sentiment import _comment_keyword_hits from .constants import ( diff --git a/backend/pipeline/competitor_report/matrix_md.py b/backend/pipeline/competitor_report/matrix_md.py index 19c3943..7faa510 100644 --- a/backend/pipeline/competitor_report/matrix_md.py +++ b/backend/pipeline/competitor_report/matrix_md.py @@ -1,7 +1,7 @@ """竞品矩阵 Markdown 行:配料格与整行管道表单元。""" from __future__ import annotations -from pipeline.csv_schema import MERGED_FIELD_TO_CSV_HEADER, merged_csv_effective_total_sales +from pipeline.csv.schema import MERGED_FIELD_TO_CSV_HEADER, merged_csv_effective_total_sales from .constants import ( _COMMENT_FUZZ_KEYS, diff --git a/backend/pipeline/csv_header_rewrite.py b/backend/pipeline/csv_header_rewrite.py deleted file mode 100644 index 9df8292..0000000 --- a/backend/pipeline/csv_header_rewrite.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""兼容入口:实现见 ``pipeline.csv.header_rewrite``。""" -from pipeline.csv.header_rewrite import * # noqa: F403, F401 diff --git a/backend/pipeline/csv_schema.py b/backend/pipeline/csv_schema.py deleted file mode 100644 index a6ef2b8..0000000 --- a/backend/pipeline/csv_schema.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""兼容入口:实现见 ``pipeline.csv.schema``。""" -from pipeline.csv.schema import * # noqa: F403, F401 diff --git a/backend/pipeline/dataset_nonempty.py b/backend/pipeline/dataset_nonempty.py index cebbca4..86120d1 100644 --- a/backend/pipeline/dataset_nonempty.py +++ b/backend/pipeline/dataset_nonempty.py @@ -1,7 +1,7 @@ """按任务扫描库内行,得到「全表至少一格非空」的列,供摘要 / 浏览 / 导出一致裁剪。""" from __future__ import annotations -from .csv_schema import ( +from .csv.schema import ( COMMENT_CSV_COLUMNS, COMMENT_CSV_TO_FIELD, DETAIL_CSV_COLUMNS, diff --git a/backend/pipeline/demos/chapter8_text_mining_probe.py b/backend/pipeline/demos/chapter8_text_mining_probe.py index a79dffe..0a32de9 100644 --- a/backend/pipeline/demos/chapter8_text_mining_probe.py +++ b/backend/pipeline/demos/chapter8_text_mining_probe.py @@ -46,7 +46,7 @@ if str(JCR_ROOT) not in sys.path: from pipeline.competitor_report import jd_report as jcr # noqa: E402 import jd_keyword_pipeline as kpl # noqa: E402 -from pipeline.csv_schema import MERGED_FIELD_TO_CSV_HEADER # noqa: E402 +from pipeline.csv.schema import MERGED_FIELD_TO_CSV_HEADER # noqa: E402 from pipeline.llm.generate import _call_llm # noqa: E402 探针专用,不新增 generate 导出 # 导入失败时**不得** ``sys.exit``:本模块会被 ``runner`` 在 Web 请求中 import,退出会整进程 500。 diff --git a/backend/pipeline/demos/run_report_llm_chapters_demo.py b/backend/pipeline/demos/run_report_llm_chapters_demo.py index b64a301..d25350d 100644 --- a/backend/pipeline/demos/run_report_llm_chapters_demo.py +++ b/backend/pipeline/demos/run_report_llm_chapters_demo.py @@ -40,7 +40,7 @@ if str(JCR_ROOT) not in sys.path: from pipeline.competitor_report import jd_report as jcr # noqa: E402 import jd_keyword_pipeline as kpl # noqa: E402 -from pipeline.csv_schema import MERGED_FIELD_TO_CSV_HEADER # noqa: E402 +from pipeline.csv.schema import MERGED_FIELD_TO_CSV_HEADER # noqa: E402 from pipeline.jd.runner import ( # noqa: E402 get_default_report_config, use_chunked_group_summaries_llm, diff --git a/backend/pipeline/export_job.py b/backend/pipeline/export_job.py index a357cc7..8aeea78 100644 --- a/backend/pipeline/export_job.py +++ b/backend/pipeline/export_job.py @@ -9,7 +9,7 @@ from typing import Any from django.db.models import QuerySet from openpyxl import Workbook -from .csv_schema import ( +from .csv.schema import ( COMMENT_CSV_TO_FIELD, DETAIL_CSV_TO_FIELD, JD_SEARCH_CSV_HEADERS, diff --git a/backend/pipeline/ingest.py b/backend/pipeline/ingest.py index b634d2d..72ae2fe 100644 --- a/backend/pipeline/ingest.py +++ b/backend/pipeline/ingest.py @@ -14,7 +14,7 @@ from django.conf import settings from django.db import transaction from django.utils import timezone -from .csv_schema import ( +from .csv.schema import ( COMMENT_CSV_COLUMNS, COMMENT_CSV_TO_FIELD, DETAIL_CSV_COLUMNS, diff --git a/backend/pipeline/jd/detail_ware_regen.py b/backend/pipeline/jd/detail_ware_regen.py index e59744c..c15f9de 100644 --- a/backend/pipeline/jd/detail_ware_regen.py +++ b/backend/pipeline/jd/detail_ware_regen.py @@ -5,7 +5,7 @@ import csv import sys from pathlib import Path -from ..csv_schema import MERGED_FIELD_TO_CSV_HEADER +from ..csv.schema import MERGED_FIELD_TO_CSV_HEADER from ..ingest import FILE_DETAIL_WARE_CSV, FILE_MERGED_CSV, SKU_FIELD_MERGED diff --git a/backend/pipeline/jd/merged_regen.py b/backend/pipeline/jd/merged_regen.py index eed7520..0635354 100644 --- a/backend/pipeline/jd/merged_regen.py +++ b/backend/pipeline/jd/merged_regen.py @@ -1,11 +1,11 @@ -"""从 ``detail_ware_export.csv`` / ``detail/ware_*_response.json`` 补全并规范化 lean ``keyword_pipeline_merged.csv``(列序与 ``csv_schema.MERGED_CSV_COLUMNS`` 一致)。""" +"""从 ``detail_ware_export.csv`` / ``detail/ware_*_response.json`` 补全并规范化 lean ``keyword_pipeline_merged.csv``(列序与 ``pipeline.csv.schema.MERGED_CSV_COLUMNS`` 一致)。""" from __future__ import annotations import csv import sys from pathlib import Path -from ..csv_schema import ( +from ..csv.schema import ( MERGED_CSV_COLUMNS, MERGED_FIELD_TO_CSV_HEADER, MERGED_LEAN_DETAIL_INTERNAL_KEYS, diff --git a/backend/pipeline/jd/runner.py b/backend/pipeline/jd/runner.py index b0599f0..12f6b56 100644 --- a/backend/pipeline/jd/runner.py +++ b/backend/pipeline/jd/runner.py @@ -12,7 +12,7 @@ from typing import Any from django.conf import settings -from ..csv_schema import MERGED_FIELD_TO_CSV_HEADER +from ..csv.schema import MERGED_FIELD_TO_CSV_HEADER from ..models import PipelineJob diff --git a/backend/pipeline/management/commands/refresh_jd_merged_total_sales.py b/backend/pipeline/management/commands/refresh_jd_merged_total_sales.py index da27599..c7a127c 100644 --- a/backend/pipeline/management/commands/refresh_jd_merged_total_sales.py +++ b/backend/pipeline/management/commands/refresh_jd_merged_total_sales.py @@ -9,7 +9,7 @@ from __future__ import annotations from django.core.management.base import BaseCommand -from pipeline.csv_schema import ( +from pipeline.csv.schema import ( JD_SEARCH_CSV_HEADERS, MERGED_FIELD_TO_CSV_HEADER, merged_csv_effective_total_sales, diff --git a/backend/pipeline/management/commands/rewrite_pipeline_csv_headers.py b/backend/pipeline/management/commands/rewrite_pipeline_csv_headers.py index 25cca50..40a6fb6 100644 --- a/backend/pipeline/management/commands/rewrite_pipeline_csv_headers.py +++ b/backend/pipeline/management/commands/rewrite_pipeline_csv_headers.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -将已有 run 目录下 CSV 表头重写为 ``csv_schema`` 纯中文表头(仅重命名与列序,不修改业务逻辑)。 +将已有 run 目录下 CSV 表头重写为 ``pipeline.csv.schema`` 纯中文表头(仅重命名与列序,不修改业务逻辑)。 在 ``backend`` 目录:: @@ -16,7 +16,7 @@ from __future__ import annotations from django.conf import settings from django.core.management.base import BaseCommand, CommandError -from pipeline.csv_header_rewrite import rewrite_run_dir_csv_headers +from pipeline.csv.header_rewrite import rewrite_run_dir_csv_headers from pipeline.ingest import ( FILE_COMMENTS_FLAT_CSV, FILE_DETAIL_WARE_CSV, @@ -27,7 +27,7 @@ from pipeline.ingest import ( class Command(BaseCommand): - help = "将 pipeline run 目录内 CSV 表头规范为 csv_schema 中的中文表头。" + help = "将 pipeline run 目录内 CSV 表头规范为 pipeline.csv.schema 中的中文表头。" def add_arguments(self, parser) -> None: parser.add_argument( diff --git a/backend/pipeline/matrix_group_label.py b/backend/pipeline/matrix_group_label.py deleted file mode 100644 index 089653f..0000000 --- a/backend/pipeline/matrix_group_label.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""兼容入口:实现见 ``pipeline.jd.matrix_group_label``。""" -from pipeline.jd.matrix_group_label import * # noqa: F403, F401 diff --git a/backend/pipeline/row_serialize.py b/backend/pipeline/row_serialize.py index 8d42f19..3070276 100644 --- a/backend/pipeline/row_serialize.py +++ b/backend/pipeline/row_serialize.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Any -from .csv_schema import ( +from .csv.schema import ( COMMENT_CSV_COLUMNS, COMMENT_CSV_TO_FIELD, DETAIL_CSV_COLUMNS, diff --git a/backend/pipeline/tests/test_buyer_offer_export_csv.py b/backend/pipeline/tests/test_buyer_offer_export_csv.py index a9895d1..613a64d 100644 --- a/backend/pipeline/tests/test_buyer_offer_export_csv.py +++ b/backend/pipeline/tests/test_buyer_offer_export_csv.py @@ -7,7 +7,7 @@ from pathlib import Path from django.conf import settings from django.test import SimpleTestCase -from pipeline.csv_schema import strip_buyer_ranking_line_prefix +from pipeline.csv.schema import strip_buyer_ranking_line_prefix class BuyerOfferExportCsvTests(SimpleTestCase): diff --git a/backend/pipeline/tests/test_competitor_brief.py b/backend/pipeline/tests/test_competitor_brief.py index 79b416a..60aa257 100644 --- a/backend/pipeline/tests/test_competitor_brief.py +++ b/backend/pipeline/tests/test_competitor_brief.py @@ -7,7 +7,7 @@ from pathlib import Path from django.test import SimpleTestCase from pipeline.competitor_report import jd_report as jcr -from pipeline.csv_schema import infer_total_sales_from_sales_floor +from pipeline.csv.schema import infer_total_sales_from_sales_floor from pipeline.reporting.charts import _cn_volume_int diff --git a/backend/pipeline/views/product_views.py b/backend/pipeline/views/product_views.py index 6ba4a66..c6efa17 100644 --- a/backend/pipeline/views/product_views.py +++ b/backend/pipeline/views/product_views.py @@ -31,7 +31,7 @@ class JdProductListView(APIView): | Q(detail_brand__icontains=q) ) if kw: - from ..csv_schema import MERGED_FIELD_TO_CSV_HEADER + from ..csv.schema import MERGED_FIELD_TO_CSV_HEADER h_kw = MERGED_FIELD_TO_CSV_HEADER["pipeline_keyword"] qs = qs.filter(