处理大型数据集

大数据在现代世界中是一个热门词汇。虽然 statsmodels 在处理可以加载到内存中的小型和中等规模数据集(可能数万个观测值)时表现良好,但存在包含数百万甚至更多观测值的使用场景。根据您的使用场景,statsmodels 可能是一个足够的工具,也可能不是。

statsmodels 及其大部分软件栈都是在内存中运行的。因此,在较大的数据集上构建模型可能会具有挑战性,甚至不切实际。尽管如此,使用 statsmodels 在较大的数据集上构建模型有两种通用策略。

分而治之 - 分配任务

如果你的系统能够加载所有数据,但你所尝试进行的分析速度较慢,你可能能够在数据的水平切片上构建模型,然后在拟合后聚合各个模型。

这种方法的一个当前限制是它通常不支持 patsy,因此在 statsmodels 中构建设计矩阵(称为 exog)有点具有挑战性。

详细的示例可以在 这里找到。

DistributedModel(partitions[, model_class, ...])

分布式模型类

DistributedResults(模型, 参数)

包含模型结果的类

子集化你的数据

如果您的整个数据集太大而无法存储在内存中,您可以尝试将其存储在像Apache Parquetbcolz这样的列式容器中。使用patsy公式接口,statsmodels将使用__getitem__函数(即data[‘Item’]) 来仅拉取指定的列。

import pyarrow as pa
import pyarrow.parquet as pq
import statsmodels.formula.api as smf

class DataSet(dict):
    def __init__(self, path):
        self.parquet = pq.ParquetFile(path)

    def __getitem__(self, key):
        try:
            return self.parquet.read([key]).to_pandas()[key]
        except:
            raise KeyError

LargeData = DataSet('LargeData.parquet')

res = smf.ols('Profit ~ Sugar + Power + Women', data=LargeData).fit()

此外,您可以向此示例 DataSet 对象添加代码,以仅返回部分行,直到您构建了一个良好的模型。然后,您可以在更多数据上重新拟合最终模型。


Last update: Oct 16, 2024