• 107016, Москва, ул. Неглинная, д. 12, к. В, Банк России
  • 8 800 300-30-00
  • www.cbr.ru
Что вы хотите найти?

Примеры работы с API на Python и С#

Специалисты Банка России подготовили примеры программного кода на Python и C# для обращения к API Сервиса получения данных.
Используйте код на Python или C# для получения данных в соответствии перечнем показателей и публикаций.
Скачайте архив с примерами реализации методов, описанных в документации, ниже.

Скачать все примеры одним архивом

# Пример работы с API Сервиса получения данных по шагам
# аналогично реализации на демонстрационной странице сервиса
# http://www.cbr.ru/statistics/data-service/
# используется python 3.11

from asyncio.windows_events import NULL
import requests
import json 
from types import SimpleNamespace
import PivotExport as pe #дополнительный пакет для экспорта данных в CSV в виде простой таблицы

print("Пример работы с API Сервиса получения данных")
BASE_URL = 'http://www.cbr.ru/dataservice' #источник данных


# необходимо получить все параметры для основного запроса /data
# для этого последовательно получаем данные справочников


print("**** Список публикаций ****")
response = requests.get(f"{BASE_URL}/publications")
pe.SaveJsonToFile(response,"publications.json") # сохраяеем данные запроса в файл (для теста)
publicationObject= response.json(object_hook=lambda d: SimpleNamespace(**d))



for pbl in publicationObject:
    print(f"id:{pbl.id} title:{pbl.category_name} { ' - NoActive' if pbl.NoActive else '' }")
    
publId=-1 #id публикации
while True:
    try:
        publId=int(input("Введите id публикации:"))
        selPublItem = next((e for e in publicationObject if e.id == publId), None)
        if not selPublItem==None and not selPublItem.NoActive:
            break
        else:
            print ("Данного id не существует либо раздел не может быть выбран (NoActive)")
    except ValueError:
        print("ошибка! id должен быть числом...")

print(f"Для id публикации:{publId} нужно выбрать показатель из списка")
print("**** Список показателей  ****")
      
responseDS = requests.get(f"{BASE_URL}/datasets?publicationId={publId}")
pe.SaveJsonToFile(response,"datasets.json") # сохраяеем данные запроса в файл (для теста)
DSObject= responseDS.json(object_hook=lambda d: SimpleNamespace(**d))

for dsItem in DSObject:
    print(f"id:{dsItem.id}, title:{dsItem.name}")    

dsId=-1 #id показателя
while True:
    try:
        dsId=int(input("Введите id показателя:"))
        selDSItem = next((e for e in DSObject if e.id == dsId), None)
        if selDSItem is None:
            print("Данного id не существует")        
        else:
            currentTypeVal=selDSItem.type
            break
    except ValueError:
        print("ошибка! id должен быть числом...")


print("currentTypeVal",currentTypeVal)
melId=-1 # id разреза

if currentTypeVal == 1:
   print("**** Список разрезов  ****")
   responseME = requests.get(f"{BASE_URL}/measures?datasetId={dsId}")
   pe.SaveJsonToFile(response,"measures.json") # сохраяеем данные запроса в файл (для теста)
   MEObject= responseME.json(object_hook=lambda d: SimpleNamespace(**d)).measure
   for meItem in MEObject:
        print(f"id:{meItem.id}, title:{meItem.name}")
   while True:
       try: 
            melId=int(input("Введите id разреза:"))
            selMeItem = next((e for e in MEObject if e.id == melId), None)
            if selMeItem is None:
                print("Данного id не существует")        
            else:            
                break   
       except ValueError:
            print("ошибка! id должен быть числом...")
else:
    print("У этого показателя нет разрезов")


yaersParams = {'measureId': melId, 'datasetId': dsId}
responseYears = requests.get(f"{BASE_URL}/years", params=yaersParams) 
pe.SaveJsonToFile(response,"years.json") # сохраяеем данные запроса в файл (для теста)
yy=responseYears.json(object_hook=lambda d: SimpleNamespace(**d))[0]
print(f"\r\nИнформация доступна с {yy.FromYear} по {yy.ToYear} год")

FromYear=-1
ToYear=-1
while True:
    try:
        FromYear=int(input("Введите год начала периода:"))
        ToYear=int(input("Введите год окончания периода:"))
        if FromYear >= yy.FromYear and ToYear <= yy.ToYear:
            break
        else:
            print(f"\r\nИнформация доступна с {yy.FromYear} по {yy.ToYear} год")
    except ValueError:
        print("ошибка! год должен быть числом...")        


# Далее получаем массив данных
dataParams = {'y1': FromYear, 'y2': ToYear, 'publicationId' : publId, 'datasetId' : dsId, "measureId" : melId}
responseData = requests.get(f"{BASE_URL}/data", params=dataParams)
pe.SaveJsonToFile(responseData,"data.json") # сохраяеем данные запроса в файл (для теста)
pe.ExportDataToCSV (responseData.json(object_hook=lambda d: SimpleNamespace(**d)))

print("All done...")

using IO.Swagger.Api;
using IO.Swagger.Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestAppClientNew
{
    //  Пример использования методов, позволяюших получить данные сервиса одним запросом, используя массивы параметров.
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.OutputEncoding = Encoding.GetEncoding(1251);
            Console.WriteLine("Пример работы с API Сервиса получения данных с помощью методов categoryNew и dataNew ");

            var client = new DefaultApi(ConfigurationManager.AppSettings["ApiLink"]); // http://www.cbr.ru/dataservice/

            // Получаем каталог показателей
            var categories = client.CategoryNewGet();
            //foreach (var catObj in categories.Category)
            //{
            //    Console.WriteLine($"id:{catObj.CategoryId} title:{catObj.CategoryName} / {catObj.IndicatorName} indicator id: {catObj.IndicatorId}");
            //}
            
            using (var writer = new CsvWriter("categoryNew.csv"))
            {
                writer.WriteHeader();
                foreach (var catObj in categories.Category)
                {
                    writer.WriteRow(catObj);
                }
            }


            Console.WriteLine("**** Получаем данные одним запросом\r\n  пример: \"Денежно - кредитная статистика - Структура денежной массы\" - \"Денежный агрегат М2 + Широкая денежная масса\" \r\nc 2021 по 2023 ****");
            // для запроса DataNewGet:
            // categoryId = 5 - Денежно-кредитная статистика-Структура денежной массы
            // iIds=7 - Денежный агрегат М2 + + 
            // iIds=8 - Широкая денежная масса
            // y1 и y2 соотв. диапазон годов
            var simpleQ1 =client.DataNewGet(5, 2021, 2023, new List() { 7, 8 });

            using (var writer = new CsvWriter("data.csv"))
            {
                writer.WriteHeader();

                

                var ret = simpleQ1.RowData.Join(simpleQ1.Links,
                    p => new { p.IndicatorId, p.Measure1Id, p.Measure2Id, p.UnitId },
                    c => new { c.IndicatorId, c.Measure1Id, c.Measure2Id, c.UnitId },
                    (p,c) => new RowModel { 
                        date=p.Date,
                        periodicity = p.Periodicity,
                        indicator_name =c.IndicatorName,
                        measure1_name = c.Measure1Name,
                        measure2_name = c.Measure2Name,
                        obs_val = p.ObsVal,
                        un_name= c.UnName
                });
                foreach (var row in ret)
                { 
                    writer.WriteRow(row);
                }
            }



            Console.WriteLine("**** Получаем данные одним запросом с большей фильтрацией:\r\n Статистика процентных ставок - По депозитам - В целом по Российской Федерации\r\nc 2021 по 2023 ****");
            //categoryId = 18 - Статистика процентных ставок - По депозитам - В целом по Российской Федерации
            //iIds=38 - Ставки по вкладам (депозитам) нефинансовых организаций
            //m1Ids= [3,4] - выбираем данные в долларах(3) и евро(4), (параметр может отсуствовать)
            //m2Ids = [9,10] - для 9 - От 1 года до 3 лет, 10 - Свыше 3 лет, (параметр может отсуствовать)
            //y1 и y2 соотв. диапазон годов 2021-2023

            

            var simpleQ2 = client.DataNewGet(18, 2021, 2023, new List() {38}, new List() {3,4 }, new List() { 9, 10 });

            using (var writer = new CsvWriter("data2.csv"))
            {
                writer.WriteHeader();
                
                var ret = simpleQ2.RowData.Join(simpleQ2.Links,
                    p => new { p.IndicatorId,  p.Measure1Id,  p.Measure2Id, p.UnitId },
                    c => new {c.IndicatorId, c.Measure1Id, c.Measure2Id, c.UnitId},
                    (p, c) => new RowModel
                {
                    date = p.Date,
                    periodicity=p.Periodicity,
                    indicator_name = c.IndicatorName,
                    measure1_name = c.Measure1Name,
                    measure2_name = c.Measure2Name,
                    obs_val = p.ObsVal,
                    un_name = c.UnName
                });
                foreach (var row in ret)
                {
                    writer.WriteRow(row);
                }
            }



            Console.WriteLine("Все готово...");


        }
    }
}

Страница была полезной?
Последнее обновление страницы: 25.02.2025