文章目录
一. Python语言的基本概念
1.1 python介绍
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使用缩进而非大括号表达代码逻辑,可读性高、表达清晰
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) #创建44的对角数组,对角元素为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模块
用于回归分析等统计建模的模块。常用的统计模型有:
- 线性回归
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
- 逻辑回归模型
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'])]
参考:
- http://www.dataguru.cn/mycourse.php?mod=intro&lessonid=1701