Python 项目实战

通过实际项目综合运用所学知识,巩固和提升你的 Python 技能

项目实战

以下是几个综合项目,帮助你巩固所学的 Python、数据处理和 AI 知识:

项目 1:电商销售数据分析

分析电商平台的销售数据,了解销售趋势、热门产品和客户行为。

# 电商销售数据分析项目
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 设置样式
sns.set(style="whitegrid")

# 1. 生成模拟数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', '2023-12-31', freq='D')
products = ['Product A', 'Product B', 'Product C', 'Product D', 'Product E']
categories = ['Electronics', 'Clothing', 'Home', 'Beauty', 'Sports']

# 生成销售数据
data = []
for date in dates:
    for i, product in enumerate(products):
        sales = np.random.randint(10, 100)
        revenue = sales * np.random.uniform(10, 100)
        category = categories[i % len(categories)]
        data.append([date, product, category, sales, revenue])

# 创建 DataFrame
df = pd.DataFrame(data, columns=['date', 'product', 'category', 'sales', 'revenue'])
print("数据前 5 行:")
print(df.head())
print("\n数据形状:", df.shape)

# 2. 数据预处理
# 提取月份和季度
df['month'] = df['date'].dt.month
df['quarter'] = df['date'].dt.quarter

# 3. 数据分析
# 月度销售趋势
monthly_sales = df.groupby('month')[['sales', 'revenue']].sum().reset_index()
print("\n月度销售数据:")
print(monthly_sales)

# 产品销售情况
product_sales = df.groupby('product')[['sales', 'revenue']].sum().reset_index()
product_sales = product_sales.sort_values('revenue', ascending=False)
print("\n产品销售排名:")
print(product_sales)

# 类别销售情况
category_sales = df.groupby('category')[['sales', 'revenue']].sum().reset_index()
print("\n类别销售情况:")
print(category_sales)

# 4. 数据可视化
# 月度销售趋势
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.lineplot(x='month', y='sales', data=monthly_sales, marker='o')
plt.title('月度销售数量趋势')
plt.xlabel('月份')
plt.ylabel('销售数量')

plt.subplot(1, 2, 2)
sns.lineplot(x='month', y='revenue', data=monthly_sales, marker='o', color='green')
plt.title('月度销售收入趋势')
plt.xlabel('月份')
plt.ylabel('销售收入')
plt.tight_layout()
# plt.show()

# 产品销售对比
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.barplot(x='product', y='sales', data=product_sales)
plt.title('各产品销售数量')
plt.xlabel('产品')
plt.ylabel('销售数量')
plt.xticks(rotation=45)

plt.subplot(1, 2, 2)
sns.barplot(x='product', y='revenue', data=product_sales, color='green')
plt.title('各产品销售收入')
plt.xlabel('产品')
plt.ylabel('销售收入')
plt.xticks(rotation=45)
plt.tight_layout()
# plt.show()

# 类别销售占比
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.pie(category_sales['sales'], labels=category_sales['category'], autopct='%1.1f%%')
plt.title('各类别销售数量占比')

plt.subplot(1, 2, 2)
plt.pie(category_sales['revenue'], labels=category_sales['category'], autopct='%1.1f%%')
plt.title('各类别销售收入占比')
plt.tight_layout()
# plt.show()

# 5. 结论和建议
print("\n=== 分析结论 ===")
print(f"1. 最畅销的产品是: {product_sales.iloc[0]['product']}")
print(f"2. 贡献收入最多的产品是: {product_sales.iloc[0]['product']}")
print(f"3. 最畅销的类别是: {category_sales.sort_values('sales', ascending=False).iloc[0]['category']}")
print(f"4. 贡献收入最多的类别是: {category_sales.sort_values('revenue', ascending=False).iloc[0]['category']}")
print("5. 销售高峰期出现在第 {} 季度".format(monthly_sales.groupby('quarter')['sales'].sum().idxmax()))

print("\n=== 业务建议 ===")
print("1. 针对畅销产品和类别,可考虑增加库存和促销活动")
print("2. 对于销售表现不佳的产品,可考虑优化营销策略或调整价格")
print("3. 在销售高峰期前做好库存准备")
print("4. 进一步分析客户购买行为,优化产品推荐策略")

提示: 你可以使用真实的电商销售数据来进行分析,例如从 Kaggle 上下载公开数据集。

项目 2:房价预测

使用机器学习模型预测房价,基于房屋的各种特征。

# 房价预测项目
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 设置样式
sns.set(style="whitegrid")

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

# 特征
area = np.random.randint(500, 3000, n_samples)  # 面积(平方英尺)
bedrooms = np.random.randint(1, 6, n_samples)  # 卧室数量
bathrooms = np.random.randint(1, 5, n_samples)  # 浴室数量
year_built = np.random.randint(1950, 2023, n_samples)  # 建造年份
garage = np.random.randint(0, 4, n_samples)  # 车库数量

# 目标变量:房价(基于特征生成,添加一些噪声)
price = (area * 100 + 
         bedrooms * 50000 + 
         bathrooms * 30000 + 
         (2023 - year_built) * 1000 + 
         garage * 20000 + 
         np.random.normal(0, 50000, n_samples))

# 创建 DataFrame
df = pd.DataFrame({
    'area': area,
    'bedrooms': bedrooms,
    'bathrooms': bathrooms,
    'year_built': year_built,
    'garage': garage,
    'price': price
})

print("数据前 5 行:")
print(df.head())
print("\n数据形状:", df.shape)

# 2. 数据探索
# 相关性分析
corr = df.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(corr, annot=True, cmap="coolwarm")
plt.title('特征相关性热力图')
# plt.show()

# 特征与目标变量的关系
plt.figure(figsize=(15, 10))
features = ['area', 'bedrooms', 'bathrooms', 'year_built', 'garage']
for i, feature in enumerate(features, 1):
    plt.subplot(2, 3, i)
    sns.scatterplot(x=feature, y='price', data=df)
    plt.title(f'{feature} vs price')
plt.tight_layout()
# plt.show()

# 3. 数据预处理
# 划分特征和目标变量
X = df.drop('price', axis=1)
y = df['price']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print("\n训练集大小:", X_train.shape)
print("测试集大小:", X_test.shape)

# 特征缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# 4. 模型训练和评估
models = {
    '线性回归': LinearRegression(),
    '岭回归': Ridge(),
    'LASSO回归': Lasso(),
    '随机森林': RandomForestRegressor(n_estimators=100, random_state=42)
}

results = {}
for name, model in models.items():
    # 训练模型
    model.fit(X_train_scaled, y_train)
    
    # 预测
    y_pred = model.predict(X_test_scaled)
    
    # 评估
    mse = mean_squared_error(y_test, y_pred)
    rmse = np.sqrt(mse)
    r2 = r2_score(y_test, y_pred)
    
    results[name] = {
        'MSE': mse,
        'RMSE': rmse,
        'R²': r2
    }
    
    print(f"\n{name} 模型评估:")
    print(f"MSE: {mse:.2f}")
    print(f"RMSE: {rmse:.2f}")
    print(f"R²: {r2:.2f}")

# 5. 模型比较
results_df = pd.DataFrame(results).T
print("\n模型性能比较:")
print(results_df)

# 可视化模型性能
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
sns.barplot(x=results_df.index, y='RMSE', data=results_df)
plt.title('各模型 RMSE 比较')
plt.ylabel('RMSE')

plt.subplot(1, 2, 2)
sns.barplot(x=results_df.index, y='R²', data=results_df)
plt.title('各模型 R² 比较')
plt.ylabel('R²')
plt.tight_layout()
# plt.show()

# 6. 特征重要性(仅适用于随机森林)
if '随机森林' in models:
    rf_model = models['随机森林']
    feature_importance = pd.DataFrame({
        'feature': X.columns,
        'importance': rf_model.feature_importances_
    }).sort_values('importance', ascending=False)
    
    print("\n特征重要性:")
    print(feature_importance)
    
    plt.figure(figsize=(10, 6))
    sns.barplot(x='importance', y='feature', data=feature_importance)
    plt.title('随机森林特征重要性')
    # plt.show()

# 7. 模型应用
# 使用最佳模型进行预测
best_model_name = results_df['R²'].idxmax()
best_model = models[best_model_name]
print(f"\n最佳模型: {best_model_name}")

# 预测新数据
new_data = np.array([[2000, 3, 2, 2010, 2]])  # 面积2000平方英尺,3卧室,2浴室,2010年建造,2车库
new_data_scaled = scaler.transform(new_data)
predicted_price = best_model.predict(new_data_scaled)
print(f"\n新房屋预测价格: ${predicted_price[0]:,.2f}")

提示: 你可以使用真实的房价数据集,例如 Kaggle 上的 Boston Housing 数据集或 Ames Housing 数据集。

项目 3:简易天气应用

创建一个简易的天气应用,使用 Python 和 Flask 框架,调用天气 API 获取天气数据。

# 简易天气应用
# 注:这是一个 Flask 应用,需要安装 Flask 和 requests 库

"""
安装依赖:
pip install flask requests

运行应用:
python app.py

然后在浏览器中访问:http://localhost:5000
"""

from flask import Flask, render_template, request
import requests

app = Flask(__name__)

# 替换为你的 OpenWeatherMap API 密钥
API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://api.openweathermap.org/data/2.5/weather'

@app.route('/', methods=['GET', 'POST'])
def index():
    weather_data = None
    error = None
    
    if request.method == 'POST':
        city = request.form.get('city')
        if city:
            try:
                # 构建 API 请求 URL
                params = {
                    'q': city,
                    'appid': API_KEY,
                    'units': 'metric',  # 使用摄氏度
                    'lang': 'zh_cn'  # 使用中文
                }
                
                # 发送 API 请求
                response = requests.get(BASE_URL, params=params)
                response.raise_for_status()  # 检查请求是否成功
                
                # 解析响应数据
                data = response.json()
                
                # 提取需要的信息
                weather_data = {
                    'city': data['name'],
                    'country': data['sys']['country'],
                    'temperature': data['main']['temp'],
                    'humidity': data['main']['humidity'],
                    'wind_speed': data['wind']['speed'],
                    'description': data['weather'][0]['description'],
                    'icon': data['weather'][0]['icon']
                }
                
            except Exception as e:
                error = f"获取天气数据失败: {str(e)}"
        else:
            error = "请输入城市名称"
    
    return render_template('index.html', weather_data=weather_data, error=error)

if __name__ == '__main__':
    app.run(debug=True)

"""




    
    
    简易天气应用
    


    

简易天气应用

{% if error %} {% endif %} {% if weather_data %}

{{ weather_data.city }}, {{ weather_data.country }}

{{ weather_data.description }}

{{ weather_data.temperature }}°C

湿度

{{ weather_data.humidity }}%

风速

{{ weather_data.wind_speed }} m/s

{% endif %}
""" # 项目扩展建议: # 1. 添加历史天气数据查询功能 # 2. 实现天气预报功能(使用 OpenWeatherMap 的 forecast API) # 3. 添加地理位置自动检测 # 4. 优化 UI 设计,添加响应式布局 # 5. 实现数据可视化,显示温度变化趋势 # 6. 添加多个城市天气对比功能 # 7. 实现天气数据缓存,减少 API 请求 # 8. 添加用户收藏城市功能 # 9. 实现多语言支持 # 10. 部署到云平台,如 Heroku 或 Vercel

提示: 你需要在 OpenWeatherMap 网站注册并获取 API 密钥才能使用这个应用。

项目规划建议

完成以上项目后,你可以尝试以下项目来进一步提升你的 Python 技能:

数据分析类项目

  • 股票市场分析
  • 社交媒体数据分析
  • 客户行为分析
  • 健康数据分析
  • 交通数据分析

机器学习类项目

  • 图像分类(猫狗识别)
  • 情感分析
  • 推荐系统
  • 异常检测
  • 时间序列预测

Web 应用类项目

  • 个人博客系统
  • 任务管理应用
  • 在线商城
  • 图书管理系统
  • 聊天应用

自动化工具类项目

  • 文件整理工具
  • 数据备份工具
  • 网页爬虫
  • 邮件自动发送工具
  • 社交媒体自动发布工具