2017-01-17 5 views
0

Ich habe eine Reihe von Daten, die aus Werten aus mehreren Experimenten besteht (1-40, in der MWE ist es 1-5). Die Gesamtmenge der Einträge in meinen ursprünglichen Daten ~ 4.000.000, die ich versuche zu glätten, um es anzuzeigen:Glättungskurve für Matplotlib.pyplot mit Pandas oder numpy/scipy

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-") 

beid scipy.interplate und statsmodels.nonparametric.smoothers_lowess.lowess, wirft aus Speicherausnahmen für meine Daten. Gibt es einen effizienten Weg, um dies zu lösen, zum Beispiel in GNU R mit ggplot2 und geom_smooth()?

+0

, warum Sie tun 'Bereich (100)' im ersten Plot? An diesem Ort ist ein Int. – Lucas

+2

Laut der Dokumentation (https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.interpolate.spline.html) ist es eine Liste/ein Array von neuen x-Werten, die dies tun würden sei in diesem Fall [0, 2, ..., 99], oder? – Robin

+0

Trennen Sie die Glättungsberechnung vom Plotaufruf, damit Sie sehen, wo sie fehlschlägt. Meine Vermutung ist, dass das Erstellen eines Plots mit 4 Millionen Punkten nicht sehr informativ ist und viel Speicherplatz benötigt. Außerdem sollte der bei der lokalen Regression zu verwendende Anteil reduziert werden, wenn die Stichprobengröße so groß ist. – user333700

Antwort

1

Ich kann nicht ganz sagen, was Sie bekommen bei mit allen Dimensionen auf Ihre Daten, aber eine sehr einfache Sache, die Sie versuchen können, ist nur die ‚markevery‘ verwenden kwarg etwa so:

import numpy as np 
import matplotlib.pyplot as plt 

x=np.linspace(1,100,1E7) 
y=x**2 
plt.figure(1, figsize=(11.69,8.27)) 
plt.plot(x,y,markevery=100) 
plt.show() 

Dies zeigt nur jeden n-ten Punkt an (n = 100).

Wenn das nicht helfen Sie wie so nur eine einfache numpy Interpolation mit weniger Proben versuchen mögen:

x_large=np.linspace(1,100,1E7) 
y_large=x**2 
x_small=np.linspace(1,100,1E3) 
y_small=np.interp(x_small,x_large,y_large) 
plt.plot(x_small,y_small) 
Verwandte Themen