用Python+Pandas搞定校园单车数据清洗:从‘200+’到精准预测的保姆级教程

张开发
2026/6/7 13:04:01 15 分钟阅读
用Python+Pandas搞定校园单车数据清洗:从‘200+’到精准预测的保姆级教程
用PythonPandas搞定校园单车数据清洗从‘200’到精准预测的保姆级教程校园单车数据清洗与分析是许多数据分析新手面临的第一个实战挑战。想象一下你拿到一份包含200、缺失值和杂乱时间格式的Excel表格如何从中提取有价值的信息本文将带你用Python的Pandas库一步步完成从数据清洗到预测建模的全过程。1. 数据准备与环境搭建在开始之前我们需要准备好Python环境和必要的库。推荐使用Anaconda创建虚拟环境避免与其他项目产生依赖冲突。conda create -n bike_analysis python3.9 conda activate bike_analysis pip install pandas numpy matplotlib seaborn scikit-learn数据通常以Excel或CSV格式提供。假设我们有一个名为campus_bikes.xlsx的文件包含多个停车点的单车数量记录。首先我们使用Pandas读取数据import pandas as pd # 读取Excel文件 raw_data pd.read_excel(campus_bikes.xlsx, sheet_nameSheet1) # 查看前5行数据 print(raw_data.head())提示如果数据量很大可以使用chunksize参数分块读取避免内存不足。2. 数据清洗处理异常值与缺失数据原始数据往往包含各种问题如200这样的字符串、缺失值(NaN)以及不一致的时间格式。我们需要先解决这些问题。2.1 处理200类字符串对于包含符号的数值我们可以提取数字部分并转换为整数def clean_plus_values(value): if isinstance(value, str) and in value: return int(value.replace(, )) return value # 应用清洗函数到所有数值列 for col in raw_data.columns[1:]: # 假设第一列是时间 raw_data[col] raw_data[col].apply(clean_plus_values)2.2 处理缺失值缺失值处理有多种策略这里我们展示几种常用方法# 方法1用列平均值填充 mean_filled raw_data.fillna(raw_data.mean()) # 方法2用前一个有效值填充 forward_filled raw_data.fillna(methodffill) # 方法3用插值法填充 interpolated raw_data.interpolate()注意选择哪种填充方法取决于数据特性和分析目的。时间序列数据通常适合插值法。3. 时间序列处理与转换校园单车数据通常是时间序列数据正确处理时间戳对后续分析至关重要。3.1 标准化时间格式原始数据中的时间可能有多种格式如7:30、08:50 AM等我们需要统一# 将时间列转换为datetime格式 raw_data[时间] pd.to_datetime(raw_data[时间], format%H:%M).dt.time # 如果需要日期信息假设都是同一天 raw_data[完整时间] pd.to_datetime(2023-01-01 raw_data[时间].astype(str))3.2 时间特征提取从时间戳中提取有用特征可以增强模型性能raw_data[小时] raw_data[完整时间].dt.hour raw_data[分钟] raw_data[完整时间].dt.minute raw_data[一天中的分钟数] raw_data[小时] * 60 raw_data[分钟]4. 单车总量估算与分布分析有了干净的数据我们可以开始估算校园内单车总量和分析分布模式。4.1 单车总量估算简单的方法是假设观测到的单车数量总和代表校园内单车总量total_bikes raw_data.iloc[:, 1:-3].sum().sum() # 排除时间相关列 print(f估算校园内单车总量: {total_bikes:.0f}辆)更精确的方法是考虑时间维度和周转率# 计算每个时间点的单车总数 timewise_totals raw_data.iloc[:, 1:-3].sum(axis1) # 取最大值作为总量估计 max_bikes timewise_totals.max() print(f基于峰值估算的单车总量: {max_bikes:.0f}辆)4.2 停车点分布热力图使用Seaborn可视化各停车点的单车数量分布import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize(12, 8)) sns.heatmap(raw_data.iloc[:, 1:15].corr(), annotTrue, cmapcoolwarm) plt.title(各停车点单车数量相关性热力图) plt.show()5. 预测模型构建我们可以构建简单的时间序列模型来预测单车数量变化。5.1 线性回归模型from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split # 准备特征和目标变量 X raw_data[[一天中的分钟数]] y raw_data[东门] # 以东门为例 # 分割训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 训练模型 model LinearRegression() model.fit(X_train, y_train) # 评估模型 score model.score(X_test, y_test) print(f模型R²分数: {score:.2f})5.2 随机森林模型对于更复杂的模式可以使用随机森林from sklearn.ensemble import RandomForestRegressor rf_model RandomForestRegressor(n_estimators100, random_state42) rf_model.fit(X_train, y_train) rf_score rf_model.score(X_test, y_test) print(f随机森林模型R²分数: {rf_score:.2f})6. 结果可视化与分析将预测结果与实际数据对比可视化# 创建预测时间点 full_day_minutes pd.DataFrame({一天中的分钟数: range(0, 1440, 30)}) predictions model.predict(full_day_minutes) # 绘制结果 plt.figure(figsize(12, 6)) plt.scatter(X, y, colorblue, label实际数据) plt.plot(full_day_minutes, predictions, colorred, linewidth2, label预测趋势) plt.xlabel(一天中的分钟数) plt.ylabel(单车数量) plt.title(东门单车数量时间趋势预测) plt.legend() plt.grid(True) plt.show()7. 实际应用与优化建议在实际项目中我发现几个关键点能显著提高分析质量数据质量检查清洗前先全面了解数据问题制定系统的清洗策略特征工程除了基本时间特征考虑添加天气、学期阶段等外部变量模型选择简单模型往往更稳健复杂模型需要更多数据和调优对于校园单车系统优化数据分析可以支持以下决策高峰时段调度根据预测模型提前调配车辆停车点布局识别使用率过低或过高的点位维护计划结合使用频率安排检修

更多文章