Skip to content
DA-07-10-25-lesson2
import requests
import json
import csv
from datetime import datetime, timedelta
import os
import pandas as pd
import time
def load_data_into_dataframe(url):
"""
Завантажує JSON-дані за вказаним URL і перетворює їх у pandas DataFrame.
Параметри:
- url (str): URL для завантаження JSON-даних.
Повертає:
- pd.DataFrame: DataFrame, що містить завантажені дані.
"""
headers = {"accept": "application/json"}
try:
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Failed to fetch data: {e}")
return None
# Зчитуємо JSON дані з відповіді
data = response.json()
# Завантажуємо дані в pandas DataFrame
df = pd.DataFrame(data)
return df
def get_public_finance_transactions_function(current_date, max_retries=3, backoff_factor=2):
print("Processing for date:", current_date)
timestamp_str = current_date.strftime("%Y-%m-%d_%H-%M-%S")
start_date = (current_date - timedelta(days=1)).strftime("%Y-%m-%d")
end_date = (current_date - timedelta(days=1)).strftime("%Y-%m-%d")
url = "https://api.spending.gov.ua/api/v2/api/transactions/"
params = {"startdate": start_date, "enddate": end_date}
headers = {"accept": "application/json"}
for attempt in range(max_retries):
try:
response = requests.get(url, params=params, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
df = pd.DataFrame(data)
return df
except requests.exceptions.RequestException as e:
print(f"Attempt {attempt+1} failed: {e}")
if attempt < max_retries - 1:
sleep_time = backoff_factor ** attempt
print(f"Retrying in {sleep_time} seconds...")
time.sleep(sleep_time)
else:
print("Max retries reached. Returning None.")
return None
if __name__ == "__main__":
date = datetime(2025, 10, 28) # Встановлюємо дату для отримання даних
# Отримуємо транзакції з публічного фінансового API на задану дату
data_from_public_finance_api = get_public_finance_transactions_function(date)
print(type(data_from_public_finance_api))
if data_from_public_finance_api is not None:
print(data_from_public_finance_api.shape)
# Виводимо перші 5 рядків отриманих даних
print(data_from_public_finance_api.head())
# Виводимо інформацію про дані (кількість ненульових значень, типи даних тощо)
print(data_from_public_finance_api.info())
# Отримуємо список стовпців набору даних
columns = list(data_from_public_finance_api.columns)
print(columns) # Виводимо список стовпців
else:
print("No data was loaded from the API.")# Виводимо інформацію про дані (кількість ненульових значень, типи даних тощо)
data_from_public_finance_api.info() # Отримуємо список стовпців набору даних
columns = list(data_from_public_finance_api.columns)
print(columns) # Виводимо список стовпців# Перевіряємо типи даних у кожній колонці
print("Типи даних колонок: ")
print(data_from_public_finance_api.dtypes)import pandas as pd
import requests
import matplotlib.pyplot as plt
# Функція для завантаження даних з JSON API у DataFrame
def load_data_into_dataframe(url):
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
# Якщо дані - це словник з ключем 'data', беремо його, інакше - сам список
# FIX: Додаємо перевірку, якщо data - це словник, беремо його значення
if isinstance(data, dict):
# Якщо є ключ 'data', беремо його, інакше беремо всі значення словника
if 'data' in data:
data = data['data']
else:
# Якщо словник, але без 'data', беремо всі значення як список
data = list(data.values())
return pd.DataFrame(data)
except Exception as e:
print(f"Помилка при завантаженні даних: {e}")
return None
# Довідник регіонів в JSON форматі за посиланням
data_url = "https://api.spending.gov.ua/api/v2/dictionaries/regions"
# Використання функції load_data_into_dataframe для завантаження Довідника регіонів
data_region_info = load_data_into_dataframe(data_url)
# Додаємо перевірку, чи не повернула функція None
if data_region_info is None:
raise ValueError("load_data_into_dataframe повернула None. Перевірте реалізацію функції та джерело даних.")
print(data_region_info.info())
# Для прикладу створимо data_from_public_finance_api з фіктивними даними
# (В реальному випадку цей DataFrame має бути отриманий з іншого джерела)
data_from_public_finance_api = pd.DataFrame({
'region_id': data_region_info['regionCode'].sample(20, replace=True).values
})
# Злиття даних за допомогою поля region_id (regionCode)
merged_data = pd.merge(
data_from_public_finance_api,
data_region_info,
left_on='region_id',
right_on='regionCode',
how='inner'
)
merged_data = merged_data[merged_data['regionName'] != 'м.Київ']
print(merged_data.info())
# Налаштування matplotlib для коректного відображення українських символів
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['axes.unicode_minus'] = False
# Побудова діаграми
merged_data['regionName'].value_counts().plot.pie(autopct='%1.1f%%', startangle=140)
plt.ylabel('') # Видаляємо мітку осі y для кращого вигляду
plt.title('Розподіл за регіонами')
plt.show()