Autor Tema: programa en python

0 Usuarios y 1 Visitante están viendo este tema.

22 Septiembre, 2015, 08:45 pm
Leído 5365 veces

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Hola espero puedan ayudarme tengo el siguiente ejercicio tengo que imprimir y gráficar los datos de población total contra casos de dengue total (los primeros están en el archivo 2014Population.csv y los segundos están en el archivo dengue-datos.csv, estos dos documentos están en una carpeta llamada DATA), mi idea es usar un ciclo for pero no sé como hacerlo no estoy muy familiarizada con este programa de phyton python, lo único que he logrado es imprimir para el segundo estado pero quiero la de los 32 estados y no se como hacerlo,
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import datos_plot_lib as dpl

matplotlib.rc('xtick', labelsize=18)
matplotlib.rc('ytick', labelsize=18)
matplotlib.rc('axes', labelsize=18)
data = dpl.data("DATA")
print data.population[1][1]
# en esta se que se deve variar el primer argumento [1]
print data.cases[1][54]
#para este segundo deve variar el primer argumento tambien ya que el total esta en la 54 posicion [54]

Ya me dan algunas funciones específicas (lo he subido como archivo doc ya que no me acepta otro formato, y los archivos .csv como .xls por la misma situación), espero me ayuden porfavor por favor sé que no es muy complicado pero no sé bien como usar o expresar en lenguaje de python.
Ya lo he intentado pero no me sale   :'(  :banghead:

22 Septiembre, 2015, 09:15 pm
Respuesta #1

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola marsi.

Da la impresión que escribiste un código que no sabes qué hace (copiado y pegado de alguna parte). Obviamente puedo estar equivocado, es sólo lo que me parece.

Por ejemplo, la cuarta línea:

    import datos_plot_lib as dpl

no sé qué hace. Seguramente es algo que tienes en el mismo directorio.

---------

Sobre tu pregunta, si ya has importado los datos entonces haciendo

    print data.population
    print data.cases

debiera imprimir las tablas.

---------

Sobre lectura de archivos csv, ¿consultaste la documentación de python?    https://docs.python.org/2/library/csv.html
Sobre las gráficas, el documento que adjuntaste parece que no trae nada, pero ¿buscaste en internet cómo usar matplotlib?:  http://matplotlib.org/users/pyplot_tutorial.html

23 Septiembre, 2015, 02:44 am
Respuesta #2

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Hola, pues el profesor me dio el archivo con las funciones predeterminadas (mostradas en el archivo funciones),
y originalmente este archivo tiene el nombre datos_plot_lib en lugar de funciones por eso lo importo con la instrucción:
 import datos_plot_lib as dpl
y con respecto a los datos no puedo imprimir toda la lista de los 32 estados es por eso que preguntaba, porque solo con las instrucciones:
 
print data.population[1][1]
# en esta se que se deve variar el primer argumento es decir print data.population [1]
print data.cases[1][54]
#para este segundo deve variar el primer argumento tambien ya que el total esta en la 54 posicion [54] es decir print data.cases[j][54]

logro imprimir solo para un estado, es por ello que mi idea es mandarlos a traer con un ciclo y que varíe el primer argumento como lo que indiqué en comentarios para que haga el recorrido e imprima los 32 datos para cada instrucción en total 64 datos pero eso es lo que no sé como estructurar bien el ciclo, espero puedan ayudarme ,  :banghead:

23 Septiembre, 2015, 04:38 am
Respuesta #3

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola, pues el profesor me dio el archivo con las funciones predeterminadas (mostradas en el archivo funciones),
y originalmente este archivo tiene el nombre datos_plot_lib en lugar de funciones por eso lo importo con la instrucción:
 import datos_plot_lib as dpl

A menos que esté datos_plot_lib en el directorio donde estás corriendo python, o donde busca bibliotecas, el traductor dará un error. Esto es lo esperable, ya que se estaría tratando de importar algo que no existe.


print data.population[1][1]

Si puedes usar esa sentencia (si se imprime algo distinto a un error) entonces data.population es un arreglo. Para imprimirlo puede hacer:

    print data.population            # imprime todo el arreglo
    print data.population[:][1]    # imprime la segunda columna

Como ves, no sería necesario un ciclo.

...pero eso es lo que no se como estructurar bien el ciclo, espero puedan ayudarme ,  :banghead:

En computación no es mucho lo que hay que saber (por lo menos en algo básico).
¿Has buscado un manual python como te sugerí?
En google:
  - cargar datos csv.
  - arreglos numpy
  - imprimir datos con print

Etc.

25 Septiembre, 2015, 04:43 am
Respuesta #4

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Hola, he estado revisando algunos documentos pero me han confundido un poco y no se si sea mejor abrir mi archivo cvs y luego tratar de imprimir la columna, pero no creo sea tan necesario, pues con la instrucción que me sugieres podría funcionar pero no se como puesto que con:


    print data.population            # imprime todo el arreglo pero yo solo quiero que me imprima la última columna
                                              es decir solo la cifra de la población de los 32 estados a la vez, pero esta instrucción
                                              como tal me imprime el nombre del estado y la población.
   

   y con la instrucción
   
   print data.cases                #Ocurre algo parecido me escribe todos los datos y yo solo quiero las cifras de la columna 54

Espero por favor me ayuden, gracias

25 Septiembre, 2015, 03:07 pm
Respuesta #5

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola, he estado revisando algunos documentos pero me han confundido un poco y no se si sea mejor abrir mi archivo cvs y luego tratar de imprimir la columna, pero no creo sea tan necesario, pues con la instrucción que me sugieres podría funcionar
(...)

Antes de imprimir el archivo hay que leerlo, no creo que haya otro modo.

Sobre la revisión de documentos, python tiene excelente documentación. Antes de buscar en un documento cualquiera -te sugiero- revisar lo que la misma gente de python escribió, ellos sí que saben del tema:  https://www.python.org/doc/


   print data.cases                #Ocurre algo parecido me escribe todos los datos y yo solo quiero las cifras de la columna 54

Repito

    print data.population            # imprime todo el arreglo
    print data.population[:][1]    # imprime la segunda columna

25 Septiembre, 2015, 03:19 pm
Respuesta #6

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Hola, he estado revisando algunos documentos pero me han confundido un poco y no se si sea mejor abrir mi archivo cvs y luego tratar de imprimir la columna, pero no creo sea tan necesario, pues con la instrucción que me sugieres podría funcionar
(...)

Antes de imprimir el archivo hay que leerlo, no creo que haya otro modo.

Sobre la revisión de documentos, python tiene excelente documentación. Antes de buscar en un documento cualquiera -te sugiero- revisar lo que la misma gente de python escribió, ellos sí que saben del tema:  https://www.python.org/doc/

1. Lo primero será buscar en la documentación como importar datos de un archivo cvs:  https://docs.python.org/2/library/csv.html

Siguiendo el primer ejemplo de la documentación:

Citar
import csv

with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        print fila[1]            # <<--  imprimer la segunda columna del archivo


Y así se hace con todos los temas. Teniendo claro qué hay que hacer se busca en la documentación como hacerlo.

2. Necesitas graficar algo con matplotlib. Entonces buscas la documentación oficial de la biblioteca  http://matplotlib.org/users/pyplot_tutorial.html
    Verás que trae muy buenos ejemplos.

     

25 Septiembre, 2015, 05:05 pm
Respuesta #7

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,395
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Sobre la revisión de documentos, python tiene excelente documentación.

Una copia de la de Perl...
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

25 Septiembre, 2015, 05:27 pm
Respuesta #8

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Sobre la revisión de documentos, python tiene excelente documentación.

Una copia de la de Perl...

No tenía idea  :o.

Me parece excelente que las buenas ideas se copien y mejoren. Puede considerarse como un tributo u homenaje, hehe.


25 Septiembre, 2015, 05:46 pm
Respuesta #9

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,395
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
No tenía idea  :o.

Me parece excelente que las buenas ideas se copien y mejoren. Puede considerarse como un tributo u homenaje, hehe.

Bueno, Perl copió a Python su sistema de orientación a objetos (a nivel del intérprete), como el mismo Larry Wall reconoció una vez. Aunque luego añadió irónicamente: "Estoy arrepentido desde entonces"  :D
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

25 Septiembre, 2015, 07:54 pm
Respuesta #10

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Hola, gracias por las recomendaciones mathtruco ,pero aun no he logrado graficar
estas dos listas (población contra casos)y si entiendo la sintaxis para graficar el problema
esta en que mis listas las tendría que nombrarlas con algún nombre especial pues son arreglos,
pero ese es el detalle, no se como hacerle,
porque tendría que ser de una forma parecida a esta:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
    import csv


with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        print fila[1]
       

with open('dengue-dato.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        print fila[54]   #Aquí no se si deba agregar una definición
                          pues intente hacer eso pero no lo conseguí
                          ya que son arreglos los que se deben graficar
      x=fila[1]
      y=fila[54]
      plt.plot(x, y)
      plt.show
     
     
      Por favor ayúdenme, y muchas gracias

25 Septiembre, 2015, 08:16 pm
Respuesta #11

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
    import csv


with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        print fila[1]
       

with open('dengue-dato.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        print fila[54]   #Aquí no se si deba agregar una definición
                          pues intente hacer eso pero no lo conseguí
                          ya que son arreglos los que se deben graficar
      x=fila[1]
      y=fila[54]
      plt.plot(x, y)
      plt.show
     



Observaciones sobre tu código:
  - Cuidado con la indentación. En python la indentación no es sólo un lujo estético como en otros lenguajes.
    Por ejemplo, la cuarta línea del código te daría problemas, y también las 4 últimas.
  - y la segunda línea sobra si usas la tercera. Además que no aparece en la documentación matplotlib.


Mi versión:

Código: [Seleccionar]
import csv
import matplotlib.pyplot as plt

x=[]   # (a)
with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        #print fila[1]         # (b)
        x.append(fila[1])      # (c)

plt.plot(x,x)
plt.show()

Línea (a) :: Como inicialmente no sabemos la dimensión que tendrá x (la abcisa de la gráfica) creamos un arreglo vacío.
Línea (c) :: Acá vamos añadiendo de a una las entradas del vector x.
Línea (b) :: la comento porque ahora no queremos imprimir. Si quieres lo descomentas.

Ahora tienes todas las herramientas para completar lo que necesitas.

Nota que omití cargar la bibliotena numpy porque no la usé.

25 Septiembre, 2015, 09:41 pm
Respuesta #12

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Si estoy en lo correcto el código quedaría así:

import matplotlib
import matplotlib.pyplot as plt
import csv

x=[] 
y=[]
with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        #print fila[1]         
        x.append(fila[1])     
 
with open('dengue-dato.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        #print fila[54]         
        y.append(fila[54])     
plt.plot(x,y)
plt.show()


 pero me marca error me dice que: 'x and y must have same first dimension', ¿esto a que se debe? ???
 porque pues modifique mi archivo dengue-datos.csv, para quitarle la palabra total y dejar en la fila 54  solo los 32 datos,
 pero no se porque me marca ese error.

25 Septiembre, 2015, 09:49 pm
Respuesta #13

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
pero me marca error me dice que: 'x and y must have same first dimension', ¿esto a que se debe? ???

Creo que tu falta de confianza no te permite resolver tú misma las dudas  >:D

Debes tenerte más fe, si tú misma estás indicando el error (len(x) y len(y) te dirán el tamaño de estos vectores).

Además, la primera linea de tu código sobra. Seguro sabrás el porqué.

26 Septiembre, 2015, 12:13 am
Respuesta #14

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
Ya no veo nada claro  :'( , cuando imprimo la lista
          print fila[54]
 me imprime 1, mis valores de los casos,2. (Porque coloque 1 en lugar de la palabra Total y el 2 en lugar de la última cifra que no utilizare)
se supone que la instrucción para eliminar elementos es
          y.remove(1)
          y.remover(2)      #para eliminar estos elementos pero no lo hace me marca error
 y con la instrucción
          y.index(1)         #Devuelve el índice en la lista  cuyo valor es 1  pero me dice que no   existe
pero al imprimir si me aparecen desde el 1,…, 2.
Ya intente también con del y[0] que quita un elemento de una lista dado su índice en lugar de su valor, pero na damas no lo he logrado, creo entender lo que hay que hacer pero esto del lenguaje de programación me acostado. :banghead:

26 Septiembre, 2015, 12:33 am
Respuesta #15

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
No me queda claro lo que estás haciendo. Para que podamos entendernos escribe el programa completo que estás corriendo (como he hecho yo, linea por linea), para saber qué has hecho y dónde puede estar el error.


          y.remover(2)      #para eliminar estos elementos pero no lo hace me marca error

¿Sobra una letra r?

y con la instrucción
          y.index(1)         #Devuelve el índice en la lista  cuyo valor es 1  pero me dice que no   existe
pero al imprimir si me aparecen desde el 1,…, 2.
Ya intente también con del y[0] que quita un elemento de una lista dado su índice en lugar de su valor, pero na damas no lo he logrado, creo entender lo que hay que hacer pero esto del lenguaje de programación me acostado. :banghead:


Puedes colocar un "?" al final del comando para tener una breve descripción de lo que hace. Por ejemplo, al escribir

Código: [Seleccionar]
y.index?

Se obtiene

Código: [Seleccionar]
y.index?
Type:       builtin_function_or_method
String Form:<built-in method index of list object at 0x7fdf64d3c830>
Docstring:
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

Nota que la última línea dice que dará error si el valor que buscas no se encuentra.
Análogamente al hacer

Código: [Seleccionar]
y.remove('0')
si no encuentra al '0' dará un error.


Nota además, que el vector u no contiene números, sino caracteres. Así que para buscar el 1 tendrías que escribir:

Código: [Seleccionar]
y.index('1')

en vez de

Código: [Seleccionar]
y.index('0')

creo entender lo que hay que hacer pero esto del lenguaje de programación me acostado. :banghead:

Tranquila. Con el tiempo uno se va acostumbrando, pero si no lo utiliza se va olvidando.
Así que anda haciendo lo que tu profe te vaya enseñando en clases (clase a clase), y metiendo mano al computador cada vez que tengas tiempo.

26 Septiembre, 2015, 01:58 am
Respuesta #16

marsi

  • Novato
  • Mensajes: 120
  • Karma: +0/-0
  • Sexo: Femenino
 :)   creo que tenia errores por la sensibilidad del lenguaje, finalmente mi código queda así:

import matplotlib.pyplot as plt
import csv

x=[] 
y=[]
with open('2014Population.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        #print fila[1]         
        x.append(fila[1])     
 
with open('dengue-datos.csv', 'rb') as archivo_csv:
    archivo = csv.reader(archivo_csv)
    for fila in archivo:
        #print fila[54]         
        y.append(fila[54])
       
print y.index( 'Total' )
print y.index( '23433' )
y.remove('Total');
#print  y
y.remove('23433');
     # print  y
       
plt.plot(x,y)
plt.show()


Ahora me pregunto que si gráfica cada valor  \( x_{i} \)  del arreglo x le corresponde un elemento \( y_{i} \)del arreglo y, si es así, que me parece es correcto,como podría ordenarlos pero manteniendo la pareja \( (x_{i},y_{i}) \) , si es posible como lo haría ya que la gráfica generada se ve toda enredada.
Y muchas gracias, por tu tiempo y paciencia. :)

26 Septiembre, 2015, 05:00 am
Respuesta #17

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
:)   creo que tenia errores por la sensibilidad del lenguaje, finalmente mi código queda así:

Te haz dado cuenta de lo más importante de un lenguaje de programación: todas las cosas son blancas o negras. Las reglas son totalmente claras y estrictas, y por eso es importante aprender de una documentación oficial. El computador es un genio tonto que hace cuentas perfectas, pero ante instrucciones ambiguas no sabe qué hacer.

Por ejemplo, '1' es un string, y 1 es un entero, y jamás podrán ser iguales. Si se ha definido el comando remove pero no remover entonces este último no significa absolutamente nada para el programa.

¿Te imaginas lo terrible que sería si un lenguaje de programación permitiera cosas ambiguas, que funcionen a algunos de una forma y a otros de otra, o que interprete qué hacer cuando no tiene una regla clara?


Ahora me pregunto que si gráfica cada valor  \( x_{i} \)  del arreglo x le corresponde un elemento \( y_{i} \)del arreglo y, si es así, que me parece es correcto,como podría ordenarlos pero manteniendo la pareja \( (x_{i},y_{i}) \) , si es posible como lo haría ya que la gráfica generada se ve toda enredada.
Y muchas gracias, por tu tiempo y paciencia. :)

Para tu última pregunta te remito a mi primera respuesta:


Sobre las gráficas, el documento que adjuntaste parece que no trae nada, pero ¿buscaste en internet cómo usar matplotlib?:  http://matplotlib.org/users/pyplot_tutorial.html

La documentación es clarísima y hasta trae ejemplos.

26 Septiembre, 2015, 04:09 pm
Respuesta #18

pierrot

  • pabloN
  • Moderador Global
  • Mensajes: 3,395
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Por ejemplo, '1' es un string, y 1 es un entero, y jamás podrán ser iguales.

Ésa es una diferencia con Perl, en la que me decanto a favor de este último  :D. En Perl, '1' puede ser un string y '1' también puede ser un número. Depende del contexto. Tal como en los lenguajes naturales, las personas saben distinguir las palabras homógrafas, por ejemplo, saben perfectamente que "cerca" en estas dos oraciones no significan lo mismo,

Mis tíos viven cerca de casa.

Mi jardín está delimitado por una cerca.

perl es lo suficientemente inteligente como para darse cuenta de que en esta expresión

'1' / 100

'1' ha de ser un número, y en esta otra,

'1' . 'er ministro'

'1' ha de ser un string.

$ perl -e " print '1' / 100 "
0.01

$ perl -e " print '1' . 'er ministro' "
1er ministro
$_="loe  hnachaPkr erttes,urJ";$j=0;for($i=0;s/(.)(.{$j})$//;$i++){$_=$2.$_,$j+=1-$i%2,print$1}print

27 Septiembre, 2015, 05:00 am
Respuesta #19

mathtruco

  • Moderador Global
  • Mensajes: 4,919
  • País: cl
  • Karma: +0/-0
  • Sexo: Masculino
  • El gran profesor inspira
Por ejemplo, '1' es un string, y 1 es un entero, y jamás podrán ser iguales.

Ésa es una diferencia con Perl, en la que me decanto a favor de este último  :D. En Perl, '1' puede ser un string y '1' también puede ser un número.

Interesante, que cómodo.

Pero sigue siendo cierta mi afirmación:

:)   creo que tenia errores por la sensibilidad del lenguaje, finalmente mi código queda así:

Te haz dado cuenta de lo más importante de un lenguaje de programación: todas las cosas son blancas o negras. Las reglas son totalmente claras y estrictas, y por eso es importante aprender de una documentación oficial. El computador es un genio tonto que hace cuentas perfectas, pero ante instrucciones ambiguas no sabe qué hacer.


De todas formas, entiendo que las comodidades o ventajas de un lenguaje de programación suelen ser desventaja dependiendo del contexto. En particular, estos lenguajes que son "más inteligentes" (donde no es necesario definir variables...), incluído python y matlab, y por lo que veo perl, son cómodos para escribir programas en poco tiempo, pero eso mismo hace que no sean tan rápidos comparados con C o Fortran.