Topic: HELP : Manipolazione Dati  (Letto 208 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Homo Ex Machina

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
HELP : Manipolazione Dati
« il: Marzo 17, 2021, 18:26 »
salve a tutti, vi chiedo scusa se questa domanda possa risultare banale o stupida ma mi sto immergendo in questo mondo meraviglioso da molto poco.

Il mio obbiettivo è quello di utilizzare fogli .txt con all'interno Nome Cognome e 4 variabili.

come posso scomporre il documento base per lavorare separatamente sulle variabili e poi ricollegarle al corretto Nom e Cogn a cui appartengono?

f = open("Dataset.txt")
f1 = open("Nomi.txt", "w")
f2= open("Percentuali.txt", "w")
for line in f:
    i = 1
    z = 1
    if line(i) == k
        f1.write(line[z] + "\n")
    else:
        f2.write(line + "\n")
    i = 1 + i
    z = 1 +z

f.close()
f1.close()
f2.close()

avevo provato cosi per scomporrere ma come temevo non funziona.

grazie in anticipo!

P.S. scusate la mia ingoranza ma è la prima settimana per me :(

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:HELP : Manipolazione Dati
« Risposta #1 il: Marzo 18, 2021, 12:52 »
Ave @Homo :)

Cosa intendi con "fogli .txt"?

Per rapportare dei dati tra loro, indipendentemente se siano "Nom e Cogn" o le "altre 4 variabili" esistono una enormità di modi possibili ed immaginabili, così come sono numerose le modalità di "lavorare" separatamente i dati per poi rapportarli.
Dette numerose modalità possono andare dal "molto semplice" allo "assurdamente complesso", dipendentemente dalla struttura dati, dal contesto di esecuzione, dalla interfaccia utente che si vuole definire ... di norma la "semplicità" di interfaccia per l'utilizzatore finale è inversamente proporzionale alla complessità del codice necessario per farla utilizzare efficacemente.

Detto questo, c'è da chiarire un punto fondamentale : un "programma" è, a tutti gli effetti, un "progetto".
Come tutti i progetti, devi conoscere "bene" i materiali (i dati) con cui deve essere realizzato, le tecniche con cui deve essere realizzato (linguaggi di programmazione) e la sua destinazione d'uso (interfaccia utente), un ospedale è ben diverso da una villetta

... cosa voglio dirti con quanto sopra? : che "forse" hai l'intenzione di gestire "qualcosa" ma cosa è questo qualcosa lo sai?, se lo sai, come vorresti gestirlo? e, più importante di tutto, sai "come" gestirlo o, almeno, hai una idea di come "vorresti" gestirlo?

Non prenderlo per critica, quanto sopra, spesso parto "alla garibaldina" anche io, ma il Tuo codice, in se, non rivela nulla su ciò che a Te serve, non espone alcun pensiero strutturato su cui si possa ragionare. Prova a porti le domande di sopra ed a puntualizzare a Te stesso il problema (magari con aiuto di carta e penna, come realizzeresti "a mano"?) poi esponi i punti che ricavi che se ne parla.

Ciao
« Ultima modifica: Marzo 18, 2021, 12:55 da nuzzopippo »

Offline Homo Ex Machina

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:HELP : Manipolazione Dati
« Risposta #2 il: Marzo 18, 2021, 14:15 »
Ciao,

Grazie mille per tutti i consigli, il mio Foglio.txt chiamato 'Dataset.txt' è un documento di testo cosi strutturato:

Gianfranco Pasqui 99 99 99 99
Antonio casta     83 18 11 69
Cridello Stanti   24 31 39 71
Presto Ottardi    31 75 10 53
Pino Amrato       12 34 71 44

il mio obbiettivo era quello di lavorare sui numeri per ricavarne il prodotto di variabili indipendenti attribuendo a ciascuna variabile un diverso peso e quindi per avere una percentuale totale finale differita per ogni vriabile. Allo stesso tempo produrre anche dei file di testo contenenti i nomi e i numeri per pura praticità nel momento dello studio dei risultati, e diciamo che ci sono quasi riuscito:

[....]
[....]
f = open("Dataset.txt")
f1 = open("Nomi.txt", "w")
f2= open("Percentuali.txt", "w")
KK=[]
for x in f.read():
    try:
         if type(x) == str:
            KK.append(int(x))
    except ValueError:
        f1.write(str(x))
    continue

KKK = [(KK[0]*10 + KK[1])/100,(KK[2]*10 + KK[3])/100,(KK[4]*10+KK[5])/100,(KK[6]*10 +KK[7])/100]
def Maro():
    i=0
    while i < len(KK):
        KKKf = [(KK*10 + KK[i+1])/100,(KK[i+2]*10 + KK[i+3])/100,(KK[i+4]*10+KK[i+5])/100,(KK[i+6]*10 +KK[i+7])/100]
        valore_pp((KKKf[0]*100),(KKKf[1]*100),(KKKf[2]*100),(KKKf[3]*100))
        i=i+8
        print(KKKf)
        valore_pp
f1.close() 
f.close()
f1 = open('Nomi.txt','r')
print(f1.read(),)
Maro()

l'output è questo:

Gianfranco Pasqui   
Antonio casta       
Cridello Stanti     
Presto Ottardi       
Pino Amrato         
32.775 12.975 27.825 17.925 91.5
Bianco: []
Giallo: []
Arancione: []
Rosso: []
Nero: [91.5]
[0.99, 0.99, 0.99, 0.99]
27.175 0.8250000000000001 1.4250000000000003 11.924999999999999 41.35
Bianco: []
Giallo: []
Arancione: [41.35]
Rosso: []
Nero: []
[0.83, 0.18, 0.11, 0.69]
6.524999999999999 2.775 9.825 12.325 31.45
Bianco: []
Giallo: []
Arancione: [31.45]
Rosso: []
Nero: []
[0.24, 0.31, 0.39, 0.71]
8.975 9.374999999999998 1.125 8.725000000000001 28.2
Bianco: []
Giallo: [28.2]
Arancione: []
Rosso: []
Nero: []
[0.31, 0.75, 0.1, 0.53]
2.3249999999999997 3.225 19.425 6.925000000000001 31.900000000000002
Bianco: []
Giallo: []
Arancione: [31.900000000000002]
Rosso: []
Nero: []
[0.12, 0.34, 0.71, 0.44]

il problema che mi si è presentato ora, come puoi ben vedre, è che mi vengono riportati tutti i nomi all'inizio e subito dopo i passaggi per tutte le percentuali di ogni nome.
ora la domanda è come posso inserire il nome di ogni persona sopra la propria scheda in modo da rendere il tutto piu ordinato e sopratutto piu facile da analizzare?
Spero di essere stato un po piu chiaro di prima. Ti ringrazio tantissimo per l'aiuto, qualora avessi dei consigli su come sviluppare il miglioramento  o per diminuire i costi computazionali ne sarei piu che grato.

Grazie ancora!!! :)
« Ultima modifica: Marzo 18, 2021, 17:54 da Homo Ex Machina »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:HELP : Manipolazione Dati
« Risposta #3 il: Marzo 19, 2021, 13:45 »
brrrr ... non prenderlo come un rimprovero ma ha ben ragione il buon @RicPol quando parla della difficoltà di spiegare ad iniziando "come si fa", è un "qualcosa" che si acquisisce per gradi e ci vuole proprio TANTO per spiegarlo.

