Python 数据分析学习笔记

一、基本语法

资料地址http://www.icoolxue.com/album/show/113

1)python3新增特性:

A: print()变化

B: 新增bytes类型,可以与str进行互换,以b字母作为前缀

C: 新增format()进行格式化处理

D: dict里面删除了iterkeys(),itervalues(), iteritems(), 新增keys(), values(), items()

二、数据分析

2.1 基本理论

资料地址http://www.chinahadoop.cn/course/840/learn#lesson/16491

1)数据处理的最基本前期工作:

A: 类别型数据

明确取值类别

明确每类取值的分布

B: 数值型数据

了解极值与分位情况

了解正态性,均值,方差情况

了解变量相关性

C: 通用处理

缺失值情况

重复性情况

Inspecting——> Cleaning——>transforming——>modeling——>discover useful info/suggest conclusion/support decision making

2)常见的任务分类:

A: 分类问题

B: 回归问题

C: 聚类问题

D: 时序分析问题

2.2 基本工具

1)Numpy: ndarray

2)Pandas: Series和DataFrame

3)EDA的工具: Matplotlib, Seaborn, Bokeh

4)机器学习Scikit-learn

5)量化分析与回测:Talib/Zipline/PyAlgoTrade/Pybacktest

6)Scikit-Image: 图像处理

7)NLTK: 自然语言处理

2.3 Pandas

资料地址:http://pandas.pydata.org/pandas-docs/stable/

1)数据结构: Series/DataFrame/GroupBy/Index/Style/Resample/Window

2)Index: IntegerIndex/CategoricalIndex/IntervalIndex/DatetimeIndex/TimedeltaIndex

3)Functions: creation/conversion/attributes/index/selection/slice/groupby/sort

4)Reshape/combine/merge/join/serialization/plot/missing data/data manipulation

2.4 Sklearn

资料地址:http://scikit-learn.org/stable/

1) preprocessing: 包括样本切割,特征提取,

2) Model_selection: 包括特征选择,交叉验证等

3) Dimensionality reduction: 包括PCA, FA等

4) Classification/Regression/Clustering: 分类器、回归、聚类

2.5 imblearn

资料地址:

http://contrib.scikit-learn.org/imbalanced-learn/api.html#

http://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/

2.6 statsmodels

资料地址:http://www.statsmodels.org/stable/index.html

2.7 tushare

资料地址:http://www.statsmodels.org/stable/index.html

三、金融数据分析基础

3.1 业务背景

1)客户类型,业务类型,建模类型

3.2 金融数据分析建模基础

1)EDA的常用方法

2)极值、缺失值的处理方法

3)标准化与归一化的处理

4)Category变量的编码方式

5)变量分箱的常用方式

6)IV值的计算与经验判断

7)WOE的计算, WOE编码

8)交叉验证的策略与评价

9)各类模型的优缺点, 各类模型对输入的质量敏感性程度

10)各类模型的调参经验总结

四、数据分析实例

4.1 CASE: KNN做玻璃分类——KNN、sklearn、seaborn

示例代码:https://github.com/esppk/Glass_Classification

第一步:用pandas读取csv文件, 用df.info()方法查看

第二步:查看直观特征:

df.shape 查看有几行几列

df.columns获取每一列的表头名称,可以将y过滤掉,只留下x

df.head(n)可以预览读取的数据n行

df.dtypes可以查看df的数据类型

第三步:查看简单的统计特征:

df.describe()可以查看count,mean, sd, min,max, 25%,50%,75%

比如:通过mean可以查看各个x的取值范围是否大概一致,如果相差太大,要做归一化处理

df'y'.value_counts()可以用来查看样本里面y标签的取值与对应个数情况

比如:如果某个取值的数目特别多,表名样本非常不平衡,需要做sample weight等相关处理,或者将样本分割一下

第四步:查看可视化的统计特征:

skew的计算与描述——每个单变量x与y的分布情况——distplot

查看哪些变量需要做归一化处理——boxplot

查看两两变量之间的关系——pairplot

第五步: 分割数据集: trainset和testset, 可以直接用sklearn.model_selection里面的train_test_split

第六步:使用KNN分类器做分类算法, 看各个k取值下的准确率,从而决定best_k

第七步:使用KNN模型fit trainset,查看testset的准确率

提升模型准确率:

1)非平衡样本的数据处理

2)特征的归一化处理

3)其他分类器的尝试

4)尝试获取更多的数据

