使用大型数据集

大数据在现代世界中是一个流行词。虽然 statsmodels 可以很好地处理可以在内存中加载的小型和中等大小的数据集,例如可能数万个观测值,但存在数百万个或更多个观测值的用例。根据您的用例,statsmodels 可能是或可能不是一个合适的工具。

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

分而治之 - 分布式作业

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

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

详细示例可在 此处 获得。

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

分布式模型类

DistributedResults(model, params)

包含模型结果的类

对数据进行子集化

如果您的整个数据集太大而无法存储在内存中,您可以尝试将其存储在列式容器中,例如 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 对象添加代码,以仅返回部分行,直到您构建了一个良好的模型。然后,您可以在更多数据上重新拟合最终模型。


上次更新:2024 年 10 月 3 日