Getting values from Entry() in Python - python
I've got a little problem while creating the GUI for my Python program.
In the code, i've implemented this function:
def simula_partita(modello, squadraCasa, squadraOspite, max_gol=10):
media_gol_casa = modello.predict(pd.DataFrame(data={'Squadra': squadraCasa,
'Avversaria': squadraOspite, 'Casa':1},
index=[1])).values[0]
media_gol_ospiti = modello.predict(pd.DataFrame(data={'Squadra': squadraOspite,
'Avversaria': squadraCasa, 'Casa':0},
index=[1])).values[0]
previsione_squadra = [[poisson.pmf(i, media_squadra) for i in range(0, max_gol+1)]
for media_squadra in [media_gol_casa, media_gol_ospiti]]
ris = np.outer(np.array(previsione_squadra[0]), np.array(previsione_squadra[1]))
print(ris)
return(ris)
It takes four arguments (modello, squadraCasa, squadraOspite, max_gol).
If I call it in the code, like this:
simula_partita(modello_poisson, 'Juventus', 'Liverpool', max_gol=4)
It goes smoothly and gives me the desidered output.
Now, at the end of the code, I tried doing a GUI with this code:
root = Tk()
m = StringVar()
c = StringVar()
o = StringVar()
g = StringVar()
sceltaModello = Entry(root, textvariable = m)
sceltaCasa = Entry(root, textvariable = c)
sceltaOspite = Entry(root, textvariable = o)
sceltaGol = Entry(root, textvariable = g)
sceltaModello.pack()
sceltaCasa.pack()
sceltaOspite.pack()
sceltaGol.pack()
m.set('modello_poisson')
c.set('Squadra di Casa')
o.set('Squadra Ospite')
g.set('Max Gol')
modello = m.get()
squadraCasa = c.get()
squadraOspite = o.get()
max_gol = g.get()
avvia = Button(root, text = "Avvia Simulazione", command = simula_partita)
avvia.pack()
root.mainloop()
My wish was to get "modello", "squadraCasa", "squadraOspite" and "max_gol" as the Entry() input, but it doesn't seems to work and it gives me the error that the function "simula_partita" needs those parameters.
Could you help me figure out this problem?
Thanks a lot in advance!
Your function is defined with 4 parameters. You have to pass those parameters when the function is called via the command option in the Button. I don't exactly know what you function does, so, i'll replace it to print the 4 parameters for now.
from tkinter import *
import sqlite3
root = Tk()
def simula_partita(modello, squadraCasa, squadraOspite, max_gol=10):
print(modello, squadraCasa, squadraOspite, max_gol)
m = StringVar()
c = StringVar()
o = StringVar()
g = StringVar()
sceltaModello = Entry(root, textvariable = m)
sceltaCasa = Entry(root, textvariable = c)
sceltaOspite = Entry(root, textvariable = o)
sceltaGol = Entry(root, textvariable = g)
sceltaModello.pack()
sceltaCasa.pack()
sceltaOspite.pack()
sceltaGol.pack()
m.set('modello_poisson')
c.set('Squadra di Casa')
o.set('Squadra Ospite')
g.set('Max Gol')
avvia = Button(root, text = "Avvia Simulazione", command = lambda: simula_partita(m.get(), c.get(), o.get(), g.get()))
avvia.pack()
root.mainloop()
Edit: To answer OP's specific question
The entry field has to be set to a string. I understand that you are trying to pass as argument a variable. But the output of the entry field will be a string.
What you can do is create a dict with the string as key and the variable as value (ie 'data' in the below code) and the send the variable like data[m.get()]. If you have more variable that can be give you can add it as another key value pair in that dictionary.
Also the 4th parameter is an int so i have made it an int before passing using int().
Try changing to these lines in your full code.
m.set('modello_poisson')
c.set('Squadra di Casa')
o.set('Squadra Ospite')
g.set('Max Gol')
data={'modello_poisson':modello_poisson}
avvia = Button(root, text = "Avvia Simulazione", command = lambda: simula_partita(data[m.get()], c.get(), o.get(), int(g.get())))
I gave the following in the 4 entry fields entries
modello_poisson
Juventus
Atalanta
4
and got an output
[[0.03608837 0.03099437 0.0133097 0.00381033 0.00081812]
[0.08888343 0.07633721 0.03278097 0.00938461 0.00201498]
[0.1094572 0.09400692 0.04036875 0.01155685 0.00248139]
[0.0898621 0.07717774 0.03314191 0.00948794 0.00203717]
[0.0553312 0.047521 0.02040662 0.00584205 0.00125436]]
printed to my console.
Full code:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn
from scipy.stats import poisson,skellam
from tkinter import *
serieA_1819 = pd.read_csv("http://www.football-data.co.uk/mmz4281/1819/I1.csv")
serieA_1819 = serieA_1819[['HomeTeam','AwayTeam','FTHG','FTAG']]
serieA_1819 = serieA_1819.rename(columns={'FTHG': 'GolCasa', 'FTAG': 'GolOspiti'})
serieA_1819.head()
print(serieA_1819.head())
# Faccio una media dei gol segnati dalla squadra di casa e quelli segnati dalla squadra ospite.
# Come si può notare dall'output, generalmente la squadra di casa ha una media gol più alta.
# Questo fenomeno viene definito come "Home Field Advantage".
serieA_1819.mean()
print(serieA_1819.mean())
# Costruisco una distribuzione di Poisson per ogni media gol.
# La distribuzione di Poisson è una distribuzione di probabilità discreta,
# che descrive la probabilità che si verifichino un determinato numero di eventi
# in un arco di tempo predefinito (nel caso di una partita di calcio, 90 minuti),
# basandosi su un tasso di verifica dell'evento già noto.
poisson_pred = np.column_stack([[poisson.pmf(i, serieA_1819.mean()[j]) for i in range(8)] for j in range(2)])
# Plotto l'istogramma dei gol
plt.hist(serieA_1819[['GolCasa', 'GolOspiti']].values, range(9),
alpha=0.7, label=['Casa', 'Ospiti'],density=True, color=["#41FF32", "#20B2AA"])
# Aggiungo le linee per la distribuzione di Poisson
pois1, = plt.plot([i-0.5 for i in range(1,9)], poisson_pred[:,0],
linestyle='-', marker='o',label="Casa", color = '#000080')
pois2, = plt.plot([i-0.5 for i in range(1,9)], poisson_pred[:,1],
linestyle='-', marker='o',label="Ospiti", color = '#FF0000')
legenda=plt.legend(loc='upper right', fontsize=13, ncol=2)
legenda.set_title("Poisson Reale ", prop = {'size':'14', 'weight':'bold'})
plt.xticks([i-0.5 for i in range(1,9)],[i for i in range(9)])
plt.xlabel("Gol a Partita",size=13)
plt.ylabel("Proporzione per Partita",size=13)
plt.title("Numero di Gol per Partita (Serie A 2018/2019)",size=14,fontweight='bold')
plt.ylim([-0.004, 0.4])
plt.tight_layout()
plt.show()
# Ovviamente il numero di gol segnato da una squadra è indipendente dall'altro.
# La differenza tra due distribuzioni di Poisson viene chiamata "Distribuzione di Skellam",
# che ci permetterà di calcolare le probabilità che la partita finisca in pareggio
# o con la vittoria di una delle due squadre.
# Effettuo una previsione dei gol basandomi sulla distribuzione di Skellam
prev_skellam = [skellam.pmf(i, serieA_1819.mean()[0], serieA_1819.mean()[1]) for i in range(-6,8)]
plt.hist(serieA_1819[['GolCasa']].values - serieA_1819[['GolOspiti']].values, range(-6,8),
alpha=0.7, label='Reale',density=True)
plt.plot([i+0.5 for i in range(-6,8)], prev_skellam,
linestyle='-', marker='o', label="Skellam", color='#FF0000')
plt.legend(loc='upper right', fontsize=13)
plt.xticks([i+0.5 for i in range(-6,8)],[i for i in range(-6,8)])
plt.xlabel("Gol Casa - Gol Ospiti", size=13)
plt.ylabel("Proporzione per partita", size=13)
plt.title("Differenza Gol segnati (Squadra di Casa vs Squadra Ospite)", size=14, fontweight='bold')
plt.ylim([-0.004, 0.30])
plt.tight_layout()
plt.show()
# Per adattare questo modello a una partita specifica, dobbiamo conoscere
# il numero medio di gol segnati per partita da ogni squadra.
# Utilizziamo come esempio Juventus e Inter.
fig,(ax1,ax2) = plt.subplots(2, 1)
# Creo delle distribuzioni di Poisson sui gol fatti in casa e fuori casa di entrambe le squadre
inter_casa = serieA_1819[serieA_1819['HomeTeam']=='Inter'][['GolCasa']].apply(pd.value_counts, normalize=True)
inter_casa_poisson = [poisson.pmf(i, np.sum(np.multiply(inter_casa.values.T, inter_casa.index.T), axis=1)[0])
for i in range(8)]
juve_casa = serieA_1819[serieA_1819['HomeTeam']=='Juventus'][['GolCasa']].apply(pd.value_counts, normalize=True)
juve_casa_poisson = [poisson.pmf(i, np.sum(np.multiply(juve_casa.values.T, juve_casa.index.T), axis=1)[0])
for i in range(8)]
inter_ospiti = serieA_1819[serieA_1819['AwayTeam']=='Inter'][['GolOspiti']].apply(pd.value_counts, normalize=True)
inter_ospiti_poisson = [poisson.pmf(i, np.sum(np.multiply(inter_ospiti.values.T, inter_ospiti.index.T), axis=1)[0])
for i in range(8)]
juve_ospiti = serieA_1819[serieA_1819['AwayTeam']=='Juventus'][['GolOspiti']].apply(pd.value_counts, normalize=True)
juve_ospiti_poisson = [poisson.pmf(i, np.sum(np.multiply(juve_ospiti.values.T, juve_ospiti.index.T), axis=1)[0])
for i in range(8)]
# Questa è stata la parte che mi ha fatto smadonnare di più.
# Inizialmente i vettori "squadra_casa.values" e "squadra_ospiti.values" davano errore
# poiché venivano interpretati come vettori in 2D anzichè in 1D.
# Dopo varie analisi e ricerche su internet (le consiglio, se non lo conosce già,
# il forum "StackOverflow", veramente ben fornito, mi hanno aiutato a risolvere in meno di 5 minuti.),
# ho scoperto che bastava aggiungere ".flatten()" al vettore per poterlo avere in 1D.
# Questo ha risolto il mio problema, e in questa parte, sempre tramite la distribuzione di Poisson,
# genero un grafico che mi fa vedere le statistiche riguardo i gol fatti dalle due squadre
# quando giocano in casa e quando giocano fuori casa.
ax1.bar(inter_casa.index-0.4, inter_casa.values.flatten(), width=0.4, color="#034694", label="Inter")
ax1.bar(juve_casa.index, juve_casa.values.flatten(), width=0.4, color="#000000", label="Juventus")
pois1, = ax1.plot([i for i in range(8)], inter_casa_poisson,
linestyle='-', marker='o', label="Inter", color="#0A7BFF")
pois1, = ax1.plot([i for i in range(8)], juve_casa_poisson,
linestyle='-', marker='o', label="Juventus", color="#FF7C89")
legenda = ax1.legend(loc='upper right', fontsize=12, ncol=2)
legenda.set_title("Poisson Reale ", prop={'size':'14', 'weight':'bold'})
ax1.set_xlim([-0.5,7.5])
ax1.set_ylim([-0.01,0.65])
ax1.set_xticklabels([])
ax1.text(7.65, 0.585, ' Casa ', rotation=-90,
bbox={'facecolor':'#FFBCF6', 'alpha':0.5, 'pad':5})
ax2.text(7.65, 0.585, ' Ospiti ', rotation=-90,
bbox={'facecolor':'#FFBCF6', 'alpha':0.5, 'pad':5})
ax2.bar(inter_ospiti.index-0.4, inter_ospiti.values.flatten(), width=0.4, color="#034694", label="Inter")
ax2.bar(juve_ospiti.index, juve_ospiti.values.flatten(), width=0.4, color="#000000", label="Juventus")
pois1, = ax2.plot([i for i in range(8)], inter_ospiti_poisson,
linestyle='-', marker='o', label="Inter", color="#0A7BFF")
pois1, = ax2.plot([i for i in range(8)], juve_ospiti_poisson,
linestyle='-', marker='o', label="Juventus", color="#FF7C89")
ax2.set_xlim([-0.5,7.5])
ax2.set_ylim([-0.01,0.65])
ax1.set_title("Numero di Gol per Partita (Serie A 2018/2019)", size=14, fontweight='bold')
ax2.set_xlabel("Gol per Partita", size=13)
ax2.text(-1.15, 0.9, 'Proporzione per Partita', rotation=90, size=13)
plt.tight_layout()
plt.show()
# Ora costruirò un modello di Regressione di Poisson per analizzare
# tutti i risultati possibili per ogni partita possibile.
# Citando Wikipedia: La regressione di Poisson assume che
# la variabile di risposta Y ha una distribuzione di Poisson,
# e assume che il logaritmo del suo valore aspettato possa essere modellato
# da una combinazione lineare di parametri sconosciuti.
import statsmodels.api as sm
import statsmodels.formula.api as smf
modello_gol = pd.concat([serieA_1819[['HomeTeam','AwayTeam','GolCasa']].assign(Casa=1).rename(
columns={'HomeTeam':'Squadra', 'AwayTeam':'Avversaria','GolCasa':'Gol'}),
serieA_1819[['AwayTeam','HomeTeam','GolOspiti']].assign(Casa=0).rename(
columns={'AwayTeam':'Squadra', 'HomeTeam':'Avversaria', 'GolOspiti':'Gol'})])
modello_poisson = smf.glm(formula="Gol ~ Casa + Squadra + Avversaria", data=modello_gol,
family=sm.families.Poisson()).fit()
modello_poisson.summary()
print(modello_poisson.summary())
# Cosa significa l'output di questa porzione di codice?
# Il modello della distribuzione di Poisson avviene tramite
# il "GLM", ovvero un "Modello Lineare Generalizzato".
# Il paramentro da prendere in considerazione è quello della
# colonna "coef".
# Esso è da intendere come il coefficiente che indica la probabilità
# che la squadra faccia gol, utilizzandolo come esponente di "e".
# Un valore positivo di "coef" indica una maggiore possibilità di segnare,
# mentre un valore più vicino allo zero indica una neutralità (e^0 = 1).
# Alla fine della lista è possibile notare che "Casa" ha un valore "coef" di 0.2510.
# Ciò significa che la squadra che gioca in casa ha più probabilità di fare gol
# (nello specifico, e^0.2510 = 1.28 volte più probabile che segni).
# Ovviamente non tutte le squadre hanno lo stesso livello.
# Andando ad analizzare, per esempio, Frosinone e Sampdoria,
# i valori di "coef" sono -1.1868 (Frosinone) e -0.2197 (Sampdoria).
# Da ciò si evince appunto che la Sampdoria ha molte più probabilità
# di fare gol (0.80) rispetto al Frosinone (0.30).
# Se andiamo invece ad analizzare lo stesso valore quando la squadra è ospite,
# viene considerata quindi come "Avversaria", un valore più alto di "coef" indica
# una minor probabilità di poter segnare contro quella squadra,
# ovvero la probabilità che quella squadra ha di non subire gol.
# Prendiamo ad esempio Roma e Lazio.
# La Roma come avversaria ha un "coef" di -0.1366, mentre la Lazio -0.2766.
# Questo significa che avrei più probabilità di segnare contro
# la Lazio (0.75) che contro la Roma (0.87).
# Andiamo ora ad effettuare delle previsioni su alcune partite.
# Il modello Poissoniano riceverà come parametri le due squadre,
# e restituirà come output il valore medio di gol che ogni squadra potrebbe segnare.
# Ipotizziamo una partita Genoa - Milan.
gol_genoa_vs_milan = modello_poisson.predict(pd.DataFrame(data={'Squadra': 'Genoa', 'Avversaria': 'Milan',
'Casa':1},index=[1]))
print(gol_genoa_vs_milan)
gol_milan_vs_genoa = modello_poisson.predict(pd.DataFrame(data={'Squadra': 'Milan', 'Avversaria':'Genoa',
'Casa':0},index=[1]))
print(gol_milan_vs_genoa)
# Queste due previsioni ci daranno in output la probabilità di segnare delle due squadre.
# Ora definisco una funzione che simula una partita tra due squadre che andrò a inserire come parametri.
def simula_partita(modello, squadraCasa, squadraOspite, max_gol=10):
media_gol_casa = modello.predict(pd.DataFrame(data={'Squadra': squadraCasa,
'Avversaria': squadraOspite, 'Casa':1},
index=[1])).values[0]
media_gol_ospiti = modello.predict(pd.DataFrame(data={'Squadra': squadraOspite,
'Avversaria': squadraCasa, 'Casa':0},
index=[1])).values[0]
previsione_squadra = [[poisson.pmf(i, media_squadra) for i in range(0, max_gol+1)]
for media_squadra in [media_gol_casa, media_gol_ospiti]]
ris = np.outer(np.array(previsione_squadra[0]), np.array(previsione_squadra[1]))
print(ris)
return(ris)
# Dopo aver definito la funzione, provo a simulare una partita.
# Scelgo Fiorentina - Sassuolo.
simula_partita(modello_poisson, 'Fiorentina', 'Sassuolo', max_gol=4)
# Come si può notare dall'output, la funzione dà come risultato una matrice.
# Le righe della matrice rappresentano le probabilità della squadra di casa
# (in questo caso la Fiorentina), di segnare da 0 a max_gol,
# mentre le colonne rappresentano la stessa probabilità per la squadra
# ospite, (in questo caso il Sassuolo).
# Lungo la diagonale si trovano le varie probabilità di pareggio, che vanno
# dal caso 0-0 al caso 4-4.
# Sommando tutti gli elementi della diagonale, si ottiene la probabilità di pareggio.
# Se sommiamo gli elementi sotto la diagonale, otteniamo le probabilità di vittoria
# della squadra di casa, mentre la somma degli elementi sopra la diagonale ci darà
# la probabilità di vittoria della squadra ospite.
# Arriviamo dunque alla parte finale del programma, quella che io (e probabilmente anche lei, immagino),
# utilizzeremo per giocarci le future schedine. Ovviamente non garantisco un 100% di affidabilità,
# ma suppongo che affidarsi alla statistica a volte sia megio che farlo all'intuito.
# Il 19 Gennaio ricomincia la Serie A.
# Sfrutteremo l'occasione per calcolare i possibili risultati di alcune partite.
print("Risultati Udinese - Parma")
udinese_parma = simula_partita(modello_poisson, 'Udinese', 'Parma', max_gol=6)
# Vittoria dell'Udinese
udinese_vince_parma = np.sum(np.tril(udinese_parma, -1))
print("Vittoria Udinese:", "{0:.2f}".format(udinese_vince_parma*100), "%")
# Vittoria del Parma
parma_vince_udinese = np.sum(np.triu(udinese_parma, 1))
print("Vittoria Parma:", "{0:.2f}".format(parma_vince_udinese*100), "%")
# Pareggio
pareggio_udinese_parma = np.sum(np.diag(udinese_parma))
print("Pareggio:", "{0:.2f}".format(pareggio_udinese_parma*100), "%")
print("Risultati Napoli - Lazio")
napoli_lazio = simula_partita(modello_poisson, 'Napoli', 'Lazio', max_gol=6)
# Vittoria del Napoli
napoli_vince_lazio = np.sum(np.tril(napoli_lazio, -1))
print("Vittoria Napoli:", "{0:.2f}".format(napoli_vince_lazio*100), "%")
# Vittoria della Lazio
lazio_vince_napoli = np.sum(np.triu(napoli_lazio, 1))
print("Vittoria Lazio:", "{0:.2f}".format(lazio_vince_napoli*100), "%")
# Pareggio
pareggio_napoli_lazio = np.sum(np.diag(napoli_lazio))
print("Pareggio:", "{0:.2f}".format(pareggio_napoli_lazio*100), "%")
root = Tk()
m = StringVar()
c = StringVar()
o = StringVar()
g = StringVar()
sceltaModello = Entry(root, textvariable = m)
sceltaCasa = Entry(root, textvariable = c)
sceltaOspite = Entry(root, textvariable = o)
sceltaGol = Entry(root, textvariable = g)
sceltaModello.pack()
sceltaCasa.pack()
sceltaOspite.pack()
sceltaGol.pack()
m.set(modello_poisson)
c.set(Squadra di Casa)
o.set(Squadra Ospite)
g.set(Max Gol)
avvia = Button(root, text = "Avvia Simulazione", command = lambda: simula_partita(m.get(), c.get(), o.get(), g.get()))
avvia.pack()
root.mainloop()
Related
Python function return 'None' list
I have a function that removes duplicates from a list, and if removed, fills again those blanks with another entry of another list with all possible entries. Right now, I have a function which does this work, but I don`t know why, at time to store that complete list without duplicates in another list when I call it, it appears as "none". But it works properly. This is the function: def elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto): sinRep = [] # Donde almacenaremos las NO repetidas sinRep_AUX = [] # Para borrar en la borrada, (varios ciclos de borrado) for elem in dondeborrar: # Primera busqueda de elementos duplicados if(elem not in sinRep): sinRep.append(elem) # Obtenemos una lista sin repeticiones if sinRep == dondeborrar : pass # Comprobamos que haya diferencia de cantidad entre ambas else: while(sinRep != sinRep_AUX): dif = (cantidadNecesaria - len(sinRep)) # Obtenemos cuantos elementos hemos borrado for i in range(0,dif): # Generamos tantas nuevas entradas como las que hemos borrado sinRep.append(random.choice(fichcompleto)) # Obtenemos una nueva lista completa (pero con posibles repeticiones) for j in sinRep: # Comprobamos que no haya repeticiones de la primera busqueda if(j not in sinRep_AUX): # Segunda busqueda de elementos duplicados sinRep_AUX.append(j) # Obtenemos una lista sin repeticiones sinRep_AUX desde la primera sin rep if(sinRep == sinRep_AUX): return sinRep_AUX else: sinRep = sinRep_AUX sinRep_AUX = [] If I print at the end of the function the content of sinrep_AUX (final correct list) all is OK, the problem appears in the calling at time to store it. def gen_Preg(asignatura, porcentaje): preguntas = [] # Creamos una lista vacia para alamcenar las preguntas porc = int((porcentaje/100)*totalpreguntas) # Obtenemos cuantas preguntas necesitamos de esa asignatura por % # Bucle for para obtener y escribir la 1a vez (con posibles duplicaciones) with open(asignatura, 'r') as aPreg: fichero = aPreg.read().strip().splitlines() # Obtenemos el fichero sin posibles espacios for i in range(0,porc): preguntas.append(random.choice(fichero)) random.shuffle(preguntas) # Mezclamos las preguntas generadas preg_filt = elimina_Rep(preguntas, porc, fichero) # Tenemos un archivo con preguntas sin repeticiones print(preg_filt) Here, the first line shows the content of print sinRep_AUX from function elimina_Rep, and the last line, shows the content of preg_filt, that I suppose that is the list which store the returned list of the function when I call it ['Como te llamas?', 'Donde vives?', 'Como tomas apuntes?'] None I've tried to change the return line from return sinRep_AUX to return elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto) as I saw in other posts, but it doesn't work
You only return something when if sinRep == dondeborrar fails and then during the loop if(sinRep == sinRep_AUX) succeeds. You can solve these problems by moving the return statement to the end of the function. def elimina_Rep(dondeborrar, cantidadNecesaria, fichcompleto): sinRep = [] # Donde almacenaremos las NO repetidas sinRep_AUX = [] # Para borrar en la borrada, (varios ciclos de borrado) for elem in dondeborrar: # Primera busqueda de elementos duplicados if(elem not in sinRep): sinRep.append(elem) # Obtenemos una lista sin repeticiones if sinRep == dondeborrar : pass # Comprobamos que haya diferencia de cantidad entre ambas else: while(sinRep != sinRep_AUX): dif = (cantidadNecesaria - len(sinRep)) # Obtenemos cuantos elementos hemos borrado for i in range(0,dif): # Generamos tantas nuevas entradas como las que hemos borrado sinRep.append(random.choice(fichcompleto)) # Obtenemos una nueva lista completa (pero con posibles repeticiones) for j in sinRep: # Comprobamos que no haya repeticiones de la primera busqueda if(j not in sinRep_AUX): # Segunda busqueda de elementos duplicados sinRep_AUX.append(j) # Obtenemos una lista sin repeticiones sinRep_AUX desde la primera sin rep if(sinRep == sinRep_AUX): break else: sinRep = sinRep_AUX sinRep_AUX = [] return sinRep_AUX
Who can i do this? object too deep for desired array
who are yours?...sorry for my english translate but im from Spain, and my english is very bad, sorry. Im trying to make a program for my class of Computational Physical Programmation. I need to study the position and the velocity of 2-phase rocket, changing the % of gas of the first phase(it, obviously, change the % of 2 phase gas,Masa1= mass of 1phase, Masa 2= mass of 2phase). Changing the gas, change the time of fly. I wish to put all data whit odeint like this: from numpy import * #importamos todo lo que from scipy.integrate import odeint #podamos necesitar a lo largo import matplotlib.pyplot as plt #del programa #funciones def funder (M,t,u,D,m0): #funcion para calcular luego '''funcion derivada''' #la integral de la funcion y, v=M[0],M[1] return array([v,u*D/(m0-(D*t))]) #constantes ni=100 #numero de intervalos #cohete de una fase #Datos propuestos en el enunciado para una primera prueba D=13840. #Kg/s cantidad de combustible que se quema por segundo m0=2.85e6 #Kg masa total inicial u=2.46 #km/s velocidad de salida de los gases r=0.05 #proporcion de la masa recipiente mu=0.47*m0 #masa util mc=(m0-mu)/(1+r) #masa combustible t0=mc/D #tiempo que tarda en quemar el cobustible en una etapa #condiciones iniciales y0, v0 =0, 0 #posicion y velocidades iniciales igual ListaPorce=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9] #lista de #porcentajes,luego se convertira #en un array Intervalos=[] #lista con los #intervalos de tiempo de los #distintos porcentajes de combustible for i in ListaPorce: #para los i en ListaPorce, haz: Combustible=mc*i #multiplicara los indices por #el combustible #asi sabemos que cantidad de #combustible para cada porcentaje tempo=linspace(0,(Combustible/D),ni) #tempo es el array de tiempos #para cada porcentaje de combustible Intervalos.append(tempo) #añade tempo a la lista #Intervalos, que luego sera un array Duracion=array(Intervalos) #convertimos la lista #Intervalos al array Duracion Porcentaje=array(ListaPorce) #convertimos la lista #ListaPorce al array Porcentaje Usado=mc*Porcentaje masa1=mu+(1+r)*Usado #masa de la fase 1 masa1.shape=(masa1.size,1) masa2=mu+(1+r)*(mc-Usado) #masa de la fase 2 Comparacion01=odeint(funder,array([y0,v0]),Duracion, args=(u,D,masa1)) print Comparacion01 But when i make run, the program say me: Traceback (most recent call last): File "Trabajo IFC.py", line 278, in <module> Comparacion01=odeint(funder,array([y0,v0]),Duracion, args=(u,D,masa1)) File "/usr/lib/python2.7/dist-packages/scipy/integrate/odepack.py", line 144, in odeint ixpr, mxstep, mxhnil, mxordn, mxords) ValueError: object too deep for desired array The error is for use a non 1D array for odeint, true?. Who i can do that? i wish to have a "mega-array"(Comparacion01) like [%,times,position,velocity] Who i can do that? need to change the funcion "funder" thanks a lot for all users. i will continue trying...
Python code: IndexError: list index out of range
I have this code in which i have to confrontate values of 2 different arrays, one from real data and one from theoretical calculates: #import sys import datetime import time #import numpy as np from pysolar.solar import * \ # dati di input #posizione geografica latitudine = 43.8016626 longitudine = 11.2558136 # per sapere l'area captante mi serve la larghezza [m] pannello_mis_larghezza = 0.23 # per sapere l'area captante mi serve la lunghezza [m] pannello_mis_lunghezza = 1.970 # per calcolare ombra all'interno di una parabola devo sapere l'altezza parabola_altezza_ombra = 0.16 #posizione superficie #inclinazione rispetto al piano in gradi, TILT pannello_tilt = 12 pannello_tilt_radianti = math.radians(pannello_tilt) #conversione in radiati le funzioni math. richiedono radianti #angolo orientmento azimuth rispetto a sud , negativo verso ovest positivo verso est pannello_azimuth = 0 pannello_azimuth_radianti = math.radians(pannello_azimuth) #il pannello può avere un limite di rotazione per motivi costruttivi funzionali pannello_limite_rotazione = 45 # per studio su minuti range_studio_minuti = 1440 #per studi con secondi range_studio_secondi = 86400 #si apre il file lamma per i risultati reali file_lamma = open("/Users/costanzanaldi/Desktop/POLO_SCIENTIFICO_(LAMMA).txt",'r') #Il comando split non può essere dato su un'intera lista di stringhe ma solo su una #singola stringa, quindi si inserisce la variabile type per scandire tutte le stringhe #creo due variabili iiii e tttt per inizializzare i cicli for iiii = -1 tttt = -1 flusso_diretto_medio_W_mq_array = [] flusso_diretto_medio_W_mq_array_anno = [] for line in file_lamma: iiii= iiii+1 Type = line.split(" ") data_ = Type[0] orario_ = Type[1] radiazione_globale = Type[2] radiazione_diffusa = Type[3] #ora devo dividere la data in giorno, mese e anno e l'orario in ore e minuti giorno1, mese1, anno1 = data_.split("/") ora1, minuto1, secondo1 = orario_.split(":") anno_ = int(anno1) mese_ = int(mese1) giorno_= int(giorno1) ora_ = int(ora1) minuto_ = int(minuto1) d_ = datetime.datetime(anno_, mese_, giorno_, ora_, minuto_) energia_su_metro_quadro_globale_int=int(radiazione_globale) energia_su_metro_quadro_diffusa_int=int(radiazione_diffusa) #si crea un array per le potenze medie e si usa append per i problemi legati al floating flusso_diretto_medio_W_mq = (energia_su_metro_quadro_globale_int - energia_su_metro_quadro_diffusa_int)/(60*15) if flusso_diretto_medio_W_mq < 0: flusso_diretto_medio_W_mq = 0.0 flusso_diretto_medio_W_mq_array.append(flusso_diretto_medio_W_mq) for conta in range(15): tttt = tttt +1 flusso_diretto_medio_W_mq_array_anno.append(flusso_diretto_medio_W_mq) file_lamma.close() aaaa=-1 bbbb=-1 anno_array = [] k_array = [] #creo una lista dove avrò le date e gli orari di tutto l'anno 2014 data = datetime.datetime(2014, 1, 1, 0, 0) #con la funzione timedelta incremento la data del 1 gennaio 2014 a mezzanotte #di un minuto fino ad arrivare al 31 dicembre 2014 alle 23 e 59 (ho così un range di #525600 minuti in un anno) for i in range(0,525599): data += datetime.timedelta(minutes=1) data_stringa = data.strftime("%Y-%m-%d %H:%M:%S") anno_array.append(data_stringa) flusso_diretto_medio_teorico_W_mq_array = [] flusso_diretto_medio_teorico_W_mq_array_anno = [] aaaa=aaaa+1 for line2 in anno_array: Type2=line2.split(" ") data_2 = Type2[0] orario_2 = Type2[1] #ora devo dividere la data in giorno, mese e anno e l'orario in ore e minuti anno2, mese2, giorno2 = data_2.split("-") ora2, minuto2, secondo2 = orario_2.split(":") anno_2 = int(anno2) mese_2 = int(mese2) giorno_2 = int(giorno2) ora_2 = int(ora2) minuto_2 = int(minuto2) d_2 = datetime.datetime(anno_2, mese_2, giorno_2, ora_2, minuto_2) #calcolo elevazione sole - altitude sole_elevazione = get_altitude(latitudine, longitudine, d_2) sole_elevazione_radianti = math.radians(sole_elevazione) sole_zenith = 90 - sole_elevazione sole_zenith_radianti = math.radians(sole_zenith) #visto che la libreria non è in grado di gestire valori di elevazione negativi si forza il codice if sole_elevazione < 0: sole_elevazione = 0 #pysolar calcola anche l'irraggiamento diretto teorico irraggiamento_diretto = radiation.get_radiation_direct(d_2, sole_elevazione) # per fare i confronti con dati lamma è utile sapere l'intensità di flusso diretto su un piano #il lamma misura sul piano la totale e la diffusa. la differenze possiamo dire che è la diretta su un piano #il calcolo è simile solo che come cos prendiamo quello dell'elevazione del sole irraggiamento_diretto_su_piano_terreno = abs(math.cos(sole_zenith_radianti)) * irraggiamento_diretto aaaa=aaaa+1 flusso_diretto_medio_teorico_W_mq_array_anno.append(irraggiamento_diretto_su_piano_terreno) #ora creo il coefficiente moltiplicativo che rappresenti il rapporto fra #il calcolo teorico sul pannello piano a terra e il dato sperimentale for bbbb in range(525599): bbbb=bbbb+1 if flusso_diretto_medio_W_mq_array_anno[bbbb] == 0: k = 0 else: k = (flusso_diretto_medio_teorico_W_mq_array_anno[bbbb])/(flusso_diretto_medio_W_mq_array_anno[bbbb]) k_array.append(k) But it says " k = (flusso_diretto_medio_teorico_W_mq_array_anno[bbbb])/(flusso_diretto_medio_W_mq_array_anno[bbbb]) IndexError: list index out of range" any ideas? Thank you
You try getting value from list on index more then length a list. It is not right way. You should check exist index in list if index > len(arr): # index not found
Python: AttributeError: 'datetime.datetime' object has no attribute 'split'
i have this code: import datetime import time from pysolar.solar import * \ aaaa=-1 anno_array = [] #creo una lista dove avrò le date e gli orari di tutto l'anno 2014 data = datetime.datetime(2014, 1, 1, 0, 0) #con la funzione timedelta incremento la data del 1 gennaio 2014 a mezzanotte #di un minuto fino ad arrivare al 31 dicembre 2014 alle 23 e 59 (ho così un range di #525600 minuti in un anno) for i in range(0,525599): data += datetime.timedelta(minutes=1) anno_array.append(data) flusso_diretto_medio_teorico_W_mq_array = [] flusso_diretto_medio_teorico_W_mq_array_anno = [] aaaa=aaaa+1 for line2 in anno_array: Type2=line2.split(" ") data_2 = Type2[0] orario_2 = Type[1] #ora devo dividere la data in giorno, mese e anno e l'orario in ore e minuti anno2, mese2, giorno2 = data_2.split("-") ora2, minuto2, secondo2 = orario_2.split(":") anno_2 = int(anno2) mese_2 = int(mese2) giorno_2 = int(giorno2) ora_2 = int(ora2) minuto_2 = int(minuto2) d_2 = datetime.datetime(anno_2, mese_2, giorno_2, ora_2, minuto_2) # dati di input #posizione geografica latitudine = 43.8016626 longitudine = 11.2558136 #calcolo elevazione sole - altitude sole_elevazione = get_altitude(latitudine, longitudine, d) sole_elevazione_radianti = math.radians(sole_elevazione) sole_zenith = 90 - sole_elevazione sole_zenith_radianti = math.radians(sole_zenith) #visto che la libreria non è in grado di gestire valori di elevazione negativi si forza il codice if sole_elevazione < 0: sole_elevazione = 0 #pysolar calcola anche l'irraggiamento diretto teorico irraggiamento_diretto = radiation.get_radiation_direct(d, sole_elevazione) # per fare i confronti con dati lamma è utile sapere l'intensità di flusso diretto su un piano #il lamma misura sul piano la totale e la diffusa. la differenze possiamo dire che è la diretta su un piano #il calcolo è simile solo che come cos prendiamo quello dell'elevazione del sole irraggiamento_diretto_su_piano_terreno = abs(math.cos(sole_zenith_radianti)) * irraggiamento_diretto aaaa=aaaa+1 flusso_diretto_medio_teorico_W_mq_array_anno.append(irraggiamento_diretto_su_piano_terreno) but it doesn't work because it says:AttributeError: 'datetime.datetime' object has no attribute 'split' How can I do? I want a code that pick values of the dates from the list and then use them. Thank you
make it a string first with .strftime("%Y-%m-%d %H:%M:%S") but even that is silly and call the month etc directly datetime.month for example
How to stem a list of words in spanish with nltk?
How can i stem all spanish words in the following list with nltk snowballstemer?. This is what i tried: # coding=utf-8 from sklearn.feature_extraction.text import CountVectorizer import nltk.stem vectorizer= CountVectorizer(min_df=1) opinion = [""" Hola compis! No sabÌa como se ponÌa una lavadora hasta que conocÌ esta y es que es muy sencilla de utilizar! Todo un gustazo cuando estamos aprendiendo para emanciparnos, que si nos ponen facilidad con las tareas de la casa pues mejor que mejor. Antes de esta tenÌamos otra de la marca Otsein, de estas que van incluidas en el mobiliario y adem·s era de carga superior, pero tan antigua que seg˙n mi madre, nadie la podÌa tocar porque solo la entendÌa ella. Esta es de la marca Aeg y dentro de este tipo de lavadoras de esta marca las habÌa m·s caras o m·s baratas y est· digamos que est· en el punto medio. Es de color blanco y tiene carga frontal, con una capacidad de 6kg. En casa a pesar de ser cuatro, se ponen lavadoras casi todos o todos los dÌas. En su parte de arriba encontramos la ";zona de mandos";, donde se puede echar el detergente, aunque en nuestro caso lo al ser gel lo ponemos directamente junto con la ropa. Luego tiene la rueda para elegir el programa y los intermitentes que indican en que paso del programa estaba. Como todas tiene programas m·s cortos y m·s largos, incluso un programa que seria como lavar a mano y otro ideal para estores, que salen casi secos y planchaditos para colgar y ya est·. Es muy f·cil de aprenderla y adem·s tiene indicador por sonido de cuando acaba, lista para abrir y tender. Saludillos! """] spanish_stemmer = nltk.stem.SnowballStemmer('spanish') print "\n these are the stems of opinion", opinion = [[spanish_stemmer(word) for word in sentence.split(" ")]for sentence in opinion] the problem with that aproach is the following this is the output: Traceback (most recent call last): these are the stems of opinion File "/Users/user/PycharmProjects/untitled/prueba stem.py", line 47, in <module> opinion = [[spanish_stemmer(word) for word in sentence.split(" ")]for sentence in opinion] TypeError: 'SnowballStemmer' object is not callable How can i return the list of stems given the list (opinion)? and how to lowercase the complete opinion?
>>> from nltk import word_tokenize >>> from nltk.stem import SnowballStemmer >>> stemmer = SnowballStemmer('spanish') >>> >>> stemmer.stem('cuando') u'cuand' >>> stemmer.stem('apprenderla') u'apprend' >>> >>> text = 'En su parte de arriba encontramos la ";zona de mandos";, donde se puede echar el detergente, aunque en nuestro caso lo al ser gel lo ponemos directamente junto con la ropa.' >>> stemmed_text = [stemmer.stem(i) for i in word_tokenize(text)] >>> stemmed_text [u'en', u'su', u'part', u'de', u'arrib', u'encontr', u'la', u'``', u';', u'zon', u'de', u'mand', u"''", u';', u',', u'dond', u'se', u'pued', u'echar', u'el', u'detergent', u',', u'aunqu', u'en', u'nuestr', u'cas', u'lo', u'al', u'ser', u'gel', u'lo', u'pon', u'direct', u'junt', u'con', u'la', u'rop', u'.']
Try to change last line to this: ... opinion = [[spanish_stemmer.stem(word) for word in sentence.split(" ")]for sentence in opinion] ...