金融业信贷风控算法4-python的入门和介绍

一. Python语言的基本概念

1.1 python介绍

image.png

image.png

image.png

1.2 python基础语法

1.2.1 python3的基本数据结构

单一型变量,无需事先声明变量类型
数值:a=1, a=1.0, a=1+2j
字符串(区分大小写):b=‘python’。字符串是字符的集合,可以被引用:b[2]

列表list,可存储任意个数、任意类型的对象,索引从0开始
c = [1, ‘abc’, b]

元组tuple,跟列表相似,但是一旦建立就不能被修改
d = (c, 1, b[1])
字典,Python中的映射数据类型(哈希表),由键值对(key-value)构成
acct_amt = {‘a0001’:123.03, ‘b0002’:-45.21}

1.2.2 python3基本语句

Python使用缩进而非大括号表达代码逻辑,可读性高、表达清晰
image.png

image.png

1.2.3 自定义函数

关键词:def

def myfunc([arguments]):
	operations
	return result

函数的入参可以是
默认参数
关键字参数

例如,自定义函数,找出消费额超出日均消费额的天数

def LargeSpendDate(spend_amount_list):
	avg = sum(spend_amount_list)/len(spend_amount_list)
	large_spend_date = [d for d in range(len(spend_amount_list)) if spend_amount_list[d]> avg]
	return len(large_spend_date)

1.2.4 函数式编程

简单的函数并不需要显示定义,以此减少代码量,增加程序的阅读性和美感
lambda 与匿名函数
例如,求指定两个数的较大的一个,除了用def语句生成函数外,可以用一行lambda语句:

max_of_two = lambda x,y: int(x>y)*x+int(x<y)*y
>>> print(max_of_two(12,45))
45

map函数:对一个及多个序列执行同一个操作,返回一个列表

>>> map(lambda x: x+1,[1,2,3,4]) 
[2, 3, 4, 5]  
>>> map(lambda x,y: x+y,[1,2,3,4],(10,20,30,40)) 
[11, 22, 33, 44]  

reduce函数:某二元函数作用在序列上,且进行“卷积”操作
例如:计算每日消费的总额

>>>daily_spend = [110.32, 0, 445.32, 0, 88.83,0]
>>>print(reduce(lambda x,y:x+y, daily_spend))
644.47 

filter函数:对给定的序列依照某种条件作过滤
例如,过滤掉每日消费中,消费为0的记录

>>>daily_spend = [110.32, 0, 445.32, 0, 88.83,0]
>>>has_spend = filter(lambda x: x!=0,daily_spend)
>>>print(list(has_spend))
[110.32, 445.32, 88.83]

zip函数:将多个序列相同位置上的元素,组合成元组后放入列表中

>>>days, spend = [10,25,30], [12.20, 20.43, 44.32]
>>>consumptions = zip(days, spend)
>>>print(list(consumptions ))
[(10, 12.2), (25, 20.43), (30, 44.32)]

1.2.5 导入外部模块

基础的Python环境可能没有所需的函数、属性、功能,需要从外部模块中导入。
例如,在Python3中,reduce函数不属于全局函数,需要从库”functools”中导入。
两种操作:
导入1个或者多个整个模块:import module1[, module2,…]
从模块中导入指定的1个或者多个属性:from module import name1[,nam2,…]
可以对导入的模块或者属性重命名:
from module import longNameAttri as shortNameAttri

二. 数据分析建模中常用的模块

2.1 Pandas模块

Series: 是一个一维数组对象,并且可以带索引

import pandas as pd
#从列表中创建Series
delq = pd.Series([1,0,2,3,0])
#从字典中创建Series
delq = pd.Series({'a':1,'b':0,'c':2,'d':3,'e':0})
#查找第2个元素
print(delq[2])
#查找不为0的元素
print(delq[delq!=0])

**Dataframe:**一个表格型的数据结构。它提供有序的列和不同类型的列值。

spend = pd.read_csv('spend.csv',header = 0)
#从字典中创建dataframe
spend = pd.DataFrame({'a':list(range(10)),'b':list(range(20,10,-1))})
#选取第3条记录
print(spend.iloc[3])
#选取a列超过5,b列不超过15的记录
print(spend[(spend.a>5)&(spend.b<=15)])

apply函数: 让函数作用在dataframe某一维的向量上时,可以使用apply来完成

#将函数作用在列元素上
print(spend[‘a’].apply(lambda x: x+1))    #此时不会改变原元素
#将函数作用在行元素上
print(spend.iloc[3].apply(lambda x: x+1)) #此时不会改变原元素
#map函数:让函数作用在Series上
#applymap函数:让函数作用在dataframe的每一个元素上
print(spend.applymap(lambda x: x+1))

2.2 Numpy模块

Python的一种开源的数组计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多
创建1维数组:data = np.array([1,3,4,8]) 
创建二维数组:data = np.array([[1,2,3],[4,5,6]])
创建特殊数组:data = np.zeros((2,2)) #创建22全为0的2维数组
data = np.ones((2,3,3,)) #创建全为1的三维数组
data = np.eye(4) #创建4
4的对角数组,对角元素为1,其它都为0

