1. 数据探索
1.1 常用的统计量分析
源数据
年份,人均GDP(元),产量(万千升),人均消费指数
2000,7857.7,2231.3,100.4
2001,8521.7,2288.9,100.7
2002,9339.2,2402.7,99.2
2003,10542.0,2540.5,101.2
2004,12233.5,2958.9,103.9
2005,1569.5,256.9,80.9
#读取数据
import pandas as pd
df = pd.read_csv("data.csv", index_col="年份")
#获取数据个数
print(len(df))
print(df.index.size)
#均值
mean = df["人均GDP(元)"].mean()
print("%.2f"%mean)
#中位数:排序后在中间位置(或者中间两位的平均值)
print(df["人均GDP(元)"].median())
#众数:可能有多个众数
from pandas import Series
data = Series([750,800,950,750,800,801,800,750])
print(data.mode()[0])
#最大值
print(df["人均GDP(元)"].max())
#最小值
print(df["人均GDP(元)"].min())
#所有数据的最大值
print(df.max())
"""
人均GDP(元) 12233.5
产量(万千升) 2958.9
人均消费指数 103.9
dtype: float64
"""
#极差=最大值-最小值
print(df["人均GDP(元)"].max()-df["人均GDP(元)"].min())
#标准差:std--描述波动性
std = df["人均GDP(元)"].std()
print("%.2f"%std)
# 方差:var
var = df["人均GDP(元)"].var()
print("%.2f"%var)
#四分位数
# 先按从小到大方法排序,然后使用下列公式:
"""
p=0.25 0.5 0.75
方法1 pos = (n+1)*p
方法2 pos = 1+(n-1)*p
例如:数据----6,7,15,36,39,40,41,42,43,47,49
第一四分位数(下四分位数)
(11+1)/4 =3,说明它在第三个位置,所以是15,即Q1=15。
中位数
(11+1)/4*2=6,所以是40。
第三四分位数(上四分位数)
(11+!)/4*3=9, 所以是43。
至此,Q1=15,Q2=40,Q3=43。
下面根据公式(n-1)法计算
1+(11-1)x 0.25 =3.5,则Q1=15x0.5+36x0.5=25.5
1+(11-1)x 0.5 =6,则Q2=15x0.5+36x0.5=40
1+(11-1)x 0.75 =8.5,则Q3=42x0.5+43x0.5=42.5
"""
#代码实现
desc = df.describe()
"""
人均GDP(元) 产量(万千升) 人均消费指数
count 6.000000 6.000000 6.000000
mean 8343.933333 2113.200000 97.716667
std 3663.652617 945.755975 8.384132
min 1569.500000 256.900000 80.900000
25% 8023.700000 2245.700000 99.500000
50% 8930.450000 2345.800000 100.550000
75% 10241.300000 2506.050000 101.075000
max 12233.500000 2958.900000 103.900000
"""
#获取某个指标
print(desc["人均GDP(元)"]["25%"]) #8023.7
print(desc.loc["25%"][0]) #8023.7
print(desc.iloc[4]["人均GDP(元)"]) #8023.7
#极差
res = desc["人均GDP(元)"]["max"] - desc["人均GDP(元)"]["min"]
print(res)
#计算所有指标极差
res = desc.loc["max"] - desc.loc["min"]
"""
人均GDP(元) 10664.0
产量(万千升) 2702.0
人均消费指数 23.0
dtype: float64
"""
#将极差添加到数据框
desc.loc["range"] = res
print(desc)
"""
人均GDP(元) 产量(万千升) 人均消费指数
count 6.000000 6.000000 6.000000
mean 8343.933333 2113.200000 97.716667
std 3663.652617 945.755975 8.384132
min 1569.500000 256.900000 80.900000
25% 8023.700000 2245.700000 99.500000
50% 8930.450000 2345.800000 100.550000
75% 10241.300000 2506.050000 101.075000
max 12233.500000 2958.900000 103.900000
range 10664.000000 2702.000000 23.000000
"""
#添加方差
# var = df.var()
# desc.loc["var"] = var
# print(desc)
1.2 相关性分析
源数据
分行编号,不良贷款,各项贷款余额,本年累计应收贷款,贷款项目个数,本年固定资产投资额
1,0.9,67.3,6.8,5,51.9
2,1.1,111.3,19.8,16,90.9
3,4.8,173.0,7.7,17,73.7
4,3.2,80.8,7.2,10,14.5
5,7.8,199.7,16.5,19,63.2
1.散点图
#读取数据
import pandas as pd
df = pd.read_csv("data2.csv", index_col="分行编号")
print(df)
#散点图
x = df["各项贷款余额"]
y = df["不良贷款"]
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(x,y, alpha=0.5) #alpha:数据标记的透明度
#设置
ax.set_title("各项贷款余额&不良贷款")
ax.set_xlabel("各项贷款余额")
ax.set_ylabel("不良贷款")
#设置字体
from pylab import mpl
mpl.rcParams["font.sans-serif"]= ["FangSong"]
2.散点矩阵
将指标进行两两相关性分析:对角线是每个指标的直方图
from pandas.plotting import scatter_matrix
scatter_matrix(df, figsize=(15,15), marker="o", alpha=0.5) #figsize:画布尺寸,marker:标记点的样式
plt.show()
3.相关系数
c = df.corr()
"""
不良贷款 各项贷款余额 本年累计应收贷款 贷款项目个数 本年固定资产投资额
不良贷款 1.000000 0.876056 0.144891 0.686848 -0.022967
各项贷款余额 0.876056 1.000000 0.381666 0.892914 0.447281
本年累计应收贷款 0.144891 0.381666 1.000000 0.639148 0.650556
贷款项目个数 0.686848 0.892914 0.639148 1.000000 0.560098
本年固定资产投资额 -0.022967 0.447281 0.650556 0.560098 1.000000
"""
#获取某列相关系数
print(c["不良贷款"])
"""
不良贷款 1.000000
各项贷款余额 0.876056
本年累计应收贷款 0.144891
贷款项目个数 0.686848
本年固定资产投资额 -0.022967
Name: 不良贷款, dtype: float64
"""
#计算两个指标的相关系数
res = df["不良贷款"].corr(df["各项贷款余额"])
print("%.2f"%res) #0.88
print(df["不良贷款"].corr(df["不良贷款"])) #1.0
1.3 数据透视表pivot_table
源数据
学习中心,招生批次,院校名称,层次,专业,数据来源,招生途径,市场途径,身份证号码,费用科目,缴费方式,已缴纳学费
天津实训中心,20201109,天津大学,本科,机械,实训中心,大客户,大客户,202011091234,学费,支付宝,2500
北京实训中心,20201110,北京大学,硕士,软件,实训中心,大客户,大客户,202011091235,学费,微信,3800
天津实训中心,20201109,天津大学,本科,机械,实训中心,老带新,老带新,202011091236,学费,微信,4000
北京实训中心,20201110,北京大学,硕士,接卸,实训中心,大客户,大客户,202011091237,学费,支付宝,2500
天津实训中心,20201114,天津大学,本科,软件,实训中心,老带新,老带新,202011091238,学费,支付宝,3900
天津实训中心,20201114,南开大学,博士,管理,实训中心,大客户,大客户,202011091239,学费,支付宝,2500
天津实训中心,20201114,天津大学,硕士,软件,实训中心,老带新,老带新,202011091240,学费,pos直汇,5000
code
#读取数据
import pandas as pd
df = pd.read_csv("data2.csv")
print(df)
print(df.describe(include="all").T) #include="all"给出所有数据的信息
#数据透视表
import numpy as np
#求各学习中心已缴纳学费的总和
s1 = df.pivot_table(index=["学习中心"],values=["已缴纳学费"],aggfunc=np.sum)
print(s1)
"""
已缴纳学费
学习中心
北京实训中心 6300
天津实训中心 17900s
"""
#求各学习中心已缴纳学费的均值
mean1 = df.pivot_table(index=["学习中心"],values=["已缴纳学费"],aggfunc=np.mean)
print(mean1)
"""
已缴纳学费
学习中心
北京实训中心 3150
天津实训中心 3580
"""
#求各学习中心的报名人数
count = df.pivot_table(index=["学习中心"],values=["身份证号码"],aggfunc=np.count_nonzero)
print(count)
"""
身份证号码
学习中心
北京实训中心 2
天津实训中心 5
"""
#多个指标:求各学习中心已缴纳学费的总和和报名人数
res = df.pivot_table(index=["学习中心"],values=["已缴纳学费", "身份证号码"],aggfunc={"已缴纳学费":np.sum, "身份证号码":np.count_nonzero})
print(res)
"""
已缴纳学费 身份证号码
学习中心
北京实训中心 6300 2
天津实训中心 17900 5
"""
2. 数据预处理
2.1 数据集合并
import pandas as pd
df1 = pd.DataFrame({"key":["a", "b", "c", "d"], "data1":range(4)})
print(df1)
"""
key data1
0 a 0
1 b 1
2 c 2
3 d 3
"""
df2 = pd.DataFrame({"key":["a", "b", "e", "f"], "data2":range(1, 5)})
print(df2)
"""
key data2
0 a 1
1 b 2
2 e 3
3 f 4
"""
# 合并(相同列),两个表内连接,取交集
data = pd.merge(df1, df2)
print(data)
"""
key data1 data2
0 a 0 1
1 b 1 2
"""
#左连接:以左边为准
data = pd.merge(df1, df2, how="left")
print(data)
"""
key data1 data2
0 a 0 1.0
1 b 1 2.0
2 c 2 NaN
3 d 3 NaN
"""
#右连接
data = pd.merge(df1, df2, how="right")
print(data)
#concat:axis=0纵向连接
data = pd.concat([df1,df2],axis=0, sort=False)
print(data)
"""
key data1 data2
0 a 0.0 NaN
1 b 1.0 NaN
2 c 2.0 NaN
3 d 3.0 NaN
0 a NaN 1.0
1 b NaN 2.0
2 e NaN 3.0
3 f NaN 4.0
"""
#concat:axis=1横向连接
data = pd.concat([df1,df2],axis=1, sort=False)
print(data)
"""
key data1 key data2
0 a 0 a 1
1 b 1 b 2
2 c 2 e 3
3 d 3 f 4
"""
2.2 常用函数
源数据:data2.csv
学习中心,招生批次,院校名称,层次,专业,数据来源,招生途径,市场途径,身份证号码,费用科目,缴费方式,已缴纳学费
天津实训中心,20201109,天津大学,本科,机械,实训中心,大客户,大客户,202011091234,学费,支付宝,2500
北京实训中心,20201110,北京大学,硕士,软件,实训中心,大客户,大客户,202011091235,学费,微信,3800
天津实训中心,20201109,天津大学,本科,机械,实训中心,老带新,老带新,202011091236,学费,微信,4000
北京实训中心,20201110,北京大学,硕士,接卸,实训中心,大客户,大客户,202011091237,学费,支付宝,2500
天津实训中心,20201114,天津大学,本科,软件,实训中心,老带新,老带新,202011091238,学费,支付宝,3900
天津实训中心,20201114,南开大学,博士,管理,实训中心,大客户,大客户,202011091239,学费,支付宝,2500
天津实训中心,20201114,天津大学,硕士,软件,实训中心,老带新,老带新,202011091240,学费,pos直汇,5000
源数据:data.csv
年份,人均GDP(元),产量(万千升),人均消费指数
2000,7857.7,2231.3,100.4
2001,8521.7,2288.9,100.7
2002,9339.2,2402.7,99.2
2003,10542.0,2540.5,101.2
2004,12233.5,2958.9,103.9
2005,1569.5,256.9,80.9
code
import pandas as pd
df = pd.read_csv("data2.csv")
print(df)
#分组统计:groupby
# 与函数连用才有意义
data = df.groupby("学习中心")["已缴纳学费"].sum()
print(data)
"""
学习中心
北京实训中心 6300
天津实训中心 17900
Name: 已缴纳学费, dtype: int64
"""
#统计各学习中心的报名数
data = df.groupby("学习中心")["身份证号码"].count()
print(data)
"""
学习中心
北京实训中心 2
天津实训中心 5
Name: 身份证号码, dtype: int64
"""
#数据聚合运算:apply
# 可以很方便的对分组进行现有的运算和自定义运算
df = pd.read_csv("data.csv", index_col="年份")
print(df)
#按照列求最大值
data = df.apply(max,axis=0)
print(data)
"""
人均GDP(元) 12233.5
产量(万千升) 2958.9
人均消费指数 103.9
dtype: float64
"""
#按照行求最大值
data = df.apply(max,axis=1)
print(data.head(4))
"""
年份
2000 7857.7
2001 8521.7
2002 9339.2
2003 10542.0
dtype: float64
"""
#stack:将数据的列“旋转”为行
data = df.stack()
print(data.head(6))
"""
年份
2000 人均GDP(元) 7857.7
产量(万千升) 2231.3
人均消费指数 100.4
2001 人均GDP(元) 8521.7
产量(万千升) 2288.9
人均消费指数 100.7
dtype: float64
"""
#unstack(stack的逆运算):将数据的行“旋转”为列
data = df.stack().unstack()
print(data.head(2))
"""
人均GDP(元) 产量(万千升) 人均消费指数
年份
2000 7857.7 2231.3 100.4
2001 8521.7 2288.9 100.7
"""
2.3 缺失值的处理:NaN(不是数字)
1.Series
from pandas import Series
import numpy as np
stringSer = Series(["a","b",np.nan,"c","d"])
print(stringSer)
"""
0 a
1 b
2 NaN
3 c
4 d
dtype: object
"""
#isnull:判断为空
print(stringSer.isnull())
"""
0 False
1 False
2 True
3 False
4 False
dtype: bool
"""
#notnull:判断不为空
print(stringSer.notnull())
"""
0 True
1 True
2 False
3 True
4 True
dtype: bool
"""
#少选非缺失值
data = stringSer[stringSer.notna()]
print(data)
"""
0 a
1 b
3 c
4 d
dtype: object
"""
#删除缺失值:dropna
data = stringSer.dropna()
print(data)
2.DataFrame
from pandas import DataFrame
import numpy as np
df = DataFrame([[1.4, np.nan],
[7.2, -4.5],
[np.nan, np.nan],
[0.75, -1.3]], index=list("ABCD"), columns=["one", "two"])
print(df)
"""
one two
A 1.40 NaN
B 7.20 -4.5
C NaN NaN
D 0.75 -1.3
"""
#dropna
data = df.dropna() #去掉有缺失值的整行
print(data)
"""
one two
B 7.20 -4.5
D 0.75 -1.3
"""
data = df.dropna(how="all") #z只有当整行都缺失时才会删除
print(data)
"""
one two
A 1.40 NaN
B 7.20 -4.5
D 0.75 -1.3
"""
#填充缺失值:fillna
data = df.fillna(0) #把缺失值用0填充
print(data)
"""
one two
A 1.40 0.0
B 7.20 -4.5
C 0.00 0.0
D 0.75 -1.3
"""
#不同列的缺失值用不同的值填充
data = df.fillna({"one":0,"two":1})
print(data)
"""
A 1.40 1.0
B 7.20 -4.5
C 0.00 1.0
D 0.75 -1.3
"""
#以均值填充缺失值
mean = df.mean()
print(mean)
"""
one 3.116667
two -2.900000
dtype: float64
"""
data = df.fillna(mean)
print(data)
"""
one two
A 1.400000 -2.9
B 7.200000 -4.5
C 3.116667 -2.9
D 0.750000 -1.3
"""
2.4 异常值及数据标准化
源数据
sno,name,age
20201109,frankshi1,5
20201110,frankshi2,6
20201111,frankshi3,-1
20201112,frankshi4,0
20201113,frankshi5,300
20201114,frankshi6,5
1.异常值处理
import pandas as pd
df = pd.read_csv("data.csv")
print(df)
desc = df.describe()
print(desc)
#筛选异常值
data = df.loc[:,"age"][df.age<=0]
print(data)
"""
2 -1
3 0
Name: age, dtype: int64
"""
#定位异常值
print(df.loc[2,"age"]) #-1
#将异常值填充为缺失值
import numpy as np
df.loc[2,"age"] = np.nan
print(df)
"""
sno name age
0 20201109 frankshi1 5.0
1 20201110 frankshi2 6.0
2 20201111 frankshi3 NaN
3 20201112 frankshi4 0.0
4 20201113 frankshi5 300.0
5 20201114 frankshi6 5.0
"""
2.数据标准化
源数据
78,89,1,56
200,586,99,50
8,300,-989,96
66,1052,45,6
import pandas as pd
data = pd.read_csv("data.csv", header=None)
print(data)
#标准分数=(原始数据-均值)/标准差
#均值
mean = data.mean()
print(mean)
"""
0 88.00
1 506.75
2 -211.00
3 52.00
dtype: float64
"""
#标准差
std = data.std()
print(std)
"""
0 80.680440
1 416.668833
2 520.212777
3 36.842005
dtype: float64
"""
#标准分数
res = (data-mean)/std
print(res)
"""
0 1 2 3
0 -0.123946 -1.002595 0.407526 0.108572
1 1.388193 0.190199 0.595910 -0.054286
2 -0.991566 -0.496197 -1.495542 1.194289
3 -0.272681 1.308593 0.492106 -1.248575
"""