feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1): - Database: Add user_modules table for fine-grained module permissions - Database: Add 4 user permissions (view/create/edit/delete) to role_permissions - Backend: UserService (780 lines) - CRUD with tenant isolation - Backend: UserController + UserRoutes (648 lines) - 13 API endpoints - Backend: Batch import users from Excel - Frontend: UserListPage (412 lines) - list/filter/search/pagination - Frontend: UserFormPage (341 lines) - create/edit with module config - Frontend: UserDetailPage (393 lines) - details/tenant/module management - Frontend: 3 modal components (592 lines) - import/assign/configure - API: GET/POST/PUT/DELETE /api/admin/users/* endpoints Architecture Upgrade - Module Permission System: - Backend: Add getUserModules() method in auth.service - Backend: Login API returns modules array in user object - Frontend: AuthContext adds hasModule() method - Frontend: Navigation filters modules based on user.modules - Frontend: RouteGuard checks requiredModule instead of requiredVersion - Frontend: Remove deprecated version-based permission system - UX: Only show accessible modules in navigation (clean UI) - UX: Smart redirect after login (avoid 403 for regular users) Fixes: - Fix UTF-8 encoding corruption in ~100 docs files - Fix pageSize type conversion in userService (String to Number) - Fix authUser undefined error in TopNavigation - Fix login redirect logic with role-based access check - Update Git commit guidelines v1.2 with UTF-8 safety rules Database Changes: - CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled) - ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code) - INSERT 4 permissions + role assignments - UPDATE PUBLIC tenant with 8 module subscriptions Technical: - Backend: 5 new files (~2400 lines) - Frontend: 10 new files (~2500 lines) - Docs: 1 development record + 2 status updates + 1 guideline update - Total: ~4900 lines of code Status: User management 100% complete, module permission system operational
This commit is contained in:
@@ -1,102 +1,114 @@
|
||||
# **PRD<EFBFBD>啜ool C \- 遘醍<EFBFBD>疲焚謐ョ郛冶セ大<EFBFBD>?(The Research Editor)**
|
||||
# **PRD:Tool C \- 科研数据编辑器 (The Research Editor)**
|
||||
|
||||
| 譁<EFBFBD>。」迚域悽 | V6.0 (AI Code Interpreter 蠅槫シコ迚? |
|
||||
| 文档版本 | V6.0 (AI Code Interpreter 增强版) |
|
||||
| :---- | :---- |
|
||||
| **莠ァ蜩∝ス「諤?* | Web 遶ッ蜿梧<E89CBF>ク郛冶セ大勣 (GUI 蜿ッ隗<EFBDAF>喧謫堺ス?\+ LUI 閾ェ辟カ隸ュ險莠、莠<EFBDA4>) |
|
||||
| **譬ク蠢<EFBFBD>サキ蛟?* | 蟆<>廢xcel 逧<><E980A7>逕ィ諤ァ窶昜ク寂弃ython 逧<>シコ螟ァ閭ス蜉帚晉サ灘粋縲ょ現逕滓里蜿ッ莉・騾夊ソ<E5A48A>シ<EFBFBD>譬<EFBFBD>せ蜃サ螳梧<E89EB3>蠕ョ謫搾シ御ケ溷庄莉・騾夊ソ<E5A48A><EFBDBF>辟カ隸ュ險謖<C280>硯 AI 郛門<E9839B>莉」遐∝ョ梧<EFBDAE>螟肴揩逧<E68FA9>ク<EFBFBD>エ嶺ササ蜉。<E89C89>亥ヲる柄螳ス霓ャ謐「縲∝、夐㍾謠定。・<EFBDA1>峨?|
|
||||
| **謚譛ッ蠎募コ?* | Node.js BFF \+ Python Server-side Sandbox \+ DeepSeek-V3 |
|
||||
| **产品形态** | Web 端双核编辑器 (GUI 可视化操作 \+ LUI 自然语言交互) |
|
||||
| **核心价值** | 将“Excel 的易用性”与“Python 的强大能力”结合。医生既可以通过鼠标点击完成微操,也可以通过自然语言指挥 AI 编写代码完成复杂的清洗任务(如长宽转换、多重插补)。 |
|
||||
| **技术底座** | Node.js BFF \+ Python Server-side Sandbox \+ DeepSeek-V3 |
|
||||
|
||||
## **荳縲?莠ァ蜩∵<E89CA9>ク蠢<EFBDB8>炊蠢オ (Core Philosophy)**
|
||||
## **一、 产品核心理念 (Core Philosophy)**
|
||||
|
||||
### **1.1 双核驱动 (Dual-Core Interaction)**
|
||||
|
||||
* **蟾ヲ閼<EFBFBD> (GUI):** 謠蝉セ帷アサ莨シ Excel 逧<>ス第<EFBDBD>シ蜥悟キ・蜈キ譬擾シ碁ょ粋窶懃峩隗牙シ上∝次蟄仙喧窶晉噪謫堺ス懶シ亥ヲよ焔蜉ィ菫ョ謾ケ荳荳ェ蛟シ縲∵賜蠎上∫ュ幃会シ峨?
|
||||
* **蜿ウ閼<EFBFBD> (AI Copilot):** 謠蝉セ帛ッケ隸晏シ丈サ」遐∬ァ」驥雁勣<EFBFBD>碁ょ粋窶憺サ霎第ァ縲∵音驥丞喧窶晉噪謫堺ス懶シ亥ヲや懈滑蟷エ鮴<EFBFBD><EFBFBD>?0蟯∝<E89FAF>邂ア窶昴≫懷唖髯、謇譛臥ゥコ陦娯昴≫懆ョ。邂礼函蟄俶慮髣エ窶晢シ峨?
|
||||
* **左脑 (GUI):** 提供类似 Excel 的网格和工具栏,适合“直觉式、原子化”的操作(如手动修改一个值、排序、筛选)。
|
||||
* **右脑 (AI Copilot):** 提供对话式代码解释器,适合“逻辑性、批量化”的操作(如“把年龄按60岁分箱”、“删除所有空行”、“计算生存时间”)。
|
||||
|
||||
### **1.2 可控黑盒 (Controllable Blackbox)**
|
||||
|
||||
AI 荳咲峩謗・菫ョ謾ケ謨ー謐ョ<EFBFBD>瑚梧弍**逕滓<E98095> Python 莉」遐<EFBDA3>**縲らウサ扈溷惠謇ァ陦悟燕螻慕、コ\*\*窶憺「<E686BA>桃菴懷今迚<E4BB8A>拿*\*<2A>檎罰逕ィ謌キ遑ョ隶、謇ァ陦鯉シ檎。ョ菫晉ァ醍<EFBDA7>疲焚謐ョ逧<EFBDAE>ク・隹ィ諤ァ縲?
|
||||
## **莠後?譬ク蠢<EFBDB8>ク壼苅豬∫ィ<E288AB> (User Flow)**
|
||||
AI 不直接修改数据,而是**生成 Python 代码**。系统在执行前展示\*\*“预操作卡片”\*\*,由用户确认执行,确保科研数据的严谨性。
|
||||
|
||||
謨ー謐ョ蟇シ蜈・ \-\> 蜿梧ィ。蠑乗ク<E4B997>エ?(轤ケ蜃サ蟾・蜈キ譬?OR 蟇ケ隸<EFBDB9> AI) \-\> 莉」遐<EFBDA3>/謫堺ス懈鴬陦<E9B4AC> \-\> 螳樊慮鬚<E685AE>ァ域峩譁ー \-\> 迚域悽蠢ォ辣ァ \-\> 蟇シ蜃コ扈捺棡
|
||||
## **二、 核心业务流程 (User Flow)**
|
||||
|
||||
## **荳峨?蜉溯<E89C89>讓。蝮苓ッヲ隗」 (Functional Requirements)**
|
||||
数据导入 \-\> 双模式清洗 (点击工具栏 OR 对话 AI) \-\> 代码/操作执行 \-\> 实时预览更新 \-\> 版本快照 \-\> 导出结果
|
||||
|
||||
## **三、 功能模块详解 (Functional Requirements)**
|
||||
|
||||
### **1\. 界面布局 (The Workspace)**
|
||||
|
||||
* **P0:** **分栏布局 (Split View):**
|
||||
* **蟾ヲ萓ァ (70%):** 雜<EFBFBD>コァ鄂第<EFBFBD>シ (The Grid)<EFBFBD>悟ア慕、コ謨ー謐ョ鬚<EFBFBD>ァ医?
|
||||
* **蜿ウ萓ァ (30%):** 譎コ閭ス萓ァ霎ケ譬?(Smart Sidebar)<EFBFBD>悟桁蜷?**\[扈溯ョ。讎りァ<E3828A>]** 蜥?**\[AI 蜉ゥ謇欺]** 荳、荳ェ Tab縲?
|
||||
* **P0:** **蜈ィ螻迥カ諤∵欠遉?**
|
||||
* 蠖?AI 豁」蝨ィ諤晁<EFBFBD><EFBFBD>蜷守ォッ豁」蝨ィ隶。邂玲慮<EFBFBD>悟キヲ萓ァ鄂第<EFBFBD>シ譏セ遉コ **窶廣I 螟<>炊荳?..窶?* 驕ョ鄂ゥ<E98482>悟ケカ髞∝ョ夂シ冶セ托シ碁亟豁「蜿悟<E89CBF>蜀イ遯√?
|
||||
### **2\. 鬘カ驛ィ謇∝ケウ蟾・蜈キ譬?(Flat Toolbar) 窶披?GUI 譬ク蠢<EFBDB8>**
|
||||
* **左侧 (70%):** 超级网格 (The Grid),展示数据预览。
|
||||
* **右侧 (30%):** 智能侧边栏 (Smart Sidebar),包含 **\[统计概览\]** 和 **\[AI 助手\]** 两个 Tab。
|
||||
* **P0:** **全局状态指示:**
|
||||
* 当 AI 正在思考或后端正在计算时,左侧网格显示 **“AI 处理中...”** 遮罩,并锁定编辑,防止双写冲突。
|
||||
|
||||
*菫晉蕗鬮倬「代∵<C280><E288B5>㊥蛹也噪謫堺ス懷<EFBDBD>蜿」<E89CBF>御ス應クコ AI 逧<>。・蜈<EFBDA5>?
|
||||
### **2\. 顶部扁平工具栏 (Flat Toolbar) —— GUI 核心**
|
||||
|
||||
*保留高频、标准化的操作入口,作为 AI 的补充。*
|
||||
|
||||
* **P0: 变量加工:**
|
||||
* **逕滓<EFBFBD>譁ー蜿倬<EFBFBD>?** 蠑ケ遯怜<E981AF>蠑乗桷蟒コ蝎ィ縲?
|
||||
* **隶。邂玲慮髣エ蟾?** 蜀<>スョ蛹サ蟄ヲ蟶ク謨ー (蟷?365.25螟?縲?
|
||||
* **逕滓<EFBFBD>蜩大序驥?** 蝗槫ス貞<EFBDBD>譫蝉ク鍋畑縲?
|
||||
* **讓ェ郤オ陦ィ霓ャ謐?(Pivot):** \* *莠、莠貞合郤ァ:* 轤ケ蜃サ蜷惹ク榊<EFBDB8>蜿ェ譏ッ郤ッ蜑咲ォッ隶。邂暦シ瑚梧弍隹<E5BC8D>畑蜷守ォッ Python 騾サ霎托シ梧髪謖∝、<E2889D>炊譖エ螟肴揩逧<E68FA9>スャ謐「縲?
|
||||
* **生成新变量:** 弹窗公式构建器。
|
||||
* **计算时间差:** 内置医学常数 (年=365.25天)。
|
||||
* **生成哑变量:** 回归分析专用。
|
||||
* **横纵表转换 (Pivot):** \* *交互升级:* 点击后不再只是纯前端计算,而是调用后端 Python 逻辑,支持处理更复杂的转换。
|
||||
* **P0: 质量治理:**
|
||||
* **譟・謇セ驥榊、榊?** 謖?ID 謌門<EFBFBD>蟄玲ョオ譟・驥阪?
|
||||
* **螟夐㍾謠定。・ (MICE):** 蜈ィ螻蜈・蜿」<EFBFBD>瑚ー<EFBFBD>畑蜷守ォ?sklearn 謌?fancyimpute 蠎薙?
|
||||
* **P0: 譬キ譛ャ遲幃?** 譫<>サコ蜈・謗呈<E8AC97><E59188>㊥縲?
|
||||
### **3\. AI Copilot 譎コ閭ス蜉ゥ謇<EFBDA9> (The Brain) 窶披?V6 譬ク蠢<EFBDB8>合郤ァ**
|
||||
* **查找重复值:** 按 ID 或全字段查重。
|
||||
* **多重插补 (MICE):** 全局入口,调用后端 sklearn 或 fancyimpute 库。
|
||||
* **P0: 样本筛选:** 构建入排标准。
|
||||
|
||||
*菴堺コ主承萓ァ萓ァ霎ケ譬冗噪 \[AI 蜉ゥ謇欺] Tab縲?
|
||||
### **3\. AI Copilot 智能助手 (The Brain) —— V6 核心升级**
|
||||
|
||||
*位于右侧侧边栏的 \[AI 助手\] Tab。*
|
||||
|
||||
#### **3.1 自然语言指令解析**
|
||||
|
||||
* **P0:** **諢丞崟隸<EFBFBD>悪:** 謾ッ謖∵ィ。邉頑欠莉、<EFBFBD>悟ヲや懈エ嶺ク荳区焚謐ョ窶昴≫懈滑逕キ蜿俶<EFBFBD>?窶昴?
|
||||
* **P0:** **荳贋ク区枚諢溽<EFBFBD>?** AI 閭ス螟溯ッサ蜿門ス灘燕逧<E78795><E980A7>蜷?(Metadata) 蜥悟燕 5 陦梧焚謐ョ遉コ萓具シ檎炊隗」謨ー謐ョ蜷ォ荵峨?
|
||||
#### **3.2 莉」遐∬ァ」驥雁勣讓。蠑?(Code Interpreter)**
|
||||
* **P0:** **意图识别:** 支持模糊指令,如“洗一下数据”、“把男变成1”。
|
||||
* **P0:** **上下文感知:** AI 能够读取当前的列名 (Metadata) 和前 5 行数据示例,理解数据含义。
|
||||
|
||||
* **P0:** **莉」遐∫函謌<E587BD>:** AI 髓亥ッケ逕ィ謌キ髴豎ゑシ檎函謌仙庄謇ァ陦檎噪 **Python (Pandas)** 莉」遐∝摎縲?
|
||||
* **P0:** **鬚<>桃菴懷今迚?(Action Card):**
|
||||
* AI 荳咲峩謗・謇ァ陦御サ」遐√?
|
||||
* 逡碁擇螻慕、コ荳荳ェ蜊。迚<EFBFBD>シ壽桃菴懃アサ蝙<EFBFBD>: 謨ー謐ョ蛻<EFBDAE>ョア | 逶ョ譬<EFBDAE><E8ADAC>? 蟷エ鮴<EFBDB4> | 莉」遐<EFBDA3>「<EFBFBD>ァ医?
|
||||
* 謖蛾聴<EFBFBD>?*\[霑占。御サ」遐―]** | **\[蜿匁カ<E58C81>]**縲?
|
||||
#### **3.2 代码解释器模式 (Code Interpreter)**
|
||||
|
||||
* **P0:** **代码生成:** AI 针对用户需求,生成可执行的 **Python (Pandas)** 代码块。
|
||||
* **P0:** **预操作卡片 (Action Card):**
|
||||
* AI 不直接执行代码。
|
||||
* 界面展示一个卡片:操作类型: 数据分箱 | 目标列: 年龄 | 代码预览。
|
||||
* 按钮:**\[运行代码\]** | **\[取消\]**。
|
||||
* **P0:** **执行反馈:**
|
||||
* 謇ァ陦梧<EFBFBD>蜉滂シ壽仞遉?笨<>シ悟キヲ萓ァ陦ィ譬シ閾ェ蜉ィ蛻キ譁ー縲?
|
||||
* 謇ァ陦悟、ア雍・<EFBFBD>哂I 閾ェ蜉ィ蛻<EFBDA8>梵 Error Log<6F>悟ー晁ッ戊<EFBDAF>謌台ソョ豁」莉」遐∝ケカ蟒コ隶ョ驥崎ッ輔?
|
||||
* 执行成功:显示 ✅,左侧表格自动刷新。
|
||||
* 执行失败:AI 自动分析 Error Log,尝试自我修正代码并建议重试。
|
||||
|
||||
#### **3.3 典型 AI 场景支持**
|
||||
|
||||
* **鬮倡コァ貂<EFBFBD>エ<EFBFBD>:** 窶懈滑謇譛牙<E8AD9B>逧<EFBFBD>シょクク蛟シ<E89B9F><EFBDBC>>3蛟肴<E89B9F><E882B4>㊥蟾ョ<E89FBE>画崛謐「荳コ郛コ螟ア蛟シ窶昴?
|
||||
* **螟肴揩謠仙叙:** 窶應サ寂倩ッ頑妙窶吝<E7AAB6>荳ュ謠仙叙蜃コ逕ア窶?窶吝<E7AAB6>髫皮噪隨ャ莠碁Κ蛻<CE9A>シ檎函謌先眠蛻冷昴?
|
||||
* **謇ケ驥丞、<EFBFBD>炊:** 窶懷唖髯、謇譛臥シコ螟ア邇<EFBDB1>カ<EFBFBD>ソ<EFBFBD> 50% 逧<><E980A7>窶昴?
|
||||
* **高级清洗:** “把所有列的异常值(\>3倍标准差)替换为缺失值”。
|
||||
* **复杂提取:** “从‘诊断’列中提取出由‘/’分隔的第二部分,生成新列”。
|
||||
* **批量处理:** “删除所有缺失率超过 50% 的列”。
|
||||
|
||||
### **4\. 智能统计面板 (Insight Panel)**
|
||||
|
||||
*菴堺コ主承萓ァ萓ァ霎ケ譬冗噪 \[扈溯ョ。讎りァ<E3828A>] Tab縲?
|
||||
*位于右侧侧边栏的 \[统计概览\] Tab。*
|
||||
|
||||
* **P0:** **蛻苓#蜉?** 轤ケ蜃サ蟾ヲ萓ァ鄂第<EFBFBD>シ譟蝉ク蛻暦シ悟承萓ァ閾ェ蜉ィ譏セ遉コ隸・蛻礼噪蛻<EFBFBD>ク<EFBFBD>崟<EFBFBD>育峩譁ケ蝗セ/鬚第ャ。蝗セ<E89D97>峨?
|
||||
* **P0:** **蠢ォ謐キ謫堺ス<EFBFBD>:** 蝗セ陦ィ荳区婿逶エ謗・謠蝉セ帚懷。ォ陦・窶昴≫懷<C280>邂ア窶昴≫懈丐蟆<E4B890>晉ュ牙ソォ謐キ謖蛾聴縲?
|
||||
### **5\. 蟇シ蜃コ荳取オ∬ス?(Export)**
|
||||
* **P0:** **列联动:** 点击左侧网格某一列,右侧自动显示该列的分布图(直方图/频次图)。
|
||||
* **P0:** **快捷操作:** 图表下方直接提供“填补”、“分箱”、“映射”等快捷按钮。
|
||||
|
||||
* **P0:** **扈捺棡蟇シ蜃コ:** 謾ッ謖<EFBDAF> Excel (.xlsx) 蜥?SPSS (.sav) 譬シ蠑上?
|
||||
* **P0:** **謫堺ス懷ョ。隶。:** 蟇シ蜃コ逧<EFBDBA>枚莉カ荳ュ<E88DB3>碁刋蟶ヲ荳莉?**"貂<>エ玲律蠢<E5BE8B> (Cleaning Log)"**<2A>瑚ョー蠖穂コ<E7A982>園譛臥噪 AI 莉」遐∝柱謇句勘謫堺ス懈ュ・鬪、<E9ACAA>育畑莠守ァ醍<EFBDA7>疲コッ貅撰シ峨?
|
||||
## **蝗帙?謨ー謐ョ荳取ァ閭ス遲也払 (Data Strategy)**
|
||||
### **5\. 导出与流转 (Export)**
|
||||
|
||||
* **P0:** **结果导出:** 支持 Excel (.xlsx) 和 SPSS (.sav) 格式。
|
||||
* **P0:** **操作审计:** 导出的文件中,附带一份 **"清洗日志 (Cleaning Log)"**,记录了所有的 AI 代码和手动操作步骤(用于科研溯源)。
|
||||
|
||||
## **四、 数据与性能策略 (Data Strategy)**
|
||||
|
||||
### **4.1 性能准入 (Guardrails)**
|
||||
|
||||
* **譁<EFBFBD>サカ螟ァ蟆城剞蛻カ:** 蜊穂クェ譁<EFBDAA>サカ **\< 20MB**縲?
|
||||
* **陦梧焚髯仙宛:** 蟒コ隶ョ **\< 50,000 陦?* 莉・菫晁ッ∝燕遶ッ貂イ譟捺オ∫腐蠎ヲ縲?
|
||||
* *遲也払:* 蜷守ォッ Python 蜿ッ莉・螟<EFBDA5>炊逋セ荳<EFBDBE>。鯉シ御ス<E5BEA1>燕遶?AG Grid 莉<EFBFBD>刈霓ス蜑<EFBFBD> 100-1000 陦御ス應クコ鬚<EFBFBD>ァ茨シ<EFBFBD>review Mode<64>会シ悟ッシ蜃コ譌カ謇咲函謌仙<E8AC8C>驥乗枚莉カ縲?
|
||||
### **4.2 螳牙<E89EB3>荳朱嚼遘?*
|
||||
* **文件大小限制:** 单个文件 **\< 20MB**。
|
||||
* **行数限制:** 建议 **\< 50,000 行** 以保证前端渲染流畅度。
|
||||
* *策略:* 后端 Python 可以处理百万行,但前端 AG Grid 仅加载前 100-1000 行作为预览(Preview Mode),导出时才生成全量文件。
|
||||
|
||||
* **P0:** **豐咏ョア髫皮ヲサ:** AI 逕滓<E98095>逧?Python 莉」遐∝ソ<E2889D>。サ蝨ィ譛榊苅遶ッ逧<EFBDAF>ョ牙<EFBDAE>豐咏ョア<EFBDAE><EFBDB1>ocker/SAE<41>我クュ霑占。鯉シ檎ヲ∵ュ「隶ソ髣ョ螟也ス大柱邉サ扈滓枚莉カ縲?
|
||||
* **P0:** **謨ー謐ョ閼ア謨<EFBDB1>:** 遑ョ菫晁セ灘<EFBDBE>郛冶セ大勣逧<E58BA3>焚謐ョ蟾イ蝨ィ蜑咲スョ邇ッ闃ゑシ亥キ・蜈?B<>牙ョ梧<EFBDAE>莠<EFBFBD> PII 閼ア謨上?
|
||||
## **莠斐?蝓狗せ荳守サ溯ョ?*
|
||||
### **4.2 安全与隐私**
|
||||
|
||||
* **AI 驥<>コウ邇?** 螻慕、コ Action Card 蜷趣シ檎畑謌キ轤ケ蜃サ窶懆ソ占。娯晉噪豈比セ九?
|
||||
* **莉」遐∵冠髞咏<EFBFBD>?** AI 逕滓<E98095>逧<EFBFBD>サ」遐∝惠蜷守ォッ謇ァ陦悟、ア雍・逧<EFBDA5>ッ比セ九?
|
||||
* **蟶ク逕ィ謖<EFBDA8>サ、 Top 10:** 扈溯ョ。蛹サ逕滓怙蟶ク蟇ケ AI 隸エ逧<EFBDB4>ッ昴?
|
||||
## **蜈ュ縲?髯<>ス包シ哂I 謖<>サ、髮<EFBDA4>、コ萓?(Few-Shot Examples)**
|
||||
* **P0:** **沙箱隔离:** AI 生成的 Python 代码必须在服务端的安全沙箱(Docker/SAE)中运行,禁止访问外网和系统文件。
|
||||
* **P0:** **数据脱敏:** 确保输入编辑器的数据已在前置环节(工具 B)完成了 PII 脱敏。
|
||||
|
||||
## **五、 埋点与统计**
|
||||
|
||||
* **AI 采纳率:** 展示 Action Card 后,用户点击“运行”的比例。
|
||||
* **代码报错率:** AI 生成的代码在后端执行失败的比例。
|
||||
* **常用指令 Top 10:** 统计医生最常对 AI 说的话。
|
||||
|
||||
## **六、 附录:AI 指令集示例 (Few-Shot Examples)**
|
||||
|
||||
| 用户指令 | AI 动作 (Action) | 生成代码逻辑 (Python Pandas) |
|
||||
| :---- | :---- | :---- |
|
||||
| "謚頑ァ蛻ォ霓ャ荳コ謨ー蟄<EFBFBD>" | Recode | df\['sex'\] \= df\['sex'\].map({'逕?:1, '螂?:0}) |
|
||||
| "蟷エ鮴<EFBFBD><EFBFBD>?0蛻<30>ク、扈? | Binning | df\['age\_group'\] \= pd.cut(df\['age'\], bins=\[0,60,150\], labels=\['0','1'\]) |
|
||||
| "把性别转为数字" | Recode | df\['sex'\] \= df\['sex'\].map({'男':1, '女':0}) |
|
||||
| "年龄按60分两组" | Binning | df\['age\_group'\] \= pd.cut(df\['age'\], bins=\[0,60,150\], labels=\['0','1'\]) |
|
||||
| "删除没有ID的行" | Filter | df \= df.dropna(subset=\['patient\_id'\]) |
|
||||
| "计算BMI" | Formula | df\['bmi'\] \= df\['weight'\] / (df\['height'\]/100)\*\*2 |
|
||||
| "謚頑ッ丈クェ莠コ逧<EFBFBD>ク陦悟序謌仙、夊。? | Pivot/Melt | df \= df.melt(id\_vars=\['id'\], ...) |
|
||||
| "把每个人的一行变成多行" | Pivot/Melt | df \= df.melt(id\_vars=\['id'\], ...) |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user