高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践_第1页
高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践_第2页
高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践_第3页
高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践_第4页
高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高中信息技术必修1《数据的分析》第二课时教学设计:基于Python的探索性数据分析实践依据《普通高中信息技术课程标准(2017年版2020年修订)》模块“数据与信息”核心要求,结合粤教版(2019)必修1教材第5章“数据分析与可视化”第3节“数据的分析”教学安排,本设计聚焦第二课时。教材第一课时已完成统计基础概念、Excel透视表操作及基础图表绘制,第二课时需跨越工具操作层面,引导学生以计算思维解构数据分析全流程,掌握Python生态下Pandas、Matplotlib/Seaborn库核心功能,完成从脏数据清洗、特征工程、探索性可视化到初步建模评估的闭环实践。设计遵循“真实情境驱动、核心素养导向、渐进式脚手架搭建”原则,旨在培养学生数据意识、计算思维、数字化学习与创新及信息社会责任四大核心素养。一、教学素材深度解析本节内容在课标“数据分析与可视化”学习主题中占据枢纽地位。课标明确要求学生“理解数据分析的一般过程”“掌握常用数据分析方法与工具”“能利用编程工具对数据进行清洗、转换、分析与可视化”。教材第5.3节虽给出了“获取数据—清洗数据—分析数据—表达数据”四步法框架,但案例多基于Excel界面操作,掩盖了数据类型转换、缺失值填充策略选择、异常值检测逻辑、可视化编码映射机制等计算本质。粤教版教材配套案例“某校学生体质健康数据分析”数据量级小、结构单一、已预处理完毕,难以支撑高中阶段对“探索性数据分析(EDA)”核心思想的深度体验。因此,教学设计必须重构素材:引入真实、高维、含噪的开放数据集(如UCI机器学习仓库“学生成绩预测”数据集或本地化“校园能耗监测”数据集),迫使学生直面列名非规范、数值型字段存为对象类型、关键指标缺失率超15%、离群点干扰建模等真实挑战,倒逼工具升级与思维跃迁。二、学情精准画像与差异化预判学生已修完必修1前四章,具备Python基础语法(变量、流程控制、函数、列表字典)、JupyterNotebook交互式开发环境使用经验,理解CSV/Excel文件读写,接触过Matplotlib基础绘图。但普遍存在三类认知断层:一是“语法会用、库不懂底层”,对Pandas索引对齐机制、向量化运算广播原理、绘图库面向对象API与MATLAB风格接口差异缺乏心智模型;二是“统计知皮毛、业务不落地”,知均值中位数定义,不知何时用中位数填充缺失值、何时用IQR法而非3σ原则剔除异常值、箱线图须线长度如何映射四分位距;三是“流程碎片化、闭环不成型”,单步操作能跟上,串联全流程时易陷入“清洗完不知分析什么、画完图不知结论怎么写”困境。针对差异化,设定分层目标:基础组完成指标代码填空与图表解读;提高组自主设计特征工程方案并对比模型基线;拔尖组尝试引入Sweetviz/Autoviz自动化EDA工具对比手动分析效率差异。三、核心素养导向的教学目标矩阵1.信息觉悟:能辨析原始数据中隐含的采样偏差、测量误差与隐私风险,判断数据集是否支撑特定分析目的,建立“数据非中立、分析有视角”批判视角。2.计算思维:能将业务问题分解为数据结构转换(宽表变长表、类别编码、时间序列重采样)、算法流程构建(清洗管道封装、可视化模板复用)、迭代优化模型(基线建立—特征筛选—参数调优)三层计算抽象,用代码实现可复现分析流水线。3.数字化学习与创新:能综合运用文档查阅(官方API文档、StackOverflow高赞答案)、版本控制(Git提交节点对应分析里程碑)、协作平台(GitHubCodespaces/Gitee实时共编)完成小组项目,形成个人知识库与团队资产库双重积累。4.信息社会责任:明确数据脱敏处理规范(学号哈希化、成绩分桶化),遵守校园数据使用合规边界,在分析报告中诚实标注数据局限性与推论置信度,拒绝“Phacking”与“数据挖掘陷阱”。四、教学重难点与破解路径重点:Pandas数据清洗核心技能栈(类型推断与强制转换、缺失值机制识别与填充策略决策树、异常值检测可视化与业务结合处理、GroupBy聚合与透视表多维透视)、探索性可视化语法体系(Seaborn分面网格映射分布、关系、分类三大图族、配色方案与标签工程化设置)、分析报告结构化写作(背景方法发现局限建议)。难点:学生从“调用API参数”向“理解参数背后统计学假设”跨越。例如:`df.fillna(method='ffill')`看似简单,实则假设数据具有时序自相关性;`sns.regplot`绘制回归线默认Pearson相关,要求变量呈线性关系且服从双变量正态分布。破解路径设计“黑箱透明化”专题环节:通过手动实现简易版填充算法、绘制残差图对比线性假设、引导阅读源码片段,建立“代码—数学—业务”三角映射心智模型。五、教学策略与环境配置采用“项目式学习(PBL)”为主线,“任务驱动+脚手架支撑+同伴互评”融合策略。项目主题定为“校园能耗异常模式挖掘与节能建议生成”,数据源为校园智慧电表采集的半年小时级数据(约50万行×12列,含楼宇编号、时间戳、有功功率、无功功率、电压、电流、功率因数、温度、湿度、人流量估值、是否节假日、异常标签)。环境统一为学校云桌面预装Anaconda环境(Python3.10,Pandas2.1,Seaborn0.13,Plotly5.17,JupyterLab4.0),配置Git预提交钩子强制代码格式化(Black)与笔记本清理输出。提供骨架笔记本:预置数据加载、基础检查、函数签名、可视化模板、报告Markdown单元格,学生聚焦核心逻辑填充。引入“代码审查清单”作为过程性评价工具,覆盖命名规范、注释密度、异常处理、性能注记四维度。六、教学过程详细设计(六课时,每课时45分钟)【第一课时:沉浸情境·定义问题·初探数据】教师播放校园能耗监控大屏实时流视频(30秒),抛出驱动性问题:“后勤处反馈近期综合楼电费激增,物业怀疑存在设备故障或人为浪费,但人工巡检成本高、滞后性强。若你是数据分析师,如何用半年电表数据定位异常、量化损失、给出整改建议?”学生分组讨论3分钟,产出“问题拆解树”:目标变量何者(有功电量/峰谷平电费/功率因数罚款)?分析粒度何者(楼宇/楼层/回路/小时/日/月)?异常定义何者(同比环比突变/同类楼宇横向离群/物理约束违背如功率因数超1)?所需外部数据何者(气象/课表/活动日历)?教师汇总记录于共享在线白板,引导提炼核心分析任务:1.单楼宇日用电曲线画像与偏离检测;2.多维度交叉诊断(天气人流用电三元关系);3.异常时段根因溯源与节能潜力测算。随后引导打开骨架笔记本执行“初探数据”代码块。重点讲解`()`内存占用与非空计数解读、`df.describe(include='all')`分数位数统计含义、`df.sample(10).T`转置查看样本全貌。设置“数据侦探”微任务:在5分钟内利用`df.isnull().sum()/len(df)`、`df.nunique()`、`df['楼宇编号'].value_counts()`发现三个关键问题:①“功率因数”列存为object类型,混入字符串“错误”;②“异常标签”列缺失率98%,疑为人工事后打标未完成;③“温度”“湿度”存在物理不可能值(999占位符)。学生在笔记本Markdown单元格记录发现,教师巡回提问:“为何`describe()`未显示‘功率因数’统计量?如何一键转数值并标记转换失败行?”引出`pd.to_numeric(errors='coerce')`与布尔索引定位脏数据。【第二课时:深度清洗·类型重塑·缺失决策】开篇展示“脏数据危害链”:类型错误导致向量化运算报错回退Python循环降速百倍、缺失值填充偏差扭曲相关分析方向、占位符未清洗污染聚类中心。演示清洗管道构建模式:定义`defclean_pipeline(raw_df):`函数,内部串联步骤并返回清洗报告字典。学生分组完成四个子任务:任务一:类型标准化。针对“功率因数”,编写`df['功率因数']=pd.to_numeric(df['功率因数'],errors='coerce')`,统计转换产生的NaN占比,结合业务知识(正常范围01)决定是否剔除或填充。任务二:占位符替换。识别999为传感器故障码,对温湿度列执行`replace(999,np.nan)`,对比替换前后直方图形变。任务三:缺失机制研判。引入Little'sMCAR检验概念(简化版:分组比较缺失与非缺失组目标变量均值差异),学生编写代码验证“温度缺失是否随机”。若非随机(MNAR),引入指示变量`df['温度_缺失标记']=df['温度'].isna().astype(int)`再填充。任务四:填充策略对比实验。同一缺失列分别用前向填充、线性插值、KNN填充(`sklearn.impute.KNNImputer`)、随机森林填充,计算填充值与真实值(人工抽取的完整子集)RMSE,在笔记本绘制对比条形图,撰写选择理由。教师组织“清洗决策辩论赛”:A组主张“直接删除含缺失行,保证数据纯净”,B组主张“多重插补保留样本量”,C组主张“领域知识填充(如夜间温度取日均值)”。教师引导从“数据量损耗率”“分布偏移度”“下游建模稳健性”三维评判,达成共识:关键数值列采用迭代填充,非关键类别列填充众数并增设缺失标记列,所有操作记录于清洗日志DataFrame供审计追溯。【第三课时:特征工程·多维透视·可视化编码】讲解特征工程“法则”:让数据结构适配分析问题,而非迁就原始结构。演示时间特征展开:`df['小时']=df.index.hour`、`df['是否周末']=df.index.weekday>=5`、`df['季节']=df.index.month.map({12:1,1:1,2:1,3:2...})`。讲解周期性编码陷阱:小时23与0相邻但数值差23,引入正弦余弦编码`df['小时_sin']=np.sin(2np.pidf['小时']/24)`、`df['小时_cos']=np.cos(...)`。引导构建聚合特征:按楼宇+日期重采样`df.resample('D').agg({'有功功率':['sum','max','min','std'],'功率因数':'mean'})`,处理多级列索引扁平化。可视化环节对标“可视化编码语法”:数据→几何对象→美学映射→统计变换→坐标系→分面。学生完成“可视化工具箱”搭建任务:封装`plot_daily_profile(df,building_id)`函数,输出单楼宇日负荷曲线带置信带(`sns.lineplot(estimator='mean',errorbar=('ci',95))`);封装`plot_correlation_heatmap(df,cols)`函数,自动计算Spearman相关(非线性鲁棒)、掩盖上三角、标注显著性星号;封装`plot_anomaly_scatter(df,x_col,y_col,hue_col)`函数,用PlotlyExpress生成交互式散点图,悬停显示时间戳与异常标签,支持框选缩放导出异常样本索引。重点讲解配色无障碍设计:色盲友好调色板`colorblind`、语义映射(红增绿减/蓝冷红热)、避免彩虹色谱误导数量感知。微项目实战:“综合楼8月用电画像”。学生调用工具箱函数,产出四张核心图表:1.典型工作日/周末/节假日三类日负荷曲线叠加对比(揭示基载与峰谷特征);2.温度用电散点图分工作日/非工作日着色、拟合三次多项式曲线(捕捉空调负荷非线性阈值);3.功率因数时序图标注低于0.9罚款阈值段(量化无功损失);4.异常标签稀疏分布图(揭示标签不可靠性)。每图要求配备“洞察卡片”:一句话结论+支撑数据证据+业务动作建议。【第四课时:异常挖掘·无监督建模·根因假设】引入孤立森林作为无监督异常检测基线,讲解原理:随机切分特征空间,异常样本路径长度显著更短。代码演示:特征标准化(`RobustScaler`抗异常)、训练`IsolationForest(contamination=0.01,random_state=42)`、输出异常分数`anomaly_score`与预测标签`is_anomaly`。学生任务:将检出异常与原有“异常标签”列交叉表对比,计算召回率/精确率(视人工标签为不完全地面真值),分析漏报与误报样本特征。进阶挑战:异常解释性。引入SHAP值概念(简化版:排列重要性),计算异常样本各特征对异常分数贡献度。学生编写循环,对Top20高分异常样本生成瀑布图,识别主导异常特征(如:某日功率因数骤降、电压不平衡度超标、温度正常但用电激增)。分组头脑风暴根因假设:假设A“电容补偿柜故障导致功率因数低”,假设B“实验室大功率设备启动未纳入基载”,假设C“电表计量故障”。设计验证方案:查阅维修工单系统、对比同变压器下其他回路、联系物业核对设备台账。教师强调:数据分析发现“异常”,领域知识解释“原因”,二者缺一不可。【第五课时:量化评估·报告撰写·同伴互评】引导完成“节能潜力测算”量化模型:基线模型采用同比同期均值法(去年同周同星期几均值),实际用电与基线差值即节电/超耗量。进阶引入线性回归基线(特征:温度、湿度、是否工作日、人流量),用`statsmodels.OLS`输出系数p值、R方、DurbinWatson统计量,讲解自相关残差修正(加入滞后项)。学生计算综合楼8月节电量、折算电费节省、功率因数整改避免罚款金额,形成《校园综合楼用电异常分析与节能建议报告》。报告结构规范:1.执行摘要(300字内含核心结论与金额);2.数据来源与质量声明(采样频率、缺失率、清洗日志链接);3.方法论(清洗管道图、特征工程表、模型超参数表);4.关键发现(图表+洞察卡片,每图一结论);5.根因溯源与验证计划;6.节能建议分级(零成本运行调整/低成本设备加装/高投入系统改造);7.局限性声明(数据时效性、未观测变量、模型假设风险);8.代码与数据复现指引(Git仓库地址、环境锁定文件`environment.yml`)。同伴互评采用“双盲三维评分”:维度一“计算严谨性”(清洗日志完整/代码可复现/统计检验恰当);维度二“业务洞察力”(结论是否指向可执行动作/量化依据充分/避免相关当因果);维度三“沟通表达力”(可视化自解释性/术语准确/非技术利益相关者可读)。每组评审3份报告,填写结构化反馈单,作者据此迭代定稿。【第六课时:成果答辩·元认知复盘·迁移拓展】课堂模拟“数据分析汇报会”,邀请后勤处干部、物业经理、计算机教师组成评委团。每组8分钟汇报+5分钟问辩。评委聚焦提问:“若明年气象异常,你的基线模型是否失效?”“功率因数整改投资回收期如何测算?”“你的异常检测阈值0.01由何决定?业务代价如何权衡?”学生现场调取笔记本演示敏感性分析代码,展示专业素养。课后布置元认知复盘作业:个人撰写1500字反思日志,响应四个提示:“哪个清洗决策最纠结?最终依据何在?”“可视化设计中一次失败修改的完整过程?”“若数据量增至千万行、新增文本维修日志,你的流程如何重构?”“本项目对你‘数据素养’三个维度(觉悟/思维/创新)的具体提升证据”。教师批阅后择优推送至校级“数字素养成果集”公开展示。七、板书设计(核心知识图谱可视化)中心节点:探索性数据分析全流程(EDAPipeline)一级分支:①数据获取与理解(Schema验证、分布概览、业务对齐)②清洗与重塑(类型强制、缺失机制研判、填充策略决策树、异常值检测三角验证)③特征工程(时间展开与周期编码、聚合粒度重构、领域知识注入、泄漏防范)④探索性可视化(单变量分布/双变量关系/多维分面/交互式诊断——Seaborn/Plotly语法映射表)⑤无监督建模与解释(孤立森林/局部异常因子/SHAP解释/业务假设生成)⑥量化评估与报告(基线构建/反事实估计/不确定性量化/结构化叙事/复现性保障)横向贯穿带:计算思维抽象层级(数据结构→算法流程→系统工程)、核心素养映射点(标注四维素养图标)、工具链版本锁定(Git+Conda+Premit)。八、作业设计与分层评价体系基础作业(必做):完成骨架笔记本所有TODO代码填充,输出通过`nbconvert`导出的HTML报告,Git提交记录≥5次,通过教师CI/CD流水线自动测试(单元测试覆盖清洗函数、可视化函数签名合规性)。进阶作业(选做):引入`ydataprofiling`生成自动化EDA报告,对比手动分析差异,撰写《自动化EDA工具适用边界分析》短文(800字);或在Kaggle寻找同类能耗/环境监测数据集,复用清洗管道完成迁移分析,提交迁移适配日志。拓展作业(挑战):部署Streamlit交互式仪表盘至校内服务器,实现楼宇下拉筛选、日期范围选择、异常下钻明细表导出,录制2分钟演示视频。评价权重:过程性代码提交30%(含代码审查清单得分)、项目报告30%(含互评修正后版本)、现场答辩20%、元认知日志20%。引入“素养徽章”机制:清洗大师徽章(缺失处理方案获同伴最高分)、可视化匠人徽章(图表被评委引用为范例)、复现卫士徽章(CI/CD零报错通过)、洞察先锋徽章(建议被后勤处采纳)。九、教学反思与持续迭代计划实施后复盘聚焦三点:一、脚手架厚度动态调整。观测到部分配置低云桌面运行KNN填充内存溢出,下轮预置`dask.dataframe`并行替代方案或提供采样后数据集供基础组使用。二、业务专家深度介入时机。本轮后勤处仅答辩环节到场,拟调整为第二课时清洗阶段现场答疑(如“功率因数物理含义”“罚款计算规则”),提前校准领域知识偏差。三、学术诚信与AI辅助边界界定。检测到部分代码注释风格高度一致,疑似大模型生成。下轮引入“AI协作声明”规范:允许用大模型解释报错、生成样板代码、润色英文变量名,禁止直接生成核心逻辑、分析结论、反思日志,要求在笔记本首单元格标注AI工具名、用途、Prompt摘要,纳入评价体系“数字化学习与创新”维度考察“人机协作质量”而非单纯排斥。十、附件:核心代码片段注释版(教师版参考)```python文件:eda_pipeline/core.py版本:v1.2.0|更新:20250915|作者:教研组长目的:封装高复用清洗/特征/可视化函数,供学生骨架笔记本导入调用设计原则:单一职责、类型提示、文档字符串含统计假设、显式抛出业务异常importpandasaspdimportnumpyasnpfromtypingimportTuple,List,Dict,Optionalimportmatplotlib.pyplotaspltimportseabornassnsimportplotly.expressaspxfromscipyimportstatsfromsklearn.ensembleimportIsolationForestfromsklearn.preprocessingimportRobustScalerfromsklearn.imputeimportKNNImputer常量定义:物理约束边界,便于维护与审计PHYSICAL_BOUNDS={'功率因数':(0.0,1.0),'有功功率':(0,None),功率非负'电压':(300,450),380V三相线电压合理波动范围'温度':(40,60),校园气象站量程'湿度':(0,100)}MISSING_PLACEHOLDERS=[999,9999,'NULL','NaN','null','']defload_and_audit(filepath:str,parse_dates:List[str]=['时间戳'])>Tuple[pd.DataFrame,Dict]:"""加载数据并生成审计报告。返回:(清洗前DataFrame,审计报告dict)审计报告含:shape,dtypes,missing_ratio,duplicate_rows,placeholder_counts,memory_usage_MB"""df=pd.read_csv(filepath,parse_dates=parse_dates,na_values=MISSING_PLACEHOLDERS)if'时间戳'indf.columns:df=df.set_index('时间戳').sort_index()audit={'shape':df.shape,'dtypes':df.dtypes.astype(str).to_dict(),'missing_ratio':(df.isnull().mean()100).round(2).to_dict(),'duplicate_rows':df.index.duplicated().sum(),'placeholder_counts':{col:df[col].isin(MISSING_PLACEHOLDERS).sum()forcolindf.columns},'memory_usage_MB':round(df.memory_usage(deep=True).sum()/10242,2)}returndf,auditdefenforce_types(df:pd.DataFrame,numeric_cols:List[str])>pd.DataFrame:"""强制类型转换,转换失败置NaN并记录。统计假设:原始字符串非数值视为测量错误,非系统性缺失。"""df=df.copy()conversion_log={}forcolinnumeric_cols:ifcolnotindf.columns:continueoriginal_na=df[col].isna().sum()errors='coerce'将无法解析的字符串(如'错误')转为NaNdf[col]=pd.to_numeric(df[col],errors='coerce')new_na=df[col].isna().sum()original_naifnew_na>0:conversion_log[col]=f'强制转数值产生{new_na}个新增缺失'可选:将日志写入文件或返回returndfdefhandle_missing_advanced(df:pd.DataFrame,strategy_map:Dict[str,str],knn_cols:Optional[List[str]]=None)>Tuple[pd.DataFrame,Dict]:"""多策略缺失填充管道。strategy_map示例:{'温度':'interpolate_time','功率因数':'knn','人流量':'fill_zero'}支持策略:'ffill','bfill','interpolate_time','interpolate_linear','median','mean','knn','fill_zero','flag_only'(仅加缺失指示列)返回:(填充后DataFrame,填充报告dict)"""df=df.copy()report={'filled_columns':[],'added_indicators':[],'knn_details':{}}forcol,strategyinstrategy_map.items():ifcolnotindf.columns:continuemissing_before=df[col].isna().sum()ifmissing_before==0:continue统一添加缺失指示列,保留缺失模式信息indicator_col=f'{col}_was_missing'df[indicator_col]=df[col].isna().astype(int)report['added_indicators'].append(indicator_col)ifstrategy=='interpolate_time':时间插值要求索引为DatetimeIndex且单调df[col]=df[col].interpolate(method='time',limit_direction='both')elifstrategy=='knn'andknn_cols:KNN填充需数值型特征矩阵,仅对指定列组合填充imputer=KNNImputer(n_neighbors=5,weights='distance')subset=df[knn_cols+[col]]imputed=imputer.fit_transform(subset)df[col]=imputed[:,1]最后一列为目标列report['knn_details'][col]={'features_used':knn_cols,'n_neighbors':5}elifstrategy=='fill_zero':df[col]=df[col].fillna(0)elifstrategyin['median','mean']:fill_val=df[col].median()ifstrategy=='median'elsedf[col].mean()df[col]=df[col].fillna(fill_val)elifstrategy=='flag_only':pass仅保留指示列,不填充,留待下游模型处理else:raiseValueError(f'未知填充策略:{strategy}')filled_count=missing_beforedf[col].isna().sum()report['filled_columns'].append({'column':col,'strategy':strategy,'missing_before':int(missing_before),'filled_count':int(filled_count)})returndf,reportdefdetect_outliers_iqr(df:pd.DataFrame,cols:List[str],factor:float=1.5)>pd.DataFrame:"""基于IQR(四分位距)的异常值标记,鲁棒于非正态分布。返回布尔DataFrame,True表示异常。统计假设:数据大致对称,无极端重尾;factor=1.5为Tukey经典定义,3.0为极端异常。"""outlier_flags=pd.DataFrame(False,index=df.index,columns=cols)forcolincols:Q1=df[col].quantile(0.25)Q3=df[col].quantile(0.75)IQR=Q3Q1lower=Q1factorIQRupper=Q3+factorIQRoutlier_flags[col]=(df[col]<lower)|(df[col]>upper)returnoutlier_flagsdefrun_isolation_forest(df:pd.DataFrame,feature_cols:List[str],contamination:float=0.01,random_state:int=42)>Tuple[np.ndarray,np.ndarray,IsolationForest]:"""无监督异常检测主函数。返回:(异常分数越低越异常,预测标签1异常/1正常,训练好模型对象)注意:contamination需结合业务预期异常比例设定,非数据驱动自动确定。"""1.特征工程:仅数值列,RobustScaler抗异常缩放scaler=RobustScaler()X=scaler.fit_transform(df[feature_cols].fillna(df[feature_cols].median()))2.模型训练clf=IsolationForest(contamination=contamination,n_estimators=200,max_samples='auto',random_state=random_state,n_jobs=1)preds=clf.fit_predict(X)scores=clf.decision_function(X)越小越异常returnscores,preds,clfdefplot_daily_load_profile(df:pd.DataFrame,building_id:str,power_col:str='有功功率',freq:str='D')>plt.Figure:"""绘制单楼宇典型日负荷曲线带95%置信带。使用Seaborn面向对象接口,返回Figure对象便于后续保存/嵌入报告。"""筛选数据bld_df=df[df['楼宇编号']==building_id].copy()ifbld_df.empty:raiseValueError(f'楼宇{building_id}无数据')按天重采样至小时频率,对齐时间轴先按天分组,再对每天重采样到小时,最后取均值/置信区间此处简化:直接按小时聚合所有天hourly=bld_df.groupby(bld_df.index.hour)[power_col].agg(['mean','std','count']).reset_index()hourly.rename(columns={'index':'hour'},inplace=True)fig,ax=plt.subplots(figsize=(10,5))sns.lineplot(data=hourly,x='hour',y='mean',ax=ax,label='平均负荷',linewidth=2,color='2c7fb8')手动绘制置信带:mean±1.96std/sqrt(n)se=hourly['std']/np.sqrt(hourly['count'])ax.fill_between(hourly['hour'],hourly['mean']1.96se,hourly['mean']+1.96se,alpha=0.2,color='2c7fb8',label='95%CI')ax.set_xlabel('小时',fontsize=12)ax.set_ylabel('有功功率',fontsize=12)ax.set_title(f'{building_id}典型日负荷画像(N={len(bld_df.resample(freq).mean())}天)',fontsize=14)ax.set_xticks(range(0,24,2))ax.grid(True,linestyle='',alpha=0.5)ax.legend()sns.despine()returnfigdefgenerate_correlation_heatmap(df:pd.DataFrame,cols:List[str],method:str='spearman',figsize:Tuple[int,int]=(12,10))>plt.Figure:"""生成出版级相关性热力图:掩盖上三角、标注显著性、聚类排序。method:'pearson'|'spearman'|'kendall',Spearman默认抗单调非线性。"""corr=df[cols].corr(method=method)计算p值矩阵(仅Spearman/Pearson近似)pvals=pd.DataFrame(np.ones_like(corr),index=corr.index,columns=corr.columns)ifmethodin['pearson','spearman']:foriinrange(len(cols)):forjinrange(i+1,len(cols)):ifmethod=='pearson':_,p=stats.pearsonr(df[cols[i]].dropna(),df[cols[j]].dropna())else:_,p=stats.spearmanr(df[cols[i]].dropna(),df[cols[j]].dropna())pvals.iloc[i,j]=ppvals.iloc[j,i]=p显著性标注annot=corr.round(2).astype(str)annot=annot+pvals.applymap(lambdap:''ifp<0.01else(''ifp<0.05else''))np.fill_diagonal(annot.values,'1.00')对角线美化层次聚类重排,使相似变量聚集fromscipy.cluster.hierarchyimportlinkage,leaves_listlinkage_matrix=linkage(corr.fillna(0),method='ward')order=leaves_list(linkage_matrix)corr=corr.iloc[order,:].iloc[:,order]annot=annot.iloc[order,:].iloc[:,order]mask=np.triu(np.ones_like(corr,dtype=bool),k=1)掩盖上三角fig,ax=plt.subplots(figsize=figsize)sns.heatmap(corr,mask=mask,annot=annot,fmt='',cmap='RdBu_r',center=0,square=True,linewidths=0.5,cbar_kws={'shrink':0.8,'label':f'{method.capitalize()}相关系数'},ax=ax,annot_kws={'fontsize':9})ax.set_title(f'变量相关性热力图({method.capitalize()},下三角含显著性)',fontsize=14,pad=20)plt.tight_layout()returnfig使用示例(教师演示用)if__name__=='__main__':1.加载审计raw,audit=load_and_audit('../data/campus_energy_raw.csv')print('===审计报告===');[print(f'{k}:{v}')fork,vinaudit.items()]2.类型强制numeric_cols=['有功功率','无功功率','电压','电流','功率因数','温度','湿度','人流量']df=enforce_types(raw,numeric_cols)3.缺失填充策略定义(基于第二课时对比实验结果确定)strategy={'温度':'interpolate_time',时序强相关'湿度':'interpolate_time','功率因数':'knn',多变量非线性关系'人流量':'fill_zero',夜间无人合理'电压':'median'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论