数学运算:
x, y = np.arange(1,5).reshape(2,2), np.arange(5,9).reshape(2,2)
y = z = x+y 或np.add(x,y) 数组中对应位置元素相加,减法同理
c = x*y 数组中对应位置元素相乘
h = x.dot(y) 矩阵内积
q = x/y 数组对应位置相除
n = np.sqrt(x) 平方根
x.T 转置矩阵
np.linspace(1,10,num=200) 指定在数轴上起始位置与均分,num表示均分份数

2.3 Statsmodels模块

用于回归分析等统计建模的模块。常用的统计模型有:

  1. 线性回归
import statsmodels.api as sm # 最小二乘
regr = sm.OLS(y, x) # 普通最小二乘模型,ordinary least square model
res = regr.fit()    #res.model.endog
# 从模型获得拟合数据
st, data, ss2 = summary_table(res, alpha=0.05) # 置信水平alpha=5%,st数据汇总,data数据详情,ss2数据列名
fitted_values = data[:,2]  #等价于res.fittedvalues
  1. 逻辑回归模型
import statsmodels.api as sm
logit = sm.Logit(data[label], data[train_cols])
# 拟合模型
result = logit.fit()
# 进行预测,并将预测评分存入 predict 列中
newdata['predict'] = result.predict(newdata[predict_cols])

2.4 Sklearn模块

重要机器学习库,其中封装了大量的机器学习算法,如:分类、回归、降维以及聚类;还包含了监督学习、非监督学习、数据变换三大模块。
数据归一化:

from sklearn import preprocessing
# 1. 基于mean和std的标准化
scaler = preprocessing.StandardScaler().fit(train_data)
scaler.transform(train_data)
# 2. 将每个特征值归一化到一个固定范围
scaler = preprocessing.MinMaxScaler(feature_range=(0, 1)).fit(train_data)
scaler.transform(train_data)

在模型开发中,需要将数据拆分成训练集和验证集,此时可以使用

from sklearn.mode_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

朴素贝叶斯算法NB

from sklearn import naive_bayes
model = naive_bayes.GaussianNB() # 高斯贝叶斯
model = naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

决策树

from sklearn import tree 
model = tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, 
max_features=None, random_state=None, max_leaf_nodes=None, 
min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

KNN

from sklearn import neighbors
model = neighbors.KNeighborsClassifier(n_neighbors=5, n_jobs=1)

交叉验证

from sklearn.model_selection import cross_val_score
cross_val_score(model, X, y=None, scoring=None, cv=None, n_jobs=1)

保存为pickle文件

import pickle
with open(‘model.pickle’, ‘wb’) as f:
	pickle.dump(model, f)
with open('model.pickle', 'rb') as f:
	model = pickle.load(f)

2.5 Anaconda

Anaconda是包管理器和环境管理器,附带了一大批常用数据科学包,包括conda、Python 和 150 多个科学包及其依赖项。conda(包管理器)可以很好的帮助你在计算机上安装和管理这些包,包括安装、卸载和更新包。

三. pandas 使用实例

数据源:
链接:https://pan.baidu.com/s/1B_7fPpYSt8fmSwSX0vNJqw
提取码:qjlf

import pandas as pd

def Encoder_Gender(x):
    if x=='M':
        return 1
    elif x=='F':
        return 0
    else:
        return -1

loan_data = pd.read_csv('/Users/Code/Data Collections/all/application_train_small.csv',header = 0)

#0,查看有哪些列
for col in list(loan_data.columns):
    print(col)

#1,查看有哪些不同类型的贷款产品
contract_type = set(loan_data['NAME_CONTRACT_TYPE'])
print(contract_type)
#{'Revolving loans', 'Cash loans'}

#2,提取每种贷款产品的样本
Revolving_loans = loan_data[loan_data['NAME_CONTRACT_TYPE'] == 'Revolving loans']
Cash_loans = loan_data[loan_data['NAME_CONTRACT_TYPE'] == 'Cash loans']

#3,在Revolving loans的样本中,将前100个样本取出来
Revolving_100 = Revolving_loans.iloc[:100]

#4, 对Cash loans的样本中的性别进行编码,法则是男性编码为1,女性编码为0, 其他编码为-1
Cash_loans['Gender_Encoder'] = Cash_loans.apply(Encoder_Gender,axis=1)
#Cash_loans['Gender_Encoder'] = Cash_loans.apply(lambda x: Encoder_Gender(x.Encoder_Gender),axis=1)
#Cash_loans['Gender_Encoder'] = Cash_loans['CODE_GENDER'].apply(Encoder_Gender,axis=1)

#5,对Revolving loans的样本中OWN_CAR_AGE不缺失的样本取出来
OWN_CAR_AGE_Revolving = Revolving_loans[Revolving_loans['OWN_CAR_AGE'].notna()]

#6,对Cash Loan中,OCCUPATION_TYPE不属于Laborers和Core staff的样本取出来
Cash_loans_OCCUPATION = Cash_loans[~Cash_loans['OCCUPATION_TYPE'].isin(['Laborers','Core staff'])]

参考:

  1. http://www.dataguru.cn/mycourse.php?mod=intro&lessonid=1701
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值