Professional Documents
Culture Documents
Курсова
Курсова
Курсова робота
Пояснювальна записка
Виконавець
студент групи ІПЗ-32 __________________ Дмитро НАГІРНЯК
(підпис, дата)
Керівник
асистент кафедри ПСТ __________________ Єлизавета ЖАБСЬКА
(підпис, дата)
Київ – 2023
ЗАВДАННЯ НА КУРСОВУ РОБОТУ
2
АНОТАЦІЯ
3
ЗМІСТ
Вступ..........................................................................................................................................................5
1.Інформаційний огляд.............................................................................................................................7
1.1. Огляд проблематики .........................................................................................................................7
1.2 Огляд останніх рішень .......................................................................................................................9
1.3 Дослідження ресурсів ..................................................................................................................... 18
2.Методи розрахунку коефіціенту комфортності .................................................................................. 20
3. Технології розв’язку поставленої задачі ..........................................................................................30
3.1. Постановка задачі ...........................................................................................................................30
3.2. Структурно-функціональне моделювання процесів ...................................................................31
3.3. Діаграма варіантів використання ..................................................................................................33
4. Програмна реалізація..........................................................................................................................35
4.1. Вибір засобів програмної реалізації ..............................................................................................35
4.1.1 Мова програмування......................................................................................................................35
4.1.2 Середовище розробки.................................................................................................................... 36
4.2 Опис розроблених методів...............................................................................................................38
4.3 Результати роботи ............................................................................................................................39
4.3 Висновок ...........................................................................................................................................43
5. Список викорастаних джерел............................................................................................................44
Додаток А – Приклади кодової бази.....................................................................................................45
4
Вступ
Погода завжди відігравала важливу роль у житті суспільства. Клімат, погода
та природні явища можуть мати різний вплив, починаючи від вибору одягу на
наступний день або планування відпустки найближчим часом, й закінчуючи
кількістю жертв, зумовлених стихійними лихами. Погодні умови також мають
вплив на самопочуття кожної окремої людини, оскільки зміни в погоді можуть
викликати підвищення або зниження тиску, алергічні реакції або впливати на
психічний стан.
6
1.Інформаційний огляд
1.1. Огляд проблематики
Крім того, існують популярні додатки для платформ Android та iOS, які дозволяють
отримати прогноз погоди. Деякі з них включають 1Weather, AccuWeather,
Yahoo.Weather.
9
Рисунок 1.2 – Сайт Sinoptik.ua
10
Рисунок 1.4 – Сайт Meteoprog.ua
11
Існує багато сервісів по прогнозуванню погоди в інтрнеті, але хотілося б
розглянути найкращих представників з них детальніше та подивитися з якими
алгоритмами та методами аналізу вони працюють:
1. Weather Underground
12
Weather Underground забезпечує детальну інформацію про погоду, включаючи
температуру повітря, швидкість вітру, вологість, атмосферний тиск, опади та інші
показники, що необхідні для оцінки комфортності кліматичних умов.
Всі ці дані збираються зі станцій моніторингу, які встановлюються по всьому світу, і
опрацьовуються з використанням спеціальних алгоритмів, що дозволяє забезпечити
максимальну різноманітність інформації.
Weather Underground використовує різні методи та алгоритми для
забезпечення точності та надійності своїх прогнозів.
Основні методи та алгоритми, які використовуються в системі, описані нижче:
• Аналіз повітряних мас: Weather Underground здійснює аналіз повітряних мас,
щоб визначити, які типи погоди можуть бути пов'язані з кожною масою. Це
дає змогу зрозуміти, які умови впливають на погодні явища в конкретному
регіоні.
• Аналіз гідрометеорологічних даних: Weather Underground використовує
гідрометеорологічні дані, такі як температура повітря, вологість, тиск, опади
та інші, щоб зрозуміти поточні погодні умови та передбачити їх зміну в
майбутньому.
• Моделювання погоди: Weather Underground використовує різні моделі погоди,
щоб дати прогноз погоди на майбутнє. Вони використовують моделі, такі як
Global Forecast System (GFS) та North American Mesoscale (NAM), щоб
отримати прогноз погоди на різні терміни, від годин до декількох днів.
• Аналіз супутникових та радіолокаційних зображень: Weather Underground також
використовує дані з супутникових та радіолокаційних зображень, щоб
отримати інформацію про рух хмар, вітрові напрямки та інші погодні явища.
• Використання штучного інтелекту: Weather Underground використовує штучний
інтелект для аналізу даних та підвищення точності прогнозів.
13
2. Dark Sky
Ця метеорологічна служба пропонує різноманітні інструменти для візуалізації та
прогнозування погоди, включаючи додатки для мобільних пристроїв та веб-сайти.
Крім того, Dark Sky забезпечує API, яке дозволяє розробникам інтегрувати дані про
погоду у свої додатки та веб-сайти.
Однією з унікальних рис Dark Sky є її здатність прогнозувати час до дощу з
точністю до хвилини на конкретному місці. Це забезпечується за допомогою
алгоритму, який аналізує дані про повітря, температуру та інші показники, щоб
визначити місце та час дощу.
Ще один алгоритм, який використовує Dark Sky, - це "Мікроклімат". Він
аналізує дані з більш ніж 200 тисяч метеостанцій по всьому світу та враховує різні
фактори, такі як тип місцевості та висота над рівнем моря, щоб дати більш точний
прогноз для конкретної локації.
Dark Sky використовує різні методи та алгоритми для передбачення погоди. Основні
з них:
• Метеорологічні моделі: Dark Sky використовує глобальні моделі погоди, такі як
GFS (Global Forecast System) та NAM (North American Mesoscale) для
отримання загальної карти погоди. Ці моделі базуються на чисельних методах
та фізичних принципах, щоб передбачити температуру, вітер, хмарність та
інші метеорологічні параметри.
• Радарна технологія: Dark Sky також використовує радарні дані, які збираються з
різних метеорологічних джерел, щоб відслідковувати рух хмар та
передбачити, коли до певного регіону наближатимуться дощі чи сніг.
• Аналіз даних за допомогою машинного навчання: Dark Sky використовує
нейронні мережі та інші методи машинного навчання для аналізу великої
кількості даних погоди та покращення точності передбачень. Наприклад,
система використовує глибинне навчання (deep learning), щоб відслідковувати
хмари та передбачати різноманітні метеорологічні події, такі як зливи або
град.
14
• Аналіз показників на основі геоданих: Dark Sky використовує геодані, щоб
збирати дані про погоду з різних джерел, таких як метеорологічні станції,
супутники та засоби збору даних на землі. Система обробляє ці дані та
здійснює аналіз показників, таких як вологість, тиск та інші, щоб покращити
точність передбачень.
3. AccuWeather
AccuWeather (Рисунок 1.1) - це популярний сервіс погоди, який надає користувачам
актуальну інформацію про погоду, прогнози та різноманітні функції пов'язані зі
здоров'ям, подорожами, спортом та іншими сферами життя.
15
Основні функції AccuWeather:
• Прогноз погоди. AccuWeather надає користувачам точний інформаційний
прогноз погоди на кожен день, який оновлюється кожну годину.
4. Gismeteo
Це український сервіс прогнозу погоди, який надає актуальну інформацію про
погодні умови та кліматичні показники у більш ніж 100 країнах світу. Система має
багатий функціонал, який дозволяє користувачам отримати детальну інформацію
про погоду в різних регіонах, а також про прогноз на найближчі дні.
Однією з головних функцій Gismeteo є надання інформації про погодні умови.
Система використовує аналітичні дані, які надходять з більш ніж 40 тисяч станцій
моніторингу по всьому світу. Крім того, Gismeteo використовує сучасні алгоритми
та моделі прогнозування погоди, що дозволяє досить точно передбачати погодні
умови на найближчі дні.
Окрім прогнозу погоди, Gismeteo надає користувачам детальну інформацію
про кліматичні умови в різних регіонах. Користувачі можуть переглядати
16
інформацію про температуру повітря, вологість, тиск, швидкість вітру та інші
показники в різних місцях. Також в системі доступні інтерактивні карти, які
дозволяють користувачам відслідковувати зміни погодних умов на великій
території.
17
1.3. Дослідження ресурсів
Різні сервіси надають різну інформацію щодо прогнозу погоди. Похибки під
час аналізу прогнозу – неминуче явище. Для того, щоб порівняти точність прогнозу
різних сервісів використовувався ресурс rp5.ua, що представляє собою щоденник
погоди (Рисунок 1.6). Під час дослідження дані про прогноз погоди збиралися з
наступних джерел:
1. Sinoptik.ua
2. Gismeteo.ua
3. Meteoprog.ua
4. Accuweather.com
18
З кожного джерела отримувався прогноз погоди для міста Київ. Порівняння
проводилося за наступними критеріями: виправданість прогнозу температури та
прогнозу імовірності опадів. Спостереження проводилися у період з 15 по 30 травня.
Імовірності виправданості розраховувались як залишок від відсоткової різниці між
прогнозами метеорологічних сервісів та реальними показниками, збереженими
вкінці спостережень. Результати випробувань наведені у таблиці 1.1 та таблиці
1.2.
Таблиця 1.2 – Середнє значення прогнозу імовірності опадів у дні коли опади
спостерігались та імовірність вдалого прогнозу опадів
19
2. Методи розрахунку коефіціенту комфортності
• Індекс WBGT (Wet Bulb Globe Temperature): Цей метод враховує температуру
вологого термометра, температуру глобуса і температуру сухого термометра
для визначення комфортності умов. Він широко використовується на
спортивних заходах і в промислових галузях для оцінки ризику перегріву
організму.
21
• Індекс PMV/PPD (Predicted Mean Vote/Percent Predicted Dissatisfied): Цей індекс
використовується для оцінки комфорту у внутрішніх приміщеннях. Він
враховує різні параметри, такі як температура, вологість, швидкість повітря,
одяг та активність людини для передбачення оцінки комфорту та відсотку
незадоволених людей.
PTC=0.72×Ta+0.4×(Tr−10)+4.89×104v2−3.2
де:
T_a - температура повітря в градусах Цельсія;
T_r - температура радіаційної поверхні в градусах Цельсія;
v - швидкість вітру в метрах за секунду.
де:
23
де:
Ta - температура повітря,
V - швидкість вітру,
w - насиченість водяної пари в повітрі,
H - відносна вологість повітря,
а1-а4 - коефіцієнти, що залежать від рівня фізіологічного навантаження та статі
людини.
24
де:
де:
25
За допомогою цієї формули, індекс THI враховує ефект вологості на відчуття
температури. Чим вище значення індексу THI, тим більше ризик теплового стресу
для людини.
Індекс THI допомагає встановити рекомендації щодо заходів безпеки та захисту від
теплового стресу, таких як вживання води, уникання фізичних навантажень у гарячу
частину дня та застосування захисного спорядження.
26
Інтерпретація значень індексу HI зазвичай використовує наступні категорії:
де:
29
3. Технології розв’язку поставленої задачі
3.1. Постановка задачі
Метою роботи є розробка телеграм боту, що збирає дані про погоду з сервісу
Accuweather та обраховує коефіціент комфортності.
30
3.2. Структурно-функціональне моделювання процесів
Нижче наведені контекстна IDEF0 (Рисунок 2.1) та IDEF0 першого рівня діаграми
(Рисунок 2.2)
31
Рисунок 2.1 – Контекста IDEF0 діаграма
32
3.3. Діаграма варіантів використання
33
Діаграма варіантів використання (Рисунок 2.3) наведена нижче:
34
4. Програмна реалізація
4.1 Вибір засобів програмної реалізації
4.1.1 Мова програмування
Під час реалізації боту наступні методи з Telegram Bot API були використані:
1) sendMessage(chat_id, text) – метод для відправлення повідомлення ботом
користувачу
2) messageHandler() – обробник, необхідний для вилову повідомлень від
користувачів.
35
4.1.2 Середовище розробки
36
Рисунок 3.2 – Знаходження всіх згадувань конструкції
37
4.2 Опис розроблених методів
Нижче наведений список методів для роботи телеграм боту:
1) send_welcome(message) - Цей метод надсилає привітальне повідомлення
користувачеві під час початку чату.
2) process_weather(message) - Цей метод обробляє інформацію про погоду на
основі введення користувача (назва міста) або його місцезнаходження та
обчислює рівень комфорту (PET) на основі значення одягу, встановленого
користувачем.
3) set_clothing(message) - Цей метод дозволяє користувачу встановити значення
одягу в межах від 0 до 1, вказуючи їхній вибір одягу в різних погодних
умовах.
4) process_location(message) - Цей метод обробляє інформацію про
місцезнаходження користувача та отримує дані про погоду для цього місця за
допомогою API OpenWeatherMap.
38
4.3. Результати роботи
39
2) Після натискання кнопки “Start” з’явиться інструкція користування (Рисунок
4.2) у розділі “меню”
40
3) Для відображення прогнозу погоди у конкретному місті потрібно ввести назву
міста яке цікавить (Рисунок 4.3)
41
4) Для відображення прогнозу погоди у місці вашого знаходження потрібно
відправити геолокацію (Рисунок 4.4)
42
ВИСНОВОК
43
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
44
Додаток А – Приклади кодової бази
1. main.py (частина).
...
# bot_token = "5803215513:AAFCzskGTV2Lztl58xyOloqUeLCjtm7uqMQ"
# api_key = "99aa6b2ab24f297fc28ee38cc1d0ef1a"
import telebot
import requests
import math
from googletrans import Translator
bot_token = '5803215513:AAFCzskGTV2Lztl58xyOloqUeLCjtm7uqMQ'
api_key = '99aa6b2ab24f297fc28ee38cc1d0ef1a'
bot = telebot.TeleBot(bot_token)
translator = Translator()
clothing = {}
@bot.message_handler(commands=['start'])
def send_welcome(message):
bot.reply_to(message, "Привіт!\n Я бот для визначення комфортності погоди у твоєму місті.\n\nВстанови значення
своєї вдягненості від 0 до 1 командою /setclothing\nПісля цього відправ або назву свого міста або геолокацію і ми
визначимо комфортність!\n\nЯкщо бажаєш дізнатись про значення PET - пиши команду /pet !")
@bot.message_handler(commands=['pet'])
def send_welcome(message):
bot.reply_to(message, "Значення PET менше 0 говорить про відчуття холоду, від 0 до 20 - про комфортні умови, від
20 до 30 - про легкий дискомфорт, від 30 до 40 - про серйозний дискомфорт, а значення більше 40 говорить про
небезпечні умови для здоров'я.")
@bot.message_handler(commands=['setclothing'])
def set_clothing(message):
try:
value = float(message.text.split()[1])
if 0 <= value <= 1:
user_id = message.from_user.id
clothing[user_id] = value
bot.reply_to(message, f"Значення одягу успішно встановлено: {value}")
else:
raise ValueError
except (IndexError, ValueError):
bot.reply_to(message, "Некоректне значення одягу. Введіть число від 0 до 1.")
url = f'http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric'
response = requests.get(url)
data = response.json()
if data['cod'] == '404':
bot.reply_to(message, 'Місто не знайдено. Перевірте правильність введення.')
return
temperature = data['main']['temp']
humidity = data['main']['humidity']
45
wind_speed = data['wind']['speed']
weather_desc = data['weather'][0]['description']
# translated_desc = translator.translate(weather_desc, src='en', dest='uk').text
user_id = message.from_user.id
user_clothing = clothing.get(user_id, 0.5)
bot.reply_to(message, weather_info)
print(f"Пользователь {message.from_user.first_name} отправил сообщение: {message.text}")
@bot.message_handler(content_types=['location'])
def process_location(message):
latitude = message.location.latitude
longitude = message.location.longitude
url = f'http://api.openweathermap.org/data/2.5/weather?lat={latitude}&lon={longitude}&appid={api_key}&units=metric'
response = requests.get(url)
data = response.json()
if data['cod'] == '404':
bot.reply_to(message, 'Неможливо отримати дані про погоду для цього місця розташування.')
return
temperature = data['main']['temp']
humidity = data['main']['humidity']
wind_speed = data['wind']['speed']
weather_desc = data['weather'][0]['description']
# translated_desc = translator.translate(weather_desc, src='en', dest='uk').text
user_id = message.from_user.id
user_clothing = clothing.get(user_id, 0.5)
bot.reply_to(message, weather_info)
bot.polling()
2.__init__.py(частина).
@staticmethod
def check_regexp_input(regexp, method_name):
def message_handler(
self,
commands: Optional[List[str]] = None,
regexp: Optional[str] = None,
func: Optional[Callable] = None,
content_types: Optional[List[str]] = None,
chat_types: Optional[List[str]] = None,
**kwargs):
"""
if content_types is None:
content_types = ["text"]
method_name = "message_handler"
if isinstance(content_types, str):
logger.warning("message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]
def decorator(handler):
handler_dict = self._build_handler_dict(handler,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
func=func,
**kwargs)
self.add_message_handler(handler_dict)
return handler
return decorator
47
def add_message_handler(self, handler_dict):
self.message_handlers.append(handler_dict)
method_name = "register_message_handler"
if isinstance(content_types, str):
logger.warning(
"register_message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]
handler_dict = self._build_handler_dict(callback,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
func=func,
pass_bot=pass_bot,
**kwargs)
self.add_message_handler(handler_dict)
if content_types is None:
content_types = ["text"]
method_name = "edited_message_handler"
if isinstance(content_types, str):
logger.warning(
"edited_message_handler: 'content_types' filter should be List of strings (content types), not string.")
content_types = [content_types]
def decorator(handler):
handler_dict = self._build_handler_dict(handler,
chat_types=chat_types,
content_types=content_types,
commands=commands,
regexp=regexp,
48
func=func,
**kwargs)
self.add_edited_message_handler(handler_dict)
return handler
return decorator
3. logging.py (частина)
polling_thread = util.WorkerThread(name="PollingThread")
or_event = util.OrEvent(
polling_thread.done_event,
polling_thread.exception_event,
self.worker_pool.exception_event
)
time.sleep(error_interval)
polling_thread.clear_exceptions() # *
self.worker_pool.clear_exceptions() # *
except KeyboardInterrupt:
polling_thread.stop()
polling_thread.clear_exceptions()
self.worker_pool.clear_exceptions()
if not handled:
if logger_level and logger_level >= logging.ERROR:
logger.error("Polling exception: %s", str(e))
if logger_level and logger_level >= logging.DEBUG:
logger.error("Exception traceback:\n%s", traceback.format_exc())
if not non_stop:
self.__stop_polling.set()
50
logger.info("Exception occurred. Stopping." + warning)
else:
def stop_polling(self):
self.__stop_polling.set()
def stop_bot(self):
self.stop_polling()
if self.threaded and self.worker_pool:
self.worker_pool.close()
self.update_listener.append(listener)
result = apihelper.get_me(self.token)
return types.User.de_json(result)
51
def get_file(self, file_id: Optional[str]) -> types.File:
4.requests.py(частина)
try:
from charset_normalizer import __version__ as charset_normalizer_version
except ImportError:
charset_normalizer_version = None
try:
from chardet import __version__ as chardet_version
except ImportError:
chardet_version = None
if len(urllib3_version) == 2:
urllib3_version.append("0")
if chardet_version:
major, minor, patch = chardet_version.split(".")[:3]
major, minor, patch = int(major), int(minor), int(patch)
# chardet_version >= 3.0.2, < 6.0.0
assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
elif charset_normalizer_version:
major, minor, patch = charset_normalizer_version.split(".")[:3]
major, minor, patch = int(major), int(minor), int(patch)
try:
check_compatibility(
urllib3.__version__, chardet_version, charset_normalizer_version
)
except (AssertionError, ValueError):
warnings.warn(
"urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
"version!".format(
urllib3.__version__, chardet_version, charset_normalizer_version
),
RequestsDependencyWarning,
)
try:
try:
import ssl
except ImportError:
ssl = None
pyopenssl.inject_into_urllib3()
_check_cryptography(cryptography_version)
except ImportError:
pass
warnings.simplefilter("ignore", DependencyWarning)
import logging
from logging import NullHandler
logging.getLogger(__name__).addHandler(NullHandler())
54