使用VSCode开发少儿编程项目:天气数据分析和可视化

使用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. 环境设置

  1. 创建项目文件夹

    mkdir weather-analysis
    cd weather-analysis
    
  2. 创建虚拟环境(推荐):

    python -m venv weather_env
    # Windows
    weather_env\Scripts\activate
    # Mac/Linux
    source weather_env/bin/activate
    
  3. 安装依赖

    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)
  • 温度趋势图
  • 天气状况饼图
  • 相关性热力图
  • 多变量分析图
  • 综合仪表板

学习要点

这个项目涵盖了以下编程概念:

  1. 面向对象编程:使用类来组织代码
  2. 数据处理:使用Pandas进行数据操作
  3. 数据可视化:使用Matplotlib和Seaborn创建图表
  4. 统计分析:使用SciPy进行统计计算
  5. 文件操作:读写CSV文件
  6. 用户界面:简单的命令行交互

扩展建议

学生可以进一步扩展这个项目:

  1. 添加真实数据:从天气API获取真实数据
  2. 更多分析:添加季节性分析、预测模型
  3. 交互式可视化:使用Plotly创建交互式图表
  4. Web应用:使用Flask或Streamlit创建网页应用
  5. 数据库集成:使用SQLite或MySQL存储数据

这个项目是一个很好的起点,可以帮助学生学习数据分析的全流程,从数据生成到可视化展示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值