Примеры работы с 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