变量范围和"global"参考数据帧的共享



Python和pandas的老派程序员。可变数据类型非常酷,但它们很难直观地了解如何设置"全局"参考数据结构。

我有一堆参考数据(目前为数十MB,但在最终版本中为数百MB(。相当多的不同类和脚本需要引用相同的数据。这是历史参考数据。它很少更改,通过从 .CSV 进行批量更新。

多次将此数据加载到内存中将非常低效。我想在第一次使用数据时加载一次数据,然后在每次需要时引用相同的副本。请原谅老式的引用(我在 1970 年代学会了编程(,但这样做的"旧方法"是声明一个 GLOBAL 指针变量,该变量指向包含引用数据的多个 pandas 数据帧的单个副本。数据帧将从 加载。CSV 第一次引用它们时,所有不同的类和脚本将只使用该指针变量来查找已经驻留在内存中的数据的单个副本。

我无法弄清楚的是 Python/pandas 中执行此操作的最佳方法,以便所有不同的模块访问单个副本(不会不必要地复制(。

我想到了一个容器类,其中包含访问数据单个副本的方法。问题是大熊猫。DataFrame已经提供了如此强大的功能,我希望所有其他模块都可以访问DataFrame的所有内置方法。我看到了如何使"参考数据帧"成为容器类的属性,但我相信这会导致检索该属性的每个不同代码段获得数据帧的新副本,可能是 100MB+。引用同一数据帧的所有不同代码段不需要"防止相互踩踏",因为数据是只读的。但是熊猫不知道这一点,我担心它会复制每个独立类或脚本的数据,这些类或脚本要求从容器类属性中获取数据帧对象。

我觉得需要的是以某种方式告诉熊猫"嘿,这个巨大的数据帧是静态/只读参考数据,所以不要每次不同的模块要求它自己的对象句柄时都复制它,好吗? 有没有办法做到这一点?

谢谢!

from MyLib.refdata import RefData
rd = RefData()   # Create instance of container class that has my reference data
df = rd.OilPrices # returns 100MB pandas DataFrame object that was loaded
# by my container class. My fear is that pandas will make a
# copy of that giant dataframe so that if my code overwrites
# some of the data, it won't affect other users of the class who
# probably got their own copies. I don't want that. I want ONE
# copy.

假设你有一个数据帧(或任何其他类型的对象,真的(:

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

像下面这样的赋值将使新变量引用相同的对象:

df1 = df

这在Robert Heaton的"Python是按引用传递还是按值传递?"中有详细解释

。要复制基础数据,您必须进行显式调用 (df.copy()(。

最新更新