2015-08-31 4 views
1

J'ai un ensemble de données (x, y), et je voudrais calculer le r_value**2 pour chaque 10 éléments (donc entre l'élément 0 et 9, entre 1 et 10, .. ., entre n-10 et n).Trouver max r-valeur ** 2 en python

Idéalement, le code devrait donner le r_value**2_max et enregistrer tous les r -values ​​dans une liste. J'ai fait une boucle, mais je ne sais pas comment dire stats.linregress pour regarder entre test_i et test_i+10 et enregistrer tous r-values**2 dans une liste.

Jusqu'à présent, j'ai ceci:

import matplotlib.pyplot as plt 
from scipy import stats 
import numpy as np 
import csv 


path = '/storage/.../01_python_in/' 

test = np.loadtxt(path + 'sample_data.txt', skiprows=0) 

test_min = 0 
test_max = len(test) 

for test_i in range(test_min, test_max-10): 
    slope, intercept, r_value, p_value, std_err = stats.linregress(test[:, 0], test[:, 1]) 
    print 'i:', test_i, 'r**2:', r_value**2 
+0

avez-vous l'intention de le faire pour les co-x 1 et 2, 2 et 3, 3 et 4 etc., puis 10 et 11, 11 et 12 ... 18 et 19? –

+0

On dirait que vous voulez faire une "fenêtre roulante"? Regardez ici: [Construction de tableau Numpy 2D efficace de tableau 1D] (http://stackoverflow.com/q/4923617/1730674) – askewchan

Répondre

0

La façon de mettre en œuvre manuellement est de couper la première dimension de votre tableau test_i-test_i + 10, comme ceci:

linregress(test[test_i:test_i+window, 0], test[test_i:test_i+window, 1]) 

En fait, vous n'avez pas à séparer les pièces x et y pour linregress:

linregress(test[test_i:test_i+window]) 

Vous pouvez également enregistrer le r_values en créant une liste dans votre boucle. Ceci, ainsi que ce qui précède est montré ici:

window = 10 
r_values = [] 
for test_i in range(len(test)-window): 
    slope, intercept, r_value, p_value, std_err = \ 
      stats.linregress(test[test_i:test_i + window]) 
    r_values.append(r_value) 
    print 'i:', test_i, 'r**2:', r_value**2 

Il est en fait assez simple pour une compréhension de la liste:

r_values = [stats.linregress(test[i:i+w]).rvalue for i in range(len(test)-w)] 

Vous pouvez obtenir les places puis avec:

r_values = np.asarray(r_values) 
r_values2 = r_values**2 

Et la max i avec:

max_i = np.argmax(r_values2) 
+0

Merci beaucoup, a travaillé parfait! – burazija

+0

De rien, @burazija! Bienvenue à [SO], j'espère que vous pourrez obtenir plus d'aide à l'avenir aussi! Veuillez cliquer sur la coche en haut de ma réponse pour l'accepter comme réponse à votre question. Merci! – askewchan