【发布时间】:2017-06-01 06:59:41
【问题描述】:
我有一系列数据,其中包含来自多个实验的值(1-40,在 MWE 中为 1-5)。我的原始数据中的条目总数约为 4.000.000,我尝试对其进行平滑以显示它:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import spline
from statsmodels.nonparametric.smoothers_lowess import lowess
df = pd.DataFrame()
df["values"] = np.random.randint(100000, 200000, 1000)
df["id"] = [1,2,3,4,5] * 200
plt.figure(1, figsize=(11.69,8.27))
# Both fail for my amount of data:
plt.plot(spline(df["values"], df["id"], range(100)), "r-")
plt.plot(lowess(df["values"], df["id"]), "r-")
scipy.interplate 和 statsmodels.nonparametric.smoothers_lowess.lowess 都会为我的数据抛出内存不足异常。是否有任何有效的方法来解决这个问题,例如使用 ggplot2 和 geom_smooth() 的 GNU R?
【问题讨论】:
-
你为什么在第一个情节中使用
range(100)?在那个地方是一个 int。 -
根据文档 (docs.scipy.org/doc/scipy-0.18.1/reference/generated/…),它是一个新 x 值的列表/数组,在这种情况下是 [0, 2, ..., 99],对吧?
-
将平滑计算与绘图调用分开,这样您就可以看到它失败的地方。我的猜测是,用 400 万个点创建一个图信息量不是很大,并且可能需要大量内存。同样对于lowess,当样本量很大时,应该减少用于局部回归的分数。
-
一个无信息的绘图是我想从绘制所有值更改为平滑的原因。它无法创建平滑计算。
标签: python pandas numpy matplotlib scipy