Il primo accorgimento che bisogna avere, nella stesura del proprio codice, è fare in modo che esso sia "chiaro" e facilmente comprensibile, prova ad immaginare di rileggere tra un paio di anni, quando avrai dimenticato il corrente "problema", questo
        KKKf = [(KK[i]*10 + KK[i+1])/100,(KK[i+2]*10 + KK[i+3])/100,(KK[i+4]*10+KK[i+5])/100,(KK[i+6]*10 +KK[i+7])/100]
        valore_pp((KKKf[0]*100),(KKKf[1]*100),(KKKf[2]*100),(KKKf[3]*100))

credo che, come è capitato a me, Ti chiederai : e qua che c...o volevo fare?

Poi, dato che è possibile, sarebbe bene suddividere il proprio "problema" in parti quanto più elementari possibile e specializzate per singoli compiti, tale accorgimento permetterebbe di comprendere e mantenere più agevolmente il codice del pezzo di "lenzuolo" che hai scritto ... sinceramente mi è riuscito di comprendere ben poco di ciò che Ti serve ... per altri post utilizza il pulsante "pythoncode" dell'editor dei post per rendere più leggibile il codice.

Ora proverò a rispondere alla Tua domanda
...ora la domanda è come posso inserire il nome di ogni persona sopra la propria scheda in modo da rendere il tutto piu ordinato e sopratutto piu facile da analizzare?...