4.2 CASE: 逻辑回归做Lending Club 借贷数据分析

资料地址:http://www.chinahadoop.cn/classroom/48/introduction

第一步:文件目录相关操作 import os

os.path.exists(filepath) check某个文件或目录是否存在

os.path.join(a,b)拼接目录地址

第二步:文件压缩与解压相关操作: import zipfile

with zipfile.ZipFile(originalFilepath) as zf:

 zf.extractAll(targetPath)

第三步:pandas DataFrame里面取到某个列target的数据, 做类型转换:

data'newcolname' = pd.to_datetime(data'oldcolname')

data2=data.groupby('newcolname')'target'.sum()

df=pd.DataFrame(data2).reset_index()

将日期换成月份:(将DateTimeIndex变更为PeriodIndex)

data'newcolname_2'=data'newcolname'.apply(lamda x: x.to_period('M'))

第四步:观察数据

直观情况:raw_data.head()、raw_data.info()、raw_data.describe()

类型分布:used_data'loan_status'.value_counts()

按时间统计: 新增一列作为datetime index, group by这个index列

used_data'issue_d2'=pd.to_datetime(used_data'issue_d')

data_group_by_date=used_data.groupby('issue_d2').sum()

data_group_by_date.reset_index(inplace=True)

data_group_by_date'issue_month'=data_group_by_date'issue_d2'.apply(lambda x:x.to_period('M')) loan_amount_group_by_month=data_group_by_date.groupby('issue_month')'loan_amnt'.sum() loan_amount_group_by_month_df=pd.DataFrame(loan_amount_group_by_month).reset_index()

查看多变量间的分类统计情况:

data_group_by_state=used_data.groupby('addr_state')'loan_amnt'.sum()

data_group_by_state_df=pd.DataFrame(data_group_by_state).reset_index()

data_group_by_term=used_data.groupby('grade','term')'int_rate'.mean()

data_group_by_term_df=pd.DataFrame(data_group_by_term).reset_index()

第五步:处理category 变量,改成0,1这样的label

filtered_mask=raw_data'loan_status'.isin('Fully Paid','Charged Off','Default')

filtered_data=raw_datafiltered_mask

proc_filter_data=filtered_data.copy()

proc_filter_data'label'=filtered_data'loan_status'.apply(formateY)

proc_filter_data'emp_length_feat'=filtered_data'emp_length'.apply(formateEmpLength)

第六步:原始特征选择

第七步:缺失值处理

第八步:开始学习

A: LabelEncoder()、OneHotEncoder() check category var

B: 处理不平衡数据: SMOTE

C: 分割train set, test set

D: 选择模型, eg LogisticRegression

E: 交叉验证调整最优化的超参数: cross_val_score

1) 迭代策略的选择: KFold/LeaveOneOut/LeavePOut/ShuffleSplit

2) 交叉验证评估的度量: score类型(eg, accuracy/f1/precision/recall/roc_auc/r2)

4.3 CASE: 股票量化示例

资料地址:http://www.chinahadoop.cn/classroom/48/introduction

1)股票收益率( log(pt/p(t-1)) )的计算

1)使用tushare提供的接口,获取上证指数的价格数据

2)使用tushare提供的接口,获取某只股票的价格数据

3)股票价格服从log-normal分布, 所以对价格数据,需要求log price的序列

 log_return = np.log(price/price.shift(1))

4)两个序列处理缺失值: 方案, dropna

5)add_constant(x)加入截距数据

 sm.add_constant(x)

6)调用OLS fit 两个log price序列

 sm.OLS(y, x_cons).fit()

7)查看model的情况:

 res_ols.summary()

2)预测某只指数的涨跌

1)使用tushare读取某只指数(股票)的日K线数据

2)生成对应的时滞序列: price.shift(x)

hist_lag'lag{}'.format(str(i + 1)) = hist_data'close'.shift(i + 1)

3)label每天的涨跌:

ret_df'today' = hist_lag'today'.pct_change() * 100.0

ret_df'lag{}'.format(str(i + 1)) = \hist_lag'lag{}'.format(str(i + 1)).pct_change() * 100.0

ret_df'direction' = np.sign(ret_df'today')

4)分割train set/test set

X = lag_ret_df['lag1', 'lag2']

y = lag_ret_df'direction'

start_test = dt.datetime(2016, 1, 1)

X_train = XX.index < start_test

X_test = XX.index >= start_test

y_train = yy.index < start_test

y_test = yy.index >= start_test

