Python 在不同函数之间链接输出
我正在寻找一个过程的名称,该过程处理其他几个函数中一个函数的输出(试图为我的问题找到更好的词)。一些伪代码/实际代码将非常有用 我编写了以下代码:Python 在不同函数之间链接输出,python,Python,我正在寻找一个过程的名称,该过程处理其他几个函数中一个函数的输出(试图为我的问题找到更好的词)。一些伪代码/实际代码将非常有用 我编写了以下代码: def read_data(): 从文件中读取数据 创建df 返回df def parse_data(): 排序的\u df=读取的\u数据() 数行 按日期排序 返回已排序的 def添加新列() 新建_列_df=parse_data() 添加新列 返回新的\u列\u df def create_plot(): 绘图数据=添加新列() 创建一个绘图
def read_data():
从文件中读取数据
创建df
返回df
def parse_data():
排序的\u df=读取的\u数据()
数行
按日期排序
返回已排序的
def添加新列()
新建_列_df=parse_data()
添加新列
返回新的\u列\u df
def create_plot():
绘图数据=添加新列()
创建一个绘图
显示图表
我试图理解的是如何跳过一个函数,例如创建以下链read_data()->parse_data()->create_plot()
由于代码现在看起来(由于所有返回值以及它们在函数之间的传递方式),需要我更改最后一个函数中的输入数据,create\u plot()
我怀疑我正在创建逻辑上不正确的代码
有什么想法吗
原始代码:
将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
#将csv文件读入数据帧
def read_data():
raw_data=pd.read_csv('C:/testdata.csv',sep=','engine='python',encoding='utf-8-sig')。替换({{{{{':'''.'''.'''.''.''.''.''.'.'.''.''.''.'''.''.'.'''.'.''''.'.''.'
返回原始数据
def解析_数据(解析_数据):
...
#将CreationDate列转换为datetime
原始数据['CreationDate']=pd.to\u日期时间(原始数据['CreationDate'],格式=“%Y-%m-%d%H:%m:%S”,错误=”强制“)
原始数据。排序值(按=['CreationDate'],原地=真,升序=真)
解析的数据=原始数据
返回解析的_数据
原始数据=读取文件()
已解析=已解析的数据(原始数据)
传入数据,而不是有效地“嵌套”所有内容。函数需要的任何数据最好作为参数传入函数:
def read_data():
read data from a file
create df
return df
def parse_data(sorted_df):
count lines
sort by date
return sorted_df
def add_new_column(new_column_df):
add new column
return new_column_df
def create_plot(plot_data):
create a plot
display chart
df = read_data()
parsed = parse_data(df)
added = add_new_column(parsed)
create_plot(added)
尽量确保函数只处理它们直接负责的内容。知道数据来自何处或生成数据不是解析数据的工作,因此不应该担心这一点。让调用方来处理这一点
我在这里设置东西的方式通常被称为“管道”或“线程”。信息从一个函数“流动”到下一个函数。在Clojure这样的语言中,这可以写成:
(-> (read-data)
(parse-data)
(add-new-column)
(create-plot))
使用线程宏->
,这样您就不用手动处理数据传递了。不幸的是,Python没有任何内置功能来完成这一任务,尽管可以使用
还要注意的是,由于数据帧似乎是可变的,因此实际上不需要从函数中返回经过修改的数据帧。如果您只是直接修改参数,则可以将相同的数据帧按顺序传递给每个函数,而不是将其放在中间变量中,如
已解析的和已添加的。我在这里展示的方法是一种通用的设置方法,但是它可以根据您的具体用例进行更改。使用类来包含您的代码
class DataManipulation:
def __init__(self, path):
self.df = pd.DataFrame()
self.read_data(path)
@staticmethod
def new(file_path):
return DataManipulation(path)
def read_data(self, path):
read data from a file
self.df = create df
def parse_data(self):
use self.df
count lines
sort by date
return self
def add_new_column(self):
use self.df
add new column
return self
def create_plot(self):
plot_data = add_new_column()
create a plot
display chart
return self
然后呢,
d = DataManipulation.new(filepath).parse_data().add_column().create_plot()
使用函数参数,例如def parse_data(data)
。不要使用parse_data
调用read_data
,而是将数据从一个传递到另一个:parse_data(read_data())
。这样,每个函数都是独立的,可以灵活地链接它们。为什么。新建?只需数据操作(filepath)
也会做同样的事情。使用一个必须按特定顺序调用其方法的类并不是一个好主意。如果不调用parse_data
,其余的方法将不会做任何事情。始终显式返回self
,这是值得怀疑的。如果你想要一个流畅的界面,这是可以的,但这似乎并不可行对于流畅的界面来说,这是一个很好的用例。python中有不同的设计模式。其中之一是非常流行的builder模式。这个答案是从该模式中得到启发的。在实际模式中,当您执行new()
该函数返回一个生成器对象,该对象隐藏属性并添加功能。类本身不指定任何顺序。它具有返回self
以实现链接的函数。如果您需要示例。@deceze@Tore DjerbergI正在尝试重做代码,但在局部变量排序方面遇到一些问题。\u refere在作业之前,我已经结束了。
。我将你的答案标记为解决方案,我想我现在太累了。@ToreDjerberg我需要查看导致错误的代码才能帮助解决。我想问题在于parse_data
函数。在解析数据时,我使用以下代码段(伪):def parse_data():df['Column1']=df['Column1'].convert_to_date
。执行时,df
被标记为赋值前引用。@ToreDjerberg注意,我表明需要使用参数传入该数据。再次查看我的parse_data
函数,并注意我如何调用它。@ToreDjerberg只是一个输入错误。您创建了一个名为data
的变量(data=read_files()
),但您尝试将其称为raw_data
(parse_data(raw_data)
)。只需使用data
:parse_data(data)
。