用 Python 进行数据分析1 - 数据的处理
一些使用 Python 进行数据处理常见的任务和常用的库。可能不同时间会有更好的选择。
处理 csv 文件
可以使用 pandas import pandas as pd
- 读取 csv 表格
pd.read_csv("file.csv")- 默认第一行为列名,没有列明时用参数
header=None或者names=[...]。
- 默认第一行为列名,没有列明时用参数
- 保存 csv 文件
df.to_csv("file.csv", index=False)- 中文编码用
utf-8-sig,否则 Excel 打开会乱码。
- 中文编码用
- pandas 的数据处理函数参数混乱,返回格式不固定,最好在 repl 下使用。
- 空缺值会被识别为 nan。
- 大文件可以流式处理,使用 dask
import dask.dataframe as dd- 流式处理大文件,减少内存,可能增加 IO 。
- 也提供流式接口
import
- 补充
-如果格式复杂可以使用 jsonl 文件 ‘pd.read_json()’
描述性统计
求和和计算均值可以直接在 pandas 上对列进行。
df.mean()
数据可视化
matplotlib
import matplotlib.pyplot as plt- 折线图
plt.plot(x, y) - 柱状图
plt.bar(x, y) - 参数是向量,分别是横轴位置和纵轴位置。
seaborn import seaborn as sns
- 画柱状图,可以指定分类变量
sns.barplot(df=data,x=x, y=y, hue=hue) - pandas 提供的绘图功能不直接支持长表(某列是分类变量)。
- 注意 sns 有两套 api,用来方便使用 matplotlib 。
可视化往往和描述性统计一起进行,比如计算平均和方差。
假设检验
比较两组数据的均值是否有显著差异,例如判断参数的变化是否影响结果,可以使用 t 检验。
在 Python 中,可以用 scipy.stats.ttest_ind(a, b) ,其中参数是两个数组。
详细用法见第二章。
其他的例如,判断分布可以用 chi2 检验,
NLP
从模型、基础任务、具体应用三个不同的层级来看待。
传统方法,文本分类(WSJ数据集),垃圾邮件检测,情感识别(IMDB数据集),关键词提取,词向量。
传统任务,分词、分句(基于规则),词性标注(隐马尔可夫模型HMM、CRF),实体标注,关系抽取,语法解析。
TF(词频),主题模型(SVD、LDA)
具体应用,
阶段 1 符号 2 统计 3 深度学习
参考:
- 文本上的算法(最早的网页版和出版的第一版侧重于传统算法。)
- 自然语言处理。
- 中文自然语言处理。
fasttext 文本分类。
有了深度学习之后优先传统方法不再用了,而且传统方法易于手工实现,现在则库更加成熟。
屏蔽词是最简单的分类算法。
正则表达式可以用来匹配和提取内容。也有支持递归的。
CV
传统做法
滤波去噪,卷积。边缘检测,
直方图特征匹配,模板匹配
人脸识别
HoG,AdaBoost, yolo v8
特征点匹配。
数据库
sqlite
mysql
在 Python 中可以使用 SQLAlchemy
这个库最近变过 api 不太好用了。
- GUI 工具
- SQLite Stdio
SQL
sql 语句
- 查询 SELECT
SELECT * FROM users;- 连接 JOIN … ON
SELECT u.username, o.order_id, o.product_name FROM users u LEFT JOIN orders o ON u.id = o.user_id; - 选择 WHERE
SELECT * FROM users WHERE age > 25; - 排序 ORDER BY
SELECT * FROM users ORDER BY age ASC; SELECT * FROM users LIMIT 10;- 去重
SELECT DISTINCT age FROM users; - 聚合 AGG
SELECT COUNT(*) AS total_users FROM users; - 分组 GROUP BY
SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id HAVING order_count > 1;
- 连接 JOIN … ON
- 插入 insert
INSERT INTO users (username, email, age) VALUES ('john_doe', 'john@example.com', 30); - 更新 update
UPDATE users SET email = 'john.new@example.com', age = 32 WHERE id = 1; - 删除 delete
DELETE FROM users WHERE username = 'bob_johnson' - 创建表格 CREATE TABLE
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL UNIQUE,
age INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
- 补充
- 表结构修改
ALTER TABLE users ADD COLUMN phone TEXT; - 索引创建
CREATE INDEX idx_users_email ON users(email); - 在目前的互联网应用中,外键约束手工在代码中维护,而仅仅把数据库作为存储使用。
- 查询可以用 explain 看看如何使用索引的。
- 窗口函数,比如获得分组排名。
- 表结构修改
机器学习
sklearn
- 学习
model.fit(x, y)- 也支持 dataframe ``
- 预测
model.predict(x) - 评估
model.score(x, y) - 保存和加载
- 模型保存
pickle.dump(model, open("model.pkl", "wb")) - 模型加载
pickle.load(open("model.pkl", "rb")) - 模型保存
model.save("model.h5")
- 模型保存
- 支持 dataframe 和 numpy array
- 模型可以用 xgboost,接口相同。
也有一些命令行工具
- libsvm
- fasttext
常见算法
- 特征选择
- 评价指标
- svm
- 集成学习 xgboost
- 这里不做详述。
说明
- 参数估计用的最大似然估计。
- 是约束求解的过程。
- 有隐参数,用EM算法。
深度学习
pytorch
pytorch-lightning
hugging face
数据展示
steamlit 会比较简单。
交互网页也可以用基于 react 或 vue 提供的可复用的组件,这里不详述。
一开始挺流行 jQuery + bootstrap
数据分析
数据清理
命令行参数
argparse
有时候需要用命令行调用其他工具,可以用
sys.argv.pop(0)
其他工具
Excel
- 数据透视表,然后再画图。
Matlab(也包括Octave)
- load 命令也支持文本格式的数据,非数字字符作为分隔符。
- 常用工具:画图、统计、最优化、
bash 有时候用来处理文本。
- 统计行数
wc -l - 并行 xargs 支持并行
xargs -P 4 -n 1 python3注意进程不要冲突。 - 下载文件
- wget
- curl
- grep/sed/awk
- ruby 也支持命令行模式
运行环境
docker
- docker run ubuntu bash
Jupiter
- 用 Anaconda 有时候会 so 路径问题,可以
os.environ['LIBRARY_PATH'] = '' os.environ['PATH']=os.environ['PATH'].replace("/opt/conda/bin:","") os.environ['LD_LIBRARY_PATH']="" os.chdir("/kaggle/working")
csv2latex
nlp
- nltk
- spacy
cv
- opencv
- yolo
R 语言
- 自带可视化,统计功能。见 An Introduction to R 中的部分(只需 8, 11, 12,不要看别的)章节。
- 还可以调用好多外部的工具箱。 CRAN Task Views
- 有一些 Python 库是借鉴 R 的。
LaTeX
公式编辑器
表格编辑器
图形。
个人喜欢先用自带模板编辑,然后再嵌入到提交的模板中。
注意有些指令有新旧两套写法。
分布式
使用于数据量大和计算量大的情况
- mapreduce
- bigtable
- spark
- dask
在执行 map 操作的时候可以并行。有一些算法可以实现为并行的版本。
有点像是 concurrent.futures 模块
with concurrent.futures.ProcessPoolExecutor() as executor:
for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)):
print('%d is prime: %s' % (number, prime))
注意 Python 的线程池有 GIL 不能用来并行计算,但是对 IO 仍有效果。
算法
传统算法
贪心算法,局部最优等于全局最优。
规划问题,线性规划,
图论,图搜索(深度优先、广度优先、启发),有相关的库。
强化学习。
数值规划
线性规划。
整数规划
非线性规划。
有一些求解器
- z3
有一些启发性算法,近似求解。
注意时间复杂度。
图论。
参考
- Programming Collective Intelligence 这本书讲 Python 为主,附带一些算法。
-
Paradigms of Artificial Intelligence Programming 太老的书,探讨了基于符号的AI,不再推荐。
-
dblp 很好的用的 CS 论文检索网站。
- Data Science from Scratch
- Data Science at the Command Line
- 有一些数据分析和数据科学的教科书
其他工具
- mllib 针对分布式数据库。
- SPSS 处理调查问卷,侧重与社会科学领域。