5)选择不同的模型,交叉验证获取优化的超参数,在train set上fit, 在test set上predict, 评估模型的优劣

4.4 CASE: 银行客户流失预警模型

资料地址:http://www.chinahadoop.cn/classroom/48/introduction

1)使用Pandas读取2个数据源文件

2)Merge on ID: pd.merge(A, B, on=‘ID’)

3)区分数据类型:

if isinstance(x[0], numbers.Real):
     numericCols.append(var)
elif isinstance(x[0], str):
     stringCols.append(var)

4) EDA

A: distplot, 看X的偏度,分布

B: boxplot, 看所有X的分布(比对哪些需要做归一化、标准化)

C: pairplot, 看X两两之间的关联情况

D: category var各个取值与X的分布情况——subplots合并多张图、轴

E: 查看X是否需要做截断,截断前和截断后与Y的关系

5) 变量预处理:

A: 时间变量的处理,作为label或者作为基于某一天之间的天数

统一处理两个时间的格式,转变为datetime变量,两者相减之后取days属性

base2 = time.strptime(base,'%Y/%m/%d')
base3 = datetime.datetime(base2[0],base2[1],base2[2])
date1 = [time.strptime(i,'%Y/%m/%d') for i in df[dateCol]]
date2 = [datetime.datetime(i[0],i[1],i[2]) for i in date1]
daysGap = [(date2[i] - base3).days for i in range(len(date2))]

B: 类别变量的编码,

最常用的做法, 用y变量在这个category变量的某一类中的比率来代替这一类的取值。

如: gender=’女’——用等于‘女’的坏样本比率ratio1来替代

gender=’男’——用等于‘男’的坏样本比率ratio2来替代

第二种做法,添加哑变量,适合于category取值较少的情况

如: city=’guangzhou’

city=’nanjing’

用isGuangzhou, isNanjing这两个变量来替换掉city这个变量

第三种做法,用category变量的某一类在样本中的出现次数来代替。

如: status=’default’出现100次,‘’default‘’用100表示

Status=’normal’出现1000次,‘normal’用1000表示

C: Missing Value的处理

判断是不是有存在Missing Value——从原始数据中取出非missing数据,比对shape

#Take the sample with non-missing value in col

validDf = df.loc[df[col] == df[col]][[col]]

if validDf.shape[0] == df.shape[0]:

return 'There is no missing value in {}'.format(col)

数值型变量的outlier detection,通常超过均值上下3个标准差就算outlier

D: 去掉使用循环的思维:

[functioncall(x)  for x in  df[col]]
[functioncall(x) for x in dif[col] if xxx ]
for v in set(df[col]):
   encoder[v] = sum(subDf[target])*1.0/subDf.shape[0]
newCol = [encoder[i] for i in df[col]]    

6)变量衍生

A: X之间相除得到某个ratio

B: X的均值,最大值,最小值

C: X的求和

7)模型选择与训练:

A: train_test_split

B: 选择模型:

GBDT

神经网络

C: 参数调整:

默认参数, parameter tuning

D: 查看variable importance in selected model

4.5 CASE: 互联网金融/银行 申请评分卡模型

资料地址:http://www.chinahadoop.cn/classroom/48/introduction

1)使用pandas读取3个input文件

2)查看3个input文件里面的ID,是否存在有的有值,有的没值, 取3个里面都有的数据出来做train set

data1_Idx, data2_Idx, data3_Idx = set(data1'Idx'), set(data2'Idx'), set(data3'Idx')

check_Idx_integrity = (data1_Idx - data2_Idx)|(data2_Idx - data1_Idx)|(data1_Idx - data3_Idx)|(data3_Idx - data1_Idx)

set(xxx)能够去掉xxx里面的重复数据

3)特征衍生:

A: 一些原始变量,衍生不同time window下面的count, mean等变量

B: category变量:

如果缺失率超过50%, 则去掉这个变量

如果不超过,作为一种特殊取值留着

C: continuous变量:

如果缺失率超过70%, 则去掉这个变量

如果不超过,则考虑用填充的方式进行填充(random, mean, min)

4)特征分箱:

A: category变量:

如果分类的取值个数>5个,则用每种分类里面的bad rate代替每个分类

如果分类的取值个数<=5个,则看size最大的那个bin, 如果这个bin的size超过90%, 则去掉这个变量。 如果这个bin的size坏样本占比为0, 则将这个bin与最小的那个bin合并, 再重新check maximum bin

B: continuous变量:

