使用 NumPy 和 Pandas 进行 Python 式数据清理

877 阅读3分钟

数据处理介绍

数据处理一般有下列阶段

graph TD
Collection收集 --> Cleaning/Transformation数据清理 --> Integration数据整合 --> Modeling数据建模 --> Visualization数据可视化

前三个为准备阶段,后两个为分析阶段。

q.JPG

数据分析的任务

pie title 数据工程师花的时间
"Bilding training sets训练数据" : 3
"Cleaning/organizing 清理整合" : 60
"Collecting 收集数据" : 19
"Mining data for pattern" : 9
"others":9

所花时间百分比 Bilding training sets 训练数据 3%

Cleaning/organizing 清理整合 60%

Collecting 收集数据 19%

Mining data for pattern 数据挖掘 9%

others 9%

数据准备

Data exploration数据探索

数据探索是建立对属性的初步了解的过程(例如 分布或特征)。 比如数据大小,类型,格式,完整性,关系等。

有许多工具可以帮助建立你对数据的个人处理方式 :MIT DIVE / Python: Matplotlib/Pandas/Numpy

Data Cleaning数据清理

困难

  • 处理丢失的值
  • 去除偏差大的值(outliers)
  • 解决不一致问题
  • 处理噪音数据,降噪

数据是有噪音的,它会影响我们对于数据的理解和分析。因此我们需要在分析前去除它。 数据噪音的起因可能是:

1.传感器位置错误 2.数据来源不同 3.数据收集不规范 4.人为错误,编程错误

数据丢失指数据点不在原始数据中。 一般处理方法

w.JPG

数据包含离群值(outlier),一般找出它的方法

  • 视觉探索。
  • 统计检验。
  • 建模(线性模型,协方差,一类SVM,局部离群因子)

数据不统一是指 数据值不匹配数据属性,或者中途改变。

Data Transformation数据转换

方法:

  • Normalization 归一化
  • Aggregation 聚合
  • Discretization 离散化

Normalization 归一化改变值到一个普遍的范围,但不改变值之间的差异。归一化减少了对算法学习能力的连锁影响(取决于算法)。 确保标准化特征,隐式对所有特征的表示方式进行平均加权。

Aggregation 聚合是将至少两个属性聚合为一个(例如,将两个数据列聚合为一个)的过程。 它既可以自动完成(例如相关检测),也可以手动完成。 数据聚合可减少数据的可变性。 它对属性而不是值进行操作。

使用Python进行数据准备

数据链接: pan.baidu.com/s/1fas7BQXT… 提取码: 4zh5

数据查看

import matplotlib.pyplot as plt

# readinf the data
df = pd.read_csv("CombinedCyclePowerPlantDirty.csv")

# two samples
print("data samples")
print(df.head(3).T)

# columns and types
print("columns types")
print(df.dtypes)

print("Full Info")
print(df.info())

通过df.info()查看数据构成,可以发现数据类型以及数量不同

大多数.JPG

数据清理

df.V.hist()
plt.show()
print("min ", df.V.min())
print("max ", df.V.max())
print("mean ", df.V.mean())

输出某列的最大最小值,观察数据分布,方便之后清理

Figure_2.png

df = df[df.AP > 0]
df = df[df.AP < 100000]
df = df[df.RH > 0]
df = df[df.RH <= 100]
plt.hist(df.RH)
plt.title("RH")
plt.show()
print(df.info())

def test(value):
    try:
        float(value)
        return True
    except:
        return False

df = df[df.PE.apply(test)]
df.PE = df.PE.apply(float)
print(df.info())#去除了PE中无法被float的数据,并且将数据变成了9502组。

对数据清理,将过大过小值去除得下图

Figure_1.png

数据分布更均匀直观

e.JPG

可以看见第一次info()除PE列外,都已经对齐,共10432组数据。之后通过test函数去除了PE中无法被float的数据,并且将数据变成了9502组。

df.AT = df.AT.apply(lambda x: x.replace("o","0"))#数据中0和o混淆,将o替换为0
df.AT = df.AT.apply(float) #将数据转换为float类型
print(df.info())

再清理AT中错误数据,此时数据全部清理完毕,共9497组

as.JPG

查看数据之间关系

#在清理数据之后看数据之间的关系
# PE AT
plt.scatter(df.AT,df.PE)
plt.title("PE, vs AT")
plt.show()

Figure_3.png

datasets = {}
for name in df.TCN.unique():
    datasets[name] = df[df.TCN == name]
    plt.scatter(datasets[name].AT, datasets[name].PE, label=name)
plt.legend()
plt.show()

TCN包含集中名字,以TCN各个名字建立各个dataset,再绘图,可见不同名字分布。 Figure_4.png

def corrector(row):
    if row["TCN"] == "Daniel Smithson":
        return (row["AT"]-32)*5/9
    else:
        return row["AT"]


df.AT = df.apply(corrector, axis=1)

datasets = {}
for name in df.TCN.unique():
    datasets[name] = df[df.TCN == name]
    plt.scatter(datasets[name].AT, datasets[name].PE, label=name)
plt.legend()
plt.show()

Figure_5.png