使用 Python 筛选大型数据集,并存储要在另一个脚本中分析的数据位



我已经知道我想做什么了,但我不确定这是否是最好的方法。要点是我有大量的数据。此数据存储在集群上,作为具有我可以轻松提取的属性的对象。我正在根据对象的一个参数筛选这些数据,并随之提取其他一些属性。然后,脚本应该进一步分析数据,但这方面不是问题。

关于如何存储我想要的数据,我的想法是创建一个类,我们称之为"cutData"。循环访问原始数据集中的所有对象,创建一个新的、更简单的对象进行分析。

这里有一些伪代码来说明我的意思:

class cutData(object):
def _init_(self, a, b, c, d):
self.a = a
self.b = b
self.c = c
self.d = d
#For loop
#Call parameter for a (requires some shenanigans)
#Call parameter for b-d (trivial)
#Assign to object cutData

以下是我的问题:

  1. 对象类中的"a"是根据原始数据的一个参数计算的时间尺度差。使用其他脚本调用时,此参数以以下形式给出:

    Vector([[39552, 39553], [123166, 12476], [203800, 203900]], dtype = int32)
    

因此,对于数据中的每个对象,此参数采用多个值。其他 3 个参数很容易隔离。但是,我不知道 python 的语法允许我为此时间尺度参数的每个标记创建单独的对象,每个对象都应该携带 b、c 和 d,它们在集群数据中的每个对象都是相同的。值得注意的是,虽然我上面有三个指数,但没有设定有多少指数的值。

这样做的最终含义是,如果 a 有九个时间尺度索引,则需要创建九个对象,每个对象具有相同的 b、c 和 d,然后才能移动到集群上的下一个对象。

  1. 正如你在上面看到的,我的想法是创建一大组对象,并使用方法来调用我创建的每个对象的各个方面。不过,我对脚本如何存储大量数据不是很熟悉。脚本运行时它是否存储在内存中,并且在完成收集后是否可以调用它。还是需要将其写入文件才能从文件调用它?这个问题更多地与我的经验不足有关,如果我写的东西难以理解,请随时要求我详细说明。

感谢您提供的任何帮助。

我会坦率地说,我不太了解您在这里处理的数据,或者在存储之前可能需要或不需要执行的任何计算/处理; 如果这个答案真的没有帮助,请告诉我并尝试更具体:)。话虽如此,我会尽力提供帮助。

我有一些一般性的观察:

  • 如果要导出较大数据集的子集,并且只需要移动数据,而不需要移动任何单独的方法来操作或转换数据(想想对类实例中的数据执行操作的类方法),则可能需要将此数据存储为字典。然后,您可以将该字典序列化为 json,然后可以轻松地将其作为字典加载回另一个脚本中。 就像

    :导入 JSON export_data = {}

    使用较大集合的迭代添加数据,这些迭代符合导出条件...

    export_data['data_identifier_here'] = {'键': '值', 'other_key': 'other_value'} 使用 open("exported_data.json", "w") 作为 f: json.dump(export_data, f)

    要重新加载它:

    使用 open("exported_data.json", "r") 作为 f: exported_data = json.load(f)

如果你这样做,你要么需要在添加数据时对数据进行任何必要的计算/处理,要么只是将字典中你想要的所有内容转储到该特定事物的键下,并让另一个脚本执行任何必要的处理。

  • 如果一件事有多个值,它应该是一个列表,而不是字符串、int 或其他任何东西。无论您是坚持基于类的方法还是使用字典,这都适用。
  • 如果您决定要使用 cutData 的类实例,则可以使用 pickle 模块来序列化实例。如果您有多个类实例,则可以挑选它们的列表。我很确定,当您取消选择数据时,您需要导入与保存时相同的类。
  • 至于你关于内存的问题:是的,类实例存储在内存中,直到不再有对它们的引用,此时它们会自动进行垃圾回收。由于您要将某些内容导出为另一个脚本可以轻松使用的格式,因此您需要将此数据写入文件。
  • 如果你真的需要类方法和在每个方法上都有方法操作/获取数据的能力,但你不想弄乱腌制特定实例,你可以创建一个实例列表,然后为每个实例获取它的字典并将其打包在一个 json 中。这样,您就可以获得原始类的所有属性,但不会获得任何代码。 在提取要导出的数据时,您可以运行所需的任何方法,并且在获取完所有内容后,可以保存每个实例的所有已处理数据。

这可能看起来像这样:

# an example class; you can do the same with your cutData
class fruit(object):
def __init__(self, name, color):
self.name = name
self.color = color
# you can define any methods you need to manipulate the data in this class, and then run them
a = fruit("apple", "red")
o = fruit("grape", "purple")
fruits = [a, o] # a list of class instances
data = [] # a list that just holds class data as a dict for each, and not instances
for i in fruits:
data.append(i.__dict__)
# you can now serialize the data list however you like, keeping the data but not the methods

让我知道这是否有帮助,或者是否偏离了目标。

相关内容

最新更新