Forum >> Programmazione Python >> Calcolo scientifico >> Analisi dati, Regressione lineare, problema, consigli

Pagina: 1

Signori e signore buongiorno!
Sto usando Python 3.6.4 (anaconda3), come IDE jupiter notebook/ spyder3 e il tutto su windows10.



Mi sto approcciando alla programmazione (ho fatto qualche codice con matlab e LUA, ma pietosi). Questo è uno dei miei primi codici e lo scopo è quello di :

1 . Velocizzare le mie analisi dati (obiettivo per cui mi sono avvicinato alla programmazione) ;

2. Caricare un foglio di excel, contenente i miei dati e fare calcoli basilari;

3. Fare un po' di statistica base;

3. Plottare qualche grafico.




Questo è il mio codice :

#importo i pacchetti necessari all'analisi dati.
import scipy as sp
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#carico i dati
dati = pd.read_excel('MeltFlowIndex.xlsx')

#creo un vettore massa
massa = dati['mass']

#creo vettore tempo
tempo = dati['time']

#calcolo il Melt Flow Index
mfi = (massa*600)/tempo

#calcolo le medie
avg_11 = np.mean(mfi[0:7],0)
avg_12 = np.mean(mfi[7:15],0)
avg_13 = np.mean(mfi[15:19],0)
avg_21 = np.mean(mfi[19:24],0)
avg_22 = np.mean(mfi[24:30],0)
avg_23 = np.mean(mfi[30:36],0)
avg_31 = np.mean(mfi[36:43],0)
avg_32 = np.mean(mfi[43:49],0)
avg_33 = np.mean(mfi[49:],0)

#calcolo la deviazione standard
sd_11 = np.std(mfi[0:7],0)
sd_12 = np.std(mfi[7:15],0)
sd_13 = np.std(mfi[15:19],0)
sd_21 = np.std(mfi[19:24],0)
sd_22 = np.std(mfi[24:30],0)
sd_23 = np.std(mfi[30:36],0)
sd_31 = np.std(mfi[36:43],0)
sd_32 = np.std(mfi[43:49],0)
sd_33 = np.std(mfi[49:],0)

#esporto i miei dati in una nuova tabella
MFI Prova = pd.DataFrame({
    "Load" : ["2.16","5.00","7.06"],
    "190 °C" : [avg_11, avg_12, avg_13],
    "190_std" : [sd_11,sd_12,sd_13],
    "210 °C" : [avg_21,avg_22,avg_23],
    "210_std" : [sd_21,sd_22,sd_23],
    "230 °C" : [avg_31,avg_32,avg_33],
    "230_std" : [sd_31,sd_32,sd_33]
})

with pd.ExcelWriter('MFI Prova.xlsx') as writer:
    MFI Prova.to_excel(writer, sheet_name="MFI_results")
    
# T in K, creazione di un vettore ra=1/RT, log(MFI) e log(1/RT)
T1 = 190+273.15
T2 = 210+273.15
T3 = 230+273.15
x = [1/(8.314*T1),1/(8.314*T2),1/(8.314*T3)]
log_x = np.log(x)
just_MFI = np.array([
     [avg_11, avg_12, avg_13],    
     [avg_21,avg_22,avg_23],    
     [avg_31,avg_32,avg_33] ]
)
Activation_energy = np.log(just_MFI)
y_1 = Activation_energy[:,0]
y = y_1[::-1]

#Fitting dati
p1 = sp.polyfit(x,y,1)
slope,intercept,r_value,p_value,std_err = stats.linregress(x,y)
print(pow(r_value,2))
print(p_value)

#grafico 1 prova
plt.figure(1)
plt.plot(x,y,'r.')
plt.plot(x,sp.polyval(p1,x),'b--')
plt.show()






Problemi
Quando voglio calcolarmi l'R^2 del fitting, ovvero la sezione di codice:

slope,intercept,r_value,p_value,std_err = stats.linregress(x,y)
print(pow(r_value,2))
print(p_value)


L'IConsole mi da il seguente errore:

ValueError: all the input array dimensions except for the concatenation axis must match exactly



il problema è che :

1. Sto eseguendo,a mio parere, tutte le istruzioni/comandi riportati in questo esempio:

http://apmonitor.com/che263/index.php/Main/PythonDataRegression


2. Le array che sto utilizzando hanno effettivamente la stessa dimensione.







Cosa sbaglio? come posso risolvere?







Risolto questo problema, vorrei capire come migliorare il mio codice e sopratutto rendere più veloce ed efficiente la mia scrittura: è possibile che per un analisi così banale venga fuori una pagina di codice? mi sembra di sparare ad una zanzara con un bazooka. C'è, quindi, un modo per scrivere meno e fare le stesse cose?




