Skip to content
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()