使用卡方分箱方法, default 5个bin

查看每个bin里面的bad rate,如果bad rate不单调,则降低bin的个数重新分bin

查看maximum size的bin占比,如果超过90%, 则删掉这个变量

5)变量选择:

A: 计算每个剩下来的变量的IV值, WOE值

B: 取IV>= 0.02的所有变量

C: 生成变量对, 计算变量对之间的相关系数,如果相关系数大于某个阈值(取0.8), 则变量对里面选IV值高的那个变量入模

D: 查看每个变量的VIF值, VIF = 1/ (1-R2) , VIF>10的去掉

E: 循环检查入模变量是否显著,如果不显著(取Pvalue>0.1为不显著),就去掉之后再跑一遍

F: 直到所有变量都是显著的为止

6)跑基础的逻辑回归模型, 将model 序列化存下来

LR = sm.Logit(y, X).fit()

saveModel =open('./data/LR_Model_Normal.pkl','w')

pickle.dump(LR,saveModel)

saveModel.close()

7)跑Lasso正则化(L1)的逻辑回归模型, type1 error和type 2 error采用不同的惩罚系数

A: 用交叉验证的方式tune hyper parameter:

LR_model_2 = LogisticRegressionCV(Cs=C_penalty, penalty='l1', solver='liblinear', class_weight={1:bad_weight, 0:1})

LR_model_2_fit = LR_model_2.fit(X_train,y_train)

B: 序列化应用Lasso的逻辑回归模型

8)可以通过随机森林的方式确定变量的重要性, 根据随机森林的结果(如: 取importance top 10的变量入模等)来跑逻辑回归模型

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一心无二用,本人只专注于基础图像算法的实现与优化。

图像处理中任意核卷积(matlab中conv2函数)的快速实现。

     卷积其实是图像处理中最基本的操作,我们常见的一些算法比如:均值模糊、高斯模糊、锐化、Sobel、拉普拉斯、prewitt边缘检测等等一些和领域相关的算...

9138
来自专栏数据结构与算法

05:Cave Cows 1 洞穴里的牛之一

总时间限制: 10000ms单个测试点时间限制: 1000ms内存限制: 262144kB描述 很少人知道其实奶牛非常喜欢到洞穴里面去探险。     洞窟里有N...

2967
来自专栏Leetcode名企之路

【Leetcode】63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图...

2702
来自专栏AI研习社

博客 | MNIST 数据集载入线性模型

这节开始我们使用知名的图片数据库 「THE MNIST DATABASE」 作为我们的图片来源,它的数据内容是一共七a万张 28×28 像素的手写数字图片,并被...

1545
来自专栏数据小魔方

随机数函数

今天给大家分享几种常用的随机数函数! ▼ 在excel中生成随机数虽然不是很频繁的需求,但是简单了解几个随机数生成方式,偶尔还是很有帮助的。因为我们时常需要使用...

2874
来自专栏CDA数据分析师

教你一招:Python编写的最短路径算法

一心想学习算法,很少去真正静下心来去研究,前几天趁着周末去了解了最短路径的资料,用python写了一个最短路径算法。算法是基于带权无向图去寻找两个点之间的最短路...

39810
来自专栏SimpleAI

【DL笔记9】搭建CNN哪家强?TensorFlow,Keras谁在行?

从【DL笔记1】到【DL笔记N】,是我学习深度学习一路上的点点滴滴的记录,是从Coursera网课、各大博客、论文的学习以及自己的实践中总结而来。从基本的概念、...

2992
来自专栏鸿的学习笔记

写给开发者的机器学习指南(六)

在本节中,我们为您介绍一组在实际环境中的机器学习算法。 这些例子的想法是让你开始使用机器学习算法,而不深入解释底层算法。我们只专注于这些算法的特征方面,如何验证...

902
来自专栏AI研习社

如何在 Keras 中从零开始开发一个神经机器翻译系统?

机器翻译是一项具有挑战性的任务,包含一些使用高度复杂的语言知识开发的大型统计模型。 神经机器翻译的工作原理是——利用深层神经网络来解决机器翻译问题。 在本教程...

37412
来自专栏云计算教程系列

如何使用Scikit-learn在Python中构建机器学习分类器

机器学习是计算机科学、人工智能和统计学的研究领域。机器学习的重点是训练算法以学习模式并根据数据进行预测。机器学习特别有价值,因为它让我们可以使用计算机来自动化决...

2175

扫码关注云+社区

领取腾讯云代金券