--- Ultima modifica di pull_over93 in data 2018-04-26 14:29:31 ---
Allegati
risolto
risolto
Benissimo, se vuoi condividerlo con gli altri del forum magari potresti aiutare utenti nella tua stessa situazione.

Usa sempre il tasto apposito per la formattazione del codice, mi raccomando, lo trovi subito prima della tavolozza dei colori in fase di scrittura del messaggio.


Cya
Mi pareva di aver utilizzato l'icona code, boh! Ad ogni modo ho riorganizzato meglio il codice, forse è bastato quello:
#importo pacchetti
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy as sp
#carico i dati
df = pd.read_excel('MeltFlowIndex 1.xlsx')

# massa
m = np.array(df.mass)
# tempo
t = np.array(df.time)
# mfi
mfi = (m*600)/t
#calcolo le medie
avg_11 = np.mean(mfi[0:7],0)
avg_12 = np.mean(mfi[7:15],0)
avg_13 = np.mean(mfi[15:19],0)
avg_21 = np.mean(mfi[19:24],0)
avg_22 = np.mean(mfi[24:30],0)
avg_23 = np.mean(mfi[30:36],0)
avg_31 = np.mean(mfi[36:43],0)
avg_32 = np.mean(mfi[43:49],0)
avg_33 = np.mean(mfi[49:53],0)
avg_PP Profax STG12 = np.mean(mfi[53:58],0)
avg_PP_HPS61R = np.mean(mfi[58:],0)
#calcolo la deviazione standard
sd_11 = np.std(mfi[0:7],0)
sd_12 = np.std(mfi[7:15],0)
sd_13 = np.std(mfi[15:19],0)
sd_21 = np.std(mfi[19:24],0)
sd_22 = np.std(mfi[24:30],0)
sd_23 = np.std(mfi[30:36],0)
sd_31 = np.std(mfi[36:43],0)
sd_32 = np.std(mfi[43:49],0)
sd_33 = np.std(mfi[49:53],0)
sd_PP Profax STG12 = np.std(mfi[53:58],0)
sd_PP_HPS61R = np.std(mfi[58:],0)

#array mfi_ccx
mfi_cc1 = np.array([avg_11,avg_21,avg_31])
mfi_cc2 = np.array([avg_12,avg_22,avg_32])
mfi_cc3 = np.array([avg_13,avg_23,avg_33])
#ln(mfi_ccx)
y1 = np.log(mfi_cc1)
y2 = np.log(mfi_cc2)
y3 = np.log(mfi_cc3)

# T in K, creazione di un vettore x=1/RT, log(MFI) e log(1/RT)
T1 = 190+273.15
T2 = 210+273.15
T3 = 230+273.15
x = np.array([1/(8.314*T1),1/(8.314*T2),1/(8.314*T3)])

#Fitting dati
k = 1 #numero di variabili nel modello, dato che è lineare K=1
from scipy import stats
p1 = sp.polyfit(x,y1,1)
slope,intercept,r_value,p_value,std_err  = stats.linregress(x,y1)
R2_1 = pow(r_value,2)
adj_R2_1 = 1-(1-R2_1)*(len(x)-1)/((len(x)-k-1))

p2 = sp.polyfit(x,y2,1)
slope,intercept,r_value,p_value,std_err  = stats.linregress(x,y2)
R2_2 = pow(r_value,2)
adj_R2_2 = 1-(1-R2_2)*(len(x)-1)/((len(x)-k-1))

p3 = sp.polyfit(x,y3,1)
slope,intercept,r_value,p_value,std_err  = stats.linregress(x,y3)
R2_3 = pow(r_value,2)
adj_R2_3 = 1-(1-R2_3)*(len(x)-1)/((len(x)-k-1))

results = {
    'Load' : [2.16,5.00,7.06],
    '190 °C' : [avg_11, avg_12, avg_13],
    '190_std' : [sd_11,sd_12,sd_13],
    '210 °C' : [avg_21,avg_22,avg_23],
    '210_std' : [sd_21,sd_22,sd_23],
    '230 °C' : [avg_31,avg_32,avg_33],
    '230_std' : [sd_31,sd_32,sd_33]
}
mfi_results = pd.DataFrame(results)

mfi_results.set_index('Load',inplace=True)

#esporto i risultati in un altro foglio excel
with pd.ExcelWriter('MFI_calculation.xlsx') as writer:
    mfi_results.to_excel(writer, sheet_name="MFI_results")
questo è quanto, se qualcuno può darmi consigli su come scrivere meno righe di codice per ottenere lo stesso risultato, ben venga!


Pagina: 1



Esegui il login per scrivere una risposta.