Intanto, diciamo che una facilitazione per l'analisi dei dati potrebbe essere data dalla composizione del testo, una metodologia semplice in uso da molto tempo è la così detta CSV (Comma-separated values), dei valori separati da un ben preciso carattere.

Per provare a rispondere alla domanda sopra, ignorerò completamente il Tuo problema per proporti una problematica semplificata ed un ragionamento minimo per realizzare un approccio quanto più base possibile, utilizzando liste ed una semplice articolazione di funzioni, studiati gli argomenti, principalmente le funzioni, magari approfittando di un generoso lavoro di traduzione del buon @RicPol (leggilo tutto, fa bene alla salute).
In qualche caso, per accorciare un po' il codice (questo sarà un post moolto lungo) ricorrerò alle list comprehensions, e non spiegherò i metodi utilizzati, trovati la documentazione relativa ad ogni dubbio, studiala e cerca di capire cosa ho fatto, sarà utile esercizio, poi, se proprio non Ti riesce domanda.

Problema da affrontare : Gestire i nomi dei componenti la redazione del "Papersera" e gli stipendi corrisposti nei mesi da gennaio a marzo, i dati vanno registrati su file differenti, produrre un report a singolo nominativo e/o della redazione.

... ora che abbiamo il problema, per prima cosa cominciamo a ragionarci su, cosa ci serve?
1 - il nome e cognome dei componenti della redazione scritto da qualche parte;
2 - quanto pago ogni mese a ciascun componente della redazione scritto da qualche altra parte.

Qui mi sorge una domanda : come posso individuare quanto pago ogni mese a ciascun nominativo, senza ripeterne il nome, o almeno minimizzando ciò che devo ripetere?, come farei, p.e., se dovessi utilizzare delle schede cartacee?
Una possibile risposta è ampiamente utilizzata da secoli : assegno un numero di matricola univoco al nominativo e lo assegno alla registrazione di ogni pagamento che gli faccio!

C'è altro? Mi sembra di no, quale è il primo passo da fare? Ovviamente definire la redazione, cioè un numero indefinito di nominativi, uno alla volta od anche uno di seguito all'altro, assegnargli il suo numero di matricola e registrarlo ... per il numero di matricola, magari parto da zero e lo incremento di uno ad ogni inserimento ... si, vabbe' ma se poi avvengono assunzioni o se devo inserirli un po' alla volta?, magari mi serve anche un metodo per contare quelli che sono già registrati ed un metodo per aggiungere ai vecchi nominativi i nuovi nel file.
Più o meno quello che serve per il primo passo è individuato, apro una shell python e provo a fare i prototipi delle funzioni opportune

Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> import os
>>> os.chdir('script/test/posts/homo')
>>> def def_name():
print('DEFINIZIONE NOMINATIVO')
cognome = input('Cognome? :')
nome = input('Nome? ')
if not cognome or not nome:
return None
return cognome, nome

>>> def add_names():
names = []
print('AGGIUNTA NOMINATIVI\n')
new_name = True
while new_name:
name = def_name()
if name:
names.append(name)
print()
else:
new_name = False
return names

>>> def count_names(f_name):
count_names = 0
if os.path.exists(f_name) and os.path.isfile(f_name):
with open(f_name) as f:
old_names = f.readlines()
count_names = len(old_names)
return count_names

