输出结果即为文件目录
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
for filename in filenames:
print(os.path.join(dirname, filename))
# 输出结果即为文件目录
将输出结果读取为dataframe格式
df1 = pd.read_csv('/kaggle/input/titanic-text-data/train.csv')
df.info()
df.shape
返回(891, 12),第一个数字表示行数,第二个数字表示列数
df['A'].value_counts()
返回最大值,最小值,均值,标准差, 四分位数,中位数
df.A.describe()
df1.isnull().sum()
# 随机抽取5个样本
df.sample(5)
# 前5个样本
df.head(5)
# 后5个样本
df.tail(5)
第一种:指定删除某些变量
# 删除不太重要且缺失严重的变量df['Cabin‘']
df1.drop(columns=["Cabin"],inplace = True)
df2.drop(columns=['Cabin'],inplace = True)
第二种:指定删除某些范围的变量
此处删除了第16个变量之后的所有变量
df.drop(list(df)[16:],axis=1,inplace=True)
修改列名。有两种思路:
方法一: 直接以属性赋值的方式,一次将全部的列名进行重新定义
方法二:通过pandas的rename方法修改列名
# 方法一
# 直接以属性赋值的方式,一次将全部的列名进行重新定义
data.columns = ['city','name','post','pay','request','number']
# 方法二
#使用pandas的rename方法修改列名,新旧列名称按照字典形式成对,columns={'旧的列名': '新的列名'}
data.rename(columns={'城市': 'city'}, inplace=True)
#同时修改多个字段名
data.rename(columns={'城市': 'city','公司名称': 'name'}, inplace=True)
修改列名
通过data.info()可以查看变量属性
#将变量A的属性调整为int
data['A'] = data['A'].astype('int')
即Excel中的VLOOKUP,在pandas中通过merge实现
data1 = data1.merge(data2, on=['A','B'],how=left)
# how=left、right、inner、outer
data3 = pd.merge(data1, data2, on=['A','B'], how= left)
merger
# 用df1['age']的众数来填补df1['age']和df2['age']的缺失值
df1['Age'] = df1['Age'].fillna(value = df1.loc[df1['Age'].isnull() == False,'Age'].mode()[0])
df2['Age'] = df2['Age'].fillna(value = df1.loc[df1['Age'].isnull()==False,'Age'].mode()[0])
# 统计数值型数据的均值时会自动忽略缺失值
df['B'].fillna(df['B'].mean(), inplace=True)
df['C'].fillna(df['C'].median(),inplace=True)
df.dropna(inplace=True)
df['D'].dropna(inplace=True)
df.duplicate()
df = df.drop_duplicates()
df.drop_duplicaes(inplace=True)
def up_low_value(df):
q1 = df.quantile(0.25)
q3 = df.quantile(0.75)
IQR = q3 - q1
up_value = q3 + 1.5*IQR
low_value = q1 - 1.5*IQR
return up_value, low_value
up1, low1 = up_low_value(df['A'])
df.loc[(df['A']>up1)|(df['A']<low1),'A'] = None
df['A'].fillna(df['A'].mean(), inplace= True))
异常值检测常用的方法:
聚类、箱线图、3sigma准则
df['A'].unique() #列出分类变量所有分类
size_mapping ={'M':0,'男':0,'F':1,'女':1}
df['Gender'].map(size_mapping, inplace=True)
单热变量的实质是:把分类变量的特征通过多列数值型数据:1、0的形式表示出来。
好处:对于以数值型变量作为输入的算法可以保留分类变量的信息不丢失
df = pd.get_dummies(df, columns=['A','B'], drop_first=True)
df['log'] = df['B'].transform(np.log)
df['log+1'] = (df['B'] +1).transform(np.log)
df['log(x- min(x)+1)'] = (df['B']-df['B'].min() +1).transform(np.log)
把数据归一到 0-1之间
df['normalized'] = (df['A'] - df['A'].min())/(df['A'].max()-df['A'].min())
又称zscore归一化
df['standardized'] = (df['A'] - df['A'].mean())/df['A'].std()
构造直方图和拟合曲线kde
import seaborn as sns
sns.set_palette("hls") #设置所有图的颜色,使用hls色彩空间
sns.histplot(train.log_density,color="r",bins=30,kde=True)
plt.show()
同时绘制直方图和正态曲线
# 绘制直方图
n, bins,patches = plt.hist(train.log_density, 50, density=True,stacked=True,facecolor='blue', alpha=0.5)
# 绘制理想正态曲线
import matplotlib.mlab as mlab
from scipy.stats import norm
mu =train.log_density.mean()
sigma =train.log_density.std()
y = norm.pdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.subplots_adjust(left = 0.15)
plt.show()
num = train.state.value_counts().shape[1]
train.state.value_counts().nlargest(51).plot(kind='bar', figsize=(10,5))
plt.title("Number of state")
plt.ylabel('Number of state')
plt.xlabel('state')
对如年龄这种离散型数据,还需要按照离散型数据的先后进行排序
df2['Fare'].value_counts()
# 查看数据分布情况
print(df2.Fare.nunique())
df2.Fare.value_counts().sort_index().plot(kind='bar',figsize=(20,6),color=['lightgreen'])
# sort_index()来实现离散型数据排序
plt.show()
可以很形象的展示任意两列的相关性,格子中的值代表某两列的皮尔逊相关系数。
皮尔逊相关系数的取值介于[-1,1]之间,反映两个变量之间的线性相关性。当取值为1或者-1时,假设两个变量分别为x,y则它们满足:y=kx+b
plt.figure(figsize=(10,5))
c= df.corr()# 默认是皮尔逊相关系数
sns.heatmap(c,cmap="BrBG",annot=True)
c
bins 参数越大,画的图越细致
plt.figure(figsize=(12,10))## 设置画布",
plt.hist(train.microbusiness_density,bins=1000)
plt.show()
fig, ax = plt.subplots(figsize=(10,6))
ax.scatter(df['HP'], df['Price'])
ax.set_xlabel('HP')
ax.set_ylabel('Price')
plt.show()
import seaborn as sns
#其中month,log_density均为train中的列名
ax = sns.boxplot(x='month', y='log_density', data=train)
ax.figure.set_size_inches(20,10) # 设置画布大小
正态分布: 峰度 = 3。
厚尾分布:峰度 > 3。
瘦尾分布:峰度 < 3。
正态分布:偏度 = 0,两侧尾部长度对称。
右偏分布(正偏分布):偏度 > 0,右侧(正方向)尾部较长。
左偏分布(负偏分布):偏度 < 0,左侧(负方向)尾部较长。
0<|SK|<=0.5 低度偏态分布
0.5<|SK|<=1 中等偏态分布
|SK|>1 高度偏态分布
#skewness and kurtosis
print("Skewness: %f" % df_train['SalePrice'].skew())
print("Kurtosis: %f" % df_train['SalePrice'].kurt())
P-P图反映了变量的实际累积概率与理论累积概率的符合程度;
Q-Q图反映了变量的实际分布与理论分布的符合程度;
两者意义相似,都可以用来考察数据是否服从某种分布类型。若数据服从正态分布,则数据点应与理论直线基本重合。
# QQ图
import statsmodels.api as sm
sm.qqplot(y,line='s')
# PP图
from scipy import stats
stats.probplot(x, dist="norm", plot=plt)
属于专门用来做正态性检验的模块
其原假设:样本数据符合正态分布。
注:适用于小样本
S,P = scipy.stats.shapiro(x)
x参数为样本值序列,返回值中第一个为检验统计量,第二个为P值,当P值大于指定的显著性水平,则接受原假设。
可以检验多种分布,不止正态分布
其原假设:数据符合正态分布
注:适用于大样本
# K,P = scipy.stats.kstest(rvs,cdf,alternative,mode)
from scipy import stats
mu = train.log_density.mean() # 计算mu
std = train.log_density.std() # 计算std
K,P = stats.kstest(train['log_density'],'norm',(mu,std))
if P>0.5:
print('接受正态假设')
else:
print('拒绝正态假设')
rvs:待检验数据。
cdf:检验分布,例如’norm’,‘expon’,‘rayleigh’,'gamma’等分布,设置为’norm’时表示正态分布。
alternative:默认为双侧检验,可以设置为’less’或’greater’作单侧检验。
model:‘approx’(默认值),表示使用检验统计量的精确分布的近视值;‘asymp’:使用检验统计量的渐进分布。
其返回值中第一个为统计量,第二个为P值
有关正态性检验详细文章
KS检验以及3sigma准则
除了sklearn提供的minmaxscaler,standardscaler,对于不同的skewed data我们可以有不同的操作
左偏/left-skewed/negative skewed
右偏/right-skewed/positive skewed