使用大型数据集¶
大数据在现代世界中是一个流行词。虽然 statsmodels 可以很好地处理可以在内存中加载的小型和中等大小的数据集,例如可能数万个观测值,但存在数百万个或更多个观测值的用例。根据您的用例,statsmodels 可能是或可能不是一个合适的工具。
statsmodels 及其所依赖的大部分软件栈都在内存中运行。因此,在大型数据集上构建模型可能具有挑战性,甚至不切实际。话虽如此,使用 statsmodels 在大型数据集上构建模型有两种通用策略。
分而治之 - 分布式作业¶
如果您的系统能够加载所有数据,但您尝试执行的分析很慢,您可能能够在数据的水平切片上构建模型,然后在拟合后聚合各个模型。
这种方法当前的局限性是它通常不支持 patsy,因此在 statsmodels 中构建设计矩阵(称为 exog)有点困难。
详细示例可在 此处 获得。
|
分布式模型类 |
|
包含模型结果的类 |
对数据进行子集化¶
如果您的整个数据集太大而无法存储在内存中,您可以尝试将其存储在列式容器中,例如 Apache Parquet 或 bcolz。使用 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 日