资讯动态

Python学习全记录:从环境搭建到数据分析与量化策略

发布时间:2026/10/5 17:31:12 来源:尧图企业网站定制
刚开始接触Python的时候我也有过那种“打开教程十分钟关掉教程两行泪”的体验。3月15号这一天我把之前零散折腾的东西重新梳理了一遍从装环境到跑通一个小项目踩了一圈坑也理顺了不少概念。这篇文章就是当天学习记录的完整存档适合刚起步的人照着走一遍也适合那些装过几次环境、但始终没搞明白“为什么这么配”的朋友。我们先划个范围这一天主要解决四件事——把Python环境彻底装干净、理解变量与数据结构这些真正的基础、搞定numpy和pandas这两个绕不开的库、最后用一个小爬虫加一个简单的量化策略示例把前面的知识串起来。内容会有一点多但都是实操过的顺序也是按我当天踩坑的顺序来的跟着走基本不会再被卡住。1. 环境搭建把Python装明白别在第一步摔跤1.1 安装与环境变量双击下一步之外的事很多初学者卡在第一步不是不会下载而是下载完了不知道怎么让系统认这个解释器。我这里说的“认”就是要让cmd或者终端里直接敲python能进交互环境。去官网下载安装包Windows下注意勾选“Add Python to PATH”这个选项这是最关键的。我见过太多人没勾这个装完发现命令行里输入python显示“不是内部或外部命令”然后去百度搜环境变量配置越配越乱。其实这个选项就是帮你把Python的可执行文件路径写进系统环境变量的Path里勾上就完事。如果是Linux系统建议直接用系统包管理器。Ubuntu和Debian系执行sudo apt install python3和sudo apt install python3-pip就行。这里有个坑就是系统自带的Python版本可能比较旧官网最新的Python 3.12或者3.13不一定在源里。我个人的建议是学习阶段就用系统源里的Python 3.10或3.11完全够用不用非得追新版。装完之后验证三件事。第一命令行里输入python --version能显示版本号。第二输入pip --version能显示pip版本。第三命令行里敲python能进入交互模式看到提示符说明解释器就跑起来了。1.2 pip源配置与库安装一次把numpy、sklearn、opencv装好Python的库安装用的是pip但默认官方源在国内访问速度不稳定我当天安装numpy就卡了半天。解决办法是配置国内镜像源最常用的是清华源和阿里源。临时指定源安装的方法是pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple这样每次都得加参数很麻烦。更靠谱的做法是永久配置。Windows用户在当前用户目录下建一个pip文件夹里面建一个pip.ini文件写入[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host pypi.tuna.tsinghua.edu.cnLinux和macOS下文件路径是~/.pip/pip.conf内容一样。配好之后pip install的速度会明显提升。我当天安装的库包括numpy、pandas、scikit-learn、opencv-python命令如下pip install numpy pandas scikit-learn opencv-python这里有个很容易踩的坑就是opencv的库名。PyPI上的包名不是cv2而是opencv-python导入的时候才写import cv2。直接把pip install cv2是装不上的我见过太多人在这里卡住。另外numpy和pandas这两个库如果是在官网下的Python安装包里装基本不会遇到编译问题因为官方源都有预编译的whl轮子文件。还有一个小建议装库之前先把pip升级一下用python -m pip install --upgrade pip这样能避免一些依赖解析的旧版障碍。1.3 用VSCode把开发环境理顺如果只用命令行里写代码语法高亮和调试都是问题。我推荐装Visual Studio Code原因无他免费、轻量、插件生态好。装完之后要装两个东西Python插件和Pylance插件。Python插件提供运行和调试支持Pylance负责代码补全和类型提示。装完插件之后有一个细节就是必须选择正确的Python解释器。按下快捷键CtrlShiftP输入Python: Select Interpreter然后选择你刚安装的那个Python版本。为什么必须选解释器因为VSCode本身不包含Python运行环境它只是一个编辑器运行代码要调用外部解释器。如果不选插件会自动找一个解释器很可能找到的是Windows应用商店下载的那个版本跟你在官网装的路劲不一样最后出现“明明装了库但VSCode里import报错”的问题。我当天就遇到这个情况。命令行里import numpy很正常VSCode里却报No module named numpy。排查了半天发现是解释器选错了VSCode默认用的那个Python目录和pip安装包的目录不是同一个。这个问题几乎每个初学者都会遇到必须记住一点命令行里pip list能看到的包和你当前解释器环境里的包必须是一一对应的。判断方法是在VSCode终端里执行python -c import sys; print(sys.executable)看看当前Python解释器的路径再执行pip --version看看pip绑定的路径两者一致才说明环境是干净的。2. 语法核心变量、类型转换、函数、切片一次讲透2.1 变量与类型从内存角度理解“动态类型”Python里的变量和Java、C语言有个很大的区别就是变量本身没有类型只有绑定的对象有类型。这句话听起来有点绕我用生活里的例子解释一下。变量名就像一张便利贴你可以把它贴在手机上也可以撕下来贴到遥控器上便利贴本身没有“手机属性”或“遥控器属性”。Python里执行a 1就是把标签a贴在整数对象1上执行a hello就是把同一个标签撕下来贴到字符串对象hello上。这就是“动态类型”的意思。但是有个细节要注意整型和字符串之间的转换。我当天练习时写了一个求长方体体积的程序需要用户输入长宽高然后相乘。用户输入进来的默认都是字符串直接用*号会报错因为字符串不能和字符串相乘。这个时候就要类型转换length float(input(请输入长)) width float(input(请输入宽)) height float(input(请输入高)) volume length * width * height print(f长方体的体积是{volume})用float()而不是int()是有讲究的因为长宽高有可能是小数用int()会把小数部分直接砍掉计算出来的体积就错了。Python里常见的类型转换函数有int()、float()、str()、list()、tuple()、set()。这里有一个隐藏的点就是bool()的转换规则。空列表、空字典、空字符串、0、None转换成布尔值时都是False其他都是True。我当时做变量类型练习题的时候老是记错这一点后来总结了记忆方法“空的东西都是假”。2.2 列表与切片下标从0开始再复习一遍列表是Python里最常用的数据结构切片操作更是高频中的高频。切片的语法是list[start:stop:step]左闭右开也就是说start包含stop不包含。numbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 取前三个元素 print(numbers[0:3]) # [0, 1, 2] # 从第2个取到第6个 print(numbers[1:6]) # [1, 2, 3, 4, 5] # 每隔一个取一个 print(numbers[::2]) # [0, 2, 4, 6, 8] # 反转列表 print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]倒序切片[::-1]这个写法很实用比如判断一个字符串是不是回文直接用s s[::-1]就行。切片还有一个容易被忽略的操作就是通过切片批量替换元素。numbers[1:4] [100, 200]会把索引1到3的元素替换成两个新元素。这个操作在处理数据清洗时很有用比如把异常值批量替换掉。2.3 定义函数不要只关注def这一行定义函数用def关键字这个大家都会写但初学者容易忽略两个点参数默认值和返回值。参数默认值适合处理“大部分情况用同一个值”的场景。比如写一个计算圆面积的函数圆周率大多数时候取3.14就够了偶尔要更精确的可以再传值def circle_area(radius, pi3.14): return pi * radius ** 2 print(circle_area(5)) # 78.5 print(circle_area(5, 3.14159)) # 78.53975这里要记住花生口诀带默认值的参数必须放在不带默认值的参数后面否则解释器直接报语法错误。Python函数还有一个特殊之处就是返回多个值其实返回的是元组。def func(): return 1, 2你拿到的是一个元组(1, 2)用两个变量接收时自动解包。我学到这里时做过一个练习写一个函数同时返回商和余数很自然就用上了这种特性。关于函数的题外话是作用域。函数内部定义的变量默认是局部变量不影响外部同名变量。如果确实需要在函数内部修改全局变量要用global关键字声明。不过我个人建议学习阶段尽量不要用global先用“函数输入参数、返回值传结果”的模式代码逻辑会更清晰写复杂项目的时候少很多莫名奇妙的bug。2.4 结构化数据与DataFrame从字典到表格思维学Python到一定阶段就不能只处理单个变量了要开始面对结构化数据。最简单的结构化数据形式是字典列表也就是每个元素都是一个字典的列表。比如我当天练手时构造了三天的学习记录数据study_records [ {date: 3月13日, hours: 2.5, topic: 环境搭建}, {date: 3月14日, hours: 3.0, topic: 基础语法}, {date: 3月15日, hours: 4.5, topic: 数据分析基础}, ]这种结构可以遍历也可以根据需要筛选。但一旦数据量变大比如几千条记录用Python原生的列表和字典处理效率就低了这时候就用上pandas的DataFrame。DataFrame可以理解为一张“Excel表格”有行有列列有列名。从字典列表创建DataFrame只需要一行代码import pandas as pd df pd.DataFrame(study_records) print(df)输出结果就是一张规整的表格。筛选数据也很直观想看学习时长超过3小时的记录long_study df[df[hours] 3] print(long_study)这里的df[hours] 3会生成一个布尔序列True和False对每一行做个标记然后df[...]只保留标记为True的行。这种方式叫做布尔筛选刚接触会有点绕但实际用起来频率极高尤其是在后面做数据分析时几乎每天都要写。DataFrame的创建方式还有其他几种比如直接传入嵌套列表再指定列名或者从CSV读取。当天我只练了从字典列表创建主要目的是把“列表操作”和“表格思维”衔接起来。3. 常用库实战numpy、pandas、cv2、sklearn的真实用法3.1 numpy数组为什么不能只用Python列表很多人在学习numpy之前会有疑问Python列表不是也能存储和操作数据吗为什么还要单独装numpy这个问题我在3月15号之前也有后来彻底想明白了。Python列表里每个元素都是完整的Python对象内存开销大而numpy数组存储的是连续的同类型数据像C语言的数组一样紧凑。更重要的是numpy支持“向量化运算”也就是对整个数组直接进行数学运算不用写循环。比如要对一个列表里所有元素加1# 纯Python方式 data [1, 2, 3, 4, 5] new_data [x 1 for x in data] # numpy方式 import numpy as np arr np.array([1, 2, 3, 4, 5]) new_arr arr 1两种方式在一百万个元素的时候差距就非常明显了numpy几乎是瞬间完成而列表推导式要慢很多。numpy创建数组的常用方法有np.array()从现有列表转换、np.arange()生成等差数列、np.linspace()生成指定数量的等间隔数列、np.zeros()和np.ones()生成全0或全1数组。3.2 邻接矩阵用numpy把图结构变成数组当天还练习了构建邻接矩阵这是图论和后续很多算法的基础。邻接矩阵就是用一个二维数组表示图中节点之间的连接关系。假设有四个节点节点之间的连接关系是1连2、1连3、2连4、3连4。构建邻接矩阵的代码是import numpy as np size 4 adj_matrix np.zeros((size, size), dtypeint) edges [(0, 1), (0, 2), (1, 3), (2, 3)] for i, j in edges: adj_matrix[i][j] 1 adj_matrix[j][i] 1 # 无向图需要对称 print(adj_matrix)输出结果[[0 1 1 0] [1 0 0 1] [1 0 0 1] [0 1 1 0]]这里需要注意索引从0开始所以节点1对应下标0节点4对应下标3。如果不做adj_matrix[j][i] 1这一步得到的就是有向图的邻接矩阵。这个练习虽然简单但它把“数据结构”和“numpy数组操作”用实际场景串起来了比单纯背语法有用得多。3.3 pandas进阶筛选、排序、汇总一次搞定DataFrame除了创建和筛选我当天还练了三个高频操作排序、分组汇总、列计算。排序用sort_values()指定by参数为列名df_sorted df.sort_values(byhours, ascendingFalse)分组汇总用groupby()结合聚合函数。比如按主题统计学习总时长summary df.groupby(topic)[hours].sum()列计算就是通过已有列生成新列df[minutes] df[hours] * 60这三个操作合起来基本覆盖了日常数据操作的大部分需求。这里有一个心得pandas的groupby刚学的时候容易懵它的处理逻辑其实是“拆分-应用-合并”三步。先按照某个列把大表拆成若干小组然后对每个小组应用聚合函数求和、平均、计数等最后把结果合并回一张表。脑子里带着这个流程去看groupby就不会觉得它是魔术而是一个自然的数据加工流水线。3.4 opencv与rapidocr图像处理的入门组合这次也简单练习了一下opencv-python主要就是读取图片、改尺寸、显示。代码非常简单import cv2 img cv2.imread(test.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imwrite(test_gray.jpg, gray)这里有个新手坑cv2.imread()如果路径不对不会报错而是返回一个None后续调用cvtColor就会报“NoneType object has no attribute”的错误。排查这个问题很简单在读取后加一行判断if img is None: print(图片读取失败请检查路径)后来我还试着用了rapidocr做文字识别。这个库的名字你可能不熟它是一个基于paddleocr的轻量级OCR库安装命令是pip install rapidocr_onnxruntime。当时跑通之后发现CPU占用特别高识别一张图要等几秒。这个很正常OCR本质上是目标检测加文字识别两个深度学习模型的串行推理没有GPU加速的情况下CPU跑模型就是吃满核心。如果要在CPU上优化体验我的建议是先把图片压缩再送识别或者在代码里限制推理线程数。rapidocr的配置参数里有cpu_math_thread_num可以把默认线程数调低减少CPU突发占用识别速度变化不大但机器不会突然卡顿。3.5 sklearn机器学习库的安装与第一个模型scikit-learn是Python机器学习最常用的库安装名字是scikit-learn导入名字是sklearn。当天我用它跑了一个最简单的分类模型数据集就用内置的鸢尾花数据from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score data load_iris() X_train, X_test, y_train, y_test train_test_split( data.data, data.target, test_size0.2, random_state42 ) model KNeighborsClassifier(n_neighbors3) model.fit(X_train, y_train) y_pred model.predict(X_test) print(准确率:, accuracy_score(y_test, y_pred))这里面的train_test_split很重要它的作用是把数据分成训练集和测试集测试集大小通过test_size指定random_state则是固定随机种子。固定随机种子这个细节很关键如果不设置每次运行拆分结果都不同模型准确率也会波动别人就没法复现你的结果设置了之后大家每次拆出的训练集和测试集完全一致实验结果才能对比。4. 两个应用方向爬虫与量化策略的入门实践4.1 写一个尊重规则的学习型爬虫学完基础语法之后很多人都会想爬点数据练手。我那天写了一个非常简单的爬虫爬取一个公开的静态网页然后提取标题信息。代码骨架如下import requests from bs4 import BeautifulSoup url https://example-news.com headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersheaders, timeout10) resp.encoding utf-8 soup BeautifulSoup(resp.text, html.parser) for title in soup.find_all(h2, class_news-title): print(title.text.strip())这里有几个细节值得说。第一headers里设置User-Agent是必要的很多网站会反爬不设UA直接返回403或验证页面。第二timeout10是超时控制避免请求挂住不放。第三resp.encoding utf-8是手动指定网页编码因为有些网站没有在响应头里正确声明编码requests自动判断可能会用ISO-8859-1解析中文导致乱码。关于爬虫必须强调一个底线爬虫只能爬取公开且有授权的数据必须遵守目标网站的robots.txt规则不能对网站造成访问压力不能爬取个人隐私和敏感数据。爬虫的学习重点是理解HTTP请求、响应解析和数据处理流程而不是“通吃一切”更不能用爬虫做任何攻击性的行为。我这一天练的爬虫只跑了一次没有做任何高频率请求就是为了保证服务器和网站都安全。4.2 一个极简的“金叉死叉”量化策略骨架量化交易听着高级但入门的关键其实还是数据处理和策略表达。我当天用pandas写了一个非常基础的移动均线策略骨架没有接行情接口也没有交易接口纯粹是为理解策略结构而写的。思路很简单短周期均线上穿长周期均线时买入信号出现下穿时卖出信号出现。import pandas as pd # 模拟一组价格数据实际使用时替换为真实行情 prices pd.Series([10, 10.5, 10.8, 11.2, 11.0, 10.7, 10.9, 11.3, 11.6, 11.4]) df pd.DataFrame({close: prices}) df[ma5] df[close].rolling(5).mean() df[ma10] df[close].rolling(10).mean() df[signal] 0 df.loc[df[ma5] df[ma10], signal] 1 df.loc[df[ma5] df[ma10], signal] -1rolling(window).mean()是滚动均值计算窗口大小就是均线周期。signal列只有1和-1两种取值代表持币方向。完整的量化策略还包括回测和资金管理但那个范围就大了需要补充很多金融基础。这里我要慎重提醒一下量化策略的代码骨架用于学习完全没有问题但真正拿去实盘是完全不够的。市场有交易成本、滑点、极端行情还有过拟合风险。刚学Python的朋友不要把网上那些“源码”直接当成财富密码先把数据处理基本功练扎实再谈模型和策略。这一年我见过的所有靠量化赚钱的人没有一个是在代码层面取巧的都是先用大量时间研究数据和规则。4.3 用中文词云做一个可视化小项目爬虫拿到的数据或者单纯用文本数据可以做一个可视化小项目来综合练手。词云的思路是统计一个文本中关键词的出现次数然后用字体大小表示次数多少。用wordcloud库加matplotlib实现from wordcloud import WordCloud import matplotlib.pyplot as plt text python numpy pandas sklearn opencv python python wordcloud WordCloud(font_pathsimhei.ttf, width800, height600, background_colorwhite).generate(text) plt.imshow(wordcloud, interpolationbilinear) plt.axis(off) plt.show()中文词云有一个必踩的坑必须指定font_path为系统中文字体比如simhei.ttf黑体否则生成的图片上全是方框。这个项目虽然简单但它把文件读取、字符串处理、第三方库调用、可视化输出全部串起来了作为阶段性的综合练手非常适合。5. 常见问题排查与速查表5.1 pip安装报错的三个高频原因我这一天光在pip上就踩了几个坑整理一下基本规律。第一个报错是“WARNING: pip is being invoked by an old script wrapper”说明你的pip命令路径不对最稳妥的解决方法是改用python -m pip来执行所有pip命令比如python -m pip install numpy。这样可以确保pip和当前Python解释器绑定在同一个环境。第二个是“Could not find a version that satisfies the requirement”常见原因有两个库名拼写错误或者Python版本太旧。比如新版本pandas要求Python 3.9以上你装的是Python 3.7就会报这个错误。解决方法是先确认Python版本再确认包名如果包名没问题去PyPI官网查一下这个包支持的Python版本范围。第三个是编译错误像error: Microsoft Visual C 14.0 is required。这种情况在Windows上装某些含C扩展的库时会出现解决方法是优先下载预编译的whl文件安装而不是直接让pip去编译源码。到PyPI官网搜索包名在“Download files”页面找到对应系统和Python版本的whl文件下载后用pip install 文件名.whl安装。5.2 列表筛选与数据清洗的五个小技巧当天在pandas和列表操作上总结了几个常用技巧。一是列表去重并保持顺序Python的set()去重会打乱顺序要想保持原顺序用字典的fromkeys方法data [1, 2, 2, 3, 3, 3, 4] unique list(dict.fromkeys(data))二是查找列表里重复元素的下标indices [i for i, x in enumerate(data) if x 3]三是DataFrame去重df.drop_duplicates(subset[date])只针对指定列判断重复而不是要求整行完全一致。四是DataFrame缺失值处理df.dropna()删除含缺失值的行df.fillna(0)用0填充。实际中我更常用fillna因为删数据会损失信息填充是更保守的做法。五是根据条件批量修改数据这也是pandas常用的loc操作df.loc[df[hours] 2, level] 低强度 df.loc[df[hours] 2, level] 中高强度5.3 一张常用问题排查速查表现象大概率原因解决思路命令行输入python无反应环境变量没配好安装时勾选Add to PATH或手动添加Python目录VSCode里import不到已安装的库解释器选错CtrlShiftP选择正确解释器路径pip install cv2报错包名不对正确包名是opencv-python导入名才是cv2爬虫中文乱码编码解析错误手动指定resp.encoding utf-8cv2读取图片后报NoneType错误路径不对或文件名含中文用绝对路径并加if img is None判断matplotlib画图横坐标标签挤在一起刻度标签密度过大使用plt.xticks(rotation45)旋转或plt.xticks(ticks, labels)手动控制DataFrame列名访问报错列名拼写错误或含空格用df.columns查看实际列名字符串列名用df[my col]访问numpy运算时报shape不匹配数组维度不一致用arr.shape逐个检查列维度必要时用reshape或expand_dims函数修改外部变量无效局部变量作用域问题改用返回值返回结果少用globalPython命令与pip命令对应版本不同多个Python环境并存统一用python -m pip执行安装或使用虚拟环境venv我当天很大一部分时间其实都耗在排查这些问题上后来发现规律大多数环境问题核心就是“各个工具绑定的解释器是不是同一个”。把这个本质想通了很多报错都不用背自己就能推导出来。6. 学习记录之外的几点体会这一天学下来我最强烈的感受是学Python不是背语法而是把每个知识点放到场景里去用。就像切片光是记住list[start:stop:step]没有任何意义但当你想反转一个字符串、剔除一段异常数据、批量取某几列的时候它就成了顺手的工具。刚入门时容易陷入“我再多看一章就动手”的状态其实这是最无效的学习方式代码能力百分之八十是在报错和修bug中长出来的。我给自己定了一个小规矩每天至少写一个小程序不管多简单。哪怕只是一个“输入题目自动打分”的练习脚本只要完整跑通了语法、逻辑、查错的能力就都在涨。3月15号这天就是从环境搭建一路跑到策略骨架每一步都亲手敲过代码这份记录里所有代码片段我都运行过你照着敲的时候如果遇到问题回来看第5章的排查表大概率能找到答案。最后再分享一个小技巧。如果你也准备每天记录学习内容建议用一个固定的Markdown文件存档把当天遇到的报错原文、原因、解决方法、示例代码都写进去。这比看十篇别人的教程都有用因为它是你亲自踩坑得出的经验三个月后回来看就是自己专属的速查手册。我自己就是从这类记录里攒出了最初的排错直觉后面写代码遇到奇怪问题第一时间想起的不是网上教程而是自己某天记录里的一句话。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