>>> def store_names(f_name, new_names):
index = count_names(f_name)
with open(f_name, 'a+') as f:
for n in new_names:
name = [str(index)] + list(n)
record = ';'.join(name)
f.write(record+'\n')
index += 1

da un terminale mi posiziono nella directory di esecuzione e controllo la situazione (N.B. - è un terminale linux, io non uso windows)

NzP:~$ cd script/test/posts/homo
NzP:~$ ls
NzP:~$

Quindi provo a definire un nominativo, il file di destinazione e registrare i dati

>>> nomi = add_names()
AGGIUNTA NOMINATIVI

DEFINIZIONE NOMINATIVO
Cognome? :de' Paperoni
Nome? Paperon

DEFINIZIONE NOMINATIVO
Cognome? :
Nome?
>>> ls # Ok ... qui ho sbagliato shell
Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    ls
NameError: name 'ls' is not defined
>>> f_name = 'nomi.txt'
>>> store_names(f_name, nomi)

verifico

NzP:~$ ls
nomi.txt
NzP:~$ cat nomi.txt
0;de' Paperoni;Paperon
NzP:~$

e quindi ne inserisco altri due

>>> nomi = add_names()
AGGIUNTA NOMINATIVI

DEFINIZIONE NOMINATIVO
Cognome? :Paolino
Nome? Paperino

DEFINIZIONE NOMINATIVO
Cognome? :Paperotto
Nome? Paperoga

DEFINIZIONE NOMINATIVO
Cognome? :
Nome?
>>> store_names(f_name, nomi)
>>>

 e verifico nuovamente

NzP:~$ cat nomi.txt
0;de' Paperoni;Paperon
1;Paolino;Paperino
2;Paperotto;Paperoga
NzP:~$


allora, dal breve test svolto si direbbe che i nostri prototipi di funzione per "nominativi" funzionano correttamente, possiamo ipotizzare di inserirli in un nostro modulo per riutilizzarli in una applicazione, passiamo a valutare l'inserimento dei pagamenti ... intanto, possiamo considerare che tali processi, come logica, sono completamente separati dai processi "anagrafici", ciò che serve realmente è, in sostanza, il numero di matricola del soggetto, il mese di riferimento, che potrebbe anche essere un numero, e l'importo, ciò non di meno, dato che chi inserisce i dati è un essere umano (ben poco adatto ai numeri), definiamo una struttura dati ed una funzione "di utilità"

>>> mesi = [(1, 'Gennaio'), (2, 'Febbraio'), (3, 'Marzo')]
>>> def get_current_names(f_name):
with open(f_name) as f:
data = f.readlines()
return [x.rstrip('\n').split(';') for x in data]

>>> get_current_names(f_name)
[['0', "de' Paperoni", 'Paperon'], ['1', 'Paolino', 'Paperino'], ['2', 'Paperotto', 'Paperoga']]

e quindi una funzione che provvede direttamente a registrare i dati di input una volta inseriti, un mese alla volta, che provvederemo a lanciare, verificare e ripetere per i tre mesi che ci occorrono

>>> def make_pays(month, f_name, f_pay):
for m in mesi:
if month == m[0]:
m_name = m[1]
print('\nInserimento paghe %s:\n' % m_name)
names = get_current_names(f_name)
f = open(f_pay, 'a+')
for n in names:
row = [n[0], str(month)]
money = input('Stipendio %s? : ' % n[2])
row.append(money)
record = ';'.join(row) + '\n'
f.write(record)
f.close()


>>> f_pay = 'stipendi.txt'
>>> make_pays(1, f_name, f_pay)

Inserimento paghe Gennaio:

Stipendio Paperon? : 1000
Stipendio Paperino? : 500
Stipendio Paperoga? : 400


Questa è la situazione ottenuta dopo il primo inserimento ed alla fine degli inserimenti per Marzo

NzP:~$ ls
nomi.txt  stipendi.txt
NzP:~$ cat stipendi.txt
0;1;1000
1;1;500
2;1;400

NzP:~$ cat stipendi.txt
0;1;1000
1;1;500
2;1;400
0;2;1000
1;2;400
2;2;350
0;3;1000
1;3;500
2;3;400
NzP:~$


... stiamo giungendo alla fine della Tua domanda, non ci resta che "inserire il nome di ogni persona sopra la propria scheda", ossia interrogare i dati, funzionalità che possiamo considerare "staccata" dalle altre due, diciamo che la "scheda" della persona deve contenere gli import di pagamento per mese (variabile di utilità mesi) e che ci farebbero comodo delle utità capaci di rintracciare dalla matricola tanto il nominativo quanto i pagamenti effettuati, implementiamoli assiame alla procedura di stampa a video dei dati e testiamo il tutto :

>>> def get_subject(n_code, f_name):
names = get_current_names(f_name)
for n in names:
if n[0] == n_code:
return n
return None

>>> def get_payments(n_code, f_pay):
with open(f_pay) as f:
data = f.readlines()
return [x.rstrip('\n').split(';') for x in data if x[0] == n_code]

>>> def print_payments(n_code, f_name, f_pay):
subject = get_subject(n_code, f_name)
if not subject:
print('codice %s inesistente' % n_code)
return
print('Stipendi corrisposti a %s %s:\n' %(subject[2], subject[1]))
payments = get_payments(n_code, f_pay)
for p in payments:
for m in mesi:
if int(p[1]) == m[0]:
m_name = m[1]
break
print('%10s: %s' % (m_name, p[2]))


>>> print_payments('1', f_name, f_pay)
Stipendi corrisposti a Paperino Paolino:

   Gennaio: 500
  Febbraio: 400
     Marzo: 500
>>>

per stamparli 'tutti'

>>> for n in nomi:
print_payments(n[0], f_name, f_pay)
print()


Stipendi corrisposti a Paperon de' Paperoni:

   Gennaio: 1000
  Febbraio: 1000
     Marzo: 1000

Stipendi corrisposti a Paperino Paolino:

   Gennaio: 500
  Febbraio: 400
     Marzo: 500

Stipendi corrisposti a Paperoga Paperotto:

   Gennaio: 400
  Febbraio: 350
     Marzo: 400

>>>


... 'na faticata, vero? ... il papiro sopra è elementare, manca completamente del controllo degli errori, tanto di input utente quanto di accesso ai files, vedrai presto come sia possibile far meglio già con strutture base, p.e. con i dizionari, per non parlare come potrai operare diversamente una volta acquisite classi e programmazione ad oggetti, ma mostra in maniera elementare un metodo "di approccio" ai problemi che ho cercato di evidenziate per Te e gli altri iniziandi, che vedo numerosi porre domande da 1M$ per sparire.

Ciò che spero sia evidente è che per affrontare  seriamente questa materia, indipendentemente dal linguaggio, bisogna porsi con buona volontà ad acquisire per bene le basi, solo dopo averle acquisite procedere a piccoli passi e con la documentazione sempre a portata di mano, a realizzare proprie applicazioni sempre approfondendo i concetti, per ogni cosa appresa ve ne sono cento che si ignorano, Te lo assicuro per mia esperienza diretta.

Ciao :)

Offline Homo Ex Machina

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:HELP : Manipolazione Dati
« Risposta #4 il: Marzo 21, 2021, 11:24 »
Caro @nuzzopippo non so veramente come ringraziarti per i consigli e per la breve ma esauriente lezione che mi sei riuscito a dare, ora mi metterò sotto con lo studio grazie a tutti gli articoli nel forum( che non sapevo manco essere cosi tanti) in modo da pulire e rendere il super lenzuolo più digeribile e sopratutto più comprensibile. Grazie infinite per la pazienza e sopratutto per la delicatezza che hai avuto nei confronti di un neofita come me!!!

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:HELP : Manipolazione Dati
« Risposta #5 il: Marzo 21, 2021, 18:01 »
Lodevole intenzione, se puoi, acquista un buon libro e seguilo passo passo, qui vi sono molti post interessanti, certo, ma usali per integrare, un discorso "ben strutturato" da seguire è la miglior cosa.