📌 学习资源具体推荐
书籍(按优先级)
《Python Crash Course》第2版 - 重点看前11章
《利用Python进行数据分析》 - Pandas部分
《流畅的Python》 - 作为进阶参考
在线练习平台
LeetCode:Python题库(简单难度)
HackerRank:Python技能练习
Codewars:通过挑战学习
牛客网:国内面试题练习
实用工具
Jupyter Notebook:交互式学习
VS Code + Python插件
Anaconda:环境管理
Git:代码版本控制(提前接触)
🎯 学习效果检验
第1周末检查点
能独立编写50行以上的Python脚本
理解列表、字典、循环、函数
会用requests获取API数据
能读写JSON和CSV文件
第2周末检查点
能使用Pandas进行基本数据分析
理解面向对象编程概念
完成完整的天气数据分析项目
能解决LeetCode简单难度的算法题
💡 学习建议
每日坚持:每天至少写100行代码
不懂就问:善用Stack Overflow、知乎、CSDN
代码重构:第二天回顾前一天的代码并优化
项目驱动:学完每个知识点就做一个相关的小项目
记录问题:建立自己的错误解决方案库
第2周:数据处理与综合项目
Day 8-9:Pandas基础(约6小时)
学习内容:
Series和DataFrame的创建与操作
数据读取与写入(CSV、Excel)
数据筛选与排序
基本统计函数
实践案例:
python
# 4. 学生成绩分析系统import pandas as pdimport numpy as np# 创建示例数据data ={'姓名':['张三','李四','王五','赵六','钱七'],'数学':[85,92,78,88,95],'英语':[88,76,92,85,80],'物理':[90,85,88,92,78],'班级':['A','B','A','B','A']}df = pd.DataFrame(data)# 数据分析操作print("=== 基础信息 ===")print(f"数据形状:{df.shape}")print(f"\n数据类型:")print(df.dtypes)print("\n=== 统计分析 ===")df['总分']= df[['数学','英语','物理']].sum(axis=1)df['平均分']= df[['数学','英语','物理']].mean(axis=1).round(2)print(f"各科平均分:")print(df[['数学','英语','物理']].mean())print(f"\n班级平均分:")print(df.groupby('班级')[['数学','英语','物理','总分']].mean())print("\n=== 数据筛选 ===")# 筛选数学90分以上的学生math_90_plus = df[df['数学']>=90]print("数学90分以上的学生:")print(math_90_plus[['姓名','数学','总分']])# 总分排名df['排名']= df['总分'].rank(ascending=False, method='min').astype(int)print("\n总分排名:")print(df.sort_values('排名')[['姓名','总分','平均分','排名']])Day 10-11:NumPy基础与面向对象(约6小时)
学习内容:
NumPy数组创建与操作
数组运算与广播
面向对象编程基础
类、继承、多态
实践案例:
python
# 5. 矩阵计算器(结合NumPy和OOP)import numpy as npclassMatrixCalculator:def__init__(self, matrix1, matrix2=None):"""初始化矩阵计算器""" self.matrix1 = np.array(matrix1) self.matrix2 = np.array(matrix2)if matrix2 isnotNoneelseNonedefadd(self):"""矩阵加法"""if self.matrix2 isNone:raise ValueError("需要第二个矩阵进行加法运算")if self.matrix1.shape != self.matrix2.shape:raise ValueError("矩阵维度不匹配")return self.matrix1 + self.matrix2 defmultiply(self):"""矩阵乘法"""if self.matrix2 isNone:raise ValueError("需要第二个矩阵进行乘法运算")if self.matrix1.shape[1]!= self.matrix2.shape[0]:raise ValueError("矩阵维度不匹配,无法相乘")return np.dot(self.matrix1, self.matrix2)deftranspose(self):"""转置矩阵"""return self.matrix1.T defdeterminant(self):"""计算行列式(仅限方阵)"""if self.matrix1.shape[0]!= self.matrix1.shape[1]:raise ValueError("只有方阵才能计算行列式")return np.linalg.det(self.matrix1)defget_info(self):"""获取矩阵信息"""return{'shape': self.matrix1.shape,'dtype': self.matrix1.dtype,'min': self.matrix1.min(),'max': self.matrix1.max(),'mean': self.matrix1.mean()}# 使用示例matrix_a =[[1,2,3],[4,5,6]]matrix_b =[[7,8],[9,10],[11,12]]calc = MatrixCalculator(matrix_a, matrix_b)print("矩阵A信息:", calc.get_info())print("\n矩阵乘法结果:")print(calc.multiply())# 创建一个子类:高级矩阵计算器classAdvancedMatrixCalculator(MatrixCalculator):def__init__(self, matrix1, matrix2=None):super().__init__(matrix1, matrix2)defeigenvalues(self):"""计算特征值(仅限方阵)"""if self.matrix1.shape[0]!= self.matrix1.shape[1]:raise ValueError("只有方阵才能计算特征值")return np.linalg.eigvals(self.matrix1)defsvd_decomposition(self):"""奇异值分解""" U, s, V = np.linalg.svd(self.matrix1)return{'U': U,'singular_values': s,'V': V}# 测试高级功能square_matrix =[[4,2],[1,3]]adv_calc = AdvancedMatrixCalculator(square_matrix)print("\n方阵特征值:", adv_calc.eigenvalues())Day 12-13:综合项目实战(约8小时)
完整项目:天气数据爬虫与分析系统
python
# 6. 完整的天气数据爬虫与分析系统import requestsimport pandas as pdimport jsonimport osfrom datetime import datetimeimport matplotlib.pyplot as pltimport numpy as npclassWeatherAnalysisSystem:def__init__(self, api_key=None): self.api_key = api_key or"your_api_key_here" self.base_url ="http://api.openweathermap.org/data/2.5" self.data_dir ="weather_data"# 创建数据目录ifnot os.path.exists(self.data_dir): os.makedirs(self.data_dir)deffetch_multiple_cities(self, cities, save_csv=True):"""获取多个城市的天气数据""" all_data =[]for city in cities:print(f"正在获取 {city} 的天气数据...") data = self._fetch_single_city(city)if data:# 提取关键信息 city_data ={'city': city,'timestamp': datetime.now().strftime("%Y-%m-%d %H:%M:%S"),'temperature': data['main']['temp'],'feels_like': data['main']['feels_like'],'humidity': data['main']['humidity'],'pressure': data['main']['pressure'],'wind_speed': data['wind']['speed'],'weather': data['weather'][0]['main'],'description': data['weather'][0]['description']} all_data.append(city_data)# 创建DataFrame df = pd.DataFrame(all_data)if save_csv andnot df.empty: filename =f"weather_{datetime.now().strftime('%Y%m%d')}.csv" filepath = os.path.join(self.data_dir, filename) df.to_csv(filepath, index=False, encoding='utf-8-sig')print(f"数据已保存到:{filepath}")return df def_fetch_single_city(self, city):"""获取单个城市的天气数据""" url =f"{self.base_url}/weather" params ={'q': city,'appid': self.api_key,'units':'metric','lang':'zh_cn'}try: response = requests.get(url, params=params, timeout=10) response.raise_for_status()return response.json()except Exception as e:print(f"获取 {city} 数据失败:{e}")returnNonedefanalyze_data(self, df):"""分析天气数据"""if df.empty:print("没有数据可分析")returnNoneprint("=== 天气数据分析报告 ===")print(f"数据时间范围:{df['timestamp'].iloc[0]}")print(f"城市数量:{len(df)}")# 基本统计print(f"\n温度统计:")print(df['temperature'].describe())print(f"\n湿度统计:")print(df['humidity'].describe())# 找出最热和最冷的城市 hottest = df.loc[df['temperature'].idxmax()] coldest = df.loc[df['temperature'].idxmin()]print(f"\n最热的城市:{hottest['city']} ({hottest['temperature']}°C)")print(f"最冷的城市:{coldest['city']} ({coldest['temperature']}°C)")# 按天气类型分组 weather_groups = df.groupby('weather').size()print(f"\n天气类型分布:")print(weather_groups)return{'temperature_stats': df['temperature'].describe().to_dict(),'hottest_city': hottest.to_dict(),'coldest_city': coldest.to_dict(),'weather_distribution': weather_groups.to_dict()}defvisualize_data(self, df, save_plot=True):"""可视化天气数据"""if df.empty:return fig, axes = plt.subplots(2,2, figsize=(12,10))# 1. 温度条形图 ax1 = axes[0,0] cities = df['city'] temps = df['temperature'] bars = ax1.bar(cities, temps, color=plt.cm.coolwarm(np.array(temps)/max(temps))) ax1.set_xlabel('城市') ax1.set_ylabel('温度 (°C)') ax1.set_title('各城市温度对比') ax1.tick_params(axis='x', rotation=45)# 在条形上添加温度值for bar, temp inzip(bars, temps): height = bar.get_height() ax1.text(bar.get_x()+ bar.get_width()/2., height +0.1,f'{temp:.1f}', ha='center', va='bottom')# 2. 湿度散点图 ax2 = axes[0,1] ax2.scatter(df['temperature'], df['humidity'], alpha=0.6, s=100) ax2.set_xlabel('温度 (°C)') ax2.set_ylabel('湿度 (%)') ax2.set_title('温度-湿度关系')# 为每个点添加城市标签for i, city inenumerate(df['city']): ax2.annotate(city,(df['temperature'].iloc[i], df['humidity'].iloc[i]), xytext=(5,5), textcoords='offset points')# 3. 天气类型饼图 ax3 = axes[1,0] weather_counts = df['weather'].value_counts() ax3.pie(weather_counts.values, labels=weather_counts.index, autopct='%1.1f%%') ax3.set_title('天气类型分布')# 4. 风速箱型图 ax4 = axes[1,1] weather_types = df['weather'].unique() wind_data =[] labels =[]for weather in weather_types: wind_speeds = df[df['weather']== weather]['wind_speed']iflen(wind_speeds)>0: wind_data.append(wind_speeds) labels.append(weather) ax4.boxplot(wind_data, labels=labels) ax4.set_xlabel('天气类型') ax4.set_ylabel('风速 (m/s)') ax4.set_title('不同天气类型的风速分布') ax4.tick_params(axis='x', rotation=45) plt.tight_layout()if save_plot: plot_path = os.path.join(self.data_dir,f"weather_analysis_{datetime.now().strftime('%Y%m%d_%H%M%S')}.png") plt.savefig(plot_path, dpi=300, bbox_inches='tight')print(f"图表已保存到:{plot_path}") plt.show()defgenerate_report(self, analysis_results, df):"""生成分析报告"""ifnot analysis_results:return report =f""" ====== 天气数据分析报告 ====== 生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 分析城市数量:{len(df)} 一、温度概况 平均温度:{analysis_results['temperature_stats']['mean']:.1f}°C 最高温度:{analysis_results['temperature_stats']['max']:.1f}°C ({analysis_results['hottest_city']['city']}) 最低温度:{analysis_results['temperature_stats']['min']:.1f}°C ({analysis_results['coldest_city']['city']}) 二、天气分布 {chr(10).join([f'{k}: {v}个城市'for k, v in analysis_results['weather_distribution'].items()])} 三、建议 """# 根据分析结果给出建议 avg_temp = analysis_results['temperature_stats']['mean']if avg_temp >25: report +="1. 天气较热,建议穿短袖,注意防晒\n"elif avg_temp <10: report +="1. 天气较冷,建议穿厚外套,注意保暖\n"else: report +="1. 天气适宜,适合户外活动\n"# 保存报告 report_path = os.path.join(self.data_dir,f"weather_report_{datetime.now().strftime('%Y%m%d')}.txt")withopen(report_path,'w', encoding='utf-8')as f: f.write(report)print(f"报告已保存到:{report_path}")return report# 主程序defmain():# 初始化系统 weather_system = WeatherAnalysisSystem()# 定义要查询的城市列表 cities =["Beijing","Shanghai","Guangzhou","Shenzhen","Chengdu","Wuhan","Xi'an","Nanjing","Hangzhou","Chongqing"]# 1. 获取数据print("开始获取天气数据...") df = weather_system.fetch_multiple_cities(cities, save_csv=True)if df.empty:print("无法获取数据,请检查网络或API密钥")return# 2. 分析数据print("\n开始分析数据...") analysis_results = weather_system.analyze_data(df)# 3. 可视化print("\n生成可视化图表...") weather_system.visualize_data(df, save_plot=True)# 4. 生成报告print("\n生成分析报告...") report = weather_system.generate_report(analysis_results, df)print("\n=== 任务完成 ===")print(f"成功处理了 {len(df)} 个城市的天气数据")if __name__ =="__main__": main()Day 14:复习与扩展(约3小时)
复习内容:
回顾所有代码,确保理解每一行
尝试修改项目:添加新功能或优化现有代码
在LeetCode完成10道Python相关题目
整理个人代码库和笔记