处理大型数据集¶
大数据在现代世界中是一个热门词汇。虽然 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 对象添加代码,以仅返回部分行,直到您构建了一个良好的模型。然后,您可以在更多数据上重新拟合最终模型。
Last update:
Oct 16, 2024