的是…你已经知道了。你已经读了足够多关于它的内容,不再需要介绍了。如果你不知道是什么,先看看这个,然后回来继续。
与的对话可以很有趣,甚至具有启发性。但让我们来看看它到底有多有用。
让我们看看在根据我们提供的规范编写代码时能做些什么。我们将从简单开始,从那里开始构建。
简单数据处理脚本
我认为从某种数据处理脚本开始比较好。因为我打算让在之后使用各种库编写一些机器学习脚本,所以这似乎是一个合理的开始。
我们的目标
首先,我想尝试加载一个数据集;确保所有数据集值都是数值值,或将其转换为数值值;检查缺失的值;并将数据集分成训练集和测试集。
提示
编写一个脚本,执行以下操作:
-将数据集从磁盘上的csv加载到 中
-确保数据集完全是数字的;将字符串值转换为数字,并在字典中跟踪此转换以供以后引用
-检查中的缺失值,并为任何有一个缺失值的记录注入缺失值;完全删除有多个缺失值的记录
-将数据集分成测试集和训练集
as pd
# Load from csv to
df = pd.(‘.csv’)
# to track to
= {}
# to and track in
for col in df.:
if df[col].dtype == :
[col] = {val: i for i, val in (df[col].())}
df[col] = df[col].map([col])
# Check for
= df.isna().sum()
# for with one value
for col in [ == 1].index:
df[col].(df[col].(), =True)
# Drop with more than one value
df.(=len(df.) – 1, =True)
# Split into test and sets
from .
, = (df, =0.2)
注意:脚本从csv文件名“.csv”中加载数据集,并以80/20的比例将数据帧分成测试集和训练集。如果要使用不同的文件名或比例,请相应地更改路径/比例。
分析
生成了一个有用的脚本。它决定了数据集名称,以及训练/测试分割百分比,并指出了这两点,以及如果需要的话如何更改它们。总的来说,任务完成了。
重构代码
我们的目标
现在我们有了一个可以执行某些操作的脚本,让我们稍微重构一下它。良好编码的基石是使用函数来逻辑地组织代码,促进重用,并确保不重复。
提示
重写上面的脚本,使用一系列有意义的函数
响应
进口熊猫作为pd
从。导入
def a():
# Load from csv to
df = pd.()
# to track to
= {}
# to and track in
for col in df.:
if df[col].dtype == :
[col] = {val: i for i, val in (df[col].())}
df[col] = df[col].map([col])
df,
def s(df):
# Check for
= df.isna().sum()
# for with one value
for col in [ == 1].index:
df[col].(df[col].(), =True)
# Drop with more than one value
df.(=len(df.) – 1, =True)
df
def (df, ):
(df, =)
# Use the
= “.csv”
df, = a()
df = s(df)
, = (df, 0.2)
在这里,我使用了三个函数:
1. a ()加载CSV数据集并将字符串值转换为数值。
2. s (df)处理数据集中缺失的值。
3. (df, )将数据集分成测试集和训练集。
主脚本使用这些函数来加载、转换和清理数据集,然后将其分割为测试集和训练集。
数据集的路径和测试比率是这些函数的输入。
分析
如果您查看的第一个脚本输出,您可能会看到一些相当明显的界线,即哪些功能将被分离到函数中。当然了。在这方面,完全符合我的预期。同样,生成了一个合格的脚本。
扩展我们的代码
我们的目标
好的,我们的脚本现在看起来好一点了,因为它使用了一些函数进行组织。接下来,让我们稍微扩展一下脚本,使用户可以在运行脚本时指定一些参数。
提示
重写上面的程序,以参数的形式从命令行请求以下内容,并在程序中使用它们:
—数据集CSV文件的路径/名称
-火车/测试的分割尺寸
-每个记录丢失值的数量阈值,在此之后删除整个记录,而不是输入丢失的值
响应
as pd
from .
def a():
# Load from csv to
df = pd.()
# to track to
= {}
# to and track in
for col in df.:
if df[col].dtype == :
[col] = {val: i for i, val in (df[col].())}
df[col] = df[col].map([col])
df,
def s(df, ):
# Check for
= df.isna().sum()
# for with one value
for col in [ == 1].index:
df[col].(df[col].(), =True)
# Drop with more than value
df.(=len(df.) – , =True)
df
def (df, ):
(df, =)
if == ”:
= .()
.(“”, help=”path/name of the csv file”)
.(“”, help=”train/test split size”, type=float)
.(“”, help=” for the of per “, type=int)
args = .()
# Use the
df, = a(args.)
df = s(df, args.)
, = (df, args.)
在这个版本中,我使用模块将文件路径、测试/训练分割大小和每个记录缺失值数量的阈值作为命令行参数。用户必须使用正确的参数运行脚本,例如:
.py .csv 0.2 1
这将使用“.csv”文件运行脚本,为0.2,缺失值的阈值为1。
主脚本使用函数中的这些参数来加载、转换和清理数据集,然后将其分割为测试集和训练集。
值得一提的是,在运行脚本时,脚本应该从命令行运行,而不是从IDE运行。
分析
老实说,这里不需要太多分析,因为已经很好地解释了它的功能。在这里,我实际上要指出一些我以前没有注意到的东西,并赞扬的注释,它是富有表现力和简洁的。
将我们的代码转换为应用程序
我们的目标
现在让我们假设我们想让这段代码“生产”就绪(请原谅我)。让在应用程序中包装这些函数。
提示
将上面的程序重写为应用程序,允许用户提供与上面的命令行参数相同的参数
as pd
as st
from .
def a():
# Load from csv to
df = pd.()
# to track to
= {}
# to and track in
for col in df.:
if df[col].dtype == :
[col] = {val: i for i, val in (df[col].())}
df[col] = df[col].map([col])
df,
def s(df, ):
# Check for
= df.isna().sum()
# for with one value
for col in [ == 1].index:
df[col].(df[col].(), =True)
# Drop with more than value
df.(=len(df.) – , =True)
df
def (df, ):
(df, =)
def main():
st.(=”Data “, =”::”, =”wide”)
st.title(“Data “)
= st.(“Enter the path/name of the csv file: “)
= st.(“Enter the train/test split size ( 0 and 1): “, step=0.01, value=0.2)
= st.(“Enter the for the of per : “, step=1, value=1)
if st.(” Data”):
df, = a()
df = s(df, )
, = (df, )
st.(“Data !”)
if == ”:
main()
这个版本是一个应用程序,允许用户提供与命令行参数相同的参数。它使用库创建一个交互式web应用程序,允许用户输入文件路径,测试/训练分割大小,以及每条记录缺失值数量的阈值。然后,用户可以单击“处理数据”按钮来运行脚本并预处理数据。它使用与之前版本脚本相同的函数来加载、转换和清理数据集,然后将其分割为测试集和训练集。
要运行这个脚本,你需要安装,你可以在你的终端上运行pip 命令。安装完成后,使用命令 run .py运行脚本。
分析
它做了它该做的事。把我们的功能…功能,并用它们构建了一个简单的 web应用程序。
使用生成的脚本创建的 web应用程序
总结
根据我们提供的规范,在创建、重构、扩展和添加一个简单的数据预处理脚本的包装器方面做得非常出色。虽然它不是最复杂的程序,但它是朝着让充当编程助手而真正有用的方向迈出的一步。每一步的结果都恰到好处。
下次,我们将构建一个不那么琐碎的程序,但增加了一些复杂性和额外的需求。我很高兴看到在压力下的表现。希望你也是。