No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

13 Días
2 Hrs
46 Min
26 Seg

Reto: graficando la población mundial

41/44
Recursos

Aportes 227

Preguntas 8

Ordenar por:

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

Para este reto se me ocurrio hacer otra funcion que recibiera la data, hacer un dictionary comprehention para filtrar los datos y devolver las llaves y los valores de ese diccionario

def get_world_percentages(data):
    percentages_dict = {item["Country/Territory"]: item["World Population Percentage"] for item in data}

    names = percentages_dict.keys()
    per = percentages_dict.values()

    return names, per

Si te sale el error: KeyError: 'Country’
Mismo caso que en el video anterior, solo sustituye ‘Country’ por ‘Country/Territory’

countries = list(map(lambda x: x['Country/Territory'], data))

Yo lo hice ordenando los paises respecto al porcentaje, aqui les comparto.

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 'World Population' in i :
                codict[i]=j
        data1.append(codict)


def graficar(data,name):
    data2 = sorted(data, key= lambda x: x['World Population Percentage'])
    labels=[i['Country'] for i in data2]
    values=[i['World Population Percentage'] for i in data2]
    fig, ax = plt.subplots()
    ax.pie(values,labels=labels)
    plt.show()

graficar(data1,'Bolivia')


def get_country_percentage(data):
    data_percentage = {i['Country/Territory']:
            float(i['World Population Percentage']) for i in data}
    return data_percentage.keys(),data_percentage.values()

import mod as md
import Charts as ch
import Read_csv_Dic as rd

def run():
    data = rd.read_csv('app/Data.csv')
    #print(data[0])
    data = list(filter(lambda i : i['Continent'] == 
                'South America', data))
    enc, val = md.get_country_percentage(data)
    ch.generate_pie_chart(enc,val)

if __name__ == '__main__':
    run()

Hola! mi solución fue crear otra función en utils para obtener label y value

import utils
import readcsv
import charts

def run():
  data = readcsv.readCsv('./app/data.csv')
  labels, values = utils.populationTotal(data)
  charts.generatePieChart(labels, values)

if __name__ == '__main__':
  run()

# función dentro de utils.py
def populationTotal(data):
  percentages = []
  countries = []
  for i in data:
    #countries.append(i['Country/Territory']) 
    countries.append(i['CCA3'])
    percentages.append(float(i['World Population Percentage']))
  return countries, percentages

Todo esto lo puedo hacer con excel lol

Yo resolví este reto preguntándole al usuario que elija si quiere población de un país o mundial. acá va el código:

from read_csv import read
from population_by_country import country_population
from charts import generate_bar_chart
from world_population import world_population


def run():
    data = read('./world_population.csv')
        
    choose = input('What would you like to know, the population grown in one country(C)\
or the world population growth(W)?(choose C or W): ')
    choose = choose.upper()
    if choose == 'C':
        countries = input('Choose a country: ')
        countries = countries.capitalize()
        for country in data:
            if country['Country/Territory'] == countries:
                labels , values = country_population(country)
                generate_bar_chart(countries, labels, values)
    elif choose == 'W':
        labels, values = world_population(data)
        generate_bar_chart('Wolrd Population Growth', labels, values)

        


if __name__ == '__main__':
    run()

función población mundial

from read_csv import read

def world_population(data):
    
    data = data
    
    population_1970 = []
    population_1980 = []
    population_1990 = []
    population_2000 = []
    population_2010 = []
    population_2015 = []
    population_2020 = []
    population_2022 = []

    for population in data:
        population_1970.append(int(population['1970 Population']))
        population_1980.append(int(population['1980 Population']))
        population_1990.append(int(population['1990 Population']))
        population_2000.append(int(population['2000 Population']))
        population_2010.append(int(population['2010 Population']))
        population_2015.append(int(population['2015 Population']))
        population_2020.append(int(population['2020 Population']))
        population_2022.append(int(population['2022 Population']))

    labels = ['1970', '1980', '1990', '2000', '2010', '2015', '2020', '2022']
    values = [
            sum(population_1970), 
            sum(population_1980), 
            sum(population_1990), 
            sum(population_2000), 
            sum(population_2010),
            sum(population_2015),
            sum(population_2020),
            sum(population_2022)
            ]
    
    return labels, values


if __name__ == '__main__':
    world_population('world_population.csv')

Saludos comunidad,
.
Les comparto el repo del proyecto: Github
.
Si quieres hacer Networking, estoy aquí: Website
.

Logre hacerlo pero con un problemita.... ![](<"C:\Users\usuario\Videos\Captures\Figure 1 11_12_2024 01_25_58.png">)![](<"C:\Users\usuario\Videos\Captures\Figure 1 11_12_2024 01_25_58.png">)![](<"C:\Users\usuario\Videos\Captures\Figure 1 11_12_2024 01_25_58.png">)![](https://static.platzi.com/media/user_upload/Figure%201%2011_12_2024%2001_25_58-e950ad69-17cf-472e-aa76-dab43cfa86c7.jpg) Si alguien sabe como solucionar este tipo de problemas de grafica en grandes cantidades estaría agradecido
utils.py ![](https://static.platzi.com/media/user_upload/image-c7e52a82-d1a8-4878-b8b5-d70fb38b5ae2.jpg) main.py ![](https://static.platzi.com/media/user_upload/image-56858e34-c307-48ed-a5b9-50c6b91f5648.jpg) esta fue mi solución
siendo sincero use tu ejemplo pero se me ocurrió modificarlo para que el usuario seleccionara el continente
```python def get_population_percentage(data): countries = [] percentages = [] for dict in data: countries.append(dict['Country/Territory']) percentages.append(dict.get('World Population Percentage')) return countries, percentages def run_2(): data = read_csv.read_csv('c:/Users/mende/OneDrive/Escritorio/Platzi/PZ_Curso_comprehensions_funciones_errores__NicolasMol_Básico/app/data.csv') countries, percentage = utils.get_population_percentage(data) charts.generate_pie_chart(countries, percentage) ```def get\_population\_percentage(data):    countries = \[]    percentages = \[]     for dict in data:         countries.append(dict\['Country/Territory'])        percentages.append(dict.get('World Population Percentage'))        return countries, percentages
Mi solución: ```python import csv import matplotlib.pyplot as plt def read_csv(path): with open(path, 'r') as file: reader = csv.reader(file, delimiter=',') header = next(reader) data = [] for row in reader: iterable = zip(header, row) country_dic = {key: value for (key, value) in iterable} data.append(country_dic) name = [country['Country/Territory'] for country in data] population = [country['World Population Percentage'] for country in data] return name, population def generate_bar_chart(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) plt.show() if __name__ == '__main__': name, population = read_csv('./world_population.csv') generate_bar_chart(name,population) ```import csvimport matplotlib.pyplot as plt def read\_csv(path): with open(path, 'r') as file: reader = csv.reader(file, delimiter=',') header = next(reader) data = \[] for row in reader: iterable = zip(header, row) country\_dic = {key: value for (key, value) in iterable} data.append(country\_dic) name = \[country\['Country/Territory'] for country in data] population = \[country\['World Population Percentage'] for country in data] return name, population def generate\_bar\_chart(labels, values): fig, ax = plt.subplots() ax.bar(labels, values) plt.show() if \_\_name\_\_ == '\_\_main\_\_': name, population = read\_csv('./world\_population.csv') generate\_bar\_chart(name,population)
Sinceramente, agote mis posibilidades, y decidí seguir una de las soluciones que dió el profesor. Y lo que más me llamó la atención es que en pocas lineas en el main, se pudo lograr esta tarea, que parecía compleja. Gracias, por enseñarnos.
Esta es mi propuesta de solución pero requiere que importemos `pip install inquirer` para poder hacer uso del menú dinámico, aquí el código: ```python # generar columna para crear grafico de tortas import inquirer import csv import matplotlib.pyplot as plt path = './app/data.csv' def menu(): questions = [ inquirer.List('column', message="¿Qué columna deseas graficar?", choices=[ '2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population', 'Area (km²)', 'Density (per km²)', 'Growth Rate', 'World Population Percentage', ], ), ] options = inquirer.prompt(questions) choice = options["column"] return(choice) def country_historical_population(path): choice = menu() with open(path, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=',') header = next(reader) # years = ['2022', '2020', '2015', '2010', '2000', '1990', '1980', '1970'] countries = [] data = [] for row in reader: iterable = zip(header, row) country_dict = {key: value for key, value in iterable} countries.append(country_dict['Country/Territory']) try: if choice == 'Growth Rate' or 'World Population Percentage' or 'Density (per km²)': data.append(float(country_dict[choice])) else: data.append(int(country_dict[choice])) except ValueError: print(f"Error al convertir el valor: {country_dict[choice]} de la columna {choice}") break final_data = { countries[i]:data[i] for i in range(len(data)) } sorted_data = dict(sorted(final_data.items(), key=lambda item: item[1], reverse=True)) fig, ax = plt.subplots() ax.bar(sorted_data.keys(), sorted_data.values()) plt.show() return sorted_data country_historical_population(path) ```
Hola a todos , les comparto mi solucion ```js import utils import csv_utils import charts def run(): data = csv_utils.read_csv('/home/firstdev/mydata/python/src/curso02/app/data.csv') result = {item['CCA3']:item['World Population Percentage'] for item in data} charts.generate_pie_chart(result.keys(),result.values()) if __name__ == '__main__': run() ```import utilsimport csv\_utilsimport charts def run(): data = csv\_utils.read\_csv('/home/firstdev/mydata/python/src/curso02/app/data.csv') result = {item\['CCA3']:item\['World Population Percentage'] for item in data} charts.generate\_pie\_chart(result.keys(),result.values()) if \_\_name\_\_ == '\_\_main\_\_': run()
Me compliqué la vida: ```python def get_population_percentage(data): dict_countries = [] dict_popupercentage = [] for row in data: dict_countries.append({x:y for x,y in row.items() if x == 'Country/Territory'}) for row in data: dict_popupercentage.append({x:y for x,y in row.items() if x == 'World Population Percentage'}) labels=[key['Country/Territory'] for key in dict_countries] values = [key['World Population Percentage'] for key in dict_popupercentage] return labels, values #values = map(filter(lambda x: x == x['World Population Percentage'], data ), data) ```def get\_population\_percentage(data):     dict\_countries = \[]    dict\_popupercentage = \[]    for row in data: dict\_countries.append({x:y for x,y in row.items() if x == 'Country/Territory'})    for row in data: dict\_popupercentage.append({x:y for x,y in row.items() if x == 'World Population Percentage'})    labels=\[key\['Country/Territory'] for key in dict\_countries]    values = \[key\['World Population Percentage'] for key in dict\_popupercentage]    return labels, values    #values = map(filter(lambda x: x == x\['World Population Percentage'], data ), data)
```python : ```
se logro despues de un rato de pensarle duro, hice que me diera los datos con datos de paises y porcentajes primero antes de llevarlo a grafica, asi que aqui esta es la parte del main: ```js import utils import read_csv import charts def run(): data = read_csv.read_csv('./app/data.csv') #county = input('Type country => ') #result = utils.get_poblation_by_country(data, county) world_population_percentage = utils.get_world_population_percentage(data) print("World Population Percentage:") print(world_population_percentage) for country, percentage in world_population_percentage.items(): print(f"{country}: {percentage}%") charts.generate_pie_chart(world_population_percentage.keys(), world_population_percentage.values()) """" if len(result) > 0: country = result[0] keys, values = utils.get_poblation(country) charts.generate_bar_chart(keys, values) """ if __name__ == "__main__": run() ```despues tenemos donde se asigno por cada item que en este caso fue el de contry se busca con el dato de contry el dato de porcentaje y asi lo localisamos y lo metemos dentro de un directorio donde vendra {pais: % de poblacion}: ```js def get_poblation(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 get_poblation_by_country(data, country): result = list(filter(lambda item: item["Country/Territory"] == country, data)) return result def get_world_population_percentage(data): world_population_percentage = {} # Iterar sobre cada fila de datos for item in data: # Obtener el nombre del país/territorio country = item["Country/Territory"] # Obtener el porcentaje de población mundial y almacenarlo en el diccionario world_population_percentage[country] = float(item["World Population Percentage"]) return world_population_percentage ```y por ultimo que realmente no es tan importante por que ya sea habia ceado esta funcion en otas clases todos los datos los metamos dentro de la funcion que crea la grafica de pastel aun que para esto utilize .keys() para los paises y .values() para los porcentajes al momento de pasarle los datos a la funcion: ```js import matplotlib.pyplot as plt # Función para generar un gráfico de barras def generate_bar_chart(labels, values): fig, ax = plt.subplots() # Crear una figura y un eje ax.bar(labels, values) # Crear un gráfico de barras plt.show() # Mostrar el gráfico # Función para generar un gráfico de pastel def generate_pie_chart(labels, values): fig, ax = plt.subplots() # Crear una figura y un eje ax.pie(values, labels=labels) # Crear un gráfico de pastel ax.axis("equal") # Asegurar que el gráfico sea circular plt.show() # Mostrar el gráfico # Bloque principal if __name__ == '__main__': labels = ['a', 'b', 'c'] values = [100, 200, 80] # Descomenta la siguiente línea para generar un gráfico de barras # generate_bar_chart(labels, values) print("Generando gráfico de pastel...") generate_pie_chart(labels, values) # Generar un gráfico de pastel print("Gráfico generado.") ```y como resultado me dio esta grafica: ![]()![]()![]()![]()![]("C:\Users\gmr_g\Downloads\grafica.png")![](https://static.platzi.com/media/user_upload/image-da9944ba-bef4-4714-9dea-7241a040ee8d.jpg)Los datos se ven un poco ensimados por la cuestion que son muchos paises pero creo que esta correcto. P.D.: Cuando la tarea soy medio teto
Mi solución ```python import csv import Chart def csv_to_dictionary(path): with open(path, "r") as file_csv: reader = csv.DictReader(file_csv) file_dictionary = list(reader) return file_dictionary def get_items_by_key(key, data): list_by_key = list(map(lambda item: item[key], data)) return list_by_key csv_path = "../Assets/WORLD_POPULATION.csv" population_data = csv_to_dictionary(csv_path) countries = get_items_by_key("Country/Territory", population_data) population_percentage = get_items_by_key("World Population Percentage", population_data) Chart.generate_bar_chart(countries, population_percentage) Chart.generate_pie_chart(countries, population_percentage) ```
¿Alguien me puede ayudar por qué no genera el gráfico? ![](https://static.platzi.com/media/user_upload/image-dd4f1b71-3a3d-4e00-ae68-1f2b702ade9d.jpg)
reto cumplido ![](https://static.platzi.com/media/user_upload/Sin%20t%C3%ADtulo-d9df3279-d41e-4e2f-b35d-27fd66befe7f.jpg)
Hice una función en el módulo utils.py que recibe los datos leídos del csv (con la función de `read_csv()`) y brinda una lista con los porcentajes y otra con los nombres de los países. ```js def get_world_population_percentage(data): # Paises labels = [country['Country'] for country in data] # Porcentajes de poblacion mundial values = [float(country['World Population Percentage']) for country in data] return labels, values ``` Luego en main.py mande a llamar la función que hice y utilice la funcion `generate_pie_chart()` del módulo charts.py ```js import utils import read_csv import charts def pie(): # Se leen datos data = read_csv.read_csv('./data.csv') # Se extrae el países y porcentaje de población muldial correspondiente labels, values = utils.get_world_population_percentage(data) # Grafica de pastel charts.generate_pie_chart(labels, values) if __name__ == '__main__': pie() ```
```js def read_csv_wp(path): with open(path, "r") as csvfile: fileCSV = csv.DictReader(csvfile,delimiter=',') objetos ={row["Country/Territory"]:float(row['World Population Percentage']) for row in fileCSV } return list(objetos.keys()),list(objetos.values()) labels, valores = read_csv_wp("./world_population.csv") print(labels) print(valores) generate_pie_char(labels, valores) ```
Yo hice lo siguente en el documento de utils para resolverlo: ```js def get_population_percentage(data): country_percentage = {} for i in range(len(data)): country_percentage[data[i]['Country/Territory']] = float(data[i]['World Population Percentage']) keys = country_percentage.keys() values = country_percentage.values() return keys, values ```Y desde el main solo lo mande a llamar: ```js labels, values = utils.get_population_percentage(data) charts.generate_pie_chart(labels, values) ```
Se me ocurrio hacer la siguente funcion en utils: labels, values = utils.get\_population\_percentage(data)    charts.generate\_pie\_chart(labels, values) ```js def get_population_percentage(data): country_percentage = {} for i in range(len(data)): country_percentage[data[i]['Country/Territory']] = float(data[i]['World Population Percentage']) keys = country_percentage.keys() values = country_percentage.values() return keys, values ```Y en el main solo lo mande a llamar: ```js labels, values = utils.get_population_percentage(data) charts.generate_pie_chart(labels, values) ```
Intenté resolverlo utilizando la siguiente función, pero el resultado no fue tan bueno como he visto en otros comentarios: ```python def population_by_year(data,year): country = [] population = [] for element in data: if year + " Population" in element: country.append(element['Country/Territory']) population.append(element[year + " Population"]) return country, population ```
Intenté resolverlo utilizando la siguiente función, pero el resultado no fue tan bueno como he visto en otros comentarios: ```python def population_by_year(data,year): country = [] population = [] for element in data: if year + " Population" in element: country.append(element['Country/Territory']) population.append(element[year + " Population"]) return country, population ```def population\_by\_year(data,year):    country = \[]    population = \[]    for element in data:        if year + " Population" in element:            country.append(element\['Country/Territory'])            population.append(element\[year + " Population"])                return country, population
Intenté resolverlo utilizando la siguiente función, pero el resultado no fue tan bueno como he visto en otros comentarios: ```python def population_by_year(data,year): country = [] population = [] for element in data: if year + " Population" in element: country.append(element['Country/Territory']) population.append(element[year + " Population"]) return country, population ```def population\_by\_year(data,year):    country = \[]    population = \[]    for element in data:        if year + " Population" in element:            country.append(element\['Country/Territory'])            population.append(element\[year + " Population"])                return country, population
Intenté resolverlo utilizando la siguiente función, pero el resultado no fue tan bueno como he visto en otros comentarios: ```js def population_by_year(data,year): country = [] population = [] for element in data: if year + " Population" in element: country.append(element['Country/Territory']) population.append(element[year + " Population"]) return country, population ```
Lo hice con esta función y me rompí mucho la cabeza, pero creo que no salio tan bien :Ddef population\_by\_year(data,year):    country = \[]    population = \[]    for element in data:        if year + " Population" in element:            country.append(element\['Country/Territory'])            population.append(element\[year + " Population"])                return country, population ```js def population_by_year(data,year): country = [] population = [] for element in data: if year + " Population" in element: country.append(element['Country/Territory']) population.append(element[year + " Population"]) return country, population ```
```python import utils import read_csv import charts def run(): Opciones = ('Asia', 'Africa', 'North America', 'South America', 'Europe', 'Oceania') data = read_csv.read_csv('./app/data.csv') El_print= input('Elige una opción (World o Country) => ') if El_print == 'World': print(Opciones) Continente = input('Ingrese el continente =>') if Continente in Opciones: data = list(filter(lambda item: item['Continent'] == Continente, data)) else: print('No se encuentra el continente, se imprimira la poblacion mundial') countries = list(map(lambda x: x['Country/Territory'], data)) percentages = list(map(lambda x: x['World Population Percentage'], data)) charts.generate_pie_chart(countries, percentages) elif El_print == 'Country': 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) if El_print != 'World' and El_print != 'Country': print('No es una opción valida') if __name__ == "__main__": run() ```import utils import read\_csv import charts def run(): Opciones = ('Asia', 'Africa', 'North America', 'South America', 'Europe', 'Oceania') data = read\_csv.read\_csv('./app/data.csv') El\_print= input('Elige una opción (World o Country) => ') if El\_print == 'World': print(Opciones) Continente = input('Ingrese el continente =>') if Continente in Opciones: data = list(filter(lambda item: item\['Continent'] == Continente, data)) else: print('No se encuentra el continente, se imprimira la poblacion mundial') countries = list(map(lambda x: x\['Country/Territory'], data)) percentages = list(map(lambda x: x\['World Population Percentage'], data)) charts.generate\_pie\_chart(countries, percentages) elif El\_print == 'Country': 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) if El\_print != 'World' and El\_print != 'Country': print('No es una opción valida') if \_\_name\_\_ == "\_\_main\_\_": run()
**Otra forma de resolver el desafío usando además la librería Pandas:**  import pandas as pd import matplotlib.pyplot as plt def plot\_population\_percentage():     # Leer el archivo CSV     df = pd.read\_csv('data\_country.csv')     # Filtrar los datos para los países de América del Sur     south\_america\_data = df\[df\['Continent'] == 'South America']     # Crear una lista con los porcentajes de población     population\_percentages = \[float(country\_data\['World Population Percentage']) for \_, country\_data in south\_america\_data.iterrows()]     countries = \[country\_data\['Country'] for \_, country\_data in south\_america\_data.iterrows()]     # Crear el gráfico de torta     plt.pie(population\_percentages, labels=countries, autopct='%1.1f%%')     plt.title('Porcentaje de población de los países de América del Sur')     plt.show() if \_\_name\_\_ == '\_\_main\_\_':     plot\_population\_percentage() ![](https://static.platzi.com/media/user_upload/image-a50058a7-cf89-463b-a03c-378dec9028e8.jpg)
mi solución: ```js def world_population(data): coun = [] pop = [] for country in data: coun.append(country['Country/Territory']) pop.append(country['World Population Percentage']) result = {country : pop for(country, pop) in zip(coun,pop)} label = result.keys() value = result.values() return label, value ```def world\_population(data): coun = \[] pop = \[] for country in data: coun.append(country\['Country/Territory']) pop.append(country\['World Population Percentage']) result = {country : pop for(country, pop) in zip(coun,pop)} label = result.keys() value = result.values() return label, value
```python import readCsv import char values = [] labels = [] data = readCsv.read_csv('./app/data.csv') for i in data: for key, value in i.items(): if key.endswith('Country'): labels.append(value) if key.endswith('Population Percentage'): value=float(value) values.append(value) print(values) print(labels) char.generate_pie_chart(labels, values) ```con los modulos de las clases anteriores
Para mi solución realicé 4 módulos 1. En el primer módulo obtuve la data, pero no completa sino que desde allí hice la selección de la información especifica que necesitaba en este caso el nombre del país y del porcentaje poblacional, por lo que tuve que obtener las columnas en base a su indice debido a que en el momento de recorrer las filas en reader nos entrega listas. Por último, le dí un formato de diccionario para agregarlo a la lista final y retornando la lista final con la información necesaria en formato de diccionario. ```python #Obteniendo la data import csv data = [] def getDataCSV(path): with open(path, "r") as fileCSV: readerCSV = csv.reader(fileCSV, delimiter=",") #Mover puntero a la fila 2 next(readerCSV) #Obtener datos for row in readerCSV: #Condición para filtrar los datos mayores a 2 if float(row[-1]) > 2: #Diccionario final con el país y el porcentaje finalD = \ { row[2]: float(row[-1]) } data.append(finalD) return data if __name__ == "__main__": dataEnd = getDataCSV("./data.csv") print(dataEnd) ```2. En el segundo módulo obtuve las llaves y los valores de los diccionarios obtenidos de la data que se ingresa.```python def convertData(data): # Lista para almacenar las claves y los valores keys = [] values = [] # Iterar sobre la lista de diccionarios y extraer las claves y los vaores for item in data: for key, value in item.items(): keys.append(key) values.append(value) return keys, values if __name__ == "__main__": data= [ {"Mexico": 100}, {"Argentina": 200}, {"Brazil": 300}, {"Colombia": 400} ] keys, values = convertData(data) print(keys) print(values) ```3. En el tercer módulo realicé la graficación. ```python import matplotlib.pyplot as plt def graphicData(values, labels): fig, ax = plt.subplots() #Mostrar los porcentajes ax.pie(values, labels=labels, autopct='%1.1f%%') #Graficar ax.axis('equal') plt.title('World Population Percentages') plt.show() if __name__ == "__main__": values = [10, 20, 30, 40] labels = ["Mexico", "Argentina", "Brazil", "Colombia"] graphicData(values, labels) ```4. En el cuarto y último módulo es mi punto de entrada, importe los módulos anteriores y ejecuté cada uno para finalmente obtener la gráfica deseada.```python import getData import graphic import utils def run(): data = getData.getDataCSV('./data.csv') keys, values = utils.convertData(data) graphic.graphicData(values, keys) if __name__ == '__main__': run() ```![](https://drive.google.com/file/d/1kcCE9Xj1cCvCR2cEZUTa80UXVUGr5GBO/view?usp=sharing)
Comparto mi solución previo a ver la solución del profesor: ```js import read_csv import charts data_path = './app/data.csv' raw_data = read_csv.read_csv(data_path) selected_column = 'World Population Percentage' labels = [x['Country/Territory'] for x in raw_data] values = [float(x[selected_column]) for x in raw_data] charts.generate_pie_chart(labels, values) ```
Comparto mi solución antes de ver la solución del profesor:import read\_csvimport charts data\_path = './app/data.csv'raw\_data = read\_csv.read\_csv(data\_path)selected\_column = 'World Population Percentage' labels = \[x\['Country/Territory'] for x in raw\_data]values = \[float(x\[selected\_column]) for x in raw\_data] charts.generate\_pie\_chart(labels, values) ```js import read_csv import charts data_path = './app/data.csv' raw_data = read_csv.read_csv(data_path) selected_column = 'World Population Percentage' labels = [x['Country/Territory'] for x in raw_data] values = [float(x[selected_column]) for x in raw_data] charts.generate_pie_chart(labels, values) ```
Para este reto cree esta nueva función en el archivo main.py: ```python def display_WorldPopulationPercentage(): #Obteniendo los porcentajes de todos los paises data = read_csv.read_csv('./app/data.csv') percentages = list( map(lambda value: float(value), utils.get_WorldPopulationPercentage(data))) #Obteniendo los nombres de todos los paises labels = utils.get_CountriesNames(data) charts.generate_pie_chart(labels, percentages) pass ```También agregué estas 2 funciones al archivo utils.py, posiblemente en una sola estaba bien, pero quise separarla en 2 casos ```js def get_WorldPopulationPercentage(data): percentages = list( map(lambda item: item['World Population Percentage'], data)) return percentages def get_CountriesNames(data): countries = list(map(lambda item: item['Country/Territory'], data)) return countries ```
similar al de alejo pero con el condicional ```js def get_percentage_by_continent(countries_dic, continent): country_percentage = [(d['Country/Territory'], d['World Population Percentage']) for d in countries_dic if d['Continent'] == continent] labels = [] values = [] print(country_percentage) for key, value in country_percentage: labels.append(key) values.append(value) return labels, values ``` country\_percentage = \[(d\['Country/Territory'], d\['World Population Percentage']) for d in countries\_dic if d\['Continent'] == continent] labels = \[] values = \[] print(country\_percentage) for key, value in country\_percentage: labels.append(key) values.append(value) return labels, values
2 horas tratando de solucionar el problema, y solo usando el 'map' y una lambda se podia solucionar!. Esto me esta costando mas de lo que esperaba
Igual que el ejercicio anterior, solamente me grafica Afghanistan. no lee más datos del csv, no he podido encontrar la solución a este problema.
```python def world_population_percentage(data): dicc_percentage = {} for country in data: country_name = country["Country/Territory"] population_percentage = country["World Population Percentage"] dicc_percentage[country_name] = population_percentage # Ordenar el diccionario por los valores (porcentaje de población) de mayor a menor world_population_percentage_sort = dict(sorted(dicc_percentage.items(), key=lambda item: item[1], reverse=True)) return world_population_percentage_sort ```def world\_population\_percentage(data): dicc\_percentage = {} for country in data: country\_name = country\["Country/Territory"] population\_percentage = country\["World Population Percentage"] dicc\_percentage\[country\_name] = population\_percentage \# Ordenar el diccionario por los valores (porcentaje de población) de mayor a menor world\_population\_percentage\_sort = dict(sorted(dicc\_percentage.items(), key=lambda item: item\[1], reverse=True)) return world\_population\_percentage\_sort
```js import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv("C:/Users/kathe/OneDrive/Desktop/Python/Data/population.csv") new_data = df[df["Continent"]=="South America"] plt.pie(new_data["World Population Percentage"], labels = new_data["Country/Territory"], autopct='%.2f'); plt.rcParams["figure.figsize"] = (6,5) ```import pandas as pd import matplotlib.pyplot as plt df = pd.read\_csv("C:/Users/kathe/OneDrive/Desktop/Python/Data/population.csv") new\_data = df\[df\["Continent"]=="South America"] plt.pie(new\_data\["World Population Percentage"], labels = new\_data\["Country/Territory"], autopct='%.2f'); plt.rcParams\["figure.figsize"] = (6,5)
![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202024-04-09%20a%20la%28s%29%209.34.16%20p.%C2%A0m.-d3c81aa7-f4b8-40fd-a0df-9b448bde09f1.jpg)
![](https://pbs.twimg.com/media/GKwnWGZXEAAqmZl?format=jpg\&name=4096x4096)
```python import read_csv import charts def run(): data = read_csv.read_csv('./world_population.csv') percentages = [] countries = [] for object in data: if float(object['World Population Percentage']) < 1.5: countries.append('') percentages.append(float(object['World Population Percentage'])) else: countries.append(f'{object["Country"]} {object["World Population Percentage"]}%') percentages.append(float(object['World Population Percentage'])) charts.generateCircularGraphic(countries, percentages) if __name__ == '__main__': run() ```![](https://pbs.twimg.com/media/GKwnWGZXEAAqmZl?format=jpg\&name=4096x4096)
Mi aporte como solución al reto: ```python import charts import read_csv def run(): data = read_csv.read_csv('./data.csv') country_keys = [] country_world_pop_perct = [] for country in data: country_keys.append(country['Country/Territory']) country_world_pop_perct.append(float(country['World Population Percentage'])) charts.generate_pie_chart(country_keys, country_world_pop_perct) if __name__ == '__main__': run() ```. . . ![](/media/sjlo/_backup/General/Information/platzi/Escuela_Datos/Entorno/comprehension_err_func/)Mi problema ahora es que no sé como hacer para que los textos saliesen más separados, pero el objetivo principal fue conseguido.
estube dos dias al primero me fruste porque en replit no me graficaba, vi a la gente del chat y copiaba y absorbia lo que colocaban y tampoco me daba solucion. inicie un chat con gpt y inicie desde cero me instale python en mi pc y empece a usar pip para instalar lo necesario pandas y plot algo asi al final se pudo con ayuda nose si esta mal usar la ia pero logre el objetivo ```python import pandas as pd import matplotlib.pyplot as plt # Paso 1: Leer el archivo CSV def read_csv(file_path): try: return pd.read_csv(file_path) except FileNotFoundError: print(f"Error: No se pudo encontrar el archivo '{file_path}'") return None except Exception as e: print(f"Error al leer el archivo CSV: {e}") return None # Paso 2: Obtener los datos de población para un país específico def get_population_data(data, country_code): try: country_data = data[data['CCA3'] == country_code] if country_data.empty: print(f"No se encontraron datos para el país con el código '{country_code}'.") return None population_data = country_data[['Country/Territory', '2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population']].iloc[0].to_dict() return population_data except Exception as e: print(f"Error al obtener los datos de población: {e}") return None # Función para que el usuario ingrese el código del país def input_country_code(): return input("Ingresa el código del país que deseas analizar (por ejemplo, 'AFG' para Afganistán): ") # Paso 3: Llamar a la función principal if __name__ == "__main__": # Leer el archivo CSV data = read_csv('world_population.csv') if data is not None: # Solicitar al usuario que ingrese el código del país country_code = input_country_code() # Obtener los datos de población para el país especificado population_data = get_population_data(data, country_code) if population_data is not None: # Imprimir los datos de población print(f"Datos poblacionales para el país con el código '{country_code}':") for year, population in population_data.items(): print(f"Año {year}: {population} habitantes") # Graficar los datos years = ['2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population'] populations = [population_data[year] * 1e-6 for year in years] # Convertir a millones de habitantes years.reverse() # Invertir el orden de los años populations.reverse() # Invertir el orden de las poblaciones plt.plot(years, populations, marker='o', color='blue') # Especificar el color de la línea plt.title(f"Crecimiento Poblacional de {population_data['Country/Territory']}") plt.xlabel('Año') plt.ylabel('Población (millones)') plt.grid(True) # Personalizar las marcas y etiquetas del eje y para mostrar los valores completos de población plt.yticks(plt.yticks()[0], [f'{tick:.1f}' for tick in plt.yticks()[0]]) plt.show() ```import pandas as pd import matplotlib.pyplot as plt \# Paso 1: Leer el archivo CSV def read\_csv(file\_path): try: return pd.read\_csv(file\_path) except FileNotFoundError: print(f"Error: No se pudo encontrar el archivo '{file\_path}'") return None except Exception as e: print(f"Error al leer el archivo CSV: {e}") return None \# Paso 2: Obtener los datos de población para un país específico def get\_population\_data(data, country\_code): try: country\_data = data\[data\['CCA3'] == country\_code] if country\_data.empty: print(f"No se encontraron datos para el país con el código '{country\_code}'.") return None population\_data = country\_data\[\['Country/Territory', '2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population']].iloc\[0].to\_dict() return population\_data except Exception as e: print(f"Error al obtener los datos de población: {e}") return None \# Función para que el usuario ingrese el código del país def input\_country\_code(): return input("Ingresa el código del país que deseas analizar (por ejemplo, 'AFG' para Afganistán): ") \# Paso 3: Llamar a la función principal if \_\_name\_\_ == "\_\_main\_\_": \# Leer el archivo CSV data = read\_csv('world\_population.csv') if data is not None: \# Solicitar al usuario que ingrese el código del país country\_code = input\_country\_code() \# Obtener los datos de población para el país especificado population\_data = get\_population\_data(data, country\_code) if population\_data is not None: \# Imprimir los datos de población print(f"Datos poblacionales para el país con el código '{country\_code}':") for year, population in population\_data.items(): print(f"Año {year}: {population} habitantes") \# Graficar los datos years = \['2022 Population', '2020 Population', '2015 Population', '2010 Population', '2000 Population', '1990 Population', '1980 Population', '1970 Population'] populations = \[population\_data\[year] \* 1e-6 for year in years] # Convertir a millones de habitantes years.reverse() # Invertir el orden de los años populations.reverse() # Invertir el orden de las poblaciones plt.plot(years, populations, marker='o', color='blue') # Especificar el color de la línea plt.title(f"Crecimiento Poblacional de {population\_data\['Country/Territory']}") plt.xlabel('Año') plt.ylabel('Población (millones)') plt.grid(True) \# Personalizar las marcas y etiquetas del eje y para mostrar los valores completos de población plt.yticks(plt.yticks()\[0], \[f'{tick:.1f}' for tick in plt.yticks()\[0]]) plt.show()
Esta es mi solucion para obtener la data ```js def get_data_countries_percent(): with open('./app/data.csv','r') as csvfile: reader = csv.reader(csvfile) next(reader) countries_dict={x[3]:float(x[-1]) for x in reader if x[4]=="North America"} return countries_dict ```

Se me ocurrió una forma más automática de mantener todas las funcionalidades y solicitar la información al usuario

# charts.py
import matplotlib.pyplot as plt

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()
#utils.py
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

def get_percent_all_countries(data):
    labels = []
    values = []
    for country in data:
        labels.append(country['Country/Territory'])
        values.append(country['World Population Percentage'])
    return labels, values

def get_population_by_continent(data, continent):
    labels = []
    values = []
    data = list(filter(lambda item: item['Continent'] == continent, data))
    for country in data:
        labels.append(country['Country/Territory'])
        values.append(country['2022 Population'])
    return labels, values
# main.py
import utils
import read_csv
import charts

def run():
    data = read_csv.read_csv('./world_population.csv')
    print('1. - Search a country')
    print('2. - World Population Percentage')
    print('3. - Countries Population by continent')
    
    option = int(input('Choose an option => '))
    if option == 1:
        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)
    elif option == 2:
        labels, values = utils.get_percent_all_countries(data)
        charts.generate_pie_chart(labels, values)
    elif option == 3:
        print('a) Africa')
        print('b) Asia')
        print('c) Europe')
        print('d) North America')
        print('e) South America')
        print('f) Oceania')
        option = input('Choose an option => ').lower()
        if option == 'a':
            labels, values = utils.get_population_by_continent(data, 'Africa')
            charts.generate_pie_chart(labels, values)
        elif option == 'b':
            labels, values = utils.get_population_by_continent(data, 'Asia')
            charts.generate_pie_chart(labels, values)
        elif option == 'c':
            labels, values = utils.get_population_by_continent(data, 'Europe')
            charts.generate_pie_chart(labels, values)
        elif option == 'd':
            labels, values = utils.get_population_by_continent(data, 'North America')
            charts.generate_pie_chart(labels, values)
        elif option == 'e':
            labels, values = utils.get_population_by_continent(data, 'South America')
            charts.generate_pie_chart(labels, values)
        elif option == 'f':
            labels, values = utils.get_population_by_continent(data, 'Oceania')
            charts.generate_pie_chart(labels, values)
        else:
            print('Invalid option... exiting')
        print(option)
    else:
            print('Invalid option... exiting')
        
        
if __name__ == '__main__':
    run()

reto solucionado

se me hizo accesible el reto, en mi caso no me acordada muy bien la estructura de lambda function: ```js import charts import read_csv def run(): data = read_csv.read_csv('./python_platzi/app/data.csv') data = list(filter(lambda item: item['Continent'] == 'South America',data)) world_Population_Percentage = [] country=[] for i in data: world_Population_Percentage.append(float(i['World Population Percentage'])) country.append(i['Country/Territory']) charts.generate_pie_chart(country,world_Population_Percentage) #si es ejecutado desde la terminal, entonces ejecuta run if __name__== '__main__': run() ```Aqui esta la gráfica: ![](https://static.platzi.com/media/user_upload/image-4841485c-c57a-405b-bb1a-a0e013d7bc97.jpg)
Asi lo hice yo, en el ultimo comentrion no se ve bien `import csv, matplotlib.pyplot as plt def world_population(path):    with open(path) as csvfile:        reader = csv.reader(csvfile, delimiter = ',')        next(reader)        #``countries , values = [row[3] for row in reader],[float(row[-1]) for row in reader]``        values = []        labels = []        for row in reader:            values.append(row[-1])            labels.append(row[2])        print(values)        print(labels)        fig ,ax = plt.subplots()        ax.pie(values, labels = labels)        ax.axis('equal')        plt.show()` `world_population('./data.csv')`
import csv, matplotlib.pyplot as plt def world\_population(path):    with open(path) as csvfile:        reader = csv.reader(csvfile, delimiter = ',')        next(reader)        #*countries , values = \[row\[3] for row in reader],\[float(row\[-1]) for row in reader]*        values = \[]        labels = \[]        for row in reader:            values.append(row\[-1])            labels.append(row\[2])        print(values)        print(labels)        fig ,ax = plt.subplots()        ax.pie(values, labels = labels)        ax.axis('equal')        plt.show() world\_population('./data.csv')
A alguien mas le sale este error cuando quiere visualizar el Output ? ![](https://static.platzi.com/media/user_upload/image-610c16e1-1096-495d-b311-d7bafcc2007a.jpg)
Se me complicó un poco las dos últimas clases, y sólo me salieron las respuestas apoyándome con la clase. Finalmente lo entendí pero creo que me faltan más ejercicios para practicar lo aprendido durante el curso.```js import utils import read_csv import charts def run(): data = read_csv.read_csv('./app/data.csv') data = list(filter(lambda item : item['Continent'] == 'South America', data)) countries = list(map(lambda item : item['Country/Territory'], data)) percentages = list(map(lambda item : item['World Population Percentage'], data)) charts.generate_pie_chart(countries, percentages) ```
Mi muy humilde solución...Pensé en otra solución como la dada por el profe pero esta fue la primera: `def read_csv(path): ` `with open(path,'r') as csvfile: reader = csv.reader(csvfile,delimiter=',') next(reader)` `dict={} ` `for row in reader: ` ` ` `dict[row[2]] = float(row[16]) ` `return(dict)`
Mi solución: ```python def get_column_word_population_percentage(data): labels = [country['Country/Territory'] for country in data] values = [float(country['World Population Percentage']) for country in data if 'World Population Percentage' in country] return labels,values ```
Yo use list Comprehension ```python import utils import read_csv import charts def run(): data = read_csv.read_csv('./data.csv') labels = [pais.get('Country/Territory') for pais in data] values = [porcentaje.get('World Population Percentage') for porcentaje in data] charts.generate_pie_chart(labels, values) if __name__ == '__main__': run() ```
```python import csv import matplotlib.pyplot as plt def print_chart(labels, values): fig, ax = plt.subplots() ax.pie(values, labels=labels) ax.axis('equal') plt.show() def run(): path = './data.csv' labels = [] values = [] 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} labels.append(country_dict['Country/Territory']) values.append(country_dict['World Population Percentage']) print_chart(labels, values) if __name__ == '__main__': run() ```
`def get_population_in_world(data):    labels = []    values = []    for country in data:        labels.append(country['Country/Territory'])        values.append(float(country['World Population Percentage']))    return labels,values`
def get\_population\_in\_world(data):    labels = \[]    values = \[]    for country in data:        labels.append(country\['Country/Territory'])        values.append(float(country\['World Population Percentage']))    return labels,values
```js def get_world_population(data): dict_world_pop = {item['Country/Territory']:item['World Population Percentage'] for item in data} labels = dict_world_pop.keys() values = dict_world_pop.values() return labels, values ```Esta es mi solucion, estaba teniendo un error en como le pasaba los argumentos a la funcion para obtener los graficos. Como estaba llamando a la funcion: get\_piechart(values,labels=labels) Como era en realidad get\_piechart(labels,values) Ojo con las llamadas a las funciones!
Por mi parte modifiqué el *read\_csv.py* para generar el diccionario con los datos que necesitaba de una vez, así: ```js 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} # El siguiente if es para el filtro, pero se puede quitar con toda libertad if country_dict['Continent'] == 'South America': data[country_dict['Country/Territory']] = country_dict['World Population Percentage'] return data if __name__ == '__main__': data = read_csv('./app/data.csv') print(data) ```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}            # El siguiente if es para el filtro, pero se puede quitar con toda libertad            if country\_dict\['Continent'] == 'South America':                data\[country\_dict\['Country/Territory']] = country\_dict\['World Population Percentage']        return data    if \_\_name\_\_ == '\_\_main\_\_':    data = read\_csv('./app/data.csv')    print(data) Lo único que agregué fue el bloque del if, y en otros archivos eliminé código que no necesitaba *utils.py :* ```js def get_population(country): return country.keys(), country.values() def population_by_country(data, country): result = list(filter(lambda item: item['Country/Territory'] == country, data)) return result ```*def* get\_population(*country*):    return country.keys(), country.values()    *def* population\_by\_country(*data*, *country*):    result = *list*(filter(*lambda* *item*: item\['Country/Territory'] == country, data))    return result y *main.py :* ```js def run(): data = read_csv.read_csv('./app/data.csv') if len(data) > 0: labels, values = utils.get_population(data) charts.generate_pie_chart(labels, values) if __name__ == '__main__': run() ```*def* run():    data = read\_csv.read\_csv('./app/data.csv')    if len(data) > 0:        labels, values = utils.get\_population(data)        charts.generate\_pie\_chart(labels, values) if \_\_name\_\_ == '\_\_main\_\_':    run()
```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_pie_chart(labels,values): fig,ax =plt.subplots() ax.pie(values,labels=labels) ax.axis('equal') plt.show() if __name__ =='__main__': data=read_csv('world_population.csv') Percentage = list(map(lambda item:item['World Population Percentage'],data)) Country = list(map(lambda item:item['Country/Territory'],data)) generare_pie_chart(Country,Percentage) ```![](https://static.platzi.com/media/user_upload/reto2-26ee9613-95aa-4a23-9af3-e6c38129482c.jpg)
![](https://static.platzi.com/media/user_upload/image-070660a8-20ee-4d3b-acd9-8563b7fd0b86.jpg)
Les dejo mi aporte: ```js import read_csv import charts def run(): dict_data = read_csv.read_csv('/home/jnog/Platzi/01_Python/02_comprehensions/app/data.csv') new_dict = dict(map(lambda data: (data["Country/Territory"], data["World Population Percentage"]), dict_data)) print(new_dict) labels = new_dict.keys() values = new_dict.values() charts.generate_pie_chart(labels, values) return labels, values if __name__ == '__main__': run() ```import read\_csvimport charts def run():    dict\_data = read\_csv.read\_csv('/home/jnog/Platzi/01\_Python/02\_comprehensions/app/data.csv')    new\_dict = dict(map(lambda data: (data\["Country/Territory"], data\["World Population Percentage"]), dict\_data))    print(new\_dict)    labels = new\_dict.keys()    values = new\_dict.values()    charts.generate\_pie\_chart(labels, values)    return labels, values if \_\_name\_\_ == '\_\_main\_\_':    run()
Mi solución es con un Diccionario en Compresión y con una modificación, pequeña. el parámetro "fuente" se refiere al mismo "data" Acá está mi función. ```js def paises_porcentaje(fuente): data_dict = {i['Country/Territory']: i['World Population Percentage'] for i in fuente if i['Continent']== 'South America'} etiquetas=list(data_dict.keys()) valores=list(data_dict.values()) return etiquetas,valores ```def paises\_porcentaje(fuente): data\_dict = {i\['Country/Territory']: i\['World Population Percentage'] for i in fuente if i\['Continent']== 'South America'} etiquetas=list(data\_dict.keys()) valores=list(data\_dict.values()) return etiquetas,valores
Quisiera aportar esta solución que permite al usuario digitar un valor para filtrar el porcentaje ```js #Filtrando data def country_percentage(data,filtervalue): db_1 = list(filter(lambda item:float(item['World Population Percentage'])>filtervalue,data)) #Extrayendo valores de paises y de porcentajes dejando en terminos flotantes wp = list(map(lambda i:float(i['World Population Percentage']),db_1)) country = list(map(lambda i:i['Country/Territory'],db_1)) return country,wp ft_value = float(input('Digite el porcentaje para filtrar los datos mayores a:' )) country,wp = country_percentage(db,ft_value) #Función creada previamente para el grafico de torta generate_piechart(country,wp) ```

Agregué dos líneas al if en main

y a ultils le agregué esta función

Mi aporte:

import csv
import matplotlib.pyplot as plt

def open_csv():
    with open('./world_population.csv', 'r') as file:
        reader = csv.reader(file, delimiter=',')
        header = next(reader)
        result = []
        for row in reader:
            response = list(zip(header, row))
            response = dict(response)
            result.append(response)
        return result

def get_populations():
    data = open_csv()
    population = []        
    for raw in data:
        population.append(
            [
                raw['Country/Territory'], float(raw['World Population Percentage']),
            ]
        )

    return population

def generate_pie_chart(population):
    labels = []
    values = []
    for country, value in population:
        labels.append(country)
        values.append(value)
    print(labels)
    print(values)
    fig, ax = plt.subplots()
    ax.pie(values, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
    ax.axis('equal')
    plt.show()


if __name__ == '__main__':
    generate_pie_chart(get_populations())
Esta la solución pero no se visualiza bien el gráfico, ya que se sobreponen los label de los países. alguien tiene alguna ida de cómo solucionar?? dejo acá un a captura.... (pd: más abajo el código) ![](https://static.platzi.com/media/user_upload/image-78fd373e-b74f-4e96-8296-48e803db6e0e.jpg) ```js import matplotlib.pyplot as plt import read_csv as read_files KEY = "Country/Territory" PERCENT = "World Population Percentage" def get_population(data, continent): data = list(filter (lambda x: x["Continent"] == continent, data)) contries = {item[KEY]: item[PERCENT] for item in data} return contries.keys(), contries.values() def generate_pie_char(labels, values): colors = ['#873E2E', '#586DA9', '#3BBD18','#7A1A8B', '#F00E32', '#AD5D19', '#93A3F3', '#40563F'] plt.pie(values, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90) plt.axis('equal') plt.show() if __name__ == '__main__': file_array = read_files.read_csv('./app/world_population.csv') c, p = get_population(file_array, 'South America') generate_pie_char( c, p ) ```import matplotlib.pyplot as plt import read\_csv as read\_files KEY = "Country/Territory" PERCENT = "World Population Percentage" def get\_population(data, continent): data = list(filter (lambda x: x\["Continent"] == continent, data)) contries = {item\[KEY]: item\[PERCENT] for item in data} return contries.keys(), contries.values() def generate\_pie\_char(labels, values): colors = \['#873E2E', '#586DA9', '#3BBD18','#7A1A8B', '#F00E32', '#AD5D19', '#93A3F3', '#40563F'] plt.pie(values, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90) plt.axis('equal') plt.show() if \_\_name\_\_ == '\_\_main\_\_': file\_array = read\_files.read\_csv('./app/world\_population.csv') c, p = get\_population(file\_array, 'South America') generate\_pie\_char( c, p )
Es interesante lo facil que se trabaja con estas funciones para el analisis de datos, agregue un par de filtros, ordene y acote la lista para apreciar mejor los graficos ![](https://static.platzi.com/media/user_upload/image-37127fe1-2d83-4264-b933-9807aebe3bad.jpg) ![](https://static.platzi.com/media/user_upload/image-604c67a7-c808-4ad2-8d50-b13cb8bd5ccb.jpg)
Les comparto la forma en que yo lo realicé, no agregué ningún filtro, por eso los países se ven así de amontonados. les comparto el codillo también en mi repositorio de GitHub: <https://github.com/LuisSantiago7/porcentaje_world_population> ![](https://static.platzi.com/media/user_upload/Captura%20de%20pantalla%202023-11-30%20a%20la%28s%29%203.48.41%E2%80%AFp.m.-1ea1025d-b580-492d-9fc2-f94b034cb4b7.jpg) ```js ###main.py import charts import read_csv if __name__ == '__main__': labels, values = read_csv.obtain_porcentage_world('PROYECTO DE PORCENTAJE MUNDIAL/world_population.csv') charts.generate_charts_pie(labels, values) ###charts.py import matplotlib.pyplot as plt def generate_charts_pie(labels, values): fig, ax = plt.subplots() ax.pie(values, labels=labels) ax.axis('equal') plt.show() ###read_csv.py import csv def obtain_porcentage_world(path): with open(path, 'r') as csvFile: reader = csv.DictReader(csvFile, delimiter = ',') country_porcentage_world = {} country_names = [] for row in reader: country = row['Country/Territory'] porcentage = float(row['World Population Percentage']) country_names.append(country) country_porcentage_world[country] = porcentage country_porcentage_world = dict(zip(country_names, country_porcentage_world.values())) return country_porcentage_world.keys(), country_porcentage_world.values() ```
buen dia campeon. satisfecho con el reto, \[repo github]\(https://github.com/brunomaldonado/World-Demographics "repo github") ![](https://static.platzi.com/media/user_upload/Screenshot%202023-11-24%20at%208.52.08%E2%80%AFPM-762e22e9-ddea-490d-8912-ed5e88101af7.jpg) ... mi solucion... ```js def generate_pie_chart(data, continent_): fig, ax = plt.subplots(figsize=(9, 6)) # world_population_percentage = [] # territories = [] population_percentage = [] countries = [] for idx, world_percentage in enumerate(data): percentage_ = world_percentage['World Population Percentage'] # world_population_percentage.append(percentage_) country = world_percentage['Country/Territory'] # territories.append(country) if world_percentage['Continent'] == str(continent_): # 'Asia' countries.append(world_percentage['Country/Territory']) population_percentage.append(world_percentage['World Population Percentage']) percentages = list(map(float, population_percentage)) percentage_continent_countries = {'Asia': 10, 'Europe': 12, 'Africa': 19, 'South America': 10, 'North America': 8, 'Oceania': 5} for key, value in percentage_continent_countries.items(): if key == str(continent_): top_countries = value explode_2d = [0.05] + [0] * (top_countries - 1) sorted_data = sorted(zip(percentages, countries), reverse=True) values, labels = zip(*sorted_data[:top_countries]) ax.pie(values, labels=labels, autopct='%1.1f%%', explode=explode_2d) # data = list(filter(lambda item: item['Continent'] == str(continent_), data)) # countries = list(map(lambda x: x['Country/Territory'], data)) # percentages = list(map(lambda x: x['World Population Percentage'], data)) # ax.pie(countries, labels=percentages, autopct='%1.1f%%') ax.axis('equal') continent_ = continent_.replace('Europe', 'European') continent_ = continent_.replace('South America', 'South American') continent_ = continent_.replace('North America', 'North American') continent_ = continent_.replace('Asia', 'Asian') continent_ = continent_.replace('Africa', 'African') plt.title(f"Percentage of population of the countries of the \n{continent_} continent", size=12, weight="bold", fontfamily="sans", color="#080404", horizontalalignment = "left", x=0.12, y=.9, transform = fig.transFigure) plt.legend() plt.show() ```def generate\_pie\_chart(*data*, *continent\_*): fig, ax = plt.subplots(*figsize*=(9, 6)) *# world\_population\_percentage = \[]* *# territories = \[]* population\_percentage = \[] countries = \[] for idx, world\_percentage in enumerate(*data*): percentage\_ = world\_percentage\['World Population Percentage'] *# world\_population\_percentage.append(percentage\_)* country = world\_percentage\['Country/Territory'] *# territories.append(country)* if world\_percentage\['Continent'] == str(*continent\_*): *# 'Asia'* countries.append(world\_percentage\['Country/Territory']) population\_percentage.append(world\_percentage\['World Population Percentage']) percentages = list(map(float, population\_percentage)) percentage\_continent\_countries = {'Asia': 10, 'Europe': 12, 'Africa': 19, 'South America': 10, 'North America': 8, 'Oceania': 5} for key, value in percentage\_continent\_countries.items(): if key == str(*continent\_*): top\_countries = value explode\_2d = \[0.05] + \[0] \* (top\_countries - 1) sorted\_data = sorted(zip(percentages, countries), *reverse*=True) values, labels = zip(\*sorted\_data\[:top\_countries]) ax.pie(values, *labels*=labels, *autopct*='%1.1f%%', *explode*=explode\_2d) *# data = list(filter(lambda item: item\['Continent'] == str(continent\_), data))* *# countries = list(map(lambda x: x\['Country/Territory'], data))* *# percentages = list(map(lambda x: x\['World Population Percentage'], data))* *# ax.pie(countries, labels=percentages, autopct='%1.1f%%')* ax.axis('equal') *continent\_* = *continent\_*.replace('Europe', 'European') *continent\_* = *continent\_*.replace('South America', 'South American') *continent\_* = *continent\_*.replace('North America', 'North American') *continent\_* = *continent\_*.replace('Asia', 'Asian') *continent\_* = *continent\_*.replace('Africa', 'African') plt.title(f"Percentage of population of the countries of the \n{*continent\_*} continent", *size*=12, *weight*="bold", *fontfamily*="sans", *color*="#080404", *horizontalalignment* = "left", *x*=0.12, *y*=.9, *transform* = fig.transFigure) plt.legend() plt.show()
Las list o dict comprehension nunca han sido mi fuerte, la manera en que yo lo solucioné fue así en el código main ```js import utils import read_csv import charts def run(): data=read_csv.read_csv("./app_2/world_population.csv") #print(data) population={} for i in data: #print(utils.world_population(i)) x, y=utils.world_population(i) #print(x,y) population[x]=y #print(population) charts.generate_pie_chart(population.keys(), population.values()) if __name__=="__main__": run() ```y así en el código utils ```js def world_population(data): for key, value in data.items(): if ("Country/Territory") in key: return value, float(data['World Population Percentage']) ```Espero le sirva a alguien
lo hice de la siguiente forma, cree una funcion que regrese las listas pais porcentaje , para ser usado de la siguiente forma: ![](https://static.platzi.com/media/user_upload/image-b75e805d-89c7-499c-a221-97358e453c40.jpg) y la implementacion de esta funcion es como se ve a continuacion: ![](https://static.platzi.com/media/user_upload/image-29a40856-3c50-436f-8dfc-7a304368fd84.jpg) en cada row , el pais esta en la posicion 2 de la lista y el porcentaje en el 16.

Me encanto este ejercicio de filtrar datos para mostrar un grafico. Es algo interesante para aprender.

Este fue la solución al reto, aproveché y también ordene los valores y gráfique los top 15 paises con más población y al resto lo dejé como “otros”

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)
    # print(data)
    return data

def llave(dict):
  # aquí lo que hago es que tomo la data del csv leido y hago un zip de dos list comprehension, una con los nombres del país y otra con el porcentaje de participación
  # a esto lo que hago es de una leerlo en un dictionary comprehension para poder ya tener el formato diccionario correcto con "pais: % population"
  popu = {key: value for key, value in list(zip([item['Country/Territory'] for item in dict], [float(item['World Population Percentage']) for item in dict]))}

  #luego lo que hago es crear otra variable para ordenar de mayor a menor la participación.
  # como al ordenarlo vuelve a quedar como una lista, vuelvo a hacer un dictionary comprehension con la lista de ordenamiento para tener el formato correcto.
  my_dict = {key: value for key, value in list(sorted(popu.items(), key=lambda item: item[1], reverse=True))}

  # luego creo una variable del top 15 de los paises y me lo traigo con [:15] ya que al estar ordenado me trae las 15 primeras  llaves y valores 
  top_15 = {key: value for key, value in list(my_dict.items())[:15] }

  # creo la variable del procentaje restante con una resta de la suma de dict values (el total) - la suma de valores de la variable que cree recién.
  porcentaje_restante = sum(my_dict.values()) - sum(top_15.values())

  #y lo que hago acá es agregar como "otros" el porcentaje resultante de la resta anterior para que el gráfico sea más amigable
  top_15["Otros"] = porcentaje_restante

  # creo los labels y values correspondientes para poder retornar y gráficar.
  paises = [x for x in top_15.keys()]
  world = [x for x in top_15.values()]

  # print(my_dict)
  # print(top_15)
  # print(porcentaje_restante)
  return paises, world

def generate_pie_chart(labels, values):
  fig, ax = plt.subplots()

  # Hemos agregado (auto porcentaje) autopct='%1.1f%%' al primer llamado de ax.pie en la función para que se muestren los porcentajes en formato de texto dentro de cada porción.
  # Luego, utilizamos la variable autotexts para modificar los valores de porcentaje y agregar el signo "%" al final.

  # La opción autopct en Matplotlib se utiliza para especificar el formato de presentación de los porcentajes dentro de las porciones de un gráfico de pastel.
  #Por ejemplo, autopct='%1.1f%%' significa que los porcentajes se presentarán con un formato que muestra un dígito antes del punto decimal y un dígito después del punto decimal,
  # seguido del signo "%" (por ejemplo, "12.3%").

  #startangle define en que grado se empezará a posicionar los valores en el caso de 180 china se empieza a graficar a las 9 horas reloj

  ax.pie(values, labels=labels, autopct='%1.1f%%', startangle=360)
  ax.axis('equal')

  # Agregar el número del porcentaje dentro de cada porción
  #   En un gráfico de pastel (pie chart) de Matplotlib, wedges, texts, y autotexts son variables que se obtienen cuando se llama a la función ax.pie() 
  # y se utilizan para personalizar y manipular elementos del gráfico. Aquí te explico brevemente el propósito de cada uno:

# wedges: Esta variable contiene información sobre las porciones individuales del gráfico de pastel. 
  #Puedes utilizar wedges para realizar cambios en el aspecto de las porciones, como colores, sombreado, bordes, etc.

  # texts: Esta variable contiene información sobre las etiquetas de las porciones. Puedes usar texts para personalizar las etiquetas, como cambiar su color, tamaño de fuente o posición.

# autotexts: Esta variable contiene información sobre los números del porcentaje que se muestran dentro de las porciones.
# Puedes utilizar autotexts para personalizar cómo se muestran los números del porcentaje, como el tamaño de fuente, el formato o la posición.

  wedges, texts, autotexts = ax.pie(values, labels=labels, autopct='', startangle=360)

  # for text, autotext in zip(texts, autotexts):
  #   autotext.set_text(f'{autotext.get_text()}%')
  #   autotext.set_fontsize(0.01)  # Ajusta el tamaño de la fuente aquí
  
  plt.show()

if __name__ == '__main__':

  final = llave(read_csv('./data.csv'))
  
  generate_pie_chart(final[0], final[1])
No mire la solucion del video todavia, pero esta es mi resultado. (casi explota replit xd) ![](https://static.platzi.com/media/user_upload/image-1f96aeaf-5688-4784-ae2a-6938f6cd2521.jpg) ```python def run(): data = read_csv.read_csv('./app/data.csv') countrys = [] values= [] for dict in data: country, value = utils.get_population_percentage(dict) countrys.append(country) values.append(value) print(countrys) charts.generate_pie_chart(countrys,values) ``````js def get_population_percentage(dict_country): country = dict_country['Country'] value = dict_country ['World Population Percentage'] return country,value ```
```js import read_csv import charts data = read_csv.read_csv('./app/data.csv') #column= input("que columna quiere revisar? ") world_population_percentage_list = [] countries_list =[] # Iterar a través de los diccionarios anidados en la lista 'data' for country_data in data: if 'World Population Percentage' in country_data: world_population_percentage = country_data['World Population Percentage'] world_population_percentage_list.append(world_population_percentage) if 'Country/Territory' in country_data: country_name = country_data['Country/Territory'] countries_list.append(country_name) values = world_population_percentage_list labels = countries_list charts.generate_pie_chart(labels,values) ````import read_csv` `import charts` `data = read_csv.read_csv('./app/data.csv')` `#column= input("que columna quiere revisar? ")` `world_population_percentage_list = []` `countries_list =[]` `# Iterar a través de los diccionarios anidados en la lista 'data'` `for country_data in data:` ` if 'World Population Percentage' in country_data:` ` world_population_percentage = country_data['World Population Percentage']` ` world_population_percentage_list.append(world_population_percentage)` ` if 'Country/Territory' in country_data:` ` country_name = country_data['Country/Territory']` ` countries_list.append(country_name)` ` ` `values = world_population_percentage_list` `labels = countries_list` `charts.generate_pie_chart(labels,values)`
Con este codigo es fácil obtener en una lista los porcentajes y paises `percentage = [x['World Population Percentage'] for x in data]` ` country = [x['Country/Territory'] for x in data]`
Recomiendo el curso : "Introducción al curso computacional". Al final tiene clases sobre el "test" o "Pruebas de caja negra". Puedes ver dónde tienes un "bug". Otra es preguntarle a Ada la "I.A, de Platzi"
Realicé un reto diferente. Utilicé una lista de productos de amazón. Uno de los problemas que tuve era : "convertir una cadena de texto vacía en un número de punto flotante". Esto, cuando al entrar a la lista tenía un "$". Tenía que quitarlo para que, pudiera leer el precio. Al final me salió. No pude agregar la imagen pero, les recomiendo usar : Google Colab (Te puede Graficar rápidamente). Lo recomiendo si quieres seguir practicando más. ```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) product_dict = {key:value for key, value in iterable} data.append(product_dict) return data if __name__ == "__main__": data = read_csv("/content/amazon_laptop_prices_v01.csv") print(data) ## # ========== # def clean_convert_price(price_str): clean_price = price_str.strip("$ ").replace(",", "") if clean_price == "": return None return float(clean_price) ## ======= ## prices = [clean_convert_price(product["price"]) for product in data] filtered_prices = [price for price in prices if price is not None] plt.bar(range(len(filtered_prices)), filtered_prices) plt.xlabel("Productos") plt.ylabel("Precios") plt.title("Gráfico de Precios de Productos") plt.show() ```import csvimport 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)      product\_dict = {key:value for key, value in iterable}      data.append(product\_dict)    return data if \_\_name\_\_ == "\_\_main\_\_":  data = read\_csv("/content/amazon\_laptop\_prices\_v01.csv")  print(data)   ## # ========== #  def clean\_convert\_price(price\_str):    clean\_price = price\_str.strip("$ ").replace(",", "")     if clean\_price == "":      return None     return float(clean\_price) \## ======= ##  prices = \[clean\_convert\_price(product\["price"]) for product in data]   filtered\_prices = \[price for price in prices if price is not None]   plt.bar(range(len(filtered\_prices)), filtered\_prices)  plt.xlabel("Productos")  plt.ylabel("Precios")  plt.title("Gráfico de Precios de Productos")   plt.show()
```python 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) product_dict = {key:value for key, value in iterable} data.append(product_dict) return data if __name__ == "__main__": data = read_csv("/content/amazon_laptop_prices_v01.csv") print(data) ## # ========== # def clean_convert_price(price_str): clean_price = price_str.strip("$ ").replace(",", "") if clean_price == "": return None return float(clean_price) ## ======= ## prices = [clean_convert_price(product["price"]) for product in data] filtered_prices = [price for price in prices if price is not None] plt.bar(range(len(filtered_prices)), filtered_prices) plt.xlabel("Productos") plt.ylabel("Precios") plt.title("Gráfico de Precios de Productos") plt.show() ```![](https://static.platzi.com/media/user_upload/datas-d4380a17-175b-465c-9d24-36816ff37658.jpg)
Yo, utilicé una lista de productos de Amazón: ```python 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) product_dict = {key:value for key, value in iterable} data.append(product_dict) return data if __name__ == "__main__": data = read_csv("/content/amazon_laptop_prices_v01.csv") print(data) ## # ========== # def clean_convert_price(price_str): clean_price = price_str.strip("$ ").replace(",", "") if clean_price == "": return None return float(clean_price) ## ======= ## prices = [clean_convert_price(product["price"]) for product in data] filtered_prices = [price for price in prices if price is not None] plt.bar(range(len(filtered_prices)), filtered_prices) plt.xlabel("Productos") plt.ylabel("Precios") plt.title("Gráfico de Precios de Productos") plt.show() ```import csvimport 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)      product\_dict = {key:value for key, value in iterable}      data.append(product\_dict)    return data if \_\_name\_\_ == "\_\_main\_\_":  data = read\_csv("/content/amazon\_laptop\_prices\_v01.csv")  print(data)   ## # ========== #  def clean\_convert\_price(price\_str):    clean\_price = price\_str.strip("$ ").replace(",", "")     if clean\_price == "":      return None     return float(clean\_price) \## ======= ##  prices = \[clean\_convert\_price(product\["price"]) for product in data]   filtered\_prices = \[price for price in prices if price is not None]   plt.bar(range(len(filtered\_prices)), filtered\_prices)  plt.xlabel("Productos")  plt.ylabel("Precios")  plt.title("Gráfico de Precios de Productos")   plt.show()
import csv
import matplotlib.pyplot as plt


def read_csv(ruta, continent):
    # convertir los datos en una lista de diccionarios
    with open(ruta) as f:
        reader = csv.reader(f)
        header = next(reader)

        paises = []
        for row in reader:
            dict_pais = {key: value for key, value in zip(header, row)}
            paises.append(dict_pais)

    # [[label],[value]]
    poblacion_mundial = [[], []]
    for pais in paises:
        # clasifico segun el continente seleccionado
        if pais['Continent'] == continent:
            # label
            cca3 = pais['CCA3']
            poblacion_mundial[0].append(cca3)

            # value
            porcentaje = pais['World Population Percentage']
            poblacion_mundial[1].append(porcentaje)

    return poblacion_mundial

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




if __name__ == '__main__':
    mis_datos = read_csv('./data.csv', 'South America')
    generate_pai_chart(mis_datos[0], mis_datos[1])

import utils2
import readCSV2
import graficas2

def run():
    
    data = readCSV2.readCsv("./proyectoPoblacionPais/data2.csv")

    columnCountries = list(map(lambda x : x["Country"], data)) 
    columnPorcentages = list(map(lambda x : x["World Population Percentage"], data))
    graficas2.generatePieChart(columnCountries, columnPorcentages)
    
if __name__ == '__main__':
    run()
import csv import matplotlib.pyplot as plt \# Leer el archivo CSV with open('world\_population.csv') as f: reader = csv.reader(f) header = next(reader) data = \[] for row in reader: data.append(row) \# Obtener la población mundial total sumando las poblaciones de todos los países world\_pop = 0 for row in data: world\_pop += int(row\[5]) print("Población mundial total:", world\_pop) \# Graficar los 10 países más poblados top10\_countries = sorted(data, key=lambda x: int(x\[5]), reverse=True)\[:10] pops = \[int(country\[5]) for country in top10\_countries] countries = \[country\[2] for country in top10\_countries] plt.bar(countries, pops) plt.title("10 Países Más Poblados") plt.ylabel("Población (millones)") plt.show() \# Graficar los continentes por porcentaje de población mundial continents = {} for row in data: cont = row\[3] pop = int(row\[5]) if cont in continents: continents\[cont] += pop else: continents\[cont] = pop sizes = \[pops/world\_pop\*100 for pops in continents.values()] labels = list(continents.keys()) plt.pie(sizes, labels=labels, autopct='%1.1f%%') plt.title("Población Mundial por Continente") plt.show()
import csv
def read_csv(path):
    with open(path,'r') as csvfile:
        reader=csv.reader(csvfile,delimiter=',')
        header=next(reader)
        
        data=[]
        #print(list(reader)[0])
        for row in reader:
            #print(row)
            iterable=zip(header,row)
            

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

data=read_csv('./data.csv')
new_data=[]
for i in data:
  country_labels=[value for key,value in i.items() if key=='Country' ]
  country_values=[value for key,value in i.items() if key=='World Population Percentage' ]
  #country['World Population Percentage']=i['World Population Percentage']
  array_vs=zip(country_labels,country_values)
  new_data.append(array_vs)
values=[]
labels=[]
for i in new_data:
  l,v=list(i)[0]
  values.append(v)
  labels.append(l)


import matplotlib.pyplot as plt

'''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()


generate_pie_chart(labels,values)import csv
def read_csv(path):
    with open(path,'r') as csvfile:
        reader=csv.reader(csvfile,delimiter=',')
        header=next(reader)
        
        data=[]
        #print(list(reader)[0])
        for row in reader:
            #print(row)
            iterable=zip(header,row)
            

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

data=read_csv('./data.csv')
new_data=[]
for i in data:
  country_labels=[value for key,value in i.items() if key=='Country' ]
  country_values=[value for key,value in i.items() if key=='World Population Percentage' ]
  #country['World Population Percentage']=i['World Population Percentage']
  array_vs=zip(country_labels,country_values)
  new_data.append(array_vs)
values=[]
labels=[]
for i in new_data:
  l,v=list(i)[0]
  values.append(v)
  labels.append(l)


import matplotlib.pyplot as plt

'''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()


generate_pie_chart(labels,values)

Creo que entendi mal ejerccicio, pero me salio algo interesante

def get_columna(columna_dicc):
  cantidad_camp=int(input('Digita el numero de campos :'))
  contador=0
  llaves=[]
  definiciones=[]
  while contador<cantidad_camp:
    b=str(contador+1)
    nombre_camp=input('Digita el nombre del campo '+b+': ')    
    llaves.append(nombre_camp)
    arreglo_def=columna_dicc[nombre_camp]
    definiciones.append(float(arreglo_def))
    contador+=1 
  columna_dict = dict(zip(llaves,definiciones))
  llaves=columna_dict.keys()
  valores=columna_dict.values()
  return llaves, valores  

import read_csv as r_csv
import charts as chrts

data = r_csv.read_csv('./data.csv')

countries = [ elem['Country'] for elem in data]

percentages = [ elem['World Population Percentage'] for elem in data]

chrts.generate_pie_chart(countries, percentages)

Les dejo mi pequeña aportacion.
Es diferente y aun se puede optimizar. Pero yo lo hice. Ja, ja.
Usando los recursos y lo aprendido en las clase anteriores.

''
import csv
import matplotlib.pyplot as plt

def read_csv(path):
  with open(path,'r') as csvfile:
    lectura = csv.reader(csvfile,delimiter=',')
    header = next(lectura)
    data = []
    for row in lectura: 
      iterable = zip(header, row)
      country_dictionary = {key: value for key, value in zip(header, row)}
      data.append(country_dictionary)
    return data

def ordered_lists(data):
  labels = []
  values = []
  continente = input('Que continente revisamos? ')
  for element in data:
    if element['Continent'] == continente:
      for item in element:
        if item == 'Country/Territory':
          labels.append(element[item])
        if item == 'World Population Percentage':
          values.append(float(element[item]))
  return labels, values

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

if __name__ == '__main__':
  data = read_csv('./csv/data.csv')
  labels, values = ordered_lists(data)
  barras = my_fist_piechart(labels, values)
'''

Utilicé esta función en mi módulo UTILS:

def get_world_population_percentage(data):
  countries = [country['Country/Territory'] for country in data]
  percentages = [country['World Population Percentage'] for country in data]
  return countries,percentages 

Posteriormente en mi archivo MAIN:

import utils
import read_csv
import charts

def run():
  data = read_csv.read_csv('./project/data.csv')
  labels,values = utils.get_world_population_percentage(data)
  charts.generate_pie_chart(labels,values)
  
if __name__ == '__main__':    #Ejecutar desde la terminal
  run()

Usando pandas y matplotlib:

df = pd.read_csv('world_population.csv') 
df2 = df.filter(['Country/Territory', 'World Population Percentage'])

fig, ax = plt.subplots()
ax.pie(df2['World Population Percentage'], labels = df2['Country/Territory'])
ax.axis('equal')
plt.show

Esta es mi solucion

import read_csv as re
import matplotlib.pyplot as plt

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

if name == ‘main’:
data = re.read_csv(’./app/data.csv’)
labels = list(map(lambda item: item[‘Country/Territory’], data))
values = list(map(lambda item: item[‘World Population Percentage’],data))

generate_pie_chart(labels, values)

Para el reto, creé una nueva función, en la cual selecciono de la lista de diccionarios, solo el nombre del país y su porcentaje de población, usando comprehensions

Aqui mi solucion:
.
.
.
.
.
.
.
.
.

import csv
import matplotlib.pyplot as plt


def population(path):
   # Tu código aquí 👇
   labels = []
   values = []

   with open(path, 'r') as csvfile:
      reader = csv.reader(csvfile, delimiter=',')
      print(next(reader))
   
      for row in reader:
        labels.append(row[2])
        values.append(float(row[16]))


  
   plt.pie(values, labels=labels)
   plt.show()