Блог им. Albus
# -*- coding: utf-8 -*- import matplotlib import matplotlib.pyplot as plt from matplotlib.ticker import FuncFormatter import wbdata as wb from datetime import * import time import collections import operator indicator="NY.GDP.MKTP.PP.KD" #код нужного индикатора. В данном случае это ВВП по паритету. Этот код можно взять с сайта Всемирного банка. Буквы в конце адреса: https://data.worldbank.org/indicator/NY.GDP.MKTP.PP.KD all_countries=[] #в этот список положим все страны, которые есть в базе Всемирного банка. bulk_years={} #сюда положим все страны и годы, за которые есть история по этому показателю. for item in wb.get_country(): #wb.get_country()-функция позволяет закачать описание всех стран. region=item['region']['value'] #получаем географический регион if region!='Aggregates': #если прилетела не страна, а "Страны Африки" или "Ближний Восток", то в описании этого параметра будет слово 'Aggregates'. Игнорируем такие данные. Нам нужны только страны. all_countries.append(item['iso2Code']) #добавили в all_countries очередной тикер страны. print('Получили список всех стран') print(all_countries) print("Начинаем закачку большого массива данных с сайта Всемирного Банка. Ожидайте...") for item in wb.get_data(indicator=indicator):#функцией wb.get_data получаем огромный объём сырых данных по этому индикатору (там много не нужного). Там будут все страны и регионы, все годы по выбранному показателю+куча левых полей. Сюда снова прольются не только страны, но и регионы типа "Юго-Восточная Азия". Их надо будет выбрасывать. id=item['country']['id'] #получаем id прилетевшей страны или региона. if id in all_countries: #если этот id есть в нашем заготовленном списке стран all_countries, значит это страна. Мы его берём. Иначе - это регион, и он нам не нужен. strana=item['country']['value'] #получаем название страны. god=int(item['date']) #получаем прилетевший год znach=item['value'] #получаем прилетевшее значение ВВП по паритету. if znach: #в некоторых случаях в качестве ВВП прилетает не цифра, а None - нет значения. None игнорируем. try: #в большом словаре bulk_years будут маленькие словари для каждой страны bulk_years[strana][god]=znach except KeyError: bulk_years[strana]={} bulk_years[strana][god]=float(znach) #Первая очистка данных завершена. bulk_years содержит полезные данные: страна, год, ВВП за этот год. #Очистка данных продолжается. Сейчас самый свежий год, за который есть данные - 2017. Но полно стран, у которых последний год, за который подсчитан ВВП - 2011, 2013 или ещё раньше. Нам надо взять самый свежий год и составить более короткий словарь: "страна : самый свежий ВВП" country_values={} #это и будет словарь "страна : самый свежий ВВП" for k,v in bulk_years.items(): #перебираем предыдущий словарь. #здесь k - это страна, например Афганистан, v - мини-словарь "год : ВВП за этот год" max_year=0 #задаём обнуление года for x,y in v.items(): #перебираем мини-словарь. Ищем самый свежий год. if x>max_year: max_year=x value=y country_values[k]=float(value) #записываем ВВП за самый свежий год. #Очистка данных полностью завершена. У нас получился словарь country_values с такими данными: {Страна : самый свежий ВВП} print("Очистка завершена. Чистый словарь:") for k,v in country_values.items(): print(k+" : "+str(v)) #теперь полученный чистый массив надо отсортировать по убыванию. Самые крупные страны в начале, самые мелкие в конце: sorted_d = sorted(country_values.items(), key=operator.itemgetter(1), reverse = True) #нам нужны не все страны, а только 10 самых крупных. sorted_d=sorted_d[0:10] #это новый список из 10 самых крупных стран. Внутри списка сидят кортежи вида "страна, ВВП". Кортеж - это список, который нельзя изменить. print("Самые крупные страны определены:") print(sorted_d) # x=[] #в этот список запишем названия стран. Это горизонтальная ось. y=[] #в этот список запишем значения ВВП. Это вертиальная ось. for _tuple in sorted_d: #перебираем кортежи внутри списка. strana=_tuple[0] #получили страну if strana=='Russian Federation': strana='Russia' pokazatel=_tuple[1] #получили ВВП y.append(pokazatel) #записали ВВП для рисования на вертикальной оси. x.append(strana) #записали страну для рисования на горизонтальной оси. #Эта функция превратит триллионы на вертикальной оси в надписи 5 Trill, 10 Trill def trillions(x, pos): 'The two args are the value and tick position' return '$%1.1i Trill' % (x * 1e-12) #trillions formatter = FuncFormatter(trillions) fig, ax = plt.subplots() ax.yaxis.set_major_formatter(formatter) plt.xlabel('Страны', fontsize=10) #рисуем подпись на горизонтальной оси. plt.ylabel('ВВП', fontsize=10)#рисуем подпись на вертикальной оси. plt.bar(x, y) #формируем столбики диаграммы. plt.title('ВВП по ППС (Всемирный банк), трлн.$', fontsize=20) #заголовок графика for i, v in enumerate(x): #в центр каждого столбика запишем значение ВВП. val=round(y[i]/1000000000000,1) plt.text(i,y[i]/2, val, color='white', ha='center', fontweight='bold', fontsize=18) plt.show() #показать график на экране. #ВСЁ!Удачи в освоении Питона!
Картинка с Италией прям в душу ударила.
Для программирования в браузере можете взять джаваскрипт, там все так же подключается как и в этом Вашем CSS.
Что дали, тем и пользуетесь, какие функции реализованы, такие доступны
ну давай-ка попробуй сделать тоже самое без wbdata api
я ещё jupyter notebook освоил. рекомендую.
позволяет исполнять код по кусочкам,
ставится не сложнее самого питона.
после этого можно импортить всякие датасайенс проекты прямо в виде jupyther notebook
big data is peace data
выдала значение None (пустота). Может быть у вас интернет прерывается и комп не может достучаться до сервера.
import wbdata as wb
что он интересно выдаст.print(wb.get_country())
На этом программа прервалась
Перепишите в таком виде:
И скорее всего заработает, но выдаст рейтинг вместе с регионами типа «Весь мир», «Страны Америки», «Ближний Восток»