No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Reto: graficando la población de un país

40/44
Recursos

Aportes 318

Preguntas 23

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola compañeros, para aquellos que les aparezca el siguiente error:

KeyError: ‘Country’

En mi caso lo solucione cambiando la palabra ‘Country’ por la palabra ‘Country/Territory’ en la función population_by_country del modulo de utils,py:

def population_by_country(data, country):
result = list(filter(lambda item: item[‘Country/Territory’] == country, data))

Esto porque en el archivo data.csv que descargue, el nombre de la columna Country no aparece como Country, sino como, Country/Territory.

Espero les sirva
![](

Como aporte sugiero no esperar hasta el final del curso para plantear retos asi, seria bueno insertarlos antes asi el mismo es mas interactivo.

Es sorprendente el poder que tienen pandas con matplotlib y si a eso le sumamos seaborn pues:

Salen graficos hermosos y en pocas líneas de código

Gente hoy estuve haciendo la gráfica me costó tuve que buscar info en mil sitios y hasta puse a prueba mis reading jaja, Aquí les dejo mi código y una mini guía para estilizar la gráfica espero que les sirva:

  • La gráfica:
  • Info:
  • Descripción del código:
  • Código:
import matplotlib.pyplot as plt

def generate_bar_chart(labels, values, país):
  plt.rcParams['font.sans-serif'] = ['Lato']
  plt.rcParams['font.weight'] = "medium"
  fig, ax = plt.subplots()
  ax.bar(labels, values, width=0.6, color='#86bf91')
  ax.spines['right'].set_visible(False)
  ax.spines['top'].set_visible(False)
  ax.spines['left'].set_visible(False)
  ax.spines['bottom'].set_visible(False)
  plt.tick_params(left = False, bottom = False)
  ax.tick_params(axis='both')
  plt.xticks(fontsize='8.5', weight='bold', color='#7e807e')
  plt.yticks(fontsize='8.5', weight='bold', color='#7e807e')
  ax.set_xlabel("Años de censo", labelpad=18, size=10, fontfamily="sans", weight="bold")
  ax.xaxis.set_label_coords(x=-0.004, y=-0.087, transform=ax.transAxes)
  ax.set_ylabel("Población (Millones)", labelpad=18, size=10, fontfamily="sans", weight="bold")
  ax.yaxis.set_label_coords(x=-0.09, y=0.81, transform=ax.transAxes)
  plt.suptitle("Desde el año 1970 al año 2022", size=10, fontfamily="sans", color="#5f615f", weight="bold",
            horizontalalignment = 'left',
             x=0.038,
             y=0.94,
             transform=fig.transFigure)
  plt.title("Población de " + país, size=17, weight='bold', fontfamily="serif", color='#598561',
            horizontalalignment = 'left',
             x=0.038,
             y=0.96,
             transform=fig.transFigure)
  vals = ax.get_yticks()
  for tick in vals:
      ax.axhline(y=tick, linestyle='dashed', alpha=0.4, color='#c3c9c5', zorder=1)
  plt.show() 

Yo lo hice de esta manera:

from csv import reader
import matplotlib.pyplot as plt

with open('data.csv','r') as data:
    reader1 = reader(data)
    header = next(reader1)
    data1=[]
    for line in reader1:
        codict=dict()
        for i,j in zip(header,line):
            if 'Country' in i or 'Population' in i :
                codict[i]=j
        data1.append(codict)

def graficar(data,name):
    result= list(filter(lambda item:item['Country']==name,data))[0]
    labels=list(result.keys())[1:-1]
    values=list(map(int,list(result.values())[1:-1]))
    fig, ax = plt.subplots()
    ax.bar(labels, values)
    plt.show()

graficar(data1,'Bolivia')

Así lo hice you

import App


def filter_by_country(data, country):
  country_data = list(filter(lambda item: item['Country'] == country, data))
  return country_data


def delete_columns(country_data):
  new_country_data = dict(
    filter(
      lambda item: 'Population' in item[0] and 'Percentage' not in item[0],
      country_data[0].items()))
  return new_country_data


def format_key(data):
  new_data = data.copy()
  new_data = {k[0:4]: v for k, v in new_data.items()}
  return new_data


def run(data):
  #country = input("Escriba el paìs: ")
  country = "Colombia"
  country_data = filter_by_country(data, country)
  population_data = delete_columns(country_data)
  population_data = format_key(population_data)


if __name__ == '__main__':
  run(App.data)

me paso que tube muchos errores a la hora de escribir los modulos y se me fue mucho tiempo encontrando los errores pero cuando le coji en tiro como que ya estaba mas facil.

animo compañeros la mayoria de errores son de escritura y asignacion de valores. con el debugger los encuantran mas facil

me da gracia que se nos pide que del csv leamos solo los año y al momento de el hacerlo los crea a mano 😂

Mi solución es similar a la presentada en el curso, sin embargo, comparto mi código para extraer automáticamente las columnas de población de los países, registrando los años y valores correspondientes en un nuevo diccionario, en lugar de hacerlo de forma manual como sucedió en el ejemplo:

Esta bien saber esto pero hoy en dia con pandas y jupyter esto es innnecesario

esta muy mal planteado este reto, es como las evaluaciones en las que practicas un tema y resulta otro totalmente diferente jajajajaja

Yo busqué las coincidencias en los campos y lo usé para filtrar los valores

def filter_list(data):
    new_dict = {}
    country = input('Seleccione un país: ' ).capitalize()
    #Obtengo la lista del pais
    list = [x for x in data if x['Country/Territory'] == country]
    #Al ser una lista de diccionarios tomo su primer y unico valor 
    for key, value in list[0].items():
        #Busco si la llave termina en 'ation' de 'Population'
        if key[-5:] == 'ation':
            #De ser así tomo los primeros 4 digitos como clave con su respectivo valor
            new_dict[key[0:4]] = value
            
    return new_dict


if __name__ == '__main__':
    data = read('./data.csv')    
    dict = filter_list(data)
    print (dict)

Entiendo que la clase no trata sobre la librería de pandas, pero si alguno tiene inquietud de como se soluciona el reto de las columnas con utilizando esta librería, queda de la siguiente manera:

import pandas as pd
import matplotlib.pyplot as plt

#Extraigo los datos y los guardo en la variable df
df = pd.read_csv('./Modulos/data.csv')
df.head()

#cambio los nombres de las columnas  muy parecido a como lo resuelve el profesor 
df = df.rename(columns={
    df.columns[5]: '2022', 
    df.columns[6]:'2020',
    df.columns[7]:'2015',
    df.columns[8]:'2010',
    df.columns[9]:'2000',
    df.columns[10]:'1990',
    df.columns[11]:'1980',
    df.columns[12]:'1970'
    })
df.head()

Hola, dejo mi aporte con la descripción del reto. En el caso de que les pasa lo que a mi me pasa, que empiezo a desarrollar y tengo que constantemente revisar el reto para ver si estoy en la dirección correcta

Reto:
De todo el csv de paises y poblaciones, seleccionar un pais, y de ese pais solamente mostrar las columnas o campos relacionados con poblacion/population y descartar las demás.
Nuestro objetivo es ver una gráfica del crecimiento poblacional de ese pais, asi que queremos tener los valores enlistados como año:población

hola, hice 3 funciones,

  1. una para leer la fila del pais,
  2. otra para crear el diccionario que tenga en las keys los años y en los valores el numero que este en el csv
  3. para graficar un bar chart.

Y al final use el output de la 1 en la 2 y el output de la 2 en la 3.

Saludos!

import csv
import re
import matplotlib.pyplot as plt


def read_country(path,country):
 with open(path,'r') as file:
  csv_file = csv.reader(file,delimiter=',')
  header = next(csv_file)
  for row in csv_file:
    if row[2] == country:
      new_row = zip(header,row)
      new_dictionary = {key:value for key, value in new_row}
 return header,new_dictionary

def dictionary_population(path,country):
 header, data = read_country(path,country)  
 new_dictionary = {}  
 for i in range(len(header)):
  matches = re.findall(r'\d{4,4}',header[i])
  if matches != []:
    new_dictionary = new_dictionary|{matches[0]:int(value) for key,value in data.items() if matches[0] in key}
 return new_dictionary

def generate_bar_chart(labels,values):
  fig, ax = plt.subplots()
  ax.bar(labels,values)
  plt.show()

if __name__ == '__main__':
 path = './app/data.csv'
 country = input('Escriba el nombre de un pais: ')
 country_dict = dictionary_population(path, country)
 generate_bar_chart(country_dict.keys(),country_dict.values())

Hola!

Les comparto el código del proyecto:

utils

# Mis propios módulos
'''
Los modulos en Python son cualquier archivo con extension .py
Dentro de un modulo nosotros podemos definir Funciones, Clases o Variables
'''

def get_population(country_dict):
  population_dict = {
    "2022": int(country_dict["2022 Population"]),
    "2020": int(country_dict["2020 Population"]),
    "2015": int(country_dict["2015 Population"]),
    "2010": int(country_dict["2010 Population"]),
    "2000": int(country_dict["2000 Population"]),
    "1990": int(country_dict["1990 Population"]),
    "1980": int(country_dict["1980 Population"]),
    "1970": int(country_dict["1970 Population"]),
  }
  
  labels = population_dict.keys()
  values = population_dict.values()
  return labels, values

def population_by_country(data, country):
  result = list(filter(lambda item: item["Country/Territory"] == country, data))
  return result

main

# Importamos el modulo
import utils
import read_csv
import charts

def run():
  data = read_csv.read_csv('./app/world_population.csv')
  country = input("Type Country => ")
  
  result = utils.population_by_country(data, country)

  if len(result) > 0:
    country = result[0]
    labels, values = utils.get_population(country)
    charts.generate_bar_chart(labels, values)
  
  print(result)

# Módulos como scripts: __name__ y __main__
# Entry point
'''
Este if le dice al main.py, que si el archivo es ejecutado desde la terminal, ejecute el metodo run, pero si es ejecutado desde otro archivo, el metodo run no se ejecutaria.
'''

if __name__ == '__main__':
  run()

Como lo hice espero sea de su comprensión, cree una lista donde quiero los elementos que deseo ver en data

import csv
import matplotlib.pyplot as plt
def read_csv(path):
    with open(path, 'r+') as csvfile:
        reader =  csv.reader(csvfile, delimiter=',')
       #obtiene la primera fila
        header = next(reader)
        data = []
        #Lista con elemento creados
        poblacion=['2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population']

        for row in reader:
            iterable =zip(header, row)#Se tienen  un array de tuplas
            country_dict ={ key: value for key, value in iterable if key in poblacion}
            data.append(country_dict)
            
        return data
def barra(labels, values):
    fig, ax = plt.subplots()
    ax.bar(labels, values)
    plt.show()

if __name__ == '__main__':
    data= read_csv('./Comprehensions, Funciones y Manejo de Errores/APP/data.csv')
    labels= data[0].keys()
    values= data[0].values()
    barra(labels, values)

![](

Les dejo mi solución:

import app.read_csv as csvhelper
import matplotlib.pyplot as plt
import re

def convert_country_to_years_dict(country: dict):
    country_copy = country.copy()

    for key in country:
        regex = "[0-9]{4} Population"

        if re.match(regex, key) != None:
            year = key.split(" ")[0]
            country_copy[year] = country[key]
                         
        del country_copy[key]

    return country_copy

def generate_population_country_chart(country_name: str):
    path = "/Users/luism.DESKTOP-QIO804S/OneDrive/Escritorio/python/platzi-curso-2-backend/app/data.csv"
    countries = csvhelper.read_csv(path)

    country_name = country_name.lower()
    try:
        country = next( country for country in countries if country["Country/Territory"].lower() == country_name )
    except Exception as error:
        exit()
    
    years_dict = convert_country_to_years_dict(country)
    sorted_years_dict = { k: years_dict[k] for k in sorted(years_dict) }
    labels, values = list(sorted_years_dict.keys()), list(sorted_years_dict.values())


    flig, ax = plt.subplots()
    ax.bar(labels, values)
    plt.show()



generate_population_country_chart("El Salvador")

Hola gente, les quería compartir mi resolución del reto, yo hice que el código le pregunte al usuario:

¿deseas saber la población de un país? 
País => "Aquí el usuario ingresa el país que  quiera"


.

el código busca de entre todos los países el que ingresó el usuario y muestra la gráfica para dicho país

.
Aquí les dejo el código por si a alguien le interesa y en los comentarios voy a explicar el módulo de la gráfica parte por parte por si alguien necesita info para estilizar su gráfica:
.

  • Módulo principal:
    .
import finder
import chart
import ordenador

if __name__ == '__main__':
  country = input('¿deseas saber la poclación de ún país? \nPaís => ')
  data = finder.read_csv('./data.csv', country)
  years = sorted(data.keys())
  population = ordenador.ordener(data.values())
  chart.generate_bar_chart(years, population, country)

.

  • Módulo que transforma el excel a diccionarios y guarda el diccionario del país que pidió el usuario:
    .
import csv

def read_csv(path, my_country):
  with open(path, 'r') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    header = next(reader)
    data = []
    for row in reader:
      iterable = zip(header, row)
      country_dict = {key[0:4]: value for key, value in iterable if key[0]=='1' or key[0]=='2' or key[0:3]=='Cou'}
      if country_dict['Coun']==my_country:
        del country_dict['Coun']
        data = country_dict
    
    return data 

.

  • Módulo que ordena el diccionario de 1970 a 2022 (es que el otro módulo retorna el diccionario de 2022 a 1970) y abrevia las poblaciones (que están en millones):
    .
def ordener(temp_population):
  population = [0, 1, 2, 3, 4, 5, 6, 7]
  y = 0
  for i in temp_population:
    x = 7 - y
    i = float(i)
    i = str(i * 0.000001)
    population[x] = i[0:5] + ' M'
    y = y + 1
  return(population)

.

  • Y el Módulo que más me costó de todos, el que crea la gráfica, se me hizo muy dificil encontrar info para estilizar la gráfica y aparte es poco intuitivo, pero finalmente lo logré, código:
    .
import matplotlib.pyplot as plt

def generate_bar_chart(labels, values, país):
  plt.rcParams['font.sans-serif'] = ['Lato']
  plt.rcParams['font.weight'] = "medium"
  fig, ax = plt.subplots()
  ax.bar(labels, values, width=0.6, color='#86bf91')
  ax.spines['right'].set_visible(False)
  ax.spines['top'].set_visible(False)
  ax.spines['left'].set_visible(False)
  ax.spines['bottom'].set_visible(False)
  plt.tick_params(left = False, bottom = False)
  ax.tick_params(axis='both')
  plt.xticks(fontsize='8.5', weight='bold', color='#7e807e')
  plt.yticks(fontsize='8.5', weight='bold', color='#7e807e')
  ax.set_xlabel("Años de censo", labelpad=18, size=10, fontfamily="sans", weight="bold")
  ax.xaxis.set_label_coords(x=-0.004, y=-0.087, transform=ax.transAxes)
  ax.set_ylabel("Población (Millones)", labelpad=18, size=10, fontfamily="sans", weight="bold")
  ax.yaxis.set_label_coords(x=-0.09, y=0.81, transform=ax.transAxes)
  plt.suptitle("Desde el año 1970 al año 2022", size=10, fontfamily="sans", color="#5f615f", weight="bold",
            horizontalalignment = 'left',
             x=0.038,
             y=0.94,
             transform=fig.transFigure)
  plt.title("Población de " + país, size=17, weight='bold', fontfamily="serif", color='#598561',
            horizontalalignment = 'left',
             x=0.038,
             y=0.96,
             transform=fig.transFigure)
  vals = ax.get_yticks()
  for tick in vals:
      ax.axhline(y=tick, linestyle='dashed', alpha=0.4, color='#c3c9c5', zorder=1)
  plt.show()
Hola, adjunto mi solución. \*\*Una pista que me ayudo bastante es que no necesitan renombrar las llaves, basta con sacarle copias a los valores en nuevas llaves con el nombre que desean.\*\* Código: `import csv` `import matplotlib.pyplot as plt` `from matplotlib.pyplot import subplot` `def read_csv(path):` ` with open(path,'r') as csv_file:` ` reader_csv=csv.DictReader(csv_file, delimiter=',')` ` data=[]` ` for row in reader_csv:` ` data.append(row)` ` return data` `def prepare_data(data,name_country):` ` specific_country=list(filter(lambda x:x['Country/Territory']==name_country,data))` ` specific_country[0]['2022']=specific_country[0]['2022 Population']` ` specific_country[0]['2020']=specific_country[0]['2020 Population']` ` specific_country[0]['2015']=specific_country[0]['2015 Population']` ` specific_country[0]['2010']=specific_country[0]['2010 Population']` ` specific_country[0]['2000']=specific_country[0]['2000 Population']` ` specific_country[0]['1990']=specific_country[0]['1990 Population']` ` specific_country[0]['1980']=specific_country[0]['1980 Population']` ` specific_country[0]['1970']=specific_country[0]['1970 Population']` ` del specific_country[0]['2022 Population']` ` del specific_country[0]['2020 Population']` ` del specific_country[0]['2015 Population']` ` del specific_country[0]['2010 Population']` ` del specific_country[0]['2000 Population']` ` del specific_country[0]['1990 Population']` ` del specific_country[0]['1980 Population']` ` del specific_country[0]['1970 Population']` ` del specific_country[0]['Rank'] ` ` del specific_country[0]['CCA3'] ` ` del specific_country[0]['Capital']` ` del specific_country[0]['Continent']` ` del specific_country[0]['Area (km²)']` ` del specific_country[0]['Density (per km²)']` ` del specific_country[0]['Growth Rate']` ` del specific_country[0]['World Population Percentage']` ` del specific_country[0]['Country/Territory']` ` return specific_country` `def convert_to_dataset(specific_country):` ` labels=list(specific_country[0].keys())` ` values=list(specific_country[0].values())` ` values=[int(x) for x in values]` ` return labels,values` ` ` `def generate_bar_chart(labels,values):` ` fig,ax=plt.subplots()` ` ax.bar(labels,values)` ` plt.show()` `def run():` ` country=input('Enter a Country Name -> ')` ` data=read_csv('./app/data.csv') #Data get all the information of all countries` ` data=prepare_data(data,country) #Now the data is just about just one country` ` labels,values=convert_to_dataset(data)` ` generate_bar_chart(labels,values)` ` ` `if __name__=='__main__':` ` run()` Suerte.
Hola, les dejo otra manera de hacerlo, donde se obtienen todos los valores de población, sin importar cuantos tenga el archivo. ```js def get_population(data, country): coun = list(filter(lambda co: co['Country/Territory'] == country, data))[0] coun_pop = {k[:4]:int(v) for k,v in coun.items() if k.endswith('Population')} return coun_pop count_chart = get_population(data, 'Argentina') generate_bar_chart(count_chart.keys(), count_chart.values()) ```
import csv
def read_csv(path):
    with open(path,'r') as csvfile:
        reader=csv.reader(csvfile,delimiter=',')
        header=next(reader)
        data=[]
        for row in reader:
            iterable=zip(header,row)

            country_dict={key:value for key,value in iterable}
            data.append(country_dict)
        return data

data=read_csv('./data.csv')
year_population=['1970','1980','1990','2000','2010','2015','2020','2022']
new_data=[f'{i} Population' for i in year_population]
header=[i for i in data[0]]
print(header)
#print(data_plot)
print(new_data)
print(len(data))
#for j in range(len(data)):
country=list(filter(lambda x:x['Country']=='Colombia',data))
data_plot=[ i for i in country][0]

label={key:value for key,value in data_plot.items()}
values=[label[new_data[i]] for i in range(len(new_data))]

import matplotlib.pyplot as plt

def generate_bar_chart(labels, values):
  fig, ax = plt.subplots()
  ax.bar(labels, values)
  plt.show()


generate_bar_chart(new_data, values)

Yo lo resolví mediante el indexing, separé del dictionary de los años aprovechando que estaban juntos e hice una list aparte, luego separé los elemento por sus keys y sus values respectivos y combiné las lists con la función zip()

def country_selected (country, data):
  search_country = list(filter(lambda element: element['Country/Territory'] == country, data))
  
  keys = list(search_country[0].keys())[5:13]
  values = list(search_country[0].values())[5:13]

  keys_final = list(map(lambda x: x[0:4], keys))
  values_final = list(map(lambda x: float(x), values))
  
  result = dict(zip(keys_final, values_final)) 
  return result

MI aporte:

import pandas as pd
import matplotlib.pyplot as plt

def world_population(country):
    df = pd.read_csv('world_population.csv')    
    df2 = df[df['Country/Territory'] == country].iloc[:,5:13]
    return df2

data = world_population('Colombia')

def barchart(x, y):
    
    fig, ax = plt.subplots()
    ax.bar(x, y)
    plt.show

if __name__ == '__main__':
    barchart(data.columns, data.values[0])

Hola
Veo que hay muchas formas de hacerlo, es genial ver tantas y diversas. Yo tuve que dar muchas vueltas para resolver el reto, al final lo logré. Así que también quiero compartir mi solución 😃

import csv
import matplotlib.pyplot as plt

def population_by_country(path):
    # Lectura del .csv
    country = {}
    with open(path, 'r') as leer_csv:
        leer = csv.reader(leer_csv, delimiter=',')
        header = next(leer)
        # Extaer el país que necesito
        for fila in leer:
            if 'Colombia' in fila:
                data = [i for i in fila]
        country = {head : pop for (head, pop) in zip(header, data)}
        print(country)
        # Crear diccionario header = año (solo con las columnas que neesito)
        years = {year:int(population) for (year, population) in country.items() if 'Population' in year and 'Percentage' not in year}
        print(years)
        # Generar listas a partir del diccionario
        labels = list(years)
        values = [i for i in years.values()]
   
    return labels, values
    
l,v = population_by_country('./ejercicios_clases/diccionario/world_population.csv')

# Generar chart
def generate_chart():
    fig, ax = plt.subplots()
    ax.bar(l, v)
    plt.show()

if __name__ == '__main__':
    data = population_by_country('./ejercicios_clases/diccionario/world_population.csv')
    generate_chart()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


df = pd.read_csv('/home/coderdav/personalprojects/python-intermediate/app/data.csv')
data = df[df['Country/Territory'] == 'Bolivia'].iloc[:,5:13]
sns.barplot(data = data, orient='h')
plt.rcParams['figure.figsize'] = (5,4)
plt.xticks(rotation = 45)
plt.show()

Hola a todos(as). Estuve teniendo el error: KeyError: 'Country’
Lo que me funciono fue borrar el archivo que ya tenia agregado y colocar “Country/Territory” en mi función y luego volver a agregar el archivo original. Intente hacerlo modificando el archivo directamente pero el error seguia apareciendo por eso tuve que eliminarlo, espero les sirva.

Mi solución.

import csv
import matplotlib.pyplot as plt


def get_country_data(country, path):
    country_data = []

    with open(path, 'r') as csv_file:
        reader = csv.reader(csv_file)
        header_row = list(next(reader))
        countries_data = [dict(zip(header_row, row)) for row in reader]
        country_data = list(filter(lambda row: row['Country/Territory'] == country, countries_data))
    
    return country_data


def generate_bar_char(labels, values):
    fig, ax = plt.subplots()
    ax.bar(labels, values)
    plt.show()


def run():
    path = './world_population.csv'
    country = input('Country: ')
    country_data = get_country_data(country, path)
    if len(country_data) > 0:
        country_data = {key[0:4]: int(value) for key, value in country_data[0].items() if 'Population' in key and 'World' not in key}
        generate_bar_char(country_data.keys(), country_data.values())
    print(country_data)


if __name__ == '__main__':
    run()

Así lo hice antes de ver el video. Cree diferentes funciones

  • Una función para hacer una gráfica de barras

  • Una función para abrir y leer el CSV

  • Una función para que guardemos solo la información del país que queramos

  • Una función para obtener la población de los diferentes años del país que queramos.

import csv
import matplotlib.pyplot as plt


def bar_chart(labels, values):
  fig, axs = plt.subplots()
  axs.bar(labels, values)
  plt.show()
  

def openCSV(csvurl):
    with open(csvurl, "r") as csvfile:
        reader = csv.reader(csvfile, delimiter=",") #En reader tnemos toda la info de los paises
        #print(list(reader))

        headers = next(reader) #Obtenemos nuestros títulos
        poblacion_paises = []
        
        for fila in reader:
            iterable = zip(headers, fila) #Lo hacemos zip para pasarlo a un diccionario, la fila es lo que va cambiando
            #print(list(iterable))
            
            countries_dict = {clave:valor for (clave, valor) in iterable} #En cada iteación crea un nuevo dict
            poblacion_paises.append(countries_dict)
    return poblacion_paises
            

def data_por_pais(poblacion, country): 
    data = list(filter(lambda dict: dict["Country/Territory"] == country, poblacion))    
    return data


def poblacion_por_anio(poblacion_pais):
    #En este diccionario guardamos la población de los diferente años del país
    poblacion = {anio:poblacion for (anio, poblacion) in poblacion_pais[0].items() if "Population" in anio}
    del poblacion["World Population Percentage"]
    return poblacion        

def run():
    poblacion_paises = openCSV("./world_population.csv")
    
    mexico_data = data_por_pais(poblacion_paises, "Mexico")
    print(mexico_data)
    
    poblacion_anual_mex = poblacion_por_anio(mexico_data)
    print(poblacion_anual_mex)
    bar_chart(poblacion_anual_mex.keys(), poblacion_anual_mex.values())             


if __name__ == '__main__':
    run()

Solución un poco ineficiente, hice todo en el archivo de la clase pasada

import matplotlib.pyplot as plt # Sinónimo
import csv
import utils

def read_csv(path):
  with open(path, 'r') as csvfile:
    # delimiter es lo que separa los datos
    reader = csv.reader(csvfile, delimiter=',')
    header = next(reader)
    popul_keys = [header[i] for i in range(5, 13)]
    labels = [header[i][0:4] for i in range(5, 13)]
    data = []
    for row in reader:
      iterable = zip(header, row)
      country_dict = {key:value for key,value in iterable}
      data.append(country_dict)
    return data, popul_keys, labels

def generate_bar_chart(labels, values):
  fig, ax = plt.subplots()
  ax.bar(labels, values)
  plt.show()

def generate_pie_chart(labels, values):
  fig, ax = plt.subplots()
  ax.pie(values, labels=labels)
  ax.axis('equal')
  plt.show()

if __name__ == '__main__':
  data, popul_keys, labels = read_csv('./app/data.csv')
  country = input('Country => ')
  country_data = utils.get_data(data, country)
  print(country_data)
  values = [int(country_data[i]) for i in popul_keys]
  generate_bar_chart(labels, values)
  #generate_pie_chart(labels, values)}
  

Mi solucion

import read
import chart

def filter_country(data, country):
  return list(filter(lambda data_country: data_country['Country/Territory'] == country, data))

def population(data):
  return {key: value for key,value in data[0].items() if key.endswith('Population') == True}

def population_bar_char(data):
  population_labels = list(data.keys())
  population_values = []
  for value in data.values():
    population_values.append(int(value))
  print(population_labels)
  print(population_values)
  chart.generate_bar_chart(population_labels, population_values)

def run():
  country = input('Ingrese un pais: ')
  data = read.read_csv('./app/data.csv')
  data = filter_country(data, country.capitalize())
  data = population(data)
  population_bar_char(data)

if __name__ == '__main__':
  run()

Quee genial reto!

import read_csv
data = read_csv.read_csv("app/data.csv")

def get_population_data(country):
  for element in data:
    if element["Country/Territory"] == country:
      new_country = {}    
      for key, value in element.items():
        if 'Population' in key and key != "World Population Percentage" :
          new_country[key.replace(" Population","")] = int(value)          
        else: 
          continue     
      return new_country
    else:
      continue

#Ejemplo:    
ecu = get_population_data("Ecuador")
print(ecu)

"""

Así lo hice yo

def get_population(country):
  new_country = {}
  for key, value in country.items():
    if ' Population' in key and not 'World' in key :
      new_key = key.replace(' Population', '')
      new_country[new_key] = int(value)
    else: 
      continue
      
  return new_country
Si estás haciendo los desafios para este tiempo, ten en cuenta que aparentemente actualizaron el documento CSV en Kaggle y si replicas el codigo del profe puede que no te funcione porque debes reemplazar la key 'Country' por 'Country/Territory' ya que actualmente tiene otro nombre
![](https://static.platzi.com/media/user_upload/image-f77b3238-5e23-4374-b345-ee7d7b423322.jpg)
espero que mi respuesta les ayude pero yo me base en el numero de los caracteres ```python def reduc (data): return {key[0:5]:int(value) for key,value in data.items() if len(key) == 15} ```def reduc (data): return {key\[0:5]:int(value) for key,value in data.items() if len(key) == 15}
Mi aporte: * Obtener los datos del CSV y ordenarlos de manera ascendente. * Graficar ```js import csv import matplotlib.pyplot as plt years=[] population=[] def readCSV(path): with open(path,'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') for row in reader: #Select ARG line if 'ARG' in row: #Select elements with population numbers for i in range(5,13): #Add data to poputation, -i means inverted position population.append(row[-i]) #Select years line if 'Rank' in row: #Select elements with year numbers numbers for i in range(5,13): #Add data to years, -i means inverted position years.append(row[-i]) def generateBarChart(years,population): #fig=figura, ax=las coordenadas fig,ax = plt.subplots() #Generar grafica de barras ax.bar(years,population) #Show graph plt.show() if __name__ == '__main__': readCSV('./app/data.csv') generateBarChart(years,population) ```
Yo y mi lógica de programación de la nada complicándonos la vida: ```js import csv def filter_years(path): with open (path, "r") as data_csv: data_reader = csv.reader(data_csv, delimiter=",") header = next(data_reader) data = [] for row in data_reader: dict = {key: value for key, value in zip(header, row)} data.append(dict) data_year_population = [] years = ["2022", "2020", "2015", "2010", "2000", "1990", "1980", "1970"] for dict in data: dict_years = {} j = 0 for i in range(5,12): dict_years[years[j]] = list(dict.items())[i][1] j += 1 data_year_population.append(dict_years) return data_year_population if __name__ == "__main__": data = filter_years("./Cursos Platzi/Curso Python/Files/app_/world_population.csv") for dict in data: print(dict) print("_"*50) ```
Comparto mi solución ```python import csv import matplotlib.pyplot as plt with open('world_population.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: if row['Country/Territory'] == 'Argentina': data = row labels = [] values = [] for key, value in data.items(): if 'Population' in key: labels.append(key) values.append(value) labels.pop(-1) values.pop(-1) fig, ax = plt.subplots() ax.bar(labels, values) plt.show() ```![](https://imgur.com/a/L1Y3exI)
```python import csv def read_csv(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] # userinput = str.title(input("\nWrite country name: \n")) for row in reader: #if userinput in row[2]: iterable = zip(header, row) country_dict = {key: value for key, value in iterable} data.append(country_dict) return data def get_population(data): userinput = str.title(input("\nWrite country name: \n")) new_data = list(filter(lambda item: item['Country/Territory'] == userinput, data)) years = [i for i in new_data[0] if 'Population' in i] population = [value for key, value in new_data[0].items() if 'Population' in key] result = list(zip(years, population)) print(result) if __name__ == '__main__': data = read_csv('./app/world_population.csv') get_population(data) ```import csv def read\_csv(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = \[] \# userinput = str.title(input("\nWrite country name: \n")) for row in reader: \#if userinput in row\[2]: iterable = zip(header, row) country\_dict = {key: value for key, value in iterable} data.append(country\_dict) return data def get\_population(data): userinput = str.title(input("\nWrite country name: \n")) new\_data = list(filter(lambda item: item\['Country/Territory'] == userinput, data)) years = \[i for i in new\_data\[0] if 'Population' in i] population = \[value for key, value in new\_data\[0].items() if 'Population' in key] result = list(zip(years, population)) print(result) if \_\_name\_\_ == '\_\_main\_\_': data = read\_csv('./app/world\_population.csv') get\_population(data)
Aqui coloco mi ejercicio, me demore, pero pude comprender varias cosas. import matplotlib.pyplot as plt import csv def read\_csv(path: str) -> list: with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = \[] for row in reader: iterable = zip(header, row) country\_dict = {key: value for key, value in iterable} data.append(country\_dict) return data \#Funcion que filtra la busqueda para un registro def filter\_data(data: list, country: str) -> list: result = list(filter(lambda item: item\['Country/Territory'] == country, data)) return result \# Convertimos el registro deseado para generar un diccionario con los datos que necesitamos def converter\_dic(data): list\_pais = filter\_data(data, 'Colombia') dict\_pais = {} for i in list\_pais: dict\_pais = i pais\_final = { '2022': int(dict\_pais\['2022 Population']), '2020': int(dict\_pais\['2020 Population']), '2015': int(dict\_pais\['2015 Population']), '2010': int(dict\_pais\['2010 Population']), '2000': int(dict\_pais\['2000 Population']), '1990': int(dict\_pais\['1990 Population']), '1980': int(dict\_pais\['1980 Population']), '1970': int(dict\_pais\['1970 Population']) } return pais\_final \# definimos generación de gráfica def generate\_bar(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) ax.set\_xlabel('Año') ax.set\_ylabel('Población') ax.set\_title('Población de Colombia por año') plt.show() \# tenemos nuestro menu principal if \_\_name\_\_ == '\_\_main\_\_': data = read\_csv('./app2/world.csv') pais\_final = converter\_dic(data) labels = list(pais\_final.keys()) values = list(pais\_final.values()) print(pais\_final) generate\_bar(labels, values)
Les comparto dos propuestas de solución, la primera la hice con las notas de la clase, y la segunda fue optimizada para tener la menor complejidad posible (y se nota, el código está muy limpio): ```python ################################### # Propuesta de solucion 1 import csv import matplotlib.pyplot as plt path = './app/data.csv' def country_historical_population(path, country): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) years = ['2022', '2020', '2015', '2010', '2000', '1990', '1980', '1970'] data = [] for row in reader: iterable = zip(header, row) country_dict = {key: value for key, value in iterable} if country_dict['Country/Territory'] == country: data.append(int(country_dict['2022 Population'])) data.append(int(country_dict['2020 Population'])) data.append(int(country_dict['2015 Population'])) data.append(int(country_dict['2010 Population'])) data.append(int(country_dict['2000 Population'])) data.append(int(country_dict['1990 Population'])) data.append(int(country_dict['1980 Population'])) data.append(int(country_dict['1970 Population'])) fig, ax = plt.subplots() ax.bar(years, data) final_data = { years[i]:data[i] for i in range(len(data)) } plt.show() return final_data data = country_historical_population(path, 'Colombia') print(data) ###################################### # Propuesta de solucion 2 import csv import matplotlib.pyplot as plt def country_historical_population(path, country): # Define los años y los índices correspondientes en las filas del CSV years_indices = { '2022': 5, # Índice basado en tu CSV, ajusta si cambian las columnas '2020': 6, '2015': 7, '2010': 8, '2000': 9, '1990': 10, '1980': 11, '1970': 12 } # Diccionario final de población final_data = {} with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') next(reader) # Salta el encabezado for row in reader: # Verifica si el país coincide if row[2] == country: # Extrae las poblaciones según los años requeridos final_data = {year: int(row[index]) for year, index in years_indices.items()} break # Detiene la iteración una vez encontrado el país fig, ax = plt.subplots() ax.bar(final_data.keys(), final_data.values()) plt.show() return final_data # Ejecuta la función data = country_historical_population('./app/data.csv', 'Colombia') print(data) ```
```js import pandas as pd import matplotlib.pyplot as plt yearsPopulation = ['Country/Territory','2022 Population','2015 Population','2010 Population','2000 Population','1990 Population','1980 Population','1970 Population'] def buildDictionary(matrix): dictionary = [{"Country":x[0], "data": [x[1],x[1],x[2],x[3],x[4],x[5],x[6] ]}for x in matrix] return dictionary def buildChar(matrixArray): label = ['2022 Population','2015 Population','2010 Population','2000 Population','1990 Population','1980 Population','1970 Population'] values = matrixArray fig, ax = plt.subplots() ax.bar(label,values) plt.show() def read_csv (path,countryName): x = pd.read_csv(path,usecols=yearsPopulation).values data = buildDictionary(x) country = list(filter(lambda x:x['Country'] == countryName, data)) buildChar(country[0]['data']) este es mi aporte para solucionar el rpblema ```import pandas as pdimport matplotlib.pyplot as plt yearsPopulation = \['Country/Territory','2022 Population','2015 Population','2010 Population','2000 Population','1990 Population','1980 Population','1970 Population'] def buildDictionary(matrix): dictionary = \[{"Country":x\[0], "data": \[x\[1],x\[1],x\[2],x\[3],x\[4],x\[5],x\[6] ]}for x in matrix] return dictionary def buildChar(matrixArray): label = \['2022 Population','2015 Population','2010 Population','2000 Population','1990 Population','1980 Population','1970 Population'] values = matrixArray fig, ax = plt.subplots() ax.bar(label,values) plt.show() def read\_csv (path,countryName): x = pd.read\_csv(path,usecols=yearsPopulation).values data = buildDictionary(x) country = list(filter(lambda x:x\['Country'] == countryName, data)) buildChar(country\[0]\['data'])
Saludos a todos, les comparto mi aporte ```js Modulo 'csv_utils.py' import csv def read_csv(path): with open(path,'r') as csvfile: reader = csv.reader(csvfile,delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header,row) # dictionary comprehention country_dict = {key: value for key ,value in iterable} data.append(country_dict) return data ```Modulo utils.py ```js def get_data_by_country(data,country): result = list(filter(lambda item:item['Country/Territory'] == country,data)) return result ```Modulo charts.py ```js import matplotlib.pyplot as plt def generate_bar_chart(labels,values): fig,ax = plt.subplots() ax.bar(labels,values) plt.show() ```Programa principal main.py ```js import utils import csv_utils import charts country='Argentina' data = csv_utils.read_csv('/home/python/src/curso02/app/data.csv') result = utils.get_data_by_country(data,country) arg_pop_dict = result[0] result2 = {key.replace(' Population',''):int(value) for (key,value) in arg_pop_dict.items() if 'Population' in key and 'Percentage' not in key} charts.generate_bar_chart(result2.keys(),result2.values()) ```
```python import csv import matplotlib.pyplot as plt def read_csv(path): with open(path,'r') as filecsv: reader = csv.reader(filecsv, delimiter=',') header = next(reader) data = [] for fila in reader: iterable = zip(header, fila) dic = {key: value for key,value in iterable} data.append(dic) return data def generador_barras(etiqueta,valor): flg, ax = plt.subplots() ax.bar(etiqueta,valor) ax.set_ylim(bottom=0) plt.show() if __name__ == '__main__': data = read_csv('modulos/data.csv') # generador_barras(data[]) argentina = data[8] P_argentina = list(argentina.items())[5:13] etiqueta = [etiqueta for etiqueta, Valor in P_argentina] valor = [valor for etiqueta, valor in P_argentina] generador_barras(etiqueta,valor) ```import csvimport matplotlib.pyplot as plt def read\_csv(path): with open(path,'r') as filecsv: reader = csv.reader(filecsv, delimiter=',') header = next(reader) data = \[] for fila in reader: iterable = zip(header, fila) dic = {key: value for key,value in iterable} data.append(dic) return data def generador\_barras(etiqueta,valor): flg, ax = plt.subplots() ax.bar(etiqueta,valor) ax.set\_ylim(bottom=0) plt.show() if \_\_name\_\_ == '\_\_main\_\_': data = read\_csv('modulos/data.csv') *# generador\_barras(data\[])* argentina = data\[8] P\_argentina = list(argentina.items())\[5:13] etiqueta = \[etiqueta for etiqueta, Valor in P\_argentina] valor = \[valor for etiqueta, valor in P\_argentina] generador\_barras(etiqueta,valor)
Yo reutilizé la funcion para pasar el csv a diccionario y solo hice un try para cada elemento de la lista, le hace falta ponerle florecitas pero funciona ```js import matplotlib.pyplot as plt import read_csv dicc = read_csv.csv_to_dicc("data.csv") print("Selecciona un pais.") lista_paises = [] for i in dicc: lista_paises.append(i["Country/Territory"]) print(lista_paises) pais = input("Escribe un pais: " ) for i in dicc: try: assert i["Country/Territory"] == pais x = [2022,2020,2015,2010,2000,1990,1980,1970] y = [i["2022 Population"], i["2020 Population"], i["2015 Population"], i["2010 Population"], i["2000 Population"], i["1990 Population"], i["1980 Population"], i["1970 Population"]] print(x,y) figure, axes = plt.subplots() axes.plot(x,y) plt.show() except AssertionError as error: continue ```import matplotlib.pyplot as plt import read\_csv dicc = read\_csv.csv\_to\_dicc("data.csv") print("Selecciona un pais.") lista\_paises = \[] for i in dicc: lista\_paises.append(i\["Country/Territory"]) print(lista\_paises) pais = input("Escribe un pais: " ) for i in dicc: try: assert i\["Country/Territory"] == pais x = \[2022,2020,2015,2010,2000,1990,1980,1970] y = \[i\["2022 Population"], i\["2020 Population"], i\["2015 Population"], i\["2010 Population"], i\["2000 Population"], i\["1990 Population"], i\["1980 Population"], i\["1970 Population"]] print(x,y) figure, axes = plt.subplots() axes.plot(x,y) plt.show() except AssertionError as error: continue
Trate de saltarme un poco el integrarlo con los demas modulos y lo hice independiente. `def read_data_by_country(data, country):` ` result = list(` ` filter(lambda item: item['Country/Territory'].lower() == country.lower(),` ` data))` ` population_by_year = {` ` key.split()[0]: value` ` for key, value in result[0].items() if key in [` ` '2022 Population', '2020 Population', '2015 Population',` ` '2010 Population', '2000 Population', '1990 Population',` ` '1980 Population', '1970 Population'` ` ]` ` }` ` return population_by_year`
Pude con el reto de la clase, luego de intentarlo mucho y repasar muchas veces los apuntes (aún no termino de ver la clase): ![](https://static.platzi.com/media/user_upload/Sin%20t%C3%ADtulo-22508be6-8b27-4dbc-9a5d-e38ec2d3a62c.jpg)![]()
```js import csv import matplotlib.pyplot as plt def read_csv_dict(path,country): with open(path, "r") as csvfile: fileCSV = csv.DictReader(csvfile,delimiter=',') objetos =[row for row in fileCSV if row["Country/Territory"] == country] return objetos[0] if len(objetos)>0 else {} def filter_years(data_country): data ={} for key,val in data_country.items(): if key[0:4].isdigit(): newkey=key.split()[0] data[newkey]=int(val) return data def generate_bar_char(labels, values): _, ax = plt.subplots() ax.bar(labels,values) plt.show() data_country = read_csv_dict("./world_population.csv",'Argentina') print(data_country) #-- el dict del país buscado.. data_year = filter_years(data_country) print(data_year) #-- el reto pide dict con key año.. generate_bar_char(data_year.keys(),data_year.values()) ```
Así obtuve solo los años con su valor correspondiente como entero. ```js def extract_anual_population(data): datos_poblacionales = [] # recorre los datos de cada país for country in data: # Hace un diccionario tomando unicamente los datos de poblacion anual # Formatea para solo tomar el año y pasa la poblacion a entero population = {year[0:4]:int(amount) for (year, amount) in country.items() if str(year).endswith('Population')} datos_poblacionales.append(population) return datos_poblacionales ```
Mi humilde solución: ```js import csv def diccionario_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = {header:row for header, row in iterable} data.append(country_dict) return data def nuevo_dict(path): lista = diccionario_data(path) new_dictionary = {} for key, value in lista[0].items(): if '1' in key[0] or '2' in key[0]: new_key = key.replace(' Population', '') new_dictionary[new_key] = value return new_dictionary if __name__ == '__main__': print(nuevo_dict('data.csv')) ```
Mi humilde solución: ```js import csv def diccionario_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = {header:row for header, row in iterable} data.append(country_dict) return data def nuevo_dict(path): lista = diccionario_data(path) new_dictionary = {} for key, value in lista[0].items(): if '1' in key[0] or '2' in key[0]: new_key = key.replace(' Population', '') new_dictionary[new_key] = value return new_dictionary if __name__ == '__main__': print(nuevo_dict('data.csv')) ```
Mi humilde solución: ```js import csv def diccionario_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = {header:row for header, row in iterable} data.append(country_dict) return data def nuevo_dict(path): lista = diccionario_data(path) new_dictionary = {} for key, value in lista[0].items(): if '1' in key[0] or '2' in key[0]: new_key = key.replace(' Population', '') new_dictionary[new_key] = value print(new_dictionary) if __name__ == '__main__': nuevo_dict('data.csv') ```
Mi humilde solución: ```js import csv def diccionario_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = {header:row for header, row in iterable} data.append(country_dict) return data def nuevo_dict(path): lista = diccionario_data(path) new_dictionary = {} for key, value in lista[0].items(): if '1' in key[0] or '2' in key[0]: new_key = key.replace(' Population', '') new_dictionary[new_key] = value print(new_dictionary) if __name__ == '__main__': nuevo_dict('data.csv') ```import csv def diccionario\_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = \[] for row in reader: iterable = zip(header, row) country\_dict = {header:row for header, row in iterable} data.append(country\_dict) return data def nuevo\_dict(path): lista = diccionario\_data(path) new\_dictionary = {} for key, value in lista\[0].items(): if '1' in key\[0] or '2' in key\[0]: new\_key = key.replace(' Population', '') new\_dictionary\[new\_key] = value print(new\_dictionary) if \_\_name\_\_ == '\_\_main\_\_': nuevo\_dict('data.csv')
Mi humilde solución: import csv def diccionario\_data(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = \[] for row in reader: iterable = zip(header, row) country\_dict = {header:row for header, row in iterable} data.append(country\_dict) return data def nuevo\_dict(path): lista = diccionario\_data(path) new\_dictionary = {} for key, value in lista\[0].items(): if '1' in key\[0] or '2' in key\[0]: new\_key = key.replace(' Population', '') new\_dictionary\[new\_key] = value print(new\_dictionary) if \_\_name\_\_ == '\_\_main\_\_': nuevo\_dict('data.csv')
**Otra forma de graficar la población de un país es ayudados por la librería Pandas.**  import pandas as pd import matplotlib.pyplot as plt def plot\_population():     # Leer el archivo CSV     df = pd.read\_csv('data\_country.csv')     # Preguntar al usuario el país que desea graficar     country = input("Por favor, ingresa el nombre del país que deseas graficar: ")     # Filtrar los datos para el país seleccionado     country\_data = df\[df\['Country'] == country]     # Crear una lista con los años y las poblaciones     years = \['2022', '2020', '2015', '2010', '2000', '1990', '1980', '1970']     populations = \[int(country\_data\[year + ' Population']) for year in years]     # Crear el gráfico de barras     plt.bar(years, populations)     plt.xlabel('Año')     plt.ylabel('Población')     plt.title('Evolución de la población de ' + country)     plt.show() if \_\_name\_\_ == '\_\_main\_\_':     plot\_population() ![](https://static.platzi.com/media/user_upload/image-d8dd1ecb-5c47-4bfe-aedd-cb8096ab0669.jpg)
aquí mi solución para quien la quiera revisar # Reto: graficando la población de un país ```js import csv import matplotlib.pyplot as plt # leer el archivo csv def buscar_pais(pais): with open('data.csv', 'r') as mi_archivo: contenido = csv.reader(mi_archivo, delimiter=',') # extrae las cabeceras correspondiente a los años cabecera = next(contenido)[5:13] # elimina la palabra 'population' y deja solo el año cabecera = [anio.split()[0] for anio in cabecera] for fila in contenido: if fila[2] == pais: # los valores se convierten a numeros valores = [int(valor) for valor in fila[5:13]] # une la lista de años con la lista de valores segun el pasi seleccionado y lo combierte a diccionario datos_poblacion = dict(zip(cabecera, valores)) return datos_poblacion def graficar_datos_poblacion(datos): eje_x = datos.keys() eje_y = datos.values() figura, coordenadas = plt.subplots() coordenadas.bar(eje_x, eje_y) plt.show() if __name__ == '__main__': datos = buscar_pais("Algeria") graficar_datos_poblacion(datos) ```Reto: graficando la población de un país
Uffff que reto tan bueno, me costo trabajo pero logre hacerlo 2 veces, una antes de ver cómo lo hizo el profesor de una forma muy diferente, teniendo en cuenta que la solución y que todo saliera bien con los valores, y otra despues de ver cómo lo hizo el profesor y refactorizando mi codigo para no afectar los archivos de charts y read\_csv y que el usuario pudiera elegir el pais.
```js ''' Obtener el crecimiento poblacional ''' import csv import matplotlib.pyplot as plt data = [] def growthPopulation(path): with open(path, "r") as file: readerCSV = csv.reader(file, delimiter=",") next(readerCSV) for item in readerCSV: dataF = \ { "2022": int(item[5]), "2020": int(item[6]), "2015": int(item[7]), "2010": int(item[8]), "2000": int(item[9]), "1990": int(item[10]), "1980": int(item[11]), "1970": int(item[12]) } data.append(dataF) return data def generateChart(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) plt.show() if __name__ == "__main__": data = growthPopulation("./dataG.csv") #labels = list(data[0].keys()) #values = list(data[0].values()) labels = data[0].keys() values = data[0].values() print(labels, values) generateChart(labels, values) ```![](file:///C:/Users/ADMIN/Pictures/Screenshots/graphic2105.png)
Me rindo, hice mil revisiones y no encuentro la manera de solucionarlo (aún soy muy novato) me dí cuenta que si digito el nombre de Afghanistan si me genera la gráfica pero con ningún otro país me da una salida de gráficos. si alguien tiene la respuesta agradezco iluminarme: Aquí el código final q tengo ```js import utils import read_csv import charts def run(): data = read_csv.read_csv('./app/data.csv') country = input('Digite el pais ==>') result = utils.population_by_country(data, country) if len(result) > 0: country = result[0] labels, values = utils.get_population(country) charts.generate_bar_chart(labels, values) if __name__ == '__main__': run() ```import utils import read\_csvimport charts def run():    data = read\_csv.read\_csv('./app/data.csv')    country = input('Digite el pais ==>')        result = utils.population\_by\_country(data, country)            if len(result) > 0:        country = result\[0]        labels, values = utils.get\_population(country)        charts.generate\_bar\_chart(labels, values)     if \_\_name\_\_ == '\_\_main\_\_':    run()
Me rindo! le hice mil revisiones y al final me estoy dando cuenta que si digito import utils import read\_csvimport charts**Afghanistan** si me genera la gráfica, pero ningún otro país me lo acepta. si en este año alguién ha realizado el ejercicio y tiene la respuesta (soy muy novato aún) le agradezco iluminarme! ```js import utils import read_csv import charts def run(): data = read_csv.read_csv('./app/data.csv') country = input('Digite el pais ==>') result = utils.population_by_country(data, country) if len(result) > 0: country = result[0] labels, values = utils.get_population(country) charts.generate_bar_chart(labels, values) if __name__ == '__main__': run() ```
Adjunto mi solución: ```js import csv import matplotlib.pyplot as plt # Función para importar y mostrar una gráfica de barras de la población por año de un país específico def importar_y_mostrar_poblacion(): pais_solicitado = input("Por favor, introduce el nombre del país que deseas consultar: ") pais_solicitado = pais_solicitado.title() # Convertir la entrada a formato título para manejar mayúsculas y minúsculas with open('data.csv', newline='') as csvfile: reader = csv.reader(csvfile) next(reader) # Saltar la cabecera for row in reader: if row[2] == pais_solicitado: # Comparar directamente con el formato título años = ['1970', '1980', '1990', '2000', '2010', '2015', '2020', '2022'] poblaciones = [int(row[12]), int(row[11]), int(row[10]), int(row[9]), int(row[8]), int(row[7]), int(row[6]), int(row[5])] plt.figure(figsize=(10, 5)) colores = ['darkslateblue', 'darkcyan', 'darkseagreen', 'darkkhaki', 'darkgoldenrod', 'darkorange', 'darkred', 'darkmagenta'] plt.bar(años, poblaciones, color=colores) plt.xlabel('Año') plt.ylabel('Población') plt.title(f'Población de {row[2]}, cuya abreviación es {row[1]}. Su capital es {row[3]} en {row[4]}') plt.show() break else: print("El país solicitado no se encuentra en la base de datos.") # Llamada a la función para ejecutarla importar_y_mostrar_poblacion() ```
````python import csv import matplotlib.pyplot as plt # Función para importar y mostrar una gráfica de barras de la población por año de un país específico def importar_y_mostrar_poblacion(): pais_solicitado = input("Por favor, introduce el nombre del país que deseas consultar: ") pais_solicitado = pais_solicitado.title() # Convertir la entrada a formato título para manejar mayúsculas y minúsculas with open('data.csv', newline='') as csvfile: reader = csv.reader(csvfile) next(reader) # Saltar la cabecera for row in reader: if row[2] == pais_solicitado: # Comparar directamente con el formato título años = ['1970', '1980', '1990', '2000', '2010', '2015', '2020', '2022'] poblaciones = [int(row[12]), int(row[11]), int(row[10]), int(row[9]), int(row[8]), int(row[7]), int(row[6]), int(row[5])] plt.figure(figsize=(10, 5)) colores = ['darkslateblue', 'darkcyan', 'darkseagreen', 'darkkhaki', 'darkgoldenrod', 'darkorange', 'darkred', 'darkmagenta'] plt.bar(años, poblaciones, color=colores) plt.xlabel('Año') plt.ylabel('Población') plt.title(f'Población de {row[2]}, cuya abreviación es {row[1]}. Su capital es {row[3]} en {row[4]}') plt.show() break else: print("El país solicitado no se encuentra en la base de datos.") # Llamada a la función para ejecutarla importar_y_mostrar_poblacion() ```*import* csv*import* matplotlib.pyplot *as* plt *# Función para importar y mostrar una gráfica de barras de la población por año de un país específico*def importar\_y\_mostrar\_poblacion():    pais\_solicitado = input("Por favor, introduce el nombre del país que deseas consultar: ")    pais\_solicitado = pais\_solicitado.title()  *# Convertir la entrada a formato título para manejar mayúsculas y minúsculas*    *with* open('data.csv', *newline*='') *as* csvfile:        reader = csv.reader(csvfile)        next(reader)  *# Saltar la cabecera*        *for* row *in* reader:            *if* row\[2] == pais\_solicitado:  *# Comparar directamente con el formato título*                años = \['1970', '1980', '1990', '2000', '2010', '2015', '2020', '2022']                poblaciones = \[int(row\[12]), int(row\[11]), int(row\[10]), int(row\[9]), int(row\[8]), int(row\[7]), int(row\[6]), int(row\[5])]                plt.figure(*figsize*=(10, 5))                colores = \['darkslateblue', 'darkcyan', 'darkseagreen', 'darkkhaki', 'darkgoldenrod', 'darkorange', 'darkred', 'darkmagenta']                plt.bar(años, poblaciones, *color*=colores)                plt.xlabel('Año')                plt.ylabel('Población')                plt.title(f'Población de {row\[2]}, cuya abreviación es {row\[1]}. Su capital es {row\[3]} en {row\[4]}')                plt.show()                *break*        *else*:            print("El país solicitado no se encuentra en la base de datos.") *# Llamada a la función para ejecutarla*importar\_y\_mostrar\_poblacion() ````
Me rindo! le hice mil revisiones y al final me estoy dando cuenta que si digito import utils import read\_csvimport charts def run():    data = read\_csv.read\_csv('./app/data.csv')    country = input('Digite el pais ==>')        result = utils.population\_by\_country(data, country)            if len(result) > 0:        country = result\[0]        labels, values = utils.get\_population(country)        charts.generate\_bar\_chart(labels, values)     if \_\_name\_\_ == '\_\_main\_\_':    run()**Afghanistan** si me genera la gráfica, pero ningún otro país me lo acepta. si en este año alguién ha realizado el ejercicio y tiene la respuesta (soy muy novato aún) le agradezco iluminarme!```js import utils import read_csv import charts def run(): data = read_csv.read_csv('./app/data.csv') country = input('Digite el pais ==>') result = utils.population_by_country(data, country) if len(result) > 0: country = result[0] labels, values = utils.get_population(country) charts.generate_bar_chart(labels, values) if __name__ == '__main__': run() ```
Con ayuda de la libreria pandas ```python import pandas as pd import matplotlib.pyplot as plt #Extraigo los datos y los guardo en la variable df df = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/world_population.csv') #df.head() #cambio los nombres de las columnas df = df.rename(columns={ df.columns[5]: '2022', df.columns[6]:'2020', df.columns[7]:'2015', df.columns[8]:'2010', df.columns[9]:'2000', df.columns[10]:'1990', df.columns[11]:'1980', df.columns[12]:'1970' }) #elimino las columnas que no necesito df = df.drop(['Rank', 'CCA3', 'Capital', 'Continent','Area (km²)', 'Density (per km²)', 'Growth Rate', 'World Population Percentage'], axis=1) # Muestro los nombres de los países disponibles al usuario paises_disponibles = df['Country/Territory'].unique() print("Países disponibles:") for pais in paises_disponibles: print(pais) # Solicito al usuario que seleccione un país pais_seleccionado = input("Ingrese el nombre del país que desea visualizar: ") print(pais_seleccionado) #data solo muestra los datos realcionados al pais_seleccionado data = df[df['Country/Territory'] == pais_seleccionado] #data.head() anos = df[df['Country/Territory'] == pais_seleccionado] anos = anos.drop('Country/Territory', axis=1) anos.head() plt.bar(anos.columns, anos.values[0]) plt.title(f'Población de {pais_seleccionado} por Año') plt.show ```![]()![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-04-17%20193524-26a27e8a-678d-4693-a17f-ae082207650c.jpg)![]()![](https://static.platzi.com/media/user_upload/pregunta%20al%20usuario-5d24b28d-ca57-4366-9594-58b6536ec4a2.jpg)![]()![](https://static.platzi.com/media/user_upload/Guarda%20el%20pais_seleccionado-e53a1d04-c840-4229-a850-aa67305c3a5f.jpg)![](https://static.platzi.com/media/user_upload/Grafica%20del%20pais_seleccionado-877a251f-dda5-447d-afdb-621633966347.jpg)
```python import utils import read_csv import charts from read_csv import read_csv # Llama a la función read_csv para leer el archivo CSV y obtener los datos data = read_csv('./app/data.csv') # Ahora puedes utilizar los datos como desees # Lista de continentes con números de opción continent_options = { 1: "Asia", 2: "Europe", 3: "Africa", 4: "North America", 5: "South America", 6: "Oceania", 7: "World" } # Mostrar las opciones al usuario print("Por favor, selecciona un continente o 'World' para todo el mundo:") for key, value in continent_options.items(): print(f"{key}. {value}") # Solicitar al usuario que ingrese un número de opción hasta que lo haga correctamente while True: selected_option = input("Opción ==> ") # Validar la entrada del usuario try: selected_option = int(selected_option) if selected_option not in continent_options: raise ValueError break # Salir del bucle si la entrada es válida except ValueError: print("Por favor, ingresa un número válido de opción.") # Obtener el continente seleccionado por el usuario if selected_option == 7: # Si el usuario selecciona 'World', graficar todos los datos selected_data = data else: selected_continent = continent_options[selected_option] # Filtrar los datos por continente seleccionado selected_data = list(filter(lambda item: item['Continent'] == selected_continent, data)) # Calcular el porcentaje de población mundial para los datos seleccionados world_population_percentage = utils.world_population_percentage(selected_data) print('') print(world_population_percentage) print('') labels = world_population_percentage.keys() values = world_population_percentage.values() charts.generate_pie_chart(labels, values) ```le coloque la opcion de elejir el continente.. o todo el mundo...
```python def population_by_year(country_name, data): for country in data: # Buscar el país en los datos if country['Country/Territory'].lower() == country_name.lower(): population_by_year = {} # Crear diccionario para almacenar la información de población por año for year in range(1900, 2024): # Iterar sobre los años y agregar la población correspondiente al diccionario population = country.get(str(year) + ' Population') # Utilizamos get() para manejar casos donde la población para ese año no esté disponible if population is not None: population_by_year[str(year)] = population return population_by_year return None # Si no se encuentra el país, devolver None ```
```js def population_by_year(country_name, data): for country in data: # Buscar el país en los datos if country['Country/Territory'].lower() == country_name.lower(): population_by_year = {} # Crear diccionario para almacenar la información de población por año for year in range(1900, 2024): # Iterar sobre los años y agregar la población correspondiente al diccionario population = country.get(str(year) + ' Population') # Utilizamos get() para manejar casos donde la población para ese año no esté disponible if population is not None: population_by_year[str(year)] = population return population_by_year return None # Si no se encuentra el país, devolver None ```def population\_by\_year(country\_name, data): for country in data: # Buscar el país en los datos if country\['Country/Territory'].lower() == country\_name.lower(): population\_by\_year = {} # Crear diccionario para almacenar la información de población por año for year in range(1900, 2024): # Iterar sobre los años y agregar la población correspondiente al diccionario population = country.get(str(year) + ' Population') # Utilizamos get() para manejar casos donde la población para ese año no esté disponible if population is not None: population\_by\_year\[str(year)] = population return population\_by\_year return None # Si no se encuentra el país, devolver None
```python import pandas as pd import matplotlib.pyplot as plt def world_population(country): df = pd.read_csv("./data/population.csv") df2 = df[df['Country/Territory'] == country].iloc[:,5:13] return df2 data = world_population('Venezuela') def barchart(x,y): # fig,ax = plt.subplots() # ax.bar(x,y) plt.bar(x, y, color ='yellow', width = 0.4) plt.title("Venezuela") plt.xlabel("Años") plt.xticks(rotation=45) plt.ylabel("Población (millones)") plt.show if __name__ == '__main__': barchart(data.columns,data.values[0]) ``` ![]()![]()![](https://static.platzi.com/media/user_upload/image-15d68c76-06e7-4d0c-b168-725602c35aa2.jpg)
No pude hacerlo
values = \[int(values) for vadef population\_country(data, country): result = list(filter(lambda i: i\["Country/Territory"]==country, data))\[0] population\_dic = {k:v for k,v in result.items() if k.endswith("Population")} labels = population\_dic.keys() values = population\_dic.values() return labels, values```js def population_country(data, country): result = list(filter(lambda i: i["Country/Territory"]==country, data))[0] population_dic = {k:v for k,v in result.items() if k.endswith("Population")} labels = population_dic.keys() values = [int(values) for values in population_country.values()] return labels, values ```Correcion del modulo para filrar y pueda transformar a # la población
```js import csv import matplotlib.pyplot as plt def population_country(data, country): result = list(filter(lambda i: i["Country/Territory"]==country, data))[0] population_dic = {k:v for k,v in result.items() if k.endswith("Population")} labels = population_dic.keys() values = population_dic.values() return labels, values def generate(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) return plt.show() data = [] def read(path): country = input("¿Qué pais quiere ver la población?") with open(path,"r") as csvfile: reader = csv.DictReader(csvfile)< for row in reader: data.append(row) labels, values = population_country(data, country) generate(labels,values) if __name__ == "__main__": read("./app/data.csv") ```
Traceback (most recent call last): File "/home/runner/Python/app/main.py", line 26, in \<module> run() File "/home/runner/Python/app/main.py", line 10, in run countries = list(map(lambda x: x\['Country'], data)) File "/home/runner/Python/app/main.py", line 10, in \<lambda> countries = list(map(lambda x: x\['Country'], data)) KeyError: 'Country' a mi me sale esto con la solucion del profe alguien sabe como resolver porque lei todo el codigo y no vi nada diferente, alguien podria mostrarmelo en todo caso
matplotlib.org no me esta funcionando me sale error de server
Correccion sin usar pandas ```js def get_data_country_dict(country): with open('./app/countries.csv','r') as csvfile: reader = csv.reader(csvfile) headers = next(reader) keys = headers[5:13] countries_dict = list(dict(zip(headers,row)) for row in reader) country_dict = [x for x in countries_dict if x['Country']==country].pop() filtered_country = {k:int(v) for (k,v) in country_dict.items() if k in keys} return filtered_country ```
Sin usar pandas ```python def get_data_country_dict(country): with open('./app/countries.csv','r') as csvfile: reader = csv.reader(csvfile) headers = next(reader) keys = headers[5:13] countries_dict = list(dict(zip(headers,row)) for row in reader) country_dict = [x for x in countries_dict if x['Country']==country].pop() filtered_country = {k:v for (k,v) in country_dict.items() if k in keys} return filtered_country ```

reto de convertir el pais en un diccionario solo con los años de la poblacion y el numero,
aclaro que importe la funcion que convierte el archivo csv en un lista de diccionarios, luego filtro por el nombre del pais que se desee buscar

Alguien sabe como conecto replit con el servidor, esto es lo que me aparece y no puedo graficar nada, alguien que me pueda ayudar por favor

Mi solucion antes de la clase ```js from read_csv import read_csv from charts import generate_pie_chart data = read_csv('./app/data.csv') countries = ['argentina', 'colombia','chile','ecuador','paraguay','uruguay','peru'] def get_data(data, countries, year): country_pop = [] key = str(year) + ' Population' for item in data: if item['Country/Territory'].lower() in countries: country_pop.append(item[key]) return country_pop generate_pie_chart(countries, get_data(data, countries, 2022)) ```![]()![](https://static.platzi.com/media/user_upload/image-cff5b52c-da76-4471-8829-621e807a7833.jpg)
new\_data = \[] population = \['1970 Population', '1980 Population', '1990 Population', '2000 Population', '2010 Population', '2015 Population', '2020 Population', '2022 Population'] def check\_item(item): dict = {} for i in item: for year in population: if year in item: dict\[year.split(' ')\[0]] = item.get(year) return dict for item in data: new\_data.append(check\_item(item)) print(new\_data)
![](https://static.platzi.com/media/user_upload/image-330df374-a8f9-4a75-8f41-1500012a25b8.jpg)![](https://static.platzi.com/media/user_upload/image-94a88a0d-a290-4f74-9741-71f5444f7ccd.jpg) Saludos Platzinautas En mi caso me muestra errores que despues de muchos intentos logre eliminar algunos; pero estos siguen apareciendo unos que no logro resolver, un poco "Muy" frustrado Acepto sugerencias Gracias
tengo problemas con la generación de la grafica, ya instale matplotlib pero no me genera el output ![](https://static.platzi.com/media/user_upload/image-918d1876-f7ea-405c-8596-346730706d45.jpg)
import matplotlib.pyplot as plt
from read_csv import read_csv

def get_population_by_country(data, country):
    info_country = list(filter(lambda item: item['Country/Territory'] == country, data))
    country = info_country[0]
    population_dict = {key:country[key] for key in country if 'Population' in key}
    return population_dict

def chart_population_by_country(population_dict):
    labels = list(map(lambda item: item, population_dict))
    labels.pop()
    #values = population_dict.values()
    def get_values(labels, population_dicts):
        values = []
        for label in labels:
            population = population_dicts[label]
            values.append(population)
        return values
    values = get_values(labels, population_dict)
    values2 = list(map(lambda item: int(item), values))
    print(labels)
    print(values)
    print(values2)
    fig, ax = plt.subplots()
    ax.bar(labels, values2)
    plt.show()
    


if __name__ == '__main__':
    data = read_csv('./app/data.csv')
    population_dict = get_population_by_country(data,'Afghanistan')
    chart_population_by_country(population_dict)
Dejo mi aporte. Abierto a todo tipo de sugerencias jeje```python import csv import matplotlib.pyplot as plt import re def read_csv(): with open('./data.csv', 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = dict(iterable) data.append(country_dict) return data data = read_csv() def country_picker(data): while(True): user_pick = input('Please enter a country name: ').title() country_picked = list(filter(lambda item: item['Country'] == user_pick, data)) if(len(country_picked) > 0): return country_picked else: print('Country not found, try again') def get_country_population(country): new_list = [] for key, value in country.items(): if (re.search('^[0-9]+ Population', key)): new_key = key.split()[0] new_list.append((new_key, int(value))) result = dict(new_list) return result def country_grafic_bar(country): labels = country.keys() values = country.values() fig, ax = plt.subplots() ax.bar(labels, values) plt.show() country = country_picker(data) population_list = get_country_population(country[0]) country_grafic_bar(population_list) ```import csv import matplotlib.pyplot as plt import re def read\_csv(): with open('./data.csv', 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = \[] for row in reader: iterable = zip(header, row) country\_dict = dict(iterable) data.append(country\_dict) return data data = read\_csv() def country\_picker(data): while(True): user\_pick = input('Please enter a country name: ').title() country\_picked = list(filter(lambda item: item\['Country'] == user\_pick, data)) if(len(country\_picked) > 0): return country\_picked else: print('Country not found, try again') def get\_country\_population(country): new\_list = \[] for key, value in country.items(): if (re.search('^\[0-9]+ Population', key)): new\_key = key.split()\[0] new\_list.append((new\_key, int(value))) result = dict(new\_list) return result def country\_grafic\_bar(country): labels = country.keys() values = country.values() fig, ax = plt.subplots() ax.bar(labels, values) plt.show() country = country\_picker(data) population\_list = get\_country\_population(country\[0]) country\_grafic\_bar(population\_list)
```js import pandas as pd cols = ["2022 Population", "2020 Population", "2015 Population", "2010 Population", "2000 Population", "1990 Population", "1980 Population", "1970 Population"] rows = ["Argentina"] filtro = df.loc[:, cols] pob_total = filtro[cols].sum() print (filtro) print(pob_total) ```Yo lo hice así gracias a una de las lecturas recomendadas de las clases anteriores, me costó un buen rato encontrar la forma de lograrlo pero ahí está. Toca instalar Pandas antes en el replit
![](https://static.platzi.com/media/user_upload/imagen-f81a8da3-a037-4593-89d4-1921824ecda6.jpg)
Mi solución: ```python def get_population_by_year(searched_country,data): country_data = next((country for country in data if country['Country/Territory'] == searched_country), None) if country_data is None: return None population_by_year = {key[:4]: value for key, value in country_data.items() if key.endswith(' Population')} return population_by_year ```
```js import matplotlib.pyplot as plt import csv def read_csv(path): with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dict = {key: value for key, value in iterable} data.append(country_dict) return data def transform_population_data(country_data): transformed_data = {} for year in ['1970', '1980', '1990', '2000', '2010', '2015', '2020', '2022']: transformed_data[year] = int(country_data.get(f'{year} Population', 0)) return transformed_data def generate_bar_chart(labels, values, country): fig, ax = plt.subplots() ax.bar(labels, values) plt.xlabel('Year') plt.ylabel('Population') plt.title(f'Population of {country} Over the Years') plt.show() if __name__ == '__main__': data = read_csv('./data.csv') user_input = input('Enter the country: ').lower() for country in data: if country['Country/Territory'].lower() == user_input: transformed_data = transform_population_data(country) labels = list(transformed_data.keys()) values = list(transformed_data.values()) generate_bar_chart(labels, values, country['Country/Territory'].title()) ```
Esta fue la solución que implementé: ```js from csv import reader from charts import generate_bar_chart def get_cart_data(path, country): with open(path) as file: file_data = reader(file) labels = next(file_data)[5:13] amount = [] for line in file_data: if country in line: amount = line[5:13] break return [list(reversed(labels)), amount] labels, amount = get_cart_data('./files/world_population.csv', 'Argentina') generate_bar_chart(labels, amount) ```La función generate\_bar\_chart es la misma de la lección pasada.
```js import csv def generate_list_population(path, country, labels, values, key): with open(path, "r") as csvfile: reader = csv.reader(csvfile, delimiter=",") periodos = labels population = [] for row in reader: if row[key] == country: for i in values: population.append(row[i]) data = list(zip(periodos, population)) dict_result = {key: int(value) for key, value in data} return dict_result if __name__ == "__main__": periodos = ["2022", "2020", "2015", "2010", "2000", "1990", "1980", "1970"] values = [5, 6, 7, 8, 9, 10, 11, 12] key = 2 data = generate_list_population("./app/data.csv", "Afghanistan", periodos, values, key) print(data) ```
```js import csv def generate_list_population(path, country, labels, values, key): with open(path, "r") as csvfile: reader = csv.reader(csvfile, delimiter=",") periodos = labels population = [] for row in reader: if row[key] == country: for i in values: population.append(row[i]) data = list(zip(periodos, population)) dict_result = {key: int(value) for key, value in data} return dict_result if __name__ == "__main__": periodos = ["2022", "2020", "2015", "2010", "2000", "1990", "1980", "1970"] values = [5, 6, 7, 8, 9, 10, 11, 12] key = 2 data = generate_list_population("./app/data.csv", "Afghanistan", periodos, values, key) print(data) ```import csv def generate\_list\_population(path, country, labels, values, key): with open(path, "r") as csvfile: reader = csv.reader(csvfile, delimiter=",") periodos = labels population = \[] for row in reader: if row\[key] == country: for i in values: population.append(row\[i]) data = list(zip(periodos, population)) dict\_result = {key: int(value) for key, value in data} return dict\_result if \_\_name\_\_ == "\_\_main\_\_": periodos = \["2022", "2020", "2015", "2010", "2000", "1990", "1980", "1970"] values = \[5, 6, 7, 8, 9, 10, 11, 12] key = 2 data = generate\_list\_population("./app/data.csv", "Afghanistan", periodos, values, key) print(data)
```python import csv import matplotlib.pyplot as plt def _get_labels(): return [ "2022 Population", "2020 Population", "2015 Population", "1990 Population", "1980 Population", "1970 Population" ] def print_chart(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) plt.show() def run(): country = input("Escriba un país: ") path = './data.csv' values = [] labels = _get_labels() with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) for row in reader: iterable = zip(header, row) country_dict = {key: value for key, value in iterable} if country_dict['Country/Territory'] == country: values = [int(country_dict[key]) for key in labels] break print_chart(labels, values) if __name__ == '__main__': run() ```
Yo lo hice así: ```js def population_by_country(data, country): result = list(filter(lambda item: item['Country/Territory'] == country, data)) return result[0] def get_dict_population(population): # Keys to extract and modify keys_to_extract = [ '2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population' ] # Create a new dictionary with modified keys new_dict = {key.split()[0]: int(population[key]) for key in keys_to_extract} labels = new_dict.keys() values = new_dict.values() return labels, values #return new_dict, keys and values separetly ``` El run() del main me quedó así: ```js def run(): alldata= read_csv.read_csv('./app/data.csv') country = input('Type Country => ') result = utils.population_by_country(alldata, country) #a dictionarie wiht the country information if len(result) >0: years, population = utils.get_dict_population(result) #print(years, population) charts.generate_bar_chart(years, population) if __name__ == '__main__': run() ```
Hi, comparto mi solución: ```python def get_population(country): years = ["2022", "2020", "2015", "2010", "2000", "1990", "1980", "1970"] erase = {} for i in years: erase[i] = int(country[f'{i} Population']) return erase.keys(), erase.values() ```Es importante que los elementos en la lista sean strings, ya que varia el gráfico que se va a realizar. :)
```js import csv import matplotlib.pyplot as plt def read_csv(path): with open(path,'r') as csvfile: reader = csv.reader(csvfile,delimiter=",") header = next(reader) data=[] for row in reader: iterable = zip (header,row) country_dict ={key:value for key,value in iterable} data.append(country_dict) return data def generare_bar_chart(labels,values): fig,ax =plt.subplots() ax.bar(labels,values) plt.show() if __name__ =='__main__': data=read_csv('world_population.csv') user_option = input('Escribe el pais => ') new_dict = next((item for item in data if item['Country/Territory'] == user_option), None) if new_dict is not None: labels=[] values=[] for age in range(1950,2030): if str(age)+' Population' in new_dict: poblation = new_dict[str(age)+' Population'] labels.append(age) values.append(poblation) generare_bar_chart(labels,values) else: print(f"No se encontraron datos para el país '{user_option}'.") ```  ![](https://static.platzi.com/media/user_upload/reto-8719960e-59a2-48b7-a2fb-296936e8942a.jpg)![]()
`def read_csv(path):` ` lista = []` ` keys = ['2022','2020','2015','2010','2000','1990','1980','1970']` ` with open(path) as file:` ` reader = csv.reader(file, delimiter=',')` ` header = next(reader)` ` for row in reader:` ` population = {k[0:4]:v for k,v in zip(header,row) if k[0:4] in keys} ` ` lista.append(population)` ` labels = population.keys() ` ` values = population.values() ` ` return labels, values`
```js import csv import charts import read_csv import utils def my_filtering_function(pair): wanted_key = ['2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population'] key, value = pair return key in wanted_key if __name__ == '__main__': data = read_csv.read_csv('./app/data.csv') country = utils.population_by_country(data, 'Argentina') filter2 = dict(country[0]) filtered_grades = dict(filter(my_filtering_function, filter2.items())) keys = list(filtered_grades.keys()) values = [int(x) for x in filtered_grades.values()] charts.generate_bar_chart(keys, values) ``` Lo completé de manera un poco diferente, espero les sirva
Nooo pero que! yo matandome trantando de hacerlo de forma automatica sin "Quemar" los nombres de las Columnas en el Código y la solución fue precesiamente esa! jajaja