Skip to content
Snippets Groups Projects
Commit e69af998 authored by Andrii Skyba's avatar Andrii Skyba
Browse files

lab 4,5,6

parent 31f42551
Branches main
No related tags found
No related merge requests found
%% Cell type:code id:37adaf49-0222-4be7-8977-5957e21e6792 tags:
``` python
!pip install xlrd
```
%% Output
Collecting xlrd
Downloading xlrd-2.0.1-py2.py3-none-any.whl.metadata (3.4 kB)
Downloading xlrd-2.0.1-py2.py3-none-any.whl (96 kB)
Installing collected packages: xlrd
Successfully installed xlrd-2.0.1
%% Cell type:code id:687a9237-70e6-4c71-9f07-b2312dd79040 tags:
``` python
!pip install openpyxl
```
%% Output
Collecting openpyxl
Downloading openpyxl-3.1.5-py2.py3-none-any.whl.metadata (2.5 kB)
Collecting et-xmlfile (from openpyxl)
Downloading et_xmlfile-2.0.0-py3-none-any.whl.metadata (2.7 kB)
Downloading openpyxl-3.1.5-py2.py3-none-any.whl (250 kB)
Downloading et_xmlfile-2.0.0-py3-none-any.whl (18 kB)
Installing collected packages: et-xmlfile, openpyxl
Successfully installed et-xmlfile-2.0.0 openpyxl-3.1.5
%% Cell type:code id:af57f689-9056-483e-b262-81a4561030c9 tags:
``` python
# Імпорт необхідних бібліотек
import pandas as pd
import numpy as np
# Завантаження файлу Excel
file_path = 'C:/Users/skiba/python_khpi/En_In.xls'
energy_data = pd.read_excel(file_path, skiprows=17, usecols="C:F")
# Перейменування стовпців
energy_data.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']
# Перетворення 'Energy Supply' у ГДж, заміна '...' на NaN
energy_data['Energy Supply'] = pd.to_numeric(energy_data['Energy Supply'], errors='coerce') * 1_000_000
# Очищення назв країн від цифр та тексту в дужках
energy_data['Country'] = energy_data['Country'].str.replace(r'\d+|\(.*\)', '', regex=True).str.strip()
# Перейменування вказаних країн
country_renames = {
"Republic of Korea": "South Korea",
"United States of America": "United States",
"United Kingdom of Great Britain and Northern Ireland": "United Kingdom",
"China, Hong Kong Special Administrative Region": "Hong Kong"
}
energy_data['Country'] = energy_data['Country'].replace(country_renames)
# Фільтрація для перевірки результату (American Samoa, South Korea, Bolivia)
filtered_countries = energy_data.loc[energy_data['Country'].isin(['American Samoa', 'South Korea', 'Bolivia'])]
filtered_countries
```
%% Output
Country Energy Supply Energy Supply per Capita % Renewable
3 American Samoa NaN ... 0.641026
24 Bolivia 3.360000e+08 32 31.477120
164 South Korea 1.100700e+10 221 2.279353
%% Cell type:code id:c4b4031d-5205-44e0-b0fa-e3585b18ec53 tags:
``` python
import pandas as pd
gdp_data = pd.read_csv('C:/Users/skiba/python_khpi/gpd.csv', skiprows=4)
country_renames = {
"Korea, Rep.": "South Korea",
"Iran, Islamic Rep.": "Iran",
"Hong Kong SAR, China": "Hong Kong"
}
gdp_data['Country Name'] = gdp_data['Country Name'].replace(country_renames)
gdp_data.head(1)
```
%% Output
Country Name Country Code Indicator Name \
0 Aruba ABW GDP at market prices (constant 2010 US$)
Indicator Code 1960 1961 1962 1963 1964 1965 ... 2006 2007 2008 \
0 NY.GDP.MKTP.KD NaN NaN NaN NaN NaN NaN ... NaN NaN NaN
2009 2010 2011 2012 2013 2014 2015
0 NaN 2.467704e+09 NaN NaN NaN NaN NaN
[1 rows x 60 columns]
%% Cell type:code id:22abd678-8561-410c-ab1d-58ee49394567 tags:
``` python
import pandas as pd
scimago_data = pd.read_excel('C:/Users/skiba/python_khpi/scimagojr.xlsx')
scimago_top15 = scimago_data[scimago_data['Rank'] <= 15]
energy_data = pd.read_excel('C:/Users/skiba/python_khpi/En_In.xls', skiprows=17, usecols="C:F")
energy_data.columns = ['Country', 'Energy Supply', 'Energy Supply per Capita', '% Renewable']
energy_data['Energy Supply'] = pd.to_numeric(energy_data['Energy Supply'], errors='coerce') * 1_000_000
energy_data['Country'] = energy_data['Country'].str.replace(r'\d+|\(.*\)', '', regex=True).str.strip()
country_renames = {
"Republic of Korea": "South Korea",
"United States of America": "United States",
"United Kingdom of Great Britain and Northern Ireland": "United Kingdom",
"China, Hong Kong Special Administrative Region": "Hong Kong"
}
energy_data['Country'] = energy_data['Country'].replace(country_renames)
gdp_data = pd.read_csv('C:/Users/skiba/python_khpi/gpd.csv', skiprows=4)
gdp_data.rename(columns={'Country Name': 'Country'}, inplace=True)
gdp_filtered = gdp_data[['Country', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015']]
gdp_country_renames = {
"Korea, Rep.": "South Korea",
"Iran, Islamic Rep.": "Iran",
"Hong Kong SAR, China": "Hong Kong"
}
# Заміна назв країн у GDP із використанням .loc
gdp_filtered.loc[:, 'Country'] = gdp_filtered['Country'].replace(gdp_country_renames)
# Об'єднання даних
merged_data = scimago_top15.merge(energy_data, how='inner', on='Country')
merged_data = merged_data.merge(gdp_filtered, how='inner', on='Country')
final_columns = ['Rank', 'Documents', 'Citable documents', 'Citations', 'Self-citations',
'Citations per document', 'H index', 'Energy Supply', 'Energy Supply per Capita',
'% Renewable', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015']
final_data = merged_data.set_index('Country')[final_columns]
print(final_data.shape)
final_data.head(3)
```
%% Output
(15, 20)
Rank Documents Citable documents Citations Self-citations \
Country
China 1 127050 126767 597237 411683
United States 2 96661 94747 792274 265436
Japan 3 30504 30287 223024 61554
Citations per document H index Energy Supply \
Country
China 4.70 138 1.271910e+11
United States 8.20 230 9.083800e+10
Japan 7.31 134 1.898400e+10
Energy Supply per Capita % Renewable 2006 \
Country
China 93 19.75491 3.992331e+12
United States 286 11.57098 1.479230e+13
Japan 149 10.23282 5.496542e+12
2007 2008 2009 2010 \
Country
China 4.559041e+12 4.997775e+12 5.459247e+12 6.039659e+12
United States 1.505540e+13 1.501149e+13 1.459484e+13 1.496437e+13
Japan 5.617036e+12 5.558527e+12 5.251308e+12 5.498718e+12
2011 2012 2013 2014 \
Country
China 6.612490e+12 7.124978e+12 7.672448e+12 8.230121e+12
United States 1.520402e+13 1.554216e+13 1.577367e+13 1.615662e+13
Japan 5.473738e+12 5.569102e+12 5.644659e+12 5.642884e+12
2015
Country
China 8.797999e+12
United States 1.654857e+13
Japan 5.669563e+12
%% Cell type:code id:e1294e32-5a5b-4632-aaed-f247d7c944cb tags:
``` python
def task_eight(data):
# Обчислення середнього значення ВВП за період з 2006 по 2015 рік
avg_gdp = data.loc[:, '2006':'2015'].mean(axis=1)
# Сортування за спаданням
avg_gdp_sorted = avg_gdp.sort_values(ascending=False)
avg_gdp_sorted.name = 'avgGDP'
return avg_gdp_sorted
task_eight_result = task_eight(final_data)
task_eight_result
```
%% Output
Country
United States 1.536434e+13
China 6.348609e+12
Japan 5.542208e+12
Germany 3.493025e+12
France 2.681725e+12
United Kingdom 2.487907e+12
Brazil 2.189794e+12
Italy 2.120175e+12
India 1.769297e+12
Canada 1.660647e+12
Russian Federation 1.565459e+12
Spain 1.418078e+12
Australia 1.164043e+12
South Korea 1.106715e+12
Iran 4.441558e+11
Name: avgGDP, dtype: float64
%% Cell type:code id:c303dc26-4820-49af-bf8e-b504883c9c39 tags:
``` python
# Функція для обчислення зміни ВВП для країни з 5-м найвищим середнім ВВП
def task_nine(data):
# Обчислення середнього ВВП кожної країни за останні 10 років та сортування за спаданням
avg_gdp = data.loc[:, '2006':'2015'].mean(axis=1).sort_values(ascending=False)
# Отримання країни з 5-м найвищим середнім ВВП
fifth_country = avg_gdp.index[4]
# Обчислення зміни ВВП за останні 10 років для цієї країни
gdp_change = data.loc[fifth_country, '2015'] - data.loc[fifth_country, '2006']
return (fifth_country, gdp_change)
task_nine_result = task_nine(final_data)
task_nine_result
```
%% Output
('France', 153345695364.24023)
%% Cell type:code id:0f5c8f0e-f124-43bb-8181-9a77c0e959ff tags:
``` python
# Функція для визначення країни з максимальним відсотком поновлюваних джерел енергії
def task_ten(data):
# Знаходимо країну з найбільшим % Renewable
max_renewable_country = data['% Renewable'].idxmax()
# Отримуємо значення максимального % Renewable
max_renewable_value = data.loc[max_renewable_country, '% Renewable']
return (max_renewable_country, max_renewable_value)
task_ten_result = task_ten(final_data)
task_ten_result
```
%% Output
('Brazil', 69.64803)
%% Cell type:code id:3d83b785-0fad-4101-99af-88bda4360a73 tags:
``` python
# Функція для оцінки чисельності населення та визначення шостої країни за населенням
def task_eleven(data):
# Оцінка чисельності населення
data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']
# Сортування за населенням за спаданням
sorted_population = data['Estimated Population'].sort_values(ascending=False)
# Отримання 6-ї країни за населенням
sixth_country = sorted_population.index[5]
sixth_population = sorted_population.iloc[5]
return (sixth_country, sixth_population)
task_eleven_result = task_eleven(final_data)
task_eleven_result
```
%% Output
('Japan', 127409395.97315437)
%% Cell type:code id:4b01c65d-49cd-4a01-a7d1-e7c024543761 tags:
``` python
# Функція для обчислення кореляції між цитованими документами на душу населення та енергопостачанням на душу населення
def task_twelve(data):
# Оцінка чисельності населення
data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']
# Обчислення цитованих документів на душу населення
data['Cited Documents per Capita'] = data['Citable documents'] / data['Estimated Population']
# Переконуємося, що дані числові, і видаляємо пропущені значення
data_cleaned = data[['Cited Documents per Capita', 'Energy Supply per Capita']].dropna()
data_cleaned = data_cleaned.apply(pd.to_numeric, errors='coerce').dropna() # Забезпечуємо числовий тип даних
# Обчислення кореляції
correlation = data_cleaned['Cited Documents per Capita'].corr(data_cleaned['Energy Supply per Capita'])
return correlation
task_twelve_result = task_twelve(final_data)
task_twelve_result
```
%% Output
0.7940010435442946
%% Cell type:code id:cfb7eaa8-6bc1-4df5-99ad-bf373fd8124d tags:
``` python
# Функція для створення нового стовпця на основі медіани % Renewable
def task_thirteen(data):
# Обчислення медіани для % Renewable
renewable_median = data['% Renewable'].median()
# Створення нового стовпця: 1, якщо % Renewable >= медіани, інакше 0
data['High Renewable'] = (data['% Renewable'] >= renewable_median).astype(int)
# Повертаємо Series, відсортований за Rank у порядку зростання, індексований за назвою країни
sorted_series = data['High Renewable'].sort_index(ascending=True)
return sorted_series
task_thirteen_result = task_thirteen(final_data)
task_thirteen_result
```
%% Output
Country
Australia 0
Brazil 1
Canada 1
China 1
France 1
Germany 1
India 0
Iran 0
Italy 1
Japan 0
Russian Federation 1
South Korea 0
Spain 1
United Kingdom 0
United States 0
Name: High Renewable, dtype: int32
%% Cell type:code id:d2402833-9146-4a85-9efa-a63f81268620 tags:
``` python
def task_forteen(data):
# Словник континентів
ContinentDict = {
'China':'Asia', 'United States':'North America', 'Japan':'Asia',
'United Kingdom':'Europe', 'Russian Federation':'Europe', 'Canada':'North America',
'Germany':'Europe', 'India':'Asia', 'France':'Europe', 'South Korea':'Asia',
'Italy':'Europe', 'Spain':'Europe', 'Iran':'Asia', 'Australia':'Australia',
'Brazil':'South America'
}
data['Estimated Population'] = data['Energy Supply'] / data['Energy Supply per Capita']
data['Continent'] = data.index.to_series().map(ContinentDict)
continent_stats = data.groupby('Continent')['Estimated Population'].agg(['size', 'sum', 'mean', 'std'])
return continent_stats
task_forteen_result = task_forteen(final_data)
task_forteen_result
```
%% Output
size sum mean std
Continent
Asia 5 2898666386.6106 579733277.32212 6.790979e+08
Australia 1 23316017.316017 23316017.316017 NaN
Europe 6 457929667.216372 76321611.202729 3.464767e+07
North America 2 352855249.48025 176427624.740125 1.996696e+08
South America 1 205915254.237288 205915254.237288 NaN
%% Cell type:code id:791927f6-9b3d-47b8-b852-405420083db6 tags:
``` python
import matplotlib.pyplot as plt
def task_fifteen(data):
continent_colors = {
'Asia': 'red', 'Australia': 'yellow', 'Europe': 'green',
'North America': 'blue', 'South America': 'orange'
}
data['Color'] = data['Continent'].map(continent_colors)
# Побудова бульбашкової діаграми
plt.figure(figsize=(12, 8))
plt.scatter(
data['Rank'], data['% Renewable'],
s=data['2015'] / 1e10, # Масштабування розміру бульбашок
c=data['Color'], alpha=0.6, edgecolors="w", linewidth=0.5
)
for i, country in enumerate(data.index):
plt.text(data['Rank'][i], data['% Renewable'][i], country, ha='center', va='center', fontsize=8)
# Підпис осей та заголовок
plt.xlabel('Rank')
plt.ylabel('% Renewable')
plt.title('Bubble chart')
plt.show()
task_fifteen(final_data)
```
%% Output
%% Cell type:code id:bcca3423-4203-453a-afe1-bd0df4be4ff6 tags:
``` python
```
Source diff could not be displayed: it is too large. Options to address this: view the blob.
%% Cell type:code id:f3d09be6-ed17-488d-ac0c-f55b4d983795 tags:
``` python
!pip install opencv-python-headless
```
%% Output
Collecting opencv-python-headless
Downloading opencv_python_headless-4.10.0.84-cp37-abi3-win_amd64.whl.metadata (20 kB)
Requirement already satisfied: numpy>=1.17.0 in c:\programdata\anaconda3\envs\first\lib\site-packages (from opencv-python-headless) (1.24.4)
Downloading opencv_python_headless-4.10.0.84-cp37-abi3-win_amd64.whl (38.8 MB)
---------------------------------------- 0.0/38.8 MB ? eta -:--:--
---------------------------------------- 0.3/38.8 MB ? eta -:--:--
- -------------------------------------- 1.0/38.8 MB 3.1 MB/s eta 0:00:12
-- ------------------------------------- 2.6/38.8 MB 5.4 MB/s eta 0:00:07
--- ------------------------------------ 3.7/38.8 MB 5.7 MB/s eta 0:00:07
---- ----------------------------------- 4.5/38.8 MB 5.4 MB/s eta 0:00:07
---- ----------------------------------- 4.7/38.8 MB 4.5 MB/s eta 0:00:08
----- ---------------------------------- 5.5/38.8 MB 4.3 MB/s eta 0:00:08
------ --------------------------------- 6.0/38.8 MB 3.8 MB/s eta 0:00:09
------ --------------------------------- 6.6/38.8 MB 3.6 MB/s eta 0:00:09
------- -------------------------------- 7.1/38.8 MB 3.6 MB/s eta 0:00:09
-------- ------------------------------- 7.9/38.8 MB 3.6 MB/s eta 0:00:09
-------- ------------------------------- 8.7/38.8 MB 3.5 MB/s eta 0:00:09
--------- ------------------------------ 9.4/38.8 MB 3.5 MB/s eta 0:00:09
---------- ----------------------------- 10.0/38.8 MB 3.5 MB/s eta 0:00:09
----------- ---------------------------- 10.7/38.8 MB 3.5 MB/s eta 0:00:09
----------- ---------------------------- 11.5/38.8 MB 3.5 MB/s eta 0:00:08
------------ --------------------------- 12.3/38.8 MB 3.4 MB/s eta 0:00:08
------------- -------------------------- 13.1/38.8 MB 3.5 MB/s eta 0:00:08
-------------- ------------------------- 14.2/38.8 MB 3.5 MB/s eta 0:00:07
--------------- ------------------------ 14.9/38.8 MB 3.6 MB/s eta 0:00:07
---------------- ----------------------- 15.7/38.8 MB 3.6 MB/s eta 0:00:07
----------------- ---------------------- 16.8/38.8 MB 3.6 MB/s eta 0:00:07
------------------ --------------------- 17.8/38.8 MB 3.7 MB/s eta 0:00:06
------------------- -------------------- 18.6/38.8 MB 3.7 MB/s eta 0:00:06
-------------------- ------------------- 19.7/38.8 MB 3.7 MB/s eta 0:00:06
--------------------- ------------------ 20.4/38.8 MB 3.7 MB/s eta 0:00:05
---------------------- ----------------- 21.5/38.8 MB 3.8 MB/s eta 0:00:05
---------------------- ----------------- 22.3/38.8 MB 3.8 MB/s eta 0:00:05
------------------------ --------------- 23.3/38.8 MB 3.8 MB/s eta 0:00:05
------------------------- -------------- 24.4/38.8 MB 3.8 MB/s eta 0:00:04
------------------------- -------------- 25.2/38.8 MB 3.9 MB/s eta 0:00:04
-------------------------- ------------- 26.0/38.8 MB 3.8 MB/s eta 0:00:04
--------------------------- ------------ 26.7/38.8 MB 3.8 MB/s eta 0:00:04
---------------------------- ----------- 27.8/38.8 MB 3.9 MB/s eta 0:00:03
----------------------------- ---------- 28.8/38.8 MB 3.9 MB/s eta 0:00:03
------------------------------ --------- 29.6/38.8 MB 3.9 MB/s eta 0:00:03
------------------------------- -------- 30.4/38.8 MB 3.9 MB/s eta 0:00:03
-------------------------------- ------- 31.2/38.8 MB 3.9 MB/s eta 0:00:02
--------------------------------- ------ 32.0/38.8 MB 3.9 MB/s eta 0:00:02
--------------------------------- ------ 32.8/38.8 MB 3.9 MB/s eta 0:00:02
---------------------------------- ----- 33.6/38.8 MB 3.9 MB/s eta 0:00:02
----------------------------------- ---- 34.3/38.8 MB 3.9 MB/s eta 0:00:02
------------------------------------ --- 35.1/38.8 MB 3.9 MB/s eta 0:00:01
------------------------------------- -- 36.4/38.8 MB 3.9 MB/s eta 0:00:01
-------------------------------------- - 37.2/38.8 MB 3.9 MB/s eta 0:00:01
--------------------------------------- 38.0/38.8 MB 3.9 MB/s eta 0:00:01
---------------------------------------- 38.8/38.8 MB 3.9 MB/s eta 0:00:00
Installing collected packages: opencv-python-headless
Successfully installed opencv-python-headless-4.10.0.84
%% Cell type:code id:bc5460c8-d18d-474d-8548-a22fb17ae3d2 tags:
``` python
ord("K") % 5 + 1
```
%% Output
1
%% Cell type:code id:bf39d7f3-7b1e-46b1-acce-7bfb59e855a2 tags:
``` python
# Імпорт необхідних бібліотек
import cv2
import pandas as pd
import numpy as np
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
# Завантаження даних з Excel-файлу
data_path = 'C:/Users/skiba/python_khpi/lab6.xlsx'
df = pd.read_excel(data_path)
# Отримання даних для конкретного варіанту (в даному випадку використовується перший рядок)
variant_data = df.iloc[0]
file_name = variant_data['file name']
image_size = tuple(map(int, variant_data['image size'].split('x')))
glasses_color = variant_data['glasses color']
line_width = int(variant_data['line width'])
# Функція для обробки зображення та додавання окулярів
def add_glasses(input_image_path, output_image_path, image_size, glasses_color, line_width):
# Завантаження зображення
image = cv2.imread(input_image_path)
# Перевірка, чи зображення завантажено успішно
if image is None:
print(f"Помилка: Не вдалося завантажити зображення за шляхом {input_image_path}.")
return None
# Перетворення в градації сірого
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Завантаження каскадів Хаара для виявлення облич та очей
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
# Виявлення облич
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# Обробка кожного виявленого обличчя
for (x, y, w, h) in faces:
# Виявлення очей в межах верхньої частини обличчя
face_region = gray[y:y + h//2, x:x + w]
eyes = eye_cascade.detectMultiScale(face_region, scaleFactor=1.1, minNeighbors=10, minSize=(20, 20))
# Перевірка кількості очей
if len(eyes) >= 2:
# Вибір двох найбільших очей
eyes = sorted(eyes, key=lambda e: e[2] * e[3], reverse=True)[:2]
# Визначення координат центрів очей
eye_centers = []
for (ex, ey, ew, eh) in eyes:
eye_center = (x + ex + ew // 2, y + ey + eh // 2)
eye_centers.append((eye_center, int(ew * 0.7))) # Зберігаємо центр та радіус кожного ока
# Сортування очей по горизонталі
left_eye, right_eye = sorted(eye_centers, key=lambda e: e[0][0])
# Малювання окулярів
pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(pil_image)
# Малювання кругів для окулярів
for eye_center, radius in eye_centers:
draw.ellipse(
(eye_center[0] - radius, eye_center[1] - radius,
eye_center[0] + radius, eye_center[1] + radius),
outline=glasses_color, width=line_width
)
# Додавання дуже короткої перемички між лінзами окулярів
bridge_length = int(left_eye[1] * 0.1) # Ще коротший розмір перемички
draw.line(
[(left_eye[0][0] + left_eye[1] - bridge_length, left_eye[0][1]),
(right_eye[0][0] - right_eye[1] + bridge_length, right_eye[0][1])],
fill=glasses_color, width=line_width
)
# Додавання дужок окулярів
for eye_center, radius in eye_centers:
# Дужка буде відходити від зовнішнього краю окуляра
side_x = eye_center[0] + (radius if eye_center == right_eye[0] else -radius)
side_y = eye_center[1]
draw.line(
[(side_x, side_y), (side_x + (20 if eye_center == right_eye[0] else -20), side_y - 10)],
fill=glasses_color, width=line_width
)
# Збереження та повернення зображення
pil_image.save(output_image_path)
print("Зображення збережено успішно.")
return pil_image
else:
print("Ока не виявлено або знайдено менше двох очей.")
print("Жодного зображення не було створено.")
return None
# Шляхи до зображення
input_image_path = f'C:/Users/skiba/python_khpi/Images/{file_name}' # Коректний шлях до зображення
output_image_path = 'C:/Users/skiba/python_khpi/Images/output_with_glasses.jpg'
output_image = add_glasses(input_image_path, output_image_path, image_size, glasses_color, line_width)
if output_image:
plt.imshow(output_image)
plt.axis('off')
plt.show()
else:
print("Зображення не створено.")
```
%% Output
Зображення збережено успішно.
%% Cell type:code id:ad66be46-7332-4056-a50b-6d22192b7e98 tags:
``` python
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment