使用VSCode开发少儿编程项目:天气数据分析和可视化
我将为您创建一个完整的天气数据分析和可视化项目,适合在VSCode中使用Python开发。这个项目包含数据生成、分析和可视化功能。
项目概述
这个天气数据分析项目将包含以下核心功能:
- 生成一个月的模拟天气数据
- 数据分析(统计、趋势分析)
- 多种可视化图表(折线图、柱状图、热力图等)
- 交互式界面
- 数据导出功能
项目结构
weather-analysis/
│
├── main.py
├── weather_data.py
├── visualization.py
├── analysis.py
├── requirements.txt
└── README.md
代码实现
1. requirements.txt
matplotlib>=3.5.0
pandas>=1.4.0
numpy>=1.21.0
seaborn>=0.11.0
scipy>=1.7.0
2. weather_data.py - 天气数据生成模块
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
import random
class WeatherDataGenerator:
def __init__(self, year=2024, month=3):
self.year = year
self.month = month
self.weather_conditions = ['晴', '多云', '阴', '小雨', '中雨', '大雨', '雷阵雨', '雪']
def generate_monthly_data(self):
"""生成一个月的天气数据"""
# 创建日期范围
start_date = datetime(self.year, self.month, 1)
if self.month == 12:
end_date = datetime(self.year + 1, 1, 1) - timedelta(days=1)
else:
end_date = datetime(self.year, self.month + 1, 1) - timedelta(days=1)
dates = pd.date_range(start=start_date, end=end_date, freq='D')
data = []
base_temp = 15 # 基础温度
for i, date in enumerate(dates):
# 温度模拟(考虑季节性变化)
day_of_year = date.timetuple().tm_yday
seasonal_factor = 10 * np.sin(2 * np.pi * (day_of_year - 80) / 365)
# 生成每日数据
max_temp = base_temp + seasonal_factor + random.uniform(-3, 8)
min_temp = max_temp - random.uniform(5, 12)
avg_temp = (max_temp + min_temp) / 2
# 湿度(与天气状况相关)
humidity = random.randint(30, 95)
# 降水量
precipitation = random.uniform(0, 25) if random.random() < 0.3 else 0
# 风速
wind_speed = random.uniform(0, 15)
# 天气状况(基于概率)
condition_weights = [0.3, 0.25, 0.15, 0.1, 0.08, 0.05, 0.05, 0.02]
weather_condition = random.choices(self.weather_conditions, weights=condition_weights)[0]
# 气压
pressure = 1013 + random.uniform(-20, 20)
data.append({
'日期': date.strftime('%Y-%m-%d'),
'星期': date.strftime('%A'),
'最高温度(°C)': round(max_temp, 1),
'最低温度(°C)': round(min_temp, 1),
'平均温度(°C)': round(avg_temp, 1),
'湿度(%)': humidity,
'降水量(mm)': round(precipitation, 1),
'风速(km/h)': round(wind_speed, 1),
'天气状况': weather_condition,
'气压(hPa)': round(pressure, 1)
})
return pd.DataFrame(data)
def save_to_csv(self, filename='weather_data.csv'):
"""保存数据到CSV文件"""
df = self.generate_monthly_data()
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"天气数据已保存到 {filename}")
return df
def load_from_csv(self, filename='weather_data.csv'):
"""从CSV文件加载数据"""
try:
df = pd.read_csv(filename, encoding='utf-8-sig')
df['日期'] = pd.to_datetime(df['日期'])
return df
except FileNotFoundError:
print(f"文件 {filename} 不存在,正在生成新数据...")
return self.save_to_csv(filename)
# 测试数据生成
if __name__ == "__main__":
generator = WeatherDataGenerator(2024, 3)
df = generator.generate_monthly_data()
print(df.head())
print(f"\n数据统计:")
print(f"总天数: {len(df)}")
print(f"温度范围: {df['最低温度(°C)'].min():.1f}°C - {df['最高温度(°C)'].max():.1f}°C")
print(f"平均温度: {df['平均温度(°C)'].mean():.1f}°C")
3. analysis.py - 数据分析模块
import pandas as pd
import numpy as np
from scipy import stats
class WeatherAnalyzer:
def __init__(self, df):
self.df = df
self.analysis_results = {}
def basic_statistics(self):
"""计算基本统计信息"""
stats_df = self.df.describe()
# 添加额外的统计信息
additional_stats = {
'温度范围(°C)': f"{self.df['最低温度(°C)'].min():.1f} - {self.df['最高温度(°C)'].max():.1f}",
'平均温差(°C)': f"{(self.df['最高温度(°C)'] - self.df['最低温度(°C)']).mean():.1f}",
'总降水量(mm)': f"{self.df['降水量(mm)'].sum():.1f}",
'雨天数量': f"{(self.df['降水量(mm)'] > 0).sum()}",
'最常见天气': f"{self.df['天气状况'].mode().iloc[0]}"
}
self.analysis_results['basic_stats'] = stats_df
self.analysis_results['additional_stats'] = additional_stats
return stats_df, additional_stats
def temperature_trend_analysis(self):
"""温度趋势分析"""
dates = pd.to_datetime(self.df['日期'])
avg_temps = self.df['平均温度(°C)']
# 线性回归分析趋势
x = np.arange(len(avg_temps))
slope, intercept, r_value, p_value, std_err = stats.linregress(x, avg_temps)
trend_analysis = {
'趋势斜率': slope, # 正数表示升温趋势
'相关系数(R²)': r_value**2,
'趋势强度': '上升' if slope > 0 else '下降',
'平均变化率(°C/天)': abs(slope)
}
self.analysis_results['trend_analysis'] = trend_analysis
return trend_analysis
def weather_patterns(self):
"""天气模式分析"""
# 天气状况分布
weather_counts = self.df['天气状况'].value_counts()
weather_percentages = (weather_counts / len(self.df) * 100).round(1)
# 温度区间分析
temp_bins = [0, 10, 20, 30, 40]
temp_labels = ['寒冷(0-10°C)', '凉爽(10-20°C)', '温暖(20-30°C)', '炎热(30-40°C)']
self.df['温度区间'] = pd.cut(self.df['平均温度(°C)'], bins=temp_bins, labels=temp_labels)
temp_distribution = self.df['温度区间'].value_counts()
patterns = {
'天气状况分布': dict(weather_percentages),
'温度区间分布': dict(temp_distribution),
'最常出现天气': weather_counts.index[0],
'晴天比例': f"{weather_percentages.get('晴', 0):.1f}%"
}
self.analysis_results['weather_patterns'] = patterns
return patterns
def correlation_analysis(self):
"""相关性分析"""
numeric_columns = ['最高温度(°C)', '最低温度(°C)', '平均温度(°C)', '湿度(%)',
'降水量(mm)', '风速(km/h)', '气压(hPa)']
correlation_matrix = self.df[numeric_columns].corr()
# 找出最强的正相关和负相关
corr_pairs = []
for i in range(len(correlation_matrix.columns)):
for j in range(i+1, len(correlation_matrix.columns)):
corr_pairs.append({
'变量1': correlation_matrix.columns[i],
'变量2': correlation_matrix.columns[j],
'相关系数': correlation_matrix.iloc[i, j]
})
# 按绝对值排序
corr_pairs.sort(key=lambda x: abs(x['相关系数']), reverse=True)
correlation_insights = {
'最强正相关': f"{corr_pairs[0]['变量1']} 和 {corr_pairs[0]['变量2']} (r={corr_pairs[0]['相关系数']:.3f})",
'最强负相关': f"{corr_pairs[1]['变量1']} 和 {corr_pairs[1]['变量2']} (r={corr_pairs[1]['相关系数']:.3f})",
'温度-湿度关系': f"r={correlation_matrix.loc['平均温度(°C)', '湿度(%)']:.3f}",
'完整相关矩阵': correlation_matrix
}
self.analysis_results['correlation'] = correlation_insights
return correlation_insights
def comprehensive_analysis(self):
"""综合分析"""
print("正在进行天气数据分析...")
basic_stats, additional_stats = self.basic_statistics()
trend = self.temperature_trend_analysis()
patterns = self.weather_patterns()
correlation = self.correlation_analysis()
print("\n" + "="*50)
print("天气数据分析报告")
print("="*50)
print(f"\n📊 基本统计:")
for key, value in additional_stats.items():
print(f" {key}: {value}")
print(f"\n📈 温度趋势:")
print(f" 整体趋势: {trend['趋势强度']} (斜率: {trend['趋势斜率']:.3f})")
print(f" 趋势可靠性: R² = {trend['相关系数(R²)']:.3f}")
print(f"\n🌤️ 天气模式:")
print(f" 最常见天气: {patterns['最常出现天气']}")
print(f" 晴天比例: {patterns['晴天比例']}")
print(f"\n🔗 相关性分析:")
print(f" {correlation['最强正相关']}")
print(f" {correlation['最强负相关']}")
return self.analysis_results
# 测试分析功能
if __name__ == "__main__":
from weather_data import WeatherDataGenerator
generator = WeatherDataGenerator()
df = generator.generate_monthly_data()
analyzer = WeatherAnalyzer(df)
results = analyzer.comprehensive_analysis()
4. visualization.py - 数据可视化模块
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from matplotlib.font_manager import FontProperties
import matplotlib.dates as mdates
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
class WeatherVisualizer:
def __init__(self, df):
self.df = df
self.df['日期'] = pd.to_datetime(self.df['日期'])
self.fig_size = (12, 8)
def create_temperature_trend(self):
"""创建温度趋势图"""
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=self.fig_size)
# 温度折线图
ax1.plot(self.df['日期'], self.df['最高温度(°C)'], 'r-', label='最高温度', linewidth=2, marker='o')
ax1.plot(self.df['日期'], self.df['最低温度(°C)'], 'b-', label='最低温度', linewidth=2, marker='s')
ax1.plot(self.df['日期'], self.df['平均温度(°C)'], 'g-', label='平均温度', linewidth=2, marker='^')
ax1.set_title('温度变化趋势', fontsize=16, fontweight='bold')
ax1.set_ylabel('温度 (°C)')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 格式化x轴日期
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.setp(ax1.xaxis.get_majorticklabels(), rotation=45)
# 温度区间填充
ax1.fill_between(self.df['日期'], self.df['最低温度(°C)'], self.df['最高温度(°C)'],
alpha=0.3, color='gray')
# 柱状图 - 温差
daily_range = self.df['最高温度(°C)'] - self.df['最低温度(°C)']
ax2.bar(self.df['日期'], daily_range, color='orange', alpha=0.7, label='日温差')
ax2.set_title('日温差', fontsize=14)
ax2.set_ylabel('温差 (°C)')
ax2.set_xlabel('日期')
ax2.grid(True, alpha=0.3)
# 格式化x轴日期
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.setp(ax2.xaxis.get_majorticklabels(), rotation=45)
plt.tight_layout()
return fig
def create_weather_condition_chart(self):
"""创建天气状况图表"""
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=self.fig_size)
# 天气状况饼图
weather_counts = self.df['天气状况'].value_counts()
colors = plt.cm.Set3(np.linspace(0, 1, len(weather_counts)))
ax1.pie(weather_counts.values, labels=weather_counts.index, autopct='%1.1f%%',
colors=colors, startangle=90)
ax1.set_title('天气状况分布', fontsize=14, fontweight='bold')
# 降水量柱状图
precipitation_data = self.df[self.df['降水量(mm)'] > 0]
if not precipitation_data.empty:
ax2.bar(precipitation_data['日期'].dt.strftime('%m/%d'),
precipitation_data['降水量(mm)'],
color='blue', alpha=0.7)
ax2.set_title('降水量分布', fontsize=14)
ax2.set_ylabel('降水量 (mm)')
ax2.tick_params(axis='x', rotation=45)
else:
ax2.text(0.5, 0.5, '本月无降水', ha='center', va='center',
transform=ax2.transAxes, fontsize=12)
plt.tight_layout()
return fig
def create_correlation_heatmap(self):
"""创建相关性热力图"""
numeric_columns = ['最高温度(°C)', '最低温度(°C)', '平均温度(°C)', '湿度(%)',
'降水量(mm)', '风速(km/h)', '气压(hPa)']
correlation_matrix = self.df[numeric_columns].corr()
fig, ax = plt.subplots(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0,
square=True, ax=ax, fmt='.2f', cbar_kws={'shrink': 0.8})
ax.set_title('天气参数相关性热力图', fontsize=16, fontweight='bold')
plt.tight_layout()
return fig
def create_multivariate_analysis(self):
"""创建多变量分析图"""
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(14, 10))
# 温度 vs 湿度
scatter = ax1.scatter(self.df['平均温度(°C)'], self.df['湿度(%)'],
c=self.df['降水量(mm)'], cmap='Blues', alpha=0.7, s=60)
ax1.set_xlabel('平均温度 (°C)')
ax1.set_ylabel('湿度 (%)')
ax1.set_title('温度 vs 湿度 (颜色表示降水量)')
plt.colorbar(scatter, ax=ax1)
# 风速分布
ax2.hist(self.df['风速(km/h)'], bins=10, color='lightgreen', alpha=0.7, edgecolor='black')
ax2.set_xlabel('风速 (km/h)')
ax2.set_ylabel('频次')
ax2.set_title('风速分布')
ax2.grid(True, alpha=0.3)
# 气压变化
ax3.plot(self.df['日期'], self.df['气压(hPa)'], 'purple', linewidth=2, marker='o')
ax3.set_xlabel('日期')
ax3.set_ylabel('气压 (hPa)')
ax3.set_title('气压变化趋势')
ax3.grid(True, alpha=0.3)
ax3.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.setp(ax3.xaxis.get_majorticklabels(), rotation=45)
# 天气状况时间线
weather_colors = {'晴': 'yellow', '多云': 'lightblue', '阴': 'gray',
'小雨': 'blue', '中雨': 'darkblue', '大雨': 'navy',
'雷阵雨': 'purple', '雪': 'white'}
for i, (date, condition) in enumerate(zip(self.df['日期'], self.df['天气状况'])):
ax4.scatter(date, 1, color=weather_colors.get(condition, 'black'),
s=100, label=condition if i == 0 else "")
ax4.set_xlabel('日期')
ax4.set_yticks([])
ax4.set_title('天气状况时间线')
ax4.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.setp(ax4.xaxis.get_majorticklabels(), rotation=45)
# 添加图例(不重复)
handles, labels = ax4.get_legend_handles_labels()
by_label = dict(zip(labels, handles))
ax4.legend(by_label.values(), by_label.keys(), loc='upper left', bbox_to_anchor=(1, 1))
plt.tight_layout()
return fig
def create_summary_dashboard(self):
"""创建综合仪表板"""
fig = plt.figure(figsize=(16, 12))
# 创建子图布局
gs = fig.add_gridspec(3, 3)
# 1. 温度趋势(占据第一行)
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(self.df['日期'], self.df['最高温度(°C)'], 'r-', label='最高温度', linewidth=2)
ax1.plot(self.df['日期'], self.df['最低温度(°C)'], 'b-', label='最低温度', linewidth=2)
ax1.fill_between(self.df['日期'], self.df['最低温度(°C)'], self.df['最高温度(°C)'],
alpha=0.3, color='gray')
ax1.set_title('温度变化趋势', fontsize=14, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
# 2. 天气状况饼图
ax2 = fig.add_subplot(gs[1, 0])
weather_counts = self.df['天气状况'].value_counts()
colors = plt.cm.Pastel1(np.linspace(0, 1, len(weather_counts)))
ax2.pie(weather_counts.values, labels=weather_counts.index, autopct='%1.1f%%', colors=colors)
ax2.set_title('天气状况分布')
# 3. 降水量
ax3 = fig.add_subplot(gs[1, 1])
rainy_days = self.df[self.df['降水量(mm)'] > 0]
if not rainy_days.empty:
ax3.bar(rainy_days['日期'].dt.strftime('%m/%d'), rainy_days['降水量(mm)'], color='blue')
ax3.set_title('降水量')
plt.setp(ax3.xaxis.get_majorticklabels(), rotation=45)
# 4. 湿度趋势
ax4 = fig.add_subplot(gs[1, 2])
ax4.plot(self.df['日期'], self.df['湿度(%)'], 'g-', linewidth=2)
ax4.set_title('湿度变化')
ax4.grid(True, alpha=0.3)
ax4.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
# 5. 相关性热力图(占据第三行)
ax5 = fig.add_subplot(gs[2, :])
numeric_columns = ['最高温度(°C)', '最低温度(°C)', '平均温度(°C)', '湿度(%)', '降水量(mm)', '风速(km/h)']
correlation_matrix = self.df[numeric_columns].corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0, ax=ax5)
ax5.set_title('天气参数相关性')
plt.tight_layout()
return fig
def save_all_charts(self, prefix='weather_chart'):
"""保存所有图表"""
charts = {
f'{prefix}_temperature.png': self.create_temperature_trend,
f'{prefix}_weather_condition.png': self.create_weather_condition_chart,
f'{prefix}_correlation.png': self.create_correlation_heatmap,
f'{prefix}_multivariate.png': self.create_multivariate_analysis,
f'{prefix}_dashboard.png': self.create_summary_dashboard
}
for filename, chart_func in charts.items():
fig = chart_func()
fig.savefig(filename, dpi=300, bbox_inches='tight')
plt.close(fig)
print(f"图表已保存: {filename}")
# 测试可视化功能
if __name__ == "__main__":
from weather_data import WeatherDataGenerator
generator = WeatherDataGenerator()
df = generator.generate_monthly_data()
visualizer = WeatherVisualizer(df)
# 显示温度趋势图
fig1 = visualizer.create_temperature_trend()
plt.show()
# 保存所有图表
visualizer.save_all_charts()
5. main.py - 主程序
import pandas as pd
import matplotlib.pyplot as plt
from weather_data import WeatherDataGenerator
from analysis import WeatherAnalyzer
from visualization import WeatherVisualizer
import os
class WeatherAnalysisApp:
def __init__(self):
self.df = None
self.generator = WeatherDataGenerator()
self.analyzer = None
self.visualizer = None
def load_data(self, use_existing=True):
"""加载天气数据"""
if use_existing and os.path.exists('weather_data.csv'):
self.df = self.generator.load_from_csv('weather_data.csv')
else:
self.df = self.generator.save_to_csv('weather_data.csv')
self.analyzer = WeatherAnalyzer(self.df)
self.visualizer = WeatherVisualizer(self.df)
print(f"✅ 成功加载 {len(self.df)} 天的天气数据")
return self.df
def show_data_preview(self):
"""显示数据预览"""
print("\n📋 数据预览:")
print(self.df.head(10))
print(f"\n📊 数据基本信息:")
print(f" 数据形状: {self.df.shape}")
print(f" 日期范围: {self.df['日期'].min()} 到 {self.df['日期'].max()}")
print(f" 数据类型:")
for col in self.df.columns:
print(f" - {col}: {self.df[col].dtype}")
def run_analysis(self):
"""运行分析"""
if self.analyzer is None:
print("❌ 请先加载数据")
return
print("\n🔍 正在分析天气数据...")
results = self.analyzer.comprehensive_analysis()
return results
def show_visualizations(self):
"""显示可视化图表"""
if self.visualizer is None:
print("❌ 请先加载数据")
return
print("\n🎨 生成可视化图表...")
# 创建图表目录
os.makedirs('charts', exist_ok=True)
# 生成并保存所有图表
self.visualizer.save_all_charts('charts/weather')
print("✅ 所有图表已保存到 'charts' 文件夹")
# 显示综合仪表板
print("\n📊 显示综合仪表板...")
dashboard = self.visualizer.create_summary_dashboard()
plt.show()
def export_report(self):
"""导出分析报告"""
if self.analyzer is None:
print("❌ 请先加载数据")
return
# 运行分析获取结果
results = self.run_analysis()
# 创建报告文件
report_filename = 'weather_analysis_report.txt'
with open(report_filename, 'w', encoding='utf-8') as f:
f.write("=" * 60 + "\n")
f.write(" 天气数据分析报告\n")
f.write("=" * 60 + "\n\n")
f.write(f"分析时间: {pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write(f"数据周期: {self.df['日期'].min()} 到 {self.df['日期'].max()}\n")
f.write(f"总天数: {len(self.df)}\n\n")
f.write("📊 基本统计信息:\n")
f.write("-" * 40 + "\n")
for key, value in results['additional_stats'].items():
f.write(f"{key}: {value}\n")
f.write("\n📈 趋势分析:\n")
f.write("-" * 40 + "\n")
trend = results['trend_analysis']
f.write(f"温度趋势: {trend['趋势强度']}\n")
f.write(f"趋势斜率: {trend['趋势斜率']:.3f}\n")
f.write(f"相关系数(R²): {trend['相关系数(R²)']:.3f}\n")
f.write("\n🌤️ 天气模式:\n")
f.write("-" * 40 + "\n")
patterns = results['weather_patterns']
f.write(f"最常出现天气: {patterns['最常出现天气']}\n")
f.write(f"晴天比例: {patterns['晴天比例']}\n")
f.write("天气状况分布:\n")
for weather, percentage in patterns['天气状况分布'].items():
f.write(f" - {weather}: {percentage}%\n")
f.write("\n🔗 关键相关性:\n")
f.write("-" * 40 + "\n")
correlation = results['correlation']
f.write(f"{correlation['最强正相关']}\n")
f.write(f"{correlation['最强负相关']}\n")
print(f"✅ 分析报告已导出到: {report_filename}")
def show_menu(self):
"""显示主菜单"""
print("\n" + "="*50)
print(" 天气数据分析和可视化系统")
print("="*50)
print("1. 📥 加载/生成天气数据")
print("2. 📋 查看数据预览")
print("3. 🔍 运行数据分析")
print("4. 🎨 生成可视化图表")
print("5. 📊 显示综合仪表板")
print("6. 📄 导出分析报告")
print("7. 🚪 退出程序")
print("="*50)
def run(self):
"""运行主程序"""
print("欢迎使用天气数据分析和可视化系统!")
while True:
self.show_menu()
choice = input("\n请选择操作 (1-7): ").strip()
if choice == '1':
use_existing = input("使用现有数据文件?(y/n): ").lower() == 'y'
self.load_data(use_existing)
elif choice == '2':
if self.df is not None:
self.show_data_preview()
else:
print("❌ 请先加载数据")
elif choice == '3':
if self.df is not None:
self.run_analysis()
else:
print("❌ 请先加载数据")
elif choice == '4':
if self.df is not None:
self.show_visualizations()
else:
print("❌ 请先加载数据")
elif choice == '5':
if self.df is not None:
self.visualizer.create_summary_dashboard()
plt.show()
else:
print("❌ 请先加载数据")
elif choice == '6':
if self.df is not None:
self.export_report()
else:
print("❌ 请先加载数据")
elif choice == '7':
print("👋 感谢使用!再见!")
break
else:
print("❌ 无效选择,请重新输入")
# 运行程序
if __name__ == "__main__":
app = WeatherAnalysisApp()
app.run()
如何在VSCode中运行
1. 环境设置
-
创建项目文件夹:
mkdir weather-analysis cd weather-analysis -
创建虚拟环境(推荐):
python -m venv weather_env # Windows weather_env\Scripts\activate # Mac/Linux source weather_env/bin/activate -
安装依赖:
pip install -r requirements.txt
2. 运行程序
在VSCode中,有几种方式运行程序:
方法一:直接运行主程序
python main.py
方法二:运行单个模块测试
# 测试数据生成
python weather_data.py
# 测试分析功能
python analysis.py
# 测试可视化功能
python visualization.py
方法三:在VSCode中使用运行按钮
- 打开
main.py文件 - 点击右上角的运行按钮 ▶️
- 或按F5键
3. 项目功能说明
数据生成模块 (weather_data.py)
- 生成一个月的模拟天气数据
- 包含温度、湿度、降水量、风速、天气状况等
- 支持保存和加载CSV文件
数据分析模块 (analysis.py)
- 基本统计分析
- 温度趋势分析
- 天气模式识别
- 相关性分析
可视化模块 (visualization.py)
- 温度趋势图
- 天气状况饼图
- 相关性热力图
- 多变量分析图
- 综合仪表板
学习要点
这个项目涵盖了以下编程概念:
- 面向对象编程:使用类来组织代码
- 数据处理:使用Pandas进行数据操作
- 数据可视化:使用Matplotlib和Seaborn创建图表
- 统计分析:使用SciPy进行统计计算
- 文件操作:读写CSV文件
- 用户界面:简单的命令行交互
扩展建议
学生可以进一步扩展这个项目:
- 添加真实数据:从天气API获取真实数据
- 更多分析:添加季节性分析、预测模型
- 交互式可视化:使用Plotly创建交互式图表
- Web应用:使用Flask或Streamlit创建网页应用
- 数据库集成:使用SQLite或MySQL存储数据
这个项目是一个很好的起点,可以帮助学生学习数据分析的全流程,从数据生成到可视化展示。

2085

被折叠的 条评论
为什么被折叠?



