Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不同函数之间链接输出_Python - Fatal编程技术网

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)