
很多同学在入门数据分析时常常感到迷茫面对一堆零散的数据不知道从哪里开始学了Python语法却不知道如何应用到真实业务中网上教程要么太浅要么太散无法形成闭环。本文旨在解决这些问题通过一个完整的实战项目串联起数据分析的核心流程——从数据获取、清洗、挖掘到可视化最终形成一份专业的分析报告。无论你是零基础的学生还是希望提升数据分析能力的开发者都能在10小时内掌握这套可复用的方法论并具备独立完成项目的能力。1. 数据分析全景与核心概念在动手写代码之前我们需要建立一个清晰的认知框架理解数据分析到底是什么以及它如何创造价值。1.1 什么是数据分析数据分析是一个从原始数据中提取有价值信息并以此为依据做出决策的过程。它不仅仅是画几张图表而是一个包含明确目标的系统性工程。一个典型的数据分析流程可以概括为以下几个阶段明确目标解决什么问题例如分析用户流失原因、预测下季度销售额、优化产品功能。数据获取从数据库、API、日志文件、公开数据集或网络爬虫等渠道收集原始数据。数据清洗与预处理处理数据中的缺失值、异常值、重复值统一格式为分析做准备。这是最耗时但至关重要的步骤常言道“垃圾进垃圾出”。数据探索与分析运用统计方法和数据挖掘技术发现数据中的模式、趋势和关联。数据可视化将分析结果通过图表直观地呈现出来便于理解和汇报。报告与决策形成分析结论提出 actionable 的建议支撑业务决策。1.2 核心技能栈Python 生态对于现代数据分析师和开发者而言Python 因其丰富的库和易用性成为首选工具。我们将围绕以下几个核心库展开Pandas数据分析的基石。提供了DataFrame和Series数据结构可以高效地进行数据清洗、转换、聚合和筛选就像在 Python 中使用 Excel 一样但功能更强大。NumPy科学计算的基础。提供高性能的多维数组对象和数学函数是 Pandas 等许多库的底层依赖。Matplotlib最基础的绘图库高度可定制可以绘制各种静态、交互式图表。Seaborn基于 Matplotlib 的高级统计图表库默认样式更美观绘制统计图形如分布图、热力图、箱线图更加简便。Scikit-learn机器学习库。虽然我们本次以分析为主但会涉及一些简单的数据挖掘算法如聚类、分类为后续深入挖掘打下基础。1.3 项目实战的价值理论学习总是抽象的。本次我们将通过一个贯穿始终的实战项目——“苏州近一周天气数据采集与分析”来具体化每一个步骤。你将学会如何使用requests库从网络 API 获取实时数据。如何使用pandas对数据进行全方位的清洗和整理。如何运用统计方法和可视化matplotlib,seaborn探索数据规律。如何将清洗和分析后的数据导出为结构化的 Excel 报告。如何将零散代码组织成一个完整的、可复用的数据分析脚本。2. 环境准备与项目初始化工欲善其事必先利其器。让我们先搭建好开发环境并创建清晰的项目结构。2.1 环境与版本说明本文示例基于以下常见环境请确保你的环境与之兼容。如果版本略有差异通常不影响核心功能。操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu)Python 版本3.8 或更高版本 (推荐 3.9)核心库版本pandas 1.3.0numpy 1.21.0requests 2.26.0openpyxl 3.0.0 (用于读写 Excel 文件)matplotlib 3.5.0seaborn 0.11.02.2 安装依赖库打开你的终端Windows 下是 CMD 或 PowerShellmacOS/Linux 下是 Terminal使用pip命令一次性安装所有必需的库。建议在虚拟环境中进行以避免包冲突。# 创建虚拟环境可选但推荐 python -m venv data_analysis_env # 激活虚拟环境 # Windows: data_analysis_env\Scripts\activate # macOS/Linux: source data_analysis_env/bin/activate # 安装依赖库 pip install pandas numpy requests openpyxl matplotlib seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple2.3 创建项目结构一个清晰的项目结构有助于代码管理和协作。在你的工作目录下创建如下文件和文件夹suzhou_weather_analysis/ │ ├── data/ # 存放原始和中间数据 │ ├── raw/ # 原始数据如爬取的JSON │ └── processed/ # 清洗后的数据 │ ├── src/ # 源代码 │ ├── __init__.py │ ├── data_fetcher.py # 数据获取模块 │ ├── data_cleaner.py # 数据清洗模块 │ ├── data_analyzer.py # 数据分析模块 │ └── visualizer.py # 数据可视化模块 │ ├── output/ # 输出结果 │ ├── figures/ # 生成的图表 │ └── reports/ # 生成的报告Excel等 │ ├── config.py # 配置文件如API密钥、城市代码 ├── main.py # 主程序入口 └── requirements.txt # 项目依赖列表创建requirements.txt文件记录项目依赖pandas1.3.0 numpy1.21.0 requests2.26.0 openpyxl3.0.0 matplotlib3.5.0 seaborn0.11.03. 核心技能点拆解从获取到可视化的每一步在进入完整项目前我们先逐一攻克每个核心环节的关键技术和常见“坑点”。3.1 数据获取使用 Requests 调用天气 API我们的数据源是免费的天气 API。这里以和风天气HeWeather或心知天气Seniverse的免费接口为例。请注意使用任何 API 前请务必阅读其官方文档遵守调用频率限制并妥善保管你的 API Key。核心步骤注册并获取 API Key。构造请求 URL包含城市参数、时间范围等。发送 HTTP GET 请求并处理响应状态码、JSON 数据。解析 JSON 数据提取所需字段。# file: src/data_fetcher.py import requests import pandas as pd from datetime import datetime, timedelta import time import json def fetch_weather_data(api_key, city苏州, days7): 从天气API获取指定城市未来几天的天气预报数据。 Args: api_key (str): 你的API密钥。 city (str): 城市名称。 days (int): 要获取的天数。 Returns: list: 包含每天天气数据的字典列表。 base_url https://api.seniverse.com/v3/weather/daily.json # 构造请求参数 params { key: api_key, location: city, language: zh-Hans, unit: c, start: 0, # 从今天开始 days: days } weather_list [] try: response requests.get(base_url, paramsparams, timeout10) response.raise_for_status() # 如果状态码不是200抛出HTTPError异常 data response.json() # 解析API返回的JSON结构根据实际API调整 # 以心知天气为例数据在 results[0][daily] 中 if results in data and len(data[results]) 0: daily_data data[results][0][daily] for day_info in daily_data: # 提取关键信息 record { date: day_info.get(date), day_text: day_info.get(text_day, ), night_text: day_info.get(text_night, ), high_temp: float(day_info.get(high, 0)), low_temp: float(day_info.get(low, 0)), precip: float(day_info.get(precip, 0)), # 降水量 wind_direction: day_info.get(wind_direction, ), wind_scale: day_info.get(wind_scale, ) } weather_list.append(record) else: print(fAPI返回数据格式异常: {data}) except requests.exceptions.RequestException as e: print(f网络请求失败: {e}) except (KeyError, ValueError, TypeError) as e: print(f数据解析失败: {e}) # 模拟数据当API不可用时使用仅用于演示 if not weather_list: print(警告使用模拟数据进行演示。) weather_list generate_mock_data(days) return weather_list def generate_mock_data(days): 生成模拟天气数据用于演示和测试。 mock_data [] base_date datetime.now() for i in range(days): date_str (base_date timedelta(daysi)).strftime(%Y-%m-%d) mock_data.append({ date: date_str, day_text: [晴, 多云, 阴, 小雨][i % 4], night_text: [晴, 多云, 阴, 小雨][(i1) % 4], high_temp: 25 i, low_temp: 15 i, precip: i * 0.5, wind_direction: [东风, 东南风, 南风, 西南风][i % 4], wind_scale: f{i % 5 1}级 }) return mock_data if __name__ __main__: # 测试函数请替换为你自己的API Key API_KEY YOUR_API_KEY_HERE # 务必替换 data fetch_weather_data(API_KEY, city苏州, days7) print(f获取到 {len(data)} 条数据) for item in data[:2]: # 打印前两条看看 print(item)关键点与避坑指南API Key 管理切勿将 API Key 硬编码在代码中或上传到公开仓库。应使用环境变量或配置文件。错误处理必须对网络请求超时、连接错误和 JSON 解析进行异常捕获。速率限制免费 API 通常有调用次数限制在循环中调用时需加入time.sleep()。数据备份获取到的原始数据建议立即保存为 JSON 或 CSV 文件避免重复调用 API。3.2 数据清洗Pandas 的威力获取到的原始数据往往存在各种问题需要用 Pandas 进行“大扫除”。# file: src/data_cleaner.py import pandas as pd import numpy as np def clean_weather_data(weather_list): 清洗天气数据处理缺失值、异常值并转换数据类型。 Args: weather_list (list): 原始数据字典列表。 Returns: pd.DataFrame: 清洗后的DataFrame。 # 1. 转换为DataFrame df pd.DataFrame(weather_list) print(原始数据形状:, df.shape) print(原始数据预览:\n, df.head()) print(\n原始数据信息:) print(df.info()) # 2. 处理日期列 df[date] pd.to_datetime(df[date], errorscoerce) # 转换日期错误转为NaT df[weekday] df[date].dt.day_name() # 添加星期几 # 3. 处理缺失值 print(f\n缺失值统计:\n{df.isnull().sum()}) # 数值列用中位数填充 num_cols [high_temp, low_temp, precip] for col in num_cols: if col in df.columns: median_val df[col].median() df[col].fillna(median_val, inplaceTrue) # 文本列用众数或‘未知’填充 text_cols [day_text, night_text, wind_direction, wind_scale] for col in text_cols: if col in df.columns: mode_val df[col].mode()[0] if not df[col].mode().empty else 未知 df[col].fillna(mode_val, inplaceTrue) # 4. 处理异常值例如温度不可能超过60度或低于-50度 if high_temp in df.columns: df.loc[df[high_temp] 60, high_temp] df[high_temp].median() df.loc[df[high_temp] -50, high_temp] df[high_temp].median() if low_temp in df.columns: df.loc[df[low_temp] 50, low_temp] df[low_temp].median() df.loc[df[low_temp] -50, low_temp] df[low_temp].median() # 降水量非负 if precip in df.columns: df.loc[df[precip] 0, precip] 0 # 5. 处理重复值按日期去重保留第一条 df.drop_duplicates(subset[date], keepfirst, inplaceTrue) # 6. 创建衍生特征 df[temp_range] df[high_temp] - df[low_temp] # 温差 df[is_rainy] df[precip].apply(lambda x: 1 if x 0 else 0) # 是否下雨 # 7. 重置索引 df.reset_index(dropTrue, inplaceTrue) print(\n清洗后数据形状:, df.shape) print(清洗后数据预览:\n, df.head()) return df if __name__ __main__: # 测试清洗函数 from data_fetcher import generate_mock_data mock_data generate_mock_data(7) # 故意制造一些“脏数据” mock_data[0][high_temp] None mock_data[1][precip] -5 mock_data.append(mock_data[0]) # 添加一条重复数据 cleaned_df clean_weather_data(mock_data) print(cleaned_df[[date, high_temp, low_temp, precip, temp_range]])清洗核心操作解析pd.to_datetime(): 将字符串日期转为 Pandas 的datetime类型便于后续时间序列分析。fillna(): 填充缺失值。数值型常用均值/中位数分类型常用众数或特定值。drop_duplicates(): 删除重复行subset参数指定依据哪些列判断重复。apply(): 对 Series 的每个元素应用函数用于创建新列或转换数据。异常值处理逻辑需要根据业务常识设定合理范围用中位数或分位数替换。3.3 数据分析与统计清洗后的数据就可以进行探索性分析了。Pandas 提供了丰富的统计和聚合功能。# file: src/data_analyzer.py import pandas as pd import numpy as np def analyze_weather_data(df): 对清洗后的天气数据进行统计分析。 Args: df (pd.DataFrame): 清洗后的天气数据DataFrame。 Returns: dict: 包含各类统计结果的字典。 analysis_results {} # 1. 基本描述性统计 analysis_results[desc_stats] df[[high_temp, low_temp, precip, temp_range]].describe() # 2. 按天气现象分组统计 if day_text in df.columns: weather_summary df.groupby(day_text).agg({ high_temp: [mean, max, min], low_temp: mean, precip: sum, date: count # 每种天气的天数 }).round(2) weather_summary.columns [avg_high, max_high, min_high, avg_low, total_precip, days_count] analysis_results[weather_summary] weather_summary # 3. 相关性分析 numeric_df df.select_dtypes(include[np.number]) if not numeric_df.empty: analysis_results[correlation_matrix] numeric_df.corr() # 4. 趋势分析 (例如温度是否逐日上升) if date in df.columns and high_temp in df.columns: df_sorted df.sort_values(date) # 计算每日高温与前一天的变化 df_sorted[high_temp_change] df_sorted[high_temp].diff() analysis_results[temp_trend] df_sorted[[date, high_temp, high_temp_change]] # 5. 汇总关键结论 conclusions { avg_high_temp: df[high_temp].mean(), avg_low_temp: df[low_temp].mean(), total_rainy_days: df[is_rainy].sum(), max_temp_range_day: df.loc[df[temp_range].idxmax(), date] if not df.empty else None, most_common_weather: df[day_text].mode()[0] if not df[day_text].mode().empty else None } analysis_results[conclusions] conclusions return analysis_results if __name__ __main__: # 测试分析函数 from data_cleaner import clean_weather_data from data_fetcher import generate_mock_data mock_data generate_mock_data(7) cleaned_df clean_weather_data(mock_data) results analyze_weather_data(cleaned_df) print( 描述性统计 ) print(results[desc_stats]) print(\n 天气现象汇总 ) print(results.get(weather_summary, No weather summary)) print(\n 数值列相关性矩阵 ) print(results.get(correlation_matrix, No numeric columns)) print(\n 关键结论 ) for key, value in results[conclusions].items(): print(f{key}: {value})3.4 数据可视化让数据说话图表是分析结果的直观体现。我们将使用 Matplotlib 和 Seaborn 绘制多种图表。# file: src/visualizer.py import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import os # 设置中文字体和图表样式 plt.rcParams[font.sans-serif] [SimHei, DejaVu Sans] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 sns.set_style(whitegrid) def save_figure(fig, filename, output_dir../output/figures): 保存图表到指定目录 os.makedirs(output_dir, exist_okTrue) filepath os.path.join(output_dir, filename) fig.savefig(filepath, dpi300, bbox_inchestight) print(f图表已保存至: {filepath}) def plot_temperature_trend(df, saveTrue): 绘制温度趋势图折线图 fig, ax plt.subplots(figsize(12, 6)) ax.plot(df[date], df[high_temp], markero, label最高温, linewidth2) ax.plot(df[date], df[low_temp], markers, label最低温, linewidth2) ax.fill_between(df[date], df[low_temp], df[high_temp], alpha0.2, colorgray) ax.set_xlabel(日期) ax.set_ylabel(温度 (°C)) ax.set_title(苏州近一周温度变化趋势) ax.legend() ax.grid(True, linestyle--, alpha0.7) plt.xticks(rotation45) plt.tight_layout() if save: save_figure(fig, temperature_trend.png) plt.show() def plot_weather_distribution(df, saveTrue): 绘制天气现象分布图柱状图 weather_counts df[day_text].value_counts() fig, ax plt.subplots(figsize(10, 6)) bars ax.bar(weather_counts.index, weather_counts.values, colorsns.color_palette(husl, len(weather_counts))) ax.set_xlabel(天气现象) ax.set_ylabel(出现天数) ax.set_title(苏州近一周天气现象分布) # 在柱子上方添加数量标签 for bar in bars: height bar.get_height() ax.text(bar.get_x() bar.get_width()/2., height 0.1, f{int(height)}, hacenter, vabottom) plt.tight_layout() if save: save_figure(fig, weather_distribution.png) plt.show() def plot_correlation_heatmap(df, saveTrue): 绘制数值特征相关性热力图 numeric_df df.select_dtypes(include[number]) if numeric_df.shape[1] 2: print(数值特征不足无法绘制热力图。) return corr_matrix numeric_df.corr() fig, ax plt.subplots(figsize(8, 6)) sns.heatmap(corr_matrix, annotTrue, fmt.2f, cmapcoolwarm, center0, squareTrue, linewidths1, cbar_kws{shrink: .8}, axax) ax.set_title(天气特征相关性热力图) plt.tight_layout() if save: save_figure(fig, correlation_heatmap.png) plt.show() def plot_boxplot_for_temp(df, saveTrue): 绘制温度箱线图查看分布和异常值 fig, axes plt.subplots(1, 2, figsize(12, 5)) sns.boxplot(ydf[high_temp], axaxes[0], colorlightcoral) axes[0].set_title(最高温箱线图) axes[0].set_ylabel(温度 (°C)) sns.boxplot(ydf[low_temp], axaxes[1], colorlightblue) axes[1].set_title(最低温箱线图) axes[1].set_ylabel(温度 (°C)) plt.suptitle(温度分布箱线图) plt.tight_layout() if save: save_figure(fig, temperature_boxplot.png) plt.show() if __name__ __main__: # 测试可视化函数 from data_cleaner import clean_weather_data from data_fetcher import generate_mock_data mock_data generate_mock_data(7) cleaned_df clean_weather_data(mock_data) plot_temperature_trend(cleaned_df, saveFalse) plot_weather_distribution(cleaned_df, saveFalse) plot_correlation_heatmap(cleaned_df, saveFalse) plot_boxplot_for_temp(cleaned_df, saveFalse)4. 完整项目实战苏州天气数据分析报告生成现在我们将所有模块整合形成一个完整的、可执行的数据分析项目。4.1 项目配置文件首先创建一个配置文件来管理 API Key 等敏感信息和常量。# file: config.py 项目配置文件用于存放常量、API密钥等。 重要切勿将此文件提交到公开版本控制系统如Git # 天气API配置 (示例请替换为真实信息) WEATHER_API_CONFIG { api_key: YOUR_SENIVERSE_API_KEY_HERE, # 请在此处填入你的API Key base_url: https://api.seniverse.com/v3/weather/daily.json, city: 苏州, days: 7 } # 文件路径配置 DATA_RAW_PATH ./data/raw/weather_raw.json DATA_PROCESSED_PATH ./data/processed/weather_cleaned.csv OUTPUT_EXCEL_PATH ./output/reports/苏州天气分析.xlsx OUTPUT_FIG_DIR ./output/figures/ # 分析报告标题 REPORT_TITLE 苏州近一周天气数据分析报告4.2 主程序入口main.py作为程序的入口负责协调各个模块的工作流。# file: main.py 苏州天气数据分析项目主程序 执行顺序获取数据 - 清洗数据 - 分析数据 - 可视化 - 生成报告 import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from src.data_fetcher import fetch_weather_data from src.data_cleaner import clean_weather_data from src.data_analyzer import analyze_weather_data from src.visualizer import (plot_temperature_trend, plot_weather_distribution, plot_correlation_heatmap, plot_boxplot_for_temp) import pandas as pd import json from datetime import datetime from config import WEATHER_API_CONFIG, DATA_RAW_PATH, DATA_PROCESSED_PATH, OUTPUT_EXCEL_PATH, OUTPUT_FIG_DIR, REPORT_TITLE def save_raw_data(data, filepath): 保存原始数据到JSON文件 os.makedirs(os.path.dirname(filepath), exist_okTrue) with open(filepath, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2) print(f原始数据已保存至: {filepath}) def save_cleaned_data(df, filepath): 保存清洗后的数据到CSV文件 os.makedirs(os.path.dirname(filepath), exist_okTrue) df.to_csv(filepath, indexFalse, encodingutf-8-sig) # utf-8-sig 解决Excel中文乱码 print(f清洗后数据已保存至: {filepath}) def generate_excel_report(df, analysis_results, filepath): 生成包含数据和分析结果的Excel报告。 使用 openpyxl 引擎可以更好地控制格式。 os.makedirs(os.path.dirname(filepath), exist_okTrue) with pd.ExcelWriter(filepath, engineopenpyxl) as writer: # 1. 写入清洗后的详细数据 df.to_excel(writer, sheet_name详细数据, indexFalse) # 2. 写入描述性统计 if desc_stats in analysis_results: analysis_results[desc_stats].to_excel(writer, sheet_name描述性统计) # 3. 写入天气汇总 if weather_summary in analysis_results: analysis_results[weather_summary].to_excel(writer, sheet_name天气汇总) # 4. 写入相关性矩阵 if correlation_matrix in analysis_results: if isinstance(analysis_results[correlation_matrix], pd.DataFrame): analysis_results[correlation_matrix].to_excel(writer, sheet_name相关性分析) # 5. 创建一个总结页 summary_df pd.DataFrame([analysis_results.get(conclusions, {})]) summary_df.to_excel(writer, sheet_name分析结论, indexFalse) # 获取 workbook 和 worksheet 对象以调整列宽 workbook writer.book for sheet_name in writer.sheets: worksheet writer.sheets[sheet_name] for column in worksheet.columns: max_length 0 column_letter column[0].column_letter for cell in column: try: if len(str(cell.value)) max_length: max_length len(str(cell.value)) except: pass adjusted_width min(max_length 2, 50) worksheet.column_dimensions[column_letter].width adjusted_width print(fExcel分析报告已生成: {filepath}) def main(): 主函数 print(*50) print(f开始执行: {REPORT_TITLE}) print(*50) # 步骤1: 获取数据 print(\n[步骤1/5] 正在从API获取天气数据...) raw_data fetch_weather_data( api_keyWEATHER_API_CONFIG[api_key], cityWEATHER_API_CONFIG[city], daysWEATHER_API_CONFIG[days] ) if not raw_data: print(错误未能获取到数据程序终止。) return save_raw_data(raw_data, DATA_RAW_PATH) # 步骤2: 清洗数据 print(\n[步骤2/5] 正在清洗数据...) cleaned_df clean_weather_data(raw_data) save_cleaned_data(cleaned_df, DATA_PROCESSED_PATH) # 步骤3: 分析数据 print(\n[步骤3/5] 正在进行数据分析...) analysis_results analyze_weather_data(cleaned_df) # 步骤4: 数据可视化 print(\n[步骤4/5] 正在生成可视化图表...) # 确保输出目录存在 os.makedirs(OUTPUT_FIG_DIR, exist_okTrue) plot_temperature_trend(cleaned_df) plot_weather_distribution(cleaned_df) plot_correlation_heatmap(cleaned_df) plot_boxplot_for_temp(cleaned_df) # 步骤5: 生成Excel报告 print(\n[步骤5/5] 正在生成Excel分析报告...) generate_excel_report(cleaned_df, analysis_results, OUTPUT_EXCEL_PATH) print(\n *50) print(数据分析流程全部完成) print(f1. 原始数据: {DATA_RAW_PATH}) print(f2. 清洗后数据: {DATA_PROCESSED_PATH}) print(f3. 可视化图表: {OUTPUT_FIG_DIR}) print(f4. 分析报告: {OUTPUT_EXCEL_PATH}) print(*50) if __name__ __main__: main()4.3 运行项目与结果解读运行项目在项目根目录下执行python main.py。查看输出./data/raw/weather_raw.json: 保存了从 API 获取的原始 JSON 数据。./data/processed/weather_cleaned.csv: 保存了清洗后的结构化数据可用 Excel 打开。./output/figures/: 包含了生成的 4 张 PNG 格式图表。./output/reports/苏州天气分析.xlsx: 最终的 Excel 分析报告包含多个工作表。报告解读示例 打开苏州天气分析.xlsx文件你可以看到详细数据包含日期、温度、天气、降水量、温差等所有字段。描述性统计可以看到温度、降水量的平均值、标准差、最小值、最大值、分位数等。天气汇总统计了“晴”、“多云”等天气分别出现了几天以及对应的平均温度、总降水量。相关性分析例如你可能会发现最高温和最低温高度正相关而降水量与温度可能呈弱负相关。分析结论汇总了关键指标如平均高温、平均低温、总降雨天数、温差最大的一天等。5. 常见问题与排查思路在实际运行中你可能会遇到以下问题问题现象可能原因解决思路运行main.py报ModuleNotFoundError1. 依赖库未安装。2. 未在项目根目录运行。3. Python 环境不对。1. 执行pip install -r requirements.txt。2. 在suzhou_weather_analysis/目录下运行。3. 确认激活了正确的虚拟环境 (python --version)。API 请求返回错误如 403, 4011. API Key 无效或过期。2. 请求频率超限。3. 城市参数格式错误。1. 检查config.py中的api_key是否正确。2. 查看 API 文档的调用频率限制加入time.sleep()。3. 确认城市名符合 API 要求如拼音或代码。图表中文显示为方框系统缺少中文字体或 Matplotlib 未配置中文字体。1. 确保系统有中文字体如 SimHei。2. 在visualizer.py中plt.rcParams[font.sans-serif]列表里添加一个你系统已有的中文字体名。3. 或者使用英文标签。生成的 Excel 文件打开乱码CSV/Excel 编码问题。代码中已使用utf-8-sig编码保存 CSVopenpyxl引擎生成 Excel 通常无此问题。如果仍有问题检查 Excel 的打开编码设置。数据分析结果全是 NaN 或 01. 数据清洗时填充逻辑有误。2. 原始数据本身质量差。1. 检查data_cleaner.py中的fillna逻辑打印中间数据 (df.head(),df.info())。2. 打印raw_data查看 API 返回的原始数据结构是否正确。pandas操作报KeyErrorDataFrame 中不存在指定的列名。1. 检查列名拼写区分大小写。2. 在操作前用if column_name in df.columns:进行判断。6. 最佳实践与项目扩展建议掌握基础流程后以下建议能帮助你将这个项目提升到更高水平并应用到更复杂的场景中。6.1 工程化最佳实践配置管理永远不要将密码、API Key 等敏感信息硬编码在代码中。除了使用config.py更安全的方式是使用环境变量如os.getenv(API_KEY)或专门的配置管理工具。日志记录用logging模块替代print可以方便地控制日志级别DEBUG, INFO, WARNING, ERROR并输出到文件便于后期排查问题。单元测试为data_fetcher,data_cleaner等核心函数编写单元测试使用unittest或pytest确保代码修改后核心功能正常。错误处理与重试对于网络请求等不稳定操作应实现重试机制如使用tenacity库并记录详细的错误信息。代码复用与模块化本项目已经做了很好的模块化拆分。在更大型的项目中可以考虑将通用功能如数据库连接、邮件发送封装成独立的包。6.2 数据分析深度扩展更复杂的数据挖掘预测使用scikit-learn的线性回归或时间序列模型如 ARIMA基于历史数据预测未来温度。聚类使用 K-Means 对天气模式进行聚类发现“高温高湿”、“低温干燥”等典型天气类别。关联分析分析不同天气现象与风向、风速之间的关联规则。更多数据源爬取历史天气数据进行年度、月度对比分析。结合空气质量数据AQI分析天气与空气质量的关系。引入节假日数据分析节假日对天气如出行适宜度的影响。高级可视化使用Plotly或Pyecharts制作交互式图表和大屏仪表盘。绘制风向玫瑰图、雷达图用于多指标天气对比。6.3 项目部署与自动化脚本自动化使用任务调度工具如 Linux 的cronWindows 的“任务计划程序”每天定时运行main.py实现日报自动生成。Web 应用使用Flask或FastAPI将分析结果封装成 RESTful API并创建一个简单的 Web 页面来展示图表和报告。容器化使用 Docker 将整个项目环境Python 版本、依赖库打包确保在任何机器上都能一键运行。通过这个从零到一的完整项目你不仅学会了 Python 数据分析的核心工具链Pandas, Matplotlib, Requests更重要的是掌握了一套解决实际问题的标准化流程定义问题 - 获取数据 - 清洗整理 - 分析挖掘 - 可视化呈现 - 报告输出。这套方法论是通用的可以平移到电商销售分析、用户行为分析、金融数据监控等几乎所有数据分析场景中。接下来你可以尝试寻找自己感兴趣领域的数据集用这套方法去探索和发现属于你的数据洞察。