在一个类中设置一个函数,该函数将以一种可以在未来函数中引用的方式读取 csv 数据

Posted

技术标签:

【中文标题】在一个类中设置一个函数,该函数将以一种可以在未来函数中引用的方式读取 csv 数据【英文标题】:Setting up a function in a class that will read in csv data in a way that it can be referenced in future functions 【发布时间】:2020-12-28 07:59:34 【问题描述】:

如果满足条件,我正在尝试确定在读取特定 .csv 文件的类中定义函数的最佳方法。然后,该函数返回文件中的数据。但我需要它以一种允许我在类中的未来函数中再次调用这些数据的方式返回数据。

一些背景:我正在读取的数据是带有时间戳的温度。每个 .csv 文件中的列是 'day', 'hour', 'temp_1', 'temp_2', 'temp_3', 'temp_4' 然后,一年中的每个小时都有几行数字数据,所以大约有 9,000 行。

我需要定义一个从 csv 文件中读取数据的函数,然后允许我在未来的函数中调用临时数据以及相应的日期和时间。

### Here I define the class. I just included a shortened version of this. 
### The class has more arguments than this. I just included the relevant parameter which is 'group'

class Individual():
    def __init__(self,group):
        self.group = group
        
### This is the function, or set of functions, that I'm trying to get running


    def return_temp1(self, day, hour):
        if self.group =='a':
            micro_df = pd.read_csv('ex1.csv')
        elif self.group =='b':
            micro_df = pd.read_csv('ex2.csv')
        return micro_df.temp1,day,hour
        
    def return_temp2(self, day, hour):
        if self.group =='a':
            micro_df = pd.read_csv('ex1.csv')
        elif self.group =='b':
            micro_df = pd.read_csv('ex2.csv')
        return micro_df.temp2,day,hour
   
     def return_temp3(self, day, hour):
        if self.group =='a':
            micro_df = pd.read_csv('ex1.csv')
        elif self.group =='b':
            micro_df = pd.read_csv('ex2.csv')
        return micro_df.temp3,day,hour
   
    
     def return_temp4(self, day, hour):
        if self.group =='a':
            micro_df = pd.read_csv('ex1.csv')
        elif self.group =='b':
            micro_df = pd.read_csv('ex2.csv')
        return micro_df.temp4,day,hour
   
### Then, later I need to define more functions where I'm able to call 
# on the temperatures pulled from the csv files in the above functions. 
# I've included one of those functions below as an example.


    def calculate_longwave_radiation(self, temp1): 
        return 53.1*10**-14*(temp1 +273.15)**6.



我对 Python 很陌生,对使用类也很陌生。任何帮助或提示将不胜感激!我知道我设置return 行的方式会导致问题(或至少部分问题)......但我不知道如何解决它。谢谢。

【问题讨论】:

把它放在self。即:self.micro_df_a = pd.read_csv('ex1.csv')。然后,您可以使用 self.micro_df_a 从代码中的任何位置引用数据框 我不明白这个问题(老实说)。是像return micro_df.temp4,day,hour et al. 这样的问题吗? 嗨@That1Guy,谢谢你的帮助。我正在尝试了解您的解决方案。是否与下面的答案相似? self.micro_df_a 将如何返回 csv 中的特定数据列? @roganjosh 是的,我认为问题在于该函数没有返回正确的内容,或者以我可以在将来的函数中引用这些数据的方式正确读取 csv 文件...运行我上面包含的代码给了我一个micro_df is not defined 错误消息。所以它的某些东西不起作用。 如果任何回复的人能够澄清他们的答案/建议,那将非常有帮助。我是 python 新手,你们花时间提供的信息并没有让我更接近解决我的问题。再次感谢 【参考方案1】:

我将在这里使用一种可能不是最好的 Python 语言的语言,但由于您是 Python 新手,它可能会在此过程中为您提供指导。

您在代码中使用的 pd 或 pandas 数据框类似于 Excel 工作表或表格。

所以,你可以做的是在你的类中创建一个名为 load_data() 的 def,然后分别在 df_ex1 和 df_ex2 中加载 ex1.csv 和 ex2.csv。如果它们具有相同的格式,您还可以将数据连接到单个 df 中。那些 dfs 应该是类的属性。喜欢:

class Individual():
    def __init__(self,group):
        self.group = group
        df_ex1 = pd.DataFrame

完成上述操作后,您可以创建所需的所有定义并引用数据框以从中提取数据。喜欢

    def return_temp1(self, day, hour):
        if self.group =='a':
            micro_df = df_ex1[['day', 'hour']].loc[df_ex1['day'] == day])
        return micro_df

【讨论】:

感谢 Fabricio 的帮助,但我不太关注你。您是说在我设置课程时所有组(我将有大约 40 个组)都应列为属性,对吗?此外,在您的 def return_temp1 函数中,我认为它不会返回写入时的临时值。您能否澄清一下该函数中的第 3 行代码? Fabricio- 另一个简单的问题,要使类的 dfs 属性,我仍然必须在属性之前有 self.,对吧?我不明白你是怎么写的,因为 df 和 group 似乎是类的独立属性。任何更多的帮助将不胜感激!谢谢 您的所有 ~40 个组似乎都具有相同的格式('day'、'hour'、'temp_1'、'temp_2'、'temp_3'、'temp_4')。如果这是真的,您可以创建一个循环并将所有数据添加到同一个 df.您还可以在 df 中添加带有文件名的列。是的,你必须使用 self.df_ex1 = pd.DataFrame 好的。谢谢你。这个方法对我来说听起来有点复杂。如果我想与我在问题中描述的尝试类似地执行此操作,并为 temp1、temp2、temp3、temp4 提供 4 个不同的函数,然后我只需为不同的组指定不同的路径,就像我所做的那样......如何修改代码的返回行以获取临时数据?你知道有什么办法吗?再次感谢您的帮助! return micro_df[['temp1','day','hour']]

以上是关于在一个类中设置一个函数,该函数将以一种可以在未来函数中引用的方式读取 csv 数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 Frida 在当前类中设置成员

通过字符串变量在Python中设置和获取@property方法

如何在 DataProvider 类 Alamofire 函数 swift 中设置协议函数不能正确调用

在类构造函数中设置 std::vector

如何在构造函数中设置 GUI 不可见?

C# SaveFileDialog 从多个扩展名中设置一个在未键入扩展名时自动添加扩展名