🐼pandas基础入门

1. pip配置详解

全局配置文件位置

  • Windows: %APPDATA%\pip\pip.ini
  • macOS/Linux: ~/.pip/pip.conf

推荐配置(清华源)

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
trusted-host = pypi.tuna.tsinghua.edu.cn
timeout = 6000

[install]
upgrade-strategy = only-if-needed

2. 虚拟环境管理(推荐)

创建虚拟环境

# 使用venv
python -m venv myenv

# 激活环境
# Linux/Mac
source myenv/bin/activate
# Windows
myenv\Scripts\activate

安装必要包

pip install pandas numpy scikit-learn matplotlib seaborn plotly jupyter

3. 基础pandas建模数据准备

生成示例销售数据集

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler, LabelEncoder

# 生成模拟销售数据
np.random.seed(42)
n_samples = 1000

data = {
    'date': pd.date_range('2022-01-01', periods=n_samples, freq='D'),
    'product_category': np.random.choice(['Electronics', 'Clothing', 'Books', 'Home'], n_samples),
    'price': np.random.uniform(10, 500, n_samples),
    'discount': np.random.uniform(0, 0.3, n_samples),
    'advertising_spend': np.random.uniform(100, 5000, n_samples),
    'competitor_price': np.random.uniform(15, 600, n_samples),
    'season': np.random.choice(['Spring', 'Summer', 'Fall', 'Winter'], n_samples),
    'customer_rating': np.random.uniform(1, 5, n_samples),
    'sales_volume': np.random.poisson(50, n_samples)
}

df = pd.DataFrame(data)
df['sales_amount'] = df['price'] * df['sales_volume'] * (1 - df['discount'])

数据概览

print("数据集概览:")
print(df.head())
print(f"\n数据形状: {df.shape}")
print(f"\n数据类型:\n{df.dtypes}")
print(f"\n缺失值检查:\n{df.isnull().sum()}")

4. 数据探索与清洗

统计信息分析

print("数值列统计信息:")
print(df.describe())

print("\n分类列统计信息:")
for col in ['product_category', 'season']:
    print(f"{col} 分布:")
    print(df[col].value_counts())
    print()

异常值处理

def remove_outliers(df, column):
    """使用IQR方法去除异常值"""
    Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    IQR = Q3 - Q1
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR
    return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]

# 应用异常值处理
df_cleaned = remove_outliers(df, 'sales_amount')
print(f"去除异常值前: {len(df)} 行")
print(f"去除异常值后: {len(df_cleaned)} 行")

5. 特征工程

时间特征提取

# 从日期提取特征
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek
df['quarter'] = df['date'].dt.quarter

# 创建业务特征
df['price_competition_ratio'] = df['price'] / df['competitor_price']
df['advertising_efficiency'] = df['sales_amount'] / df['advertising_spend']

分类变量编码

# 标签编码
le = LabelEncoder()
df['category_encoded'] = le.fit_transform(df['product_category'])
df['season_encoded'] = le.fit_transform(df['season'])

相关性分析

# 计算相关性矩阵
numeric_cols = df_cleaned.select_dtypes(include=[np.number]).columns.tolist()
correlation_matrix = df_cleaned[numeric_cols].corr()

# 可视化相关性热力图
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0, 
            square=True, fmt='.2f')
plt.title('特征相关性热力图')
plt.tight_layout()
plt.show()

6. 建模准备

特征选择与数据分割

# 选择特征列
feature_cols = ['price', 'discount', 'advertising_spend', 'competitor_price', 
                'customer_rating', 'month', 'day_of_week', 'category_encoded', 
                'season_encoded', 'price_competition_ratio', 'advertising_efficiency']

X = df_cleaned[feature_cols]
y = df_cleaned['sales_amount']

# 数据分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 特征标准化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

8. 模型训练与评估

线性回归模型

lr_model = LinearRegression()
lr_model.fit(X_train_scaled, y_train)
lr_pred = lr_model.predict(X_test_scaled)

lr_mse = mean_squared_error(y_test, lr_pred)
lr_r2 = r2_score(y_test, lr_pred)

print(f"线性回归 - MSE: {lr_mse:.2f}, R²: {lr_r2:.4f}")

随机森林模型

rf_model = RandomForestRegressor(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)  # 随机森林不需要标准化
rf_pred = rf_model.predict(X_test)

rf_mse = mean_squared_error(y_test, rf_pred)
rf_r2 = r2_score(y_test, rf_pred)

print(f"随机森林 - MSE: {rf_mse:.2f}, R²: {rf_r2:.4f}")

特征重要性分析

feature_importance = pd.DataFrame({
    'feature': feature_cols,
    'importance': rf_model.feature_importances_
}).sort_values('importance', ascending=False)

plt.figure(figsize=(10, 6))
sns.barplot(data=feature_importance, x='importance', y='feature')
plt.title('随机森林特征重要性')
plt.xlabel('重要性得分')
plt.tight_layout()
plt.show()

模型预测可视化

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 线性回归结果
ax1.scatter(y_test, lr_pred, alpha=0.6)
ax1.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
ax1.set_xlabel('实际销售额')
ax1.set_ylabel('预测销售额')
ax1.set_title(f'线性回归预测结果\nR² = {lr_r2:.4f}')

# 随机森林结果
ax2.scatter(y_test, rf_pred, alpha=0.6, color='orange')
ax2.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
ax2.set_xlabel('实际销售额')
ax2.set_ylabel('预测销售额')
ax2.set_title(f'随机森林预测结果\nR² = {rf_r2:.4f}')

plt.tight_layout()
plt.show()

11. 时间序列建模示例

数据聚合与特征工程

# 按日期聚合数据
ts_data = df_cleaned.groupby('date').agg({
    'sales_amount': 'sum',
    'advertising_spend': 'mean',
    'customer_rating': 'mean'
}).reset_index()

ts_data.set_index('date', inplace=True)

# 创建滞后特征
for i in range(1, 8):  # 过去7天的滞后特征
    ts_data[f'sales_lag_{i}'] = ts_data['sales_amount'].shift(i)

ts_data.dropna(inplace=True)

时间序列模型训练

# 准备特征
ts_feature_cols = [f'sales_lag_{i}' for i in range(1, 8)] + ['advertising_spend', 'customer_rating']
X_ts = ts_data[ts_feature_cols]
y_ts = ts_data['sales_amount']

# 分割数据
split_idx = int(len(X_ts) * 0.8)
X_ts_train, X_ts_test = X_ts[:split_idx], X_ts[split_idx:]
y_ts_train, y_ts_test = y_ts[:split_idx], y_ts[split_idx:]

# 训练模型
ts_model = RandomForestRegressor(n_estimators=50, random_state=42)
ts_model.fit(X_ts_train, y_ts_train)
ts_pred = ts_model.predict(X_ts_test)

ts_mse = mean_squared_error(y_ts_test, ts_pred)
ts_r2 = r2_score(y_ts_test, ts_pred)

print(f"时间序列模型 - MSE: {ts_mse:.2f}, R²: {ts_r2:.4f}")

时间序列预测可视化

plt.figure(figsize=(14, 6))
plt.plot(y_ts_test.index, y_ts_test.values, label='实际销售额', linewidth=2)
plt.plot(y_ts_test.index, ts_pred, label='预测销售额', linewidth=2)
plt.title('时间序列预测结果')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

pip常用命令总结

命令示例说明
安装包pip install package_name安装指定包
安装特定版本pip install package_name==1.0.0安装指定版本
升级包pip install --upgrade package_name升级到最新版本
卸载包pip uninstall package_name卸载指定包
列出已安装包pip list显示所有已安装包
查看包信息pip show package_name显示包详细信息
生成requirementspip freeze > requirements.txt导出依赖列表
从requirements安装pip install -r requirements.txt批量安装依赖
查看pip配置pip config list显示当前配置

最佳实践建议

  1. 环境管理

    • 始终使用虚拟环境隔离项目依赖
    • 使用requirements.txt管理依赖版本
    • 定期更新pip和包版本
  2. 数据预处理

    • 充分探索数据分布和相关性
    • 合理处理缺失值和异常值
    • 创建有业务意义的特征
  3. 建模策略

    • 从简单模型开始,逐步尝试复杂模型
    • 使用交叉验证评估模型稳定性
    • 分析特征重要性,优化特征选择
  4. 模型评估

    • 使用多个评估指标综合判断
    • 可视化预测结果,直观理解模型表现
    • 考虑业务场景选择合适的模型

建模结果总结

print(f"建模总结:")
print(f"线性回归R²: {lr_r2:.4f}")
print(f"随机森林R²: {rf_r2:.4f}")
print(f"时间序列模型R²: {ts_r2:.4f}")
print(f"最佳模型: {'随机森林' if rf_r2 > lr_r2 else '线性回归'}")

添加新评论