Kur keliausite šiemet ir po 10 metų?

🗺️ 🧭 ✈️

Tyrimo aprašymas ir tikslas?


Kelionėse orų poveikis žmogui tampa akivaizdus – jis daro įtaką mūsų kelionių planams, nuotaikai ir energijai. Saulėtos dienos dažnai skatina tyrinėti naujas vietas, aktyviai leisti laiką, o lietus ar apsiniaukęs dangus gali nukreipti į ramesnę veiklą, suteikti progą sustoti ir pasimėgauti aplinka. Oro sąlygos, tokios kaip temperatūra, vėjas, krituliai ir saulės šviesa, visada daro įtaką mūsų kelionių patirčiai – nuo aktyvaus pažinimo iki poilsio. Šio tyrimo tikslas – nustatyti, kokios orų sąlygos vyrauja skirtinguose Europos miestuose skirtingais metų ir kurie metų laikotarpiai yra palankiausi aktyviai veiklai lauke. Tyrimui pasirinkti šeši miestai iš Lietuvos, Čekijos, Nyderlandų, Ispanijos, Norvegijos ir Graikijos, atspindintys įvairias Europos geografines vietoves.

Hipotezės teiginiai

  1. Europos pietinės ir vakarinės šalys yra labiau tinkamos atostogoms.
  2. Geriausia keliauti vasaros mėnesiais.
  3. Klimatui keičiantis pasikeis miestų patrauklumas kelionėms.

Hipotezės tyrimo eiga

  • Nustatyti Europos miestų, turinčių skirtingas geografines charakteristikas, vidutines orų sąlygas per paskutinius 30 metų.
  • Nustatyti buvusias ekstremalias orų sąlygų reiškmes dienos metu.
  • Priskirti skirtingų miestų kiekvienos dienos orų sąlygoms kriterijus nuo "labai blogos" sąlygos iki "labai geros" sąlygos per paskutinius 15 metų.
  • Nustatyti kriterijų pasikartojimo dažnį konkrečią metų dieną 15 metų laikotarpyje.
  • Palyginti skirtingų miestų orų sąlygas metų eigoje.
  • Sudaryti žemėlapį atvaizduojantį Europos miestų reitingą pagal orų sąlygas.
  • Sudaryti palankių atostogoms datų sąrašą pagal miestą.
  • Sukurti rekomendaciją kelionei vatotojo pasirinktai datai atsižvelgiant į įvertintus kriterijus.
  • Sukurti mašininio mokymosi modelį, kuris prognozuotų oro temperatūros pokytį po 10 metų skirtinguose miestuose.
In [920]:
from IPython.display import display, HTML
image_paths = ["https://tripjive.com/wp-content/uploads/2024/06/How-does-Kaunas-compare-to-Vilnius-for-a-weekend-trip.jpg",
               "https://res.klook.com/images/fl_lossy.progressive,q_65/c_fill,w_1200,h_630/w_80,x_15,y_15,g_south_west,l_Klook_water_br_trans_yhcmh3/activities/f1unorovdc2svebpfgmy/Kh%C3%A1m%20ph%C3%A1%20Ph%E1%BB%91%20c%E1%BB%95%20Praha%3A%20V%E1%BA%BB%20%C4%91%E1%BA%B9p%20l%E1%BB%8Bch%20s%E1%BB%AD%20v%C3%A0%20m%C3%AA%20ho%E1%BA%B7c.jpg",
               "https://black-bikes.com/wp-content/uploads/2023/05/amsterdam-city-guide-things-to-see-do-and-visit.jpg",
               "https://bucket-files.city-sightseeing.com/blog/2023/09/palmademallorca-aerialview.jpg",
               "https://www.reisroutes.be/userfiles/routes/profiel/stavanger-stadswandeling_643_0_xl.jpg",
               "https://www.zoover.nl/blog/wp-content/uploads/2018/01/Kreta-Griekenland.jpeg"
              ]
html_code = f"""
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
    <img src="{image_paths[0]}" style="width:100%; height:200px; object-fit: cover;">
    <img src="{image_paths[1]}" style="width:100%; height:200px; object-fit: cover;">
    <img src="{image_paths[2]}" style="width:100%; height:200px; object-fit: cover;">
    <img src="{image_paths[3]}" style="width:100%; height:200px; object-fit: cover;">
    <img src="{image_paths[4]}" style="width:100%; height:200px; object-fit: cover;">
    <img src="{image_paths[5]}" style="width:100%; height:200px; object-fit: cover;">
</div>
"""

display(HTML(html_code))
No description has been provided for this image No description has been provided for this image No description has been provided for this image No description has been provided for this image No description has been provided for this image No description has been provided for this image

Metodika

Surinkti šešių skirtingų miestų: Vilnius, Praha, Amsterdamas ir Maljorkos Palma, Stavangeris ir Kreta valandinių oro sąlygų (oro temperatūra, vėjo greitis, kritulių kiekis ir debesuotumas) duomenys per paskutinius 30 metų (1994-2023 m.). Duomenys paimti iš OpenMeteo duomenų serverio naudojant API prisijungimą. Šis kodas leidžia parsisiųsti įvairių meteorologinių parametrų duomenis pasirinktoms koordinatėms. Pakeitus vietovių koordinates ir atsisiuntus reikiamus duomenis galima kodą lengvai pritaikyti bet kokiems pasaulio miestams. Nustatant orų sąlygas dienos metu naudoti tik 8-21 val. orų duomenys. Kiekvienai dienai priskirti orų sąlygų vertinimo kriterijų. Apačioje pateikti priimti kriterijai, kurie apibūdina malonias orų sąlygas, užtikrinančias maksimalų komfortą: minimalus kritulių kiekis, nestiprus vėjas, pakankamai saulėta ir neatšiauri vidutinė oro temperatūra, ne žemesnė nei -5 °C laipsniai šalčio žiemą bei neaukštesnė nei 26,5 °C laipsniai vasarą. Kodas leidžia koreguoti šias sąlygas, kad jos atitiktų vartotojo pageidaujamas komforto sąlygas, priklausomai nuo prioritetų ir asmeninių poreikių. Darbo autoriaus pasirinktos sąlygos:

Žiema:

  • Vidutinė oro temperatūra: > -5°C
  • Vidutinis vėjo greitis: < 4m/s
  • Suminis kritulių kiekis: < 1mm
  • Debesuotumas: <50%

Pavasaris:

  • Vidutinė oro temperatūra: > 10°C
  • Vidutinis vėjo greitis: < 4m/s
  • Suminis kritulių kiekis: < 1mm
  • Debesuotumas: <50%

Vasara:

  • Vidutinė oro temperatūra: 20 < t < 27,0°C
  • Vidutinis vėjo greitis: < 4m/s
  • Suminis kritulių kiekis: < 1mm
  • Debesuotumas: <60%

Ruduo:

  • Vidutinė oro temperatūra: > 10°C
  • Vidutinis vėjo greitis: < 4m/s
  • Suminis kritulių kiekis: < 1mm
  • Debesuotumas: <50%
Orų sąlygų vertinimas pagal kriterijus. Kai orų sąlygos patenkina visus keturis kriterijus, jos įverdijamos kaip labai geros, jei patenkina tris kriterijus - geros, jei patenkina du kriterijus - vidutinės, jei patenkina tik vieną kriterijų - blogos ir jei nepatenkina nei vieno kriterijaus - labai blogos. Apibendrinant ilgalaikias sąlygas, atitinkamai konkrečiai metų dienai prisikiama orų sąlygų reikšmė, kuri dažniausiai pasikartojo tą dieną 15 metų laikotarpyje. Remiantis šiais rezultatais sudarytas palankių kelionėms laikotarpių sąrašas, kai oro sąlygos buvo "geros" arba "labai geros" bent 5 dienas iš eilės kiekvienam miestui atskirai.

Duomenų įkėlimas ir apdorojimas

In [ ]:
#Duomenu atsisiuntimas
import openmeteo_requests

import requests_cache
import pandas as pd
from retry_requests import retry

# Setup the Open-Meteo API client with cache and retry on error
cache_session = requests_cache.CachedSession('.cache', expire_after = -1)
retry_session = retry(cache_session, retries = 5, backoff_factor = 0.2)
openmeteo = openmeteo_requests.Client(session = retry_session)

# Make sure all required weather variables are listed here
# The order of variables in hourly or daily is important to assign them correctly below
url = "https://archive-api.open-meteo.com/v1/archive"
params = {
	"latitude": 52.37,
	"longitude": 4.89,
	"start_date": "1994-01-01",
	"end_date": "2023-12-31",
	"hourly": ["temperature_2m", "precipitation", "cloud_cover", "wind_speed_10m"],
	"wind_speed_unit": "ms"
}
responses = openmeteo.weather_api(url, params=params)

# Process first location. Add a for-loop for multiple locations or weather models
response = responses[0]
print(f"Coordinates {response.Latitude()}°N {response.Longitude()}°E")
print(f"Elevation {response.Elevation()} m asl")
print(f"Timezone {response.Timezone()} {response.TimezoneAbbreviation()}")
print(f"Timezone difference to GMT+0 {response.UtcOffsetSeconds()} s")

# Process hourly data. The order of variables needs to be the same as requested.
hourly = response.Hourly()
hourly_temperature_2m = hourly.Variables(0).ValuesAsNumpy()
hourly_precipitation = hourly.Variables(1).ValuesAsNumpy()
hourly_cloud_cover = hourly.Variables(2).ValuesAsNumpy()
hourly_wind_speed_10m = hourly.Variables(3).ValuesAsNumpy()

hourly_data = {"date": pd.date_range(
	start = pd.to_datetime(hourly.Time(), unit = "s", utc = True),
	end = pd.to_datetime(hourly.TimeEnd(), unit = "s", utc = True),
	freq = pd.Timedelta(seconds = hourly.Interval()),
	inclusive = "left"
)}
hourly_data["temperature_2m"] = hourly_temperature_2m
hourly_data["precipitation"] = hourly_precipitation
hourly_data["cloud_cover"] = hourly_cloud_cover
hourly_data["wind_speed_10m"] = hourly_wind_speed_10m
#
hourly_dataframe_amsterdam2 = pd.DataFrame(data = hourly_data)
print(hourly_dataframe_amsterdam2)

hourly_dataframe_amsterdam2.to_csv('hourly_dataframe_amsterdam2.csv', index=False)
In [1604]:
# Importuoti pandas ir numpy
import pandas as pd
import numpy as np
In [1170]:
#Importuoti Vilniaus duomenis
vilnius = pd.read_csv("hourly_dataframe_vilnius2.csv", index_col=None)
vilnius.head(10)
Out[1170]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 3.5055 0.7 100.0 5.456189
1 1994-01-01 01:00:00+00:00 3.6055 0.0 100.0 5.797413
2 1994-01-01 02:00:00+00:00 3.2055 0.0 100.0 4.947727
3 1994-01-01 03:00:00+00:00 2.8555 0.0 100.0 4.071855
4 1994-01-01 04:00:00+00:00 2.7055 0.0 100.0 3.635932
5 1994-01-01 05:00:00+00:00 2.5555 0.0 100.0 3.397057
6 1994-01-01 06:00:00+00:00 2.6055 0.2 100.0 3.712142
7 1994-01-01 07:00:00+00:00 2.6055 0.2 100.0 3.764306
8 1994-01-01 08:00:00+00:00 2.7055 0.1 100.0 3.613862
9 1994-01-01 09:00:00+00:00 2.8055 0.2 100.0 3.354102
In [1172]:
#Importuoti Amsterdamo duomenis
amsterdam = pd.read_csv("hourly_dataframe_amsterdam2.csv", index_col=None)
amsterdam.head(10)
Out[1172]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 3.472 0.0 52.0 2.901724
1 1994-01-01 01:00:00+00:00 3.172 0.0 28.0 3.000000
2 1994-01-01 02:00:00+00:00 3.272 0.0 37.0 3.324154
3 1994-01-01 03:00:00+00:00 3.122 0.0 37.0 3.436568
4 1994-01-01 04:00:00+00:00 3.172 0.0 36.0 3.649657
5 1994-01-01 05:00:00+00:00 3.372 0.0 35.0 3.847077
6 1994-01-01 06:00:00+00:00 3.222 0.0 38.0 3.820995
7 1994-01-01 07:00:00+00:00 3.072 0.0 37.0 3.905125
8 1994-01-01 08:00:00+00:00 3.022 0.0 25.0 3.811824
9 1994-01-01 09:00:00+00:00 3.522 0.0 21.0 4.143670
In [1184]:
#Importuoti Maljorkos Palmos duomenis
maljorka = pd.read_csv("hourly_dataframe_palma2.csv", index_col=None)
maljorka.head(10)
Out[1184]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 15.439000 0.0 33.0 7.000714
1 1994-01-01 01:00:00+00:00 15.189000 0.0 16.0 7.117584
2 1994-01-01 02:00:00+00:00 15.039001 0.0 54.0 7.382411
3 1994-01-01 03:00:00+00:00 14.889000 0.0 31.0 6.824954
4 1994-01-01 04:00:00+00:00 15.089000 0.0 100.0 6.854196
5 1994-01-01 05:00:00+00:00 14.889000 0.0 100.0 8.363014
6 1994-01-01 06:00:00+00:00 13.889000 0.0 100.0 9.897980
7 1994-01-01 07:00:00+00:00 13.389000 0.0 93.0 10.239629
8 1994-01-01 08:00:00+00:00 13.089000 0.0 95.0 9.577578
9 1994-01-01 09:00:00+00:00 13.189000 0.0 89.0 8.993887
In [1176]:
#Importuoti Prahos duomenis
praha = pd.read_csv("hourly_dataframe_praha2.csv", index_col=None)
praha.head(10)
Out[1176]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 7.2885 0.9 100.0 5.315073
1 1994-01-01 01:00:00+00:00 7.3885 0.7 100.0 6.046487
2 1994-01-01 02:00:00+00:00 7.2385 0.2 100.0 5.923681
3 1994-01-01 03:00:00+00:00 6.7885 0.0 100.0 5.048762
4 1994-01-01 04:00:00+00:00 6.0885 0.0 100.0 4.110961
5 1994-01-01 05:00:00+00:00 5.1885 0.0 100.0 3.721559
6 1994-01-01 06:00:00+00:00 4.5885 0.0 100.0 3.452535
7 1994-01-01 07:00:00+00:00 4.8385 0.0 100.0 3.324154
8 1994-01-01 08:00:00+00:00 4.4885 0.0 100.0 3.080584
9 1994-01-01 09:00:00+00:00 4.5885 0.0 100.0 3.606938
In [1180]:
#Importuoti Stavangerio duomenis
stavanger = pd.read_csv("hourly_dataframe_stavangeris2.csv", index_col=None)
stavanger.head(10)
Out[1180]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 -0.1065 0.0 96.0 1.649242
1 1994-01-01 01:00:00+00:00 0.1935 0.0 99.0 1.600000
2 1994-01-01 02:00:00+00:00 0.4435 0.0 100.0 1.600000
3 1994-01-01 03:00:00+00:00 1.0435 0.0 100.0 1.600000
4 1994-01-01 04:00:00+00:00 1.0435 0.0 100.0 1.503330
5 1994-01-01 05:00:00+00:00 1.1935 0.0 92.0 1.204160
6 1994-01-01 06:00:00+00:00 1.4435 0.1 87.0 1.100000
7 1994-01-01 07:00:00+00:00 1.2935 0.4 85.0 0.905539
8 1994-01-01 08:00:00+00:00 1.1435 0.4 77.0 0.806226
9 1994-01-01 09:00:00+00:00 0.6435 0.3 72.0 0.538516
In [1182]:
#Importuoti Kretos duomenis
kreta = pd.read_csv("hourly_dataframe_kreta2.csv", index_col=None)
kreta.head(10)
Out[1182]:
date temperature_2m precipitation cloud_cover wind_speed_10m
0 1994-01-01 00:00:00+00:00 2.563000 0.0 98.0 1.664332
1 1994-01-01 01:00:00+00:00 2.713000 0.1 98.0 2.121320
2 1994-01-01 02:00:00+00:00 2.913000 0.4 98.0 2.523886
3 1994-01-01 03:00:00+00:00 2.863000 0.9 97.0 2.563201
4 1994-01-01 04:00:00+00:00 2.863000 1.8 98.0 2.596151
5 1994-01-01 05:00:00+00:00 2.913000 1.8 96.0 2.668333
6 1994-01-01 06:00:00+00:00 2.863000 2.4 96.0 2.531798
7 1994-01-01 07:00:00+00:00 2.663000 0.4 98.0 2.668333
8 1994-01-01 08:00:00+00:00 2.863000 0.3 94.0 2.596151
9 1994-01-01 09:00:00+00:00 3.262999 0.2 99.0 2.469818
In [1217]:
#Susikurti papildomą stulpelį su šalies informacija duomenų lentelių apjungimui
vilnius['miestas'] = "Vilnius"
praha['miestas'] = "Praha"
amsterdam['miestas'] = "Amsterdamas"
maljorka['miestas'] = "Maljorka"
kreta['miestas'] = "Kreta"
stavanger['miestas'] = "Stavangeris"
In [1221]:
stavanger
Out[1221]:
date temperature_2m precipitation cloud_cover wind_speed_10m miestas
0 1994-01-01 00:00:00+00:00 -0.1065 0.0 96.0 1.649242 Stavangeris
1 1994-01-01 01:00:00+00:00 0.1935 0.0 99.0 1.600000 Stavangeris
2 1994-01-01 02:00:00+00:00 0.4435 0.0 100.0 1.600000 Stavangeris
3 1994-01-01 03:00:00+00:00 1.0435 0.0 100.0 1.600000 Stavangeris
4 1994-01-01 04:00:00+00:00 1.0435 0.0 100.0 1.503330 Stavangeris
... ... ... ... ... ... ...
262963 2023-12-31 19:00:00+00:00 3.2565 0.1 100.0 6.303174 Stavangeris
262964 2023-12-31 20:00:00+00:00 2.8565 0.4 100.0 6.432729 Stavangeris
262965 2023-12-31 21:00:00+00:00 2.7565 0.3 100.0 7.443118 Stavangeris
262966 2023-12-31 22:00:00+00:00 2.7565 0.2 100.0 7.406079 Stavangeris
262967 2023-12-31 23:00:00+00:00 2.7565 0.1 100.0 7.233948 Stavangeris

262968 rows × 6 columns

In [1225]:
# Sujungti visų miestų duomenis i vieną duomenų lentelę su concat
oru_salygos = pd.concat([vilnius, praha, amsterdam, maljorka, stavanger, kreta], axis=0, ignore_index=True)
oru_salygos.head(10)
Out[1225]:
date temperature_2m precipitation cloud_cover wind_speed_10m miestas
0 1994-01-01 00:00:00+00:00 3.5055 0.7 100.0 5.456189 Vilnius
1 1994-01-01 01:00:00+00:00 3.6055 0.0 100.0 5.797413 Vilnius
2 1994-01-01 02:00:00+00:00 3.2055 0.0 100.0 4.947727 Vilnius
3 1994-01-01 03:00:00+00:00 2.8555 0.0 100.0 4.071855 Vilnius
4 1994-01-01 04:00:00+00:00 2.7055 0.0 100.0 3.635932 Vilnius
5 1994-01-01 05:00:00+00:00 2.5555 0.0 100.0 3.397057 Vilnius
6 1994-01-01 06:00:00+00:00 2.6055 0.2 100.0 3.712142 Vilnius
7 1994-01-01 07:00:00+00:00 2.6055 0.2 100.0 3.764306 Vilnius
8 1994-01-01 08:00:00+00:00 2.7055 0.1 100.0 3.613862 Vilnius
9 1994-01-01 09:00:00+00:00 2.8055 0.2 100.0 3.354102 Vilnius
In [1227]:
#Patikrinti ar duomenų lentelėje oru_salygos yra NaN reikšmių
oru_salygos.isna().any().any()
Out[1227]:
False
In [1231]:
#Išfiltruoti laiką nuo 8 iki 21 val. kaip dienos orų sąlygas
oru_salygos['date'] = pd.to_datetime(oru_salygos['date'])
oru_salygos_diena = oru_salygos[(oru_salygos['date'].dt.hour >= 8) & (oru_salygos['date'].dt.hour <= 21)]
print(oru_salygos_diena)
                             date  temperature_2m  precipitation  cloud_cover  \
8       1994-01-01 08:00:00+00:00          2.7055            0.1        100.0   
9       1994-01-01 09:00:00+00:00          2.8055            0.2        100.0   
10      1994-01-01 10:00:00+00:00          2.6555            0.3        100.0   
11      1994-01-01 11:00:00+00:00          2.2055            0.5        100.0   
12      1994-01-01 12:00:00+00:00          1.5555            0.4        100.0   
...                           ...             ...            ...          ...   
1577801 2023-12-31 17:00:00+00:00          3.1580            0.0        100.0   
1577802 2023-12-31 18:00:00+00:00          3.0080            0.0        100.0   
1577803 2023-12-31 19:00:00+00:00          2.8080            0.0        100.0   
1577804 2023-12-31 20:00:00+00:00          2.3580            0.0        100.0   
1577805 2023-12-31 21:00:00+00:00          2.4580            0.0        100.0   

         wind_speed_10m  miestas  
8              3.613862  Vilnius  
9              3.354102  Vilnius  
10             3.000000  Vilnius  
11             3.214032  Vilnius  
12             3.101613  Vilnius  
...                 ...      ...  
1577801        0.921954    Kreta  
1577802        1.077033    Kreta  
1577803        0.640312    Kreta  
1577804        0.583095    Kreta  
1577805        0.670820    Kreta  

[920388 rows x 6 columns]
In [1233]:
#Patikrinti stulpelių duomenų tipus
print(oru_salygos_diena.dtypes)
date              datetime64[ns, UTC]
temperature_2m                float64
precipitation                 float64
cloud_cover                   float64
wind_speed_10m                float64
miestas                        object
dtype: object
In [1235]:
#Suapvalinti float duomenis iki vieno skaičiaus po kablelio
oru_salygos_diena = oru_salygos_diena.round({'temperature_2m': 1, 'precipitation': 1,'cloud_cover': 1,'wind_speed_10m': 1})
oru_salygos_diena
Out[1235]:
date temperature_2m precipitation cloud_cover wind_speed_10m miestas
8 1994-01-01 08:00:00+00:00 2.7 0.1 100.0 3.6 Vilnius
9 1994-01-01 09:00:00+00:00 2.8 0.2 100.0 3.4 Vilnius
10 1994-01-01 10:00:00+00:00 2.7 0.3 100.0 3.0 Vilnius
11 1994-01-01 11:00:00+00:00 2.2 0.5 100.0 3.2 Vilnius
12 1994-01-01 12:00:00+00:00 1.6 0.4 100.0 3.1 Vilnius
... ... ... ... ... ... ...
1577801 2023-12-31 17:00:00+00:00 3.2 0.0 100.0 0.9 Kreta
1577802 2023-12-31 18:00:00+00:00 3.0 0.0 100.0 1.1 Kreta
1577803 2023-12-31 19:00:00+00:00 2.8 0.0 100.0 0.6 Kreta
1577804 2023-12-31 20:00:00+00:00 2.4 0.0 100.0 0.6 Kreta
1577805 2023-12-31 21:00:00+00:00 2.5 0.0 100.0 0.7 Kreta

920388 rows × 6 columns

In [1237]:
#Sukurti papildomą stulpelį, kuriame būtų data be laiko, vėliau naudojama filtravimui
oru_salygos_diena['date_ymd'] = pd.to_datetime(oru_salygos_diena['date']).dt.date
oru_salygos_diena
Out[1237]:
date temperature_2m precipitation cloud_cover wind_speed_10m miestas date_ymd
8 1994-01-01 08:00:00+00:00 2.7 0.1 100.0 3.6 Vilnius 1994-01-01
9 1994-01-01 09:00:00+00:00 2.8 0.2 100.0 3.4 Vilnius 1994-01-01
10 1994-01-01 10:00:00+00:00 2.7 0.3 100.0 3.0 Vilnius 1994-01-01
11 1994-01-01 11:00:00+00:00 2.2 0.5 100.0 3.2 Vilnius 1994-01-01
12 1994-01-01 12:00:00+00:00 1.6 0.4 100.0 3.1 Vilnius 1994-01-01
... ... ... ... ... ... ... ...
1577801 2023-12-31 17:00:00+00:00 3.2 0.0 100.0 0.9 Kreta 2023-12-31
1577802 2023-12-31 18:00:00+00:00 3.0 0.0 100.0 1.1 Kreta 2023-12-31
1577803 2023-12-31 19:00:00+00:00 2.8 0.0 100.0 0.6 Kreta 2023-12-31
1577804 2023-12-31 20:00:00+00:00 2.4 0.0 100.0 0.6 Kreta 2023-12-31
1577805 2023-12-31 21:00:00+00:00 2.5 0.0 100.0 0.7 Kreta 2023-12-31

920388 rows × 7 columns

Vidutinės orų sąlygos per paskutinius 30 metų

Čia pateikiamos vidutinės meteorologinių parametrų reikšmės, paskaičiuotos kiekvienam miestui ir mėnesiui atskirai. Sukurti heatmap žemėlapiai leidžia palyginti skirtingų parametrų dydžius metų eigoje šešiuose skirtinguose miestuose ir išskirti klimato sąlygų atžvilgiu maloniausius ir atšiauriausius laikotarpius.

In [1239]:
#Sugrupuoti orų sąlygas pagal datą ir miestą bei suskaičiuoti vidutines reikšmes ir kritulių sumą
vidutines_oru_salygos_diena = oru_salygos_diena.groupby(['date_ymd', 'miestas']).agg({
    'temperature_2m': 'mean',
    'cloud_cover': 'mean',
    'wind_speed_10m': 'mean',
    'precipitation': 'sum'
}).reset_index()
vidutines_oru_salygos_diena
Out[1239]:
date_ymd miestas temperature_2m cloud_cover wind_speed_10m precipitation
0 1994-01-01 Amsterdamas 3.685714 45.714286 3.564286 0.0
1 1994-01-01 Kreta 2.792857 61.285714 2.342857 1.0
2 1994-01-01 Maljorka 13.592857 88.357143 7.392857 0.0
3 1994-01-01 Praha 2.957143 99.142857 3.828571 0.2
4 1994-01-01 Stavangeris 2.350000 70.000000 2.007143 3.2
... ... ... ... ... ... ...
65737 2023-12-31 Kreta 4.350000 92.071429 0.628571 0.2
65738 2023-12-31 Maljorka 14.514286 86.571429 4.592857 0.0
65739 2023-12-31 Praha 4.885714 99.928571 2.278571 0.1
65740 2023-12-31 Stavangeris 3.621429 100.000000 8.414286 1.4
65741 2023-12-31 Vilnius 0.985714 99.071429 2.650000 0.1

65742 rows × 6 columns

In [1241]:
#Patikrinti datos duomenų tipą
vidutines_oru_salygos_diena["date_ymd"].dtype
Out[1241]:
dtype('O')
In [1243]:
#Pakeisti datos duomenų tipą
vidutines_oru_salygos_diena["date_ymd"] = pd.to_datetime(vidutines_oru_salygos_diena["date_ymd"], format='%Y-%m-%d')
vidutines_oru_salygos_diena["date_ymd"].dtype
Out[1243]:
dtype('<M8[ns]')
In [1245]:
#Sukurti naujus stulpelius su metais, menesiu ir diena atskirai pagal datos stulpelį
vidutines_oru_salygos_diena['month'] = vidutines_oru_salygos_diena['date_ymd'].dt.month
vidutines_oru_salygos_diena['day'] = vidutines_oru_salygos_diena["date_ymd"].dt.day
vidutines_oru_salygos_diena['year'] = vidutines_oru_salygos_diena["date_ymd"].dt.year
vidutines_oru_salygos_diena
Out[1245]:
date_ymd miestas temperature_2m cloud_cover wind_speed_10m precipitation month day year
0 1994-01-01 Amsterdamas 3.685714 45.714286 3.564286 0.0 1 1 1994
1 1994-01-01 Kreta 2.792857 61.285714 2.342857 1.0 1 1 1994
2 1994-01-01 Maljorka 13.592857 88.357143 7.392857 0.0 1 1 1994
3 1994-01-01 Praha 2.957143 99.142857 3.828571 0.2 1 1 1994
4 1994-01-01 Stavangeris 2.350000 70.000000 2.007143 3.2 1 1 1994
... ... ... ... ... ... ... ... ... ...
65737 2023-12-31 Kreta 4.350000 92.071429 0.628571 0.2 12 31 2023
65738 2023-12-31 Maljorka 14.514286 86.571429 4.592857 0.0 12 31 2023
65739 2023-12-31 Praha 4.885714 99.928571 2.278571 0.1 12 31 2023
65740 2023-12-31 Stavangeris 3.621429 100.000000 8.414286 1.4 12 31 2023
65741 2023-12-31 Vilnius 0.985714 99.071429 2.650000 0.1 12 31 2023

65742 rows × 9 columns

In [1247]:
#Apskaičiuoti kiekvienų metų mėnesines vidutines parametro reikšmes (kritulių kiekio sumas)
vidutines_salygos_tarpinis_menuo = vidutines_oru_salygos_diena.groupby(['year','month', 'miestas']).agg({
    'temperature_2m': 'mean',
    'cloud_cover': 'mean',
    'wind_speed_10m': 'mean',
    'precipitation': 'sum'
}).reset_index()
vidutines_salygos_tarpinis_menuo.head(10)
Out[1247]:
year month miestas temperature_2m cloud_cover wind_speed_10m precipitation
0 1994 1 Amsterdamas 5.679263 76.285714 6.046544 39.7
1 1994 1 Kreta 3.724654 63.511521 2.628341 79.6
2 1994 1 Maljorka 12.239171 35.154378 4.636175 10.5
3 1994 1 Praha 3.657604 73.341014 4.446544 18.4
4 1994 1 Stavangeris 2.640323 78.866359 6.182488 127.2
5 1994 1 Vilnius -0.103226 90.857143 4.446313 50.6
6 1994 2 Amsterdamas 2.412755 68.658163 4.090306 22.1
7 1994 2 Kreta 3.035969 54.420918 2.507908 44.3
8 1994 2 Maljorka 12.843112 47.882653 4.036480 11.1
9 1994 2 Praha 1.481633 70.247449 2.840816 8.3
In [1251]:
#Vidutinės orų sąlygos pagal mėnesį ir miestą suvidurkinta per visus 10 metų
vidutines_salygos_menuo = vidutines_salygos_tarpinis_menuo.groupby(['month', 'miestas']).agg({
    'temperature_2m': 'mean',
    'cloud_cover': 'mean',
    'wind_speed_10m': 'mean',
    'precipitation': 'mean'
}).reset_index().round(1)
vidutines_salygos_menuo. head(10)
Out[1251]:
month miestas temperature_2m cloud_cover wind_speed_10m precipitation
0 1 Amsterdamas 4.2 74.6 5.1 41.8
1 1 Kreta 1.9 63.5 2.5 66.3
2 1 Maljorka 12.4 47.5 3.9 21.3
3 1 Praha 0.7 74.2 3.7 21.7
4 1 Stavangeris 2.8 74.5 5.5 102.0
5 1 Vilnius -3.3 86.0 4.3 30.6
6 2 Amsterdamas 4.9 72.4 5.1 38.1
7 2 Kreta 2.4 59.5 2.5 61.9
8 2 Maljorka 12.7 45.2 3.8 23.3
9 2 Praha 2.6 70.1 3.7 18.7
In [1253]:
import matplotlib.pyplot as plt
import seaborn as sns
In [1255]:
#Sukurti visų meteo parametrų heatmap su mėnesiniais vidurkiais kiekvienam miestui atskirai

pivot_temp = vidutines_salygos_menuo.pivot(index="miestas", columns="month", values="temperature_2m")
pivot_wind = vidutines_salygos_menuo.pivot(index="miestas", columns="month", values="wind_speed_10m")
pivot_cloud = vidutines_salygos_menuo.pivot(index="miestas", columns="month", values="cloud_cover")
pivot_precip = vidutines_salygos_menuo.pivot(index="miestas", columns="month", values="precipitation")

fig, axes = plt.subplots(2, 2, figsize=(16, 12), dpi=300)

heatmaps = [
    (pivot_temp, "Vidutinė temperatūra (°C)", "coolwarm"),
    (pivot_wind, "Vidutinis vėjo greitis (m/s)", "Blues"),
    (pivot_cloud, "Debesuotumas (%)", "YlGnBu"),
    (pivot_precip, "Kritulių kiekis (mm)", "BuPu")
]

legend_fontsize = 14
axis_label_fontsize = 14
title_fontsize = 16


for ax, (data, title, cmap) in zip(axes.flatten(), heatmaps):
    heatmap = sns.heatmap(
        data,
        annot=True,
        fmt=".0f",
        annot_kws={"size": 10},
        cmap=cmap,
        cbar_kws={'label': title},
        ax=ax
    )
    ax.set_title(title, fontsize=title_fontsize)
    ax.set_xlabel("Mėnuo", fontsize=axis_label_fontsize)
    ax.set_ylabel("Miestas", fontsize=axis_label_fontsize)
    ax.tick_params(axis='both', which='major', labelsize=12)
    
    
    cbar = heatmap.collections[0].colorbar
    cbar.ax.tick_params(labelsize=legend_fontsize)
    cbar.set_label(title, fontsize=legend_fontsize)
    
plt.tight_layout()
plt.show()
No description has been provided for this image
In [1257]:
#Išsaugome paveikslus
fig.savefig("heatmaps4.jpg", dpi=300)
In [1259]:
# Sukurti "month_name" stulpelį su mėnesio pavadinimu kaip tekstas
vidutines_salygos_menuo['month_name'] = vidutines_salygos_menuo['month'].apply(lambda x: pd.to_datetime(f'2023-{x}-01').strftime('%B'))
vidutines_salygos_menuo.head(10)
Out[1259]:
month miestas temperature_2m cloud_cover wind_speed_10m precipitation month_name
0 1 Amsterdamas 4.2 74.6 5.1 41.8 January
1 1 Kreta 1.9 63.5 2.5 66.3 January
2 1 Maljorka 12.4 47.5 3.9 21.3 January
3 1 Praha 0.7 74.2 3.7 21.7 January
4 1 Stavangeris 2.8 74.5 5.5 102.0 January
5 1 Vilnius -3.3 86.0 4.3 30.6 January
6 2 Amsterdamas 4.9 72.4 5.1 38.1 February
7 2 Kreta 2.4 59.5 2.5 61.9 February
8 2 Maljorka 12.7 45.2 3.8 23.3 February
9 2 Praha 2.6 70.1 3.7 18.7 February
In [1261]:
# Atvaizduoti visus vidutinius mėnesių meteo parametrus viename plote skirtingiems miestams
parametrai = {
    'wind_speed_10m': 'Vidutinis vėjo greitis (m/s)',
    'temperature_2m': 'Vidutinė temperatūra (°C)',
    'cloud_cover': 'Debesuotumas (%)',
    'precipitation': 'Kritulių kiekis (mm)'
}

plt.figure(figsize=(12, 12))

# Kiekvienam parametrui sukurti atskirą subpaveikslą
for i, (param, title) in enumerate(parametrai.items(), 1):
    plt.subplot(2, 2, i)
    for country in vidutines_salygos_menuo['miestas'].unique():
        subset = vidutines_salygos_menuo[vidutines_salygos_menuo['miestas'] == country]
        plt.plot(subset['month_name'], subset[param], marker='o', label=country)
    
    plt.title(title)
    plt.xlabel('Mėnuo')
    plt.ylabel(title)
    plt.xticks(rotation=45)
    plt.legend(title="Miestas")
    plt.grid(True)

plt.tight_layout()
plt.savefig("parametru_grafikai.jpg", dpi=300)
plt.show()
No description has been provided for this image

Išvada: Jei nemėgstate šaltų žiemų - Vilnius nėra pats geriausias pasirinkimas, nes čia žiemą oro temperatūra paprastai yra žemiau 0°C, tuo tarpu Maljorkos Palmoje žiemą oro temperatūra yra paprastai aukštenė už 10 °C. Tačiau vasarą čia gali būti kai kuriems žmonėms per karšta, todėl Vilnius ar Amsterdamas gali būti daug geresnis pasirinkimas. Aukščiausia temperatūra vasarą yra Maljorkos Palmoje, Kretoje ir Prahoje, žemiausia Stavangeryje.
Daugiausiai kritulių iškrenta Stavangeryje, todėl, jei nemėgstate lietaus, šį miestą geriau aplankykite laikotarpyje tarp balandžio ir brželio. Sausiausia birželio-rugpjūčio mėnesiais yra Maljorkos Palmoje ir Kretoje. Amsterdame sausiausi mėnesiai yra kovas ir balandis. Tuo tarpu Vilniuje vasara yra gana lietinga, daugiausiai kritulių metų eigoje iškrenta gegužės-rugpjūčio mėnesiais.
Saulėtos dienos taip pat labai svarbus rodiklis. Iš grafikų galim apastebėti, jog Vilniuje šaltuoju metų laiku nuo lapkričio iki vasario debesuotumas neretai siekia 80 procentų. Daugiausiai saulėtų dienų turėtume tikėtis kaip Kretoje ir Maljorkos Palmoje, ypatingai šiltuoju metų laiku.
Labiausiai vėjuoti miestai yra Stavangeris ir Amsterdamas visais metų laikais, tuo tarpu Kretoje ištisus metus vėjas labai silpnas.

Ekstremalios vidutinės dienos reikšmės 30 metų laikotarpyje

Apibendrinimas:

  • Aukščiausia oro temperatūra: Maljorkos Palma, Praha
  • Žemiausia oro temperatūra: Vilnius
  • Daugiausiai kritulių per vieną dieną: Maljorkos Palma, Stavangeris, Kreta
  • Didžiausias vėjo greitis: Stavangeris, Amsterdamas

1. Aukščiausia ir žemiausia oro temperatūra¶

In [1265]:
#Surasti oro temperatūros 10 aukščiausių reikšmių datų
max_temperature = vidutines_oru_salygos_diena.groupby('miestas').apply(lambda x: x.nlargest(10, 'temperature_2m')).reset_index(drop=True)
max_temperature_date = max_temperature[['miestas', 'date_ymd', 'temperature_2m']]
max_temperature_date
Out[1265]:
miestas date_ymd temperature_2m
0 Amsterdamas 2019-07-25 31.264286
1 Amsterdamas 2018-07-27 31.128571
2 Amsterdamas 2022-07-19 30.650000
3 Amsterdamas 2018-07-26 29.671429
4 Amsterdamas 2006-07-19 29.650000
5 Amsterdamas 2014-07-19 29.207143
6 Amsterdamas 2018-08-07 29.157143
7 Amsterdamas 2019-07-26 29.050000
8 Amsterdamas 2020-08-08 28.935714
9 Amsterdamas 2020-08-11 28.857143
10 Kreta 2023-07-26 28.421429
11 Kreta 1998-07-03 28.135714
12 Kreta 2007-06-24 27.821429
13 Kreta 1998-07-04 27.757143
14 Kreta 2007-06-26 27.700000
15 Kreta 2020-05-17 27.650000
16 Kreta 2020-05-16 27.500000
17 Kreta 2000-07-06 27.492857
18 Kreta 2021-07-01 27.457143
19 Kreta 2017-06-30 27.400000
20 Maljorka 2020-07-30 34.621429
21 Maljorka 2018-08-05 34.485714
22 Maljorka 2020-07-28 34.435714
23 Maljorka 2022-08-14 34.150000
24 Maljorka 2022-08-13 33.892857
25 Maljorka 2017-08-02 33.757143
26 Maljorka 2018-08-04 33.650000
27 Maljorka 2003-08-13 33.550000
28 Maljorka 1994-08-22 33.364286
29 Maljorka 2020-07-29 33.357143
30 Praha 2019-06-26 34.042857
31 Praha 2015-08-08 33.921429
32 Praha 2019-06-30 33.657143
33 Praha 2015-08-07 33.571429
34 Praha 2015-07-22 33.035714
35 Praha 2023-07-15 32.935714
36 Praha 2022-06-19 32.778571
37 Praha 2015-08-14 32.564286
38 Praha 1994-08-01 32.542857
39 Praha 2018-08-09 32.521429
40 Stavangeris 2018-07-27 27.357143
41 Stavangeris 2019-07-26 26.635714
42 Stavangeris 2018-07-28 25.557143
43 Stavangeris 2020-06-26 25.207143
44 Stavangeris 2008-07-29 24.542857
45 Stavangeris 2022-06-24 24.350000
46 Stavangeris 2020-06-27 24.242857
47 Stavangeris 1994-07-25 24.235714
48 Stavangeris 1997-08-21 24.121429
49 Stavangeris 2014-07-23 23.878571
50 Vilnius 1994-07-30 30.264286
51 Vilnius 2002-07-31 29.914286
52 Vilnius 1994-07-31 29.528571
53 Vilnius 1994-07-29 29.507143
54 Vilnius 2019-06-12 29.492857
55 Vilnius 2012-07-29 29.421429
56 Vilnius 2019-06-13 29.250000
57 Vilnius 2014-08-03 29.214286
58 Vilnius 2021-07-16 29.100000
59 Vilnius 2006-07-11 29.035714
In [1267]:
#Vidutinė maksimali temperatūra pagal 10 aukščausių reikšmių
max_temperature_average = max_temperature.groupby('miestas')['temperature_2m'].mean()
max_temperature_average
Out[1267]:
miestas
Amsterdamas    29.757143
Kreta          27.733571
Maljorka       33.926429
Praha          33.157143
Stavangeris    25.012857
Vilnius        29.472857
Name: temperature_2m, dtype: float64
In [1269]:
max_temperature_average.plot(kind="bar", color='indianred')
plt.show()
No description has been provided for this image
In [1272]:
#Surasti oro temperatūros 10 žemiausių reikšmių datų
min_temperature = vidutines_oru_salygos_diena.groupby('miestas').apply(lambda x: x.nsmallest(10, 'temperature_2m')).reset_index(drop=True)
min_temperature_date = min_temperature[['miestas', 'date_ymd', 'temperature_2m']]
min_temperature_date
Out[1272]:
miestas date_ymd temperature_2m
0 Amsterdamas 1997-01-02 -9.857143
1 Amsterdamas 1996-12-31 -8.842857
2 Amsterdamas 1997-01-01 -8.735714
3 Amsterdamas 1996-01-26 -8.378571
4 Amsterdamas 1996-01-25 -7.685714
5 Amsterdamas 2009-12-19 -7.164286
6 Amsterdamas 2012-02-04 -6.914286
7 Amsterdamas 1996-12-28 -6.764286
8 Amsterdamas 1997-01-08 -6.707143
9 Amsterdamas 1997-01-06 -6.550000
10 Kreta 2022-01-23 -9.450000
11 Kreta 2017-01-08 -8.978571
12 Kreta 2004-02-13 -8.592857
13 Kreta 2021-02-16 -8.592857
14 Kreta 2022-03-11 -8.500000
15 Kreta 2023-02-08 -8.200000
16 Kreta 2022-01-25 -8.164286
17 Kreta 2022-03-12 -8.135714
18 Kreta 2019-01-08 -7.978571
19 Kreta 2022-01-24 -7.964286
20 Maljorka 2012-02-04 4.178571
21 Maljorka 2023-02-27 4.221429
22 Maljorka 2012-02-12 4.764286
23 Maljorka 2018-02-27 4.914286
24 Maljorka 2005-01-26 4.921429
25 Maljorka 2005-02-28 5.335714
26 Maljorka 2015-02-06 5.335714
27 Maljorka 2010-03-10 5.478571
28 Maljorka 1999-01-31 5.528571
29 Maljorka 2012-02-11 5.550000
30 Praha 1996-12-29 -18.092857
31 Praha 1996-12-28 -15.992857
32 Praha 1996-12-27 -15.857143
33 Praha 1996-12-31 -15.642857
34 Praha 1996-12-30 -15.485714
35 Praha 1997-01-01 -13.442857
36 Praha 1997-01-02 -13.414286
37 Praha 2010-12-30 -13.128571
38 Praha 1997-01-07 -12.728571
39 Praha 2010-12-02 -12.435714
40 Stavangeris 2010-12-26 -11.871429
41 Stavangeris 2009-12-30 -10.250000
42 Stavangeris 2010-01-07 -9.807143
43 Stavangeris 2010-01-08 -9.707143
44 Stavangeris 2001-02-04 -9.571429
45 Stavangeris 2009-12-31 -9.535714
46 Stavangeris 2021-02-04 -9.250000
47 Stavangeris 2001-02-03 -9.214286
48 Stavangeris 2010-12-20 -8.371429
49 Stavangeris 2010-01-09 -8.271429
50 Vilnius 2006-01-20 -25.585714
51 Vilnius 2012-02-02 -24.650000
52 Vilnius 2006-01-19 -24.378571
53 Vilnius 2003-01-06 -24.371429
54 Vilnius 1996-12-26 -23.850000
55 Vilnius 2006-01-21 -23.350000
56 Vilnius 2012-02-03 -23.314286
57 Vilnius 2003-01-07 -23.235714
58 Vilnius 2012-02-04 -22.678571
59 Vilnius 1997-12-16 -22.471429
In [1274]:
#Vidutinė minimali temperatūra pagal 10 žemiausių reikšmių
min_temperature_average = min_temperature.groupby('miestas')['temperature_2m'].mean()
min_temperature_average
Out[1274]:
miestas
Amsterdamas    -7.760000
Kreta          -8.455714
Maljorka        5.022857
Praha         -14.622143
Stavangeris    -9.585000
Vilnius       -23.788571
Name: temperature_2m, dtype: float64
In [1276]:
min_temperature_average.plot(kind="bar", color='skyblue')
plt.axhline(0, color='black', linewidth=0.5)
plt.show()
No description has been provided for this image

2. Didžiausias dienos kritulių kiekis¶

In [1278]:
#Surasti kritulių kiekio 10 didžiausių reikšmių datų
max_precip = vidutines_oru_salygos_diena.groupby('miestas').apply(lambda x: x.nlargest(10, 'precipitation')).reset_index(drop=True)
max_precip_date = max_precip[['miestas', 'date_ymd', 'precipitation','month']]
max_precip_date
Out[1278]:
miestas date_ymd precipitation month
0 Amsterdamas 2023-10-12 34.5 10
1 Amsterdamas 2002-08-24 33.5 8
2 Amsterdamas 2011-07-14 31.4 7
3 Amsterdamas 2013-10-13 28.5 10
4 Amsterdamas 2007-07-16 28.2 7
5 Amsterdamas 2002-08-20 28.0 8
6 Amsterdamas 1998-09-14 25.8 9
7 Amsterdamas 1994-08-01 25.3 8
8 Amsterdamas 2017-07-29 25.1 7
9 Amsterdamas 1998-06-05 21.9 6
10 Kreta 2022-03-02 44.9 3
11 Kreta 2009-09-11 44.4 9
12 Kreta 2019-03-29 43.8 3
13 Kreta 2022-01-12 42.6 1
14 Kreta 2021-09-08 40.4 9
15 Kreta 2022-02-23 38.7 2
16 Kreta 2019-02-14 38.5 2
17 Kreta 2019-02-16 33.3 2
18 Kreta 2020-11-09 32.0 11
19 Kreta 2020-12-15 31.5 12
20 Maljorka 2020-09-07 55.6 9
21 Maljorka 2023-02-27 46.7 2
22 Maljorka 2019-09-10 45.0 9
23 Maljorka 2010-10-12 43.4 10
24 Maljorka 2002-08-24 39.0 8
25 Maljorka 2023-08-27 35.7 8
26 Maljorka 2007-09-23 34.6 9
27 Maljorka 2017-03-24 34.0 3
28 Maljorka 2002-11-25 31.1 11
29 Maljorka 2020-01-19 29.4 1
30 Praha 2002-08-12 68.4 8
31 Praha 2010-08-07 37.4 8
32 Praha 1995-05-13 30.2 5
33 Praha 2014-07-08 27.4 7
34 Praha 2015-08-17 25.5 8
35 Praha 2013-06-01 24.9 6
36 Praha 2020-06-14 24.7 6
37 Praha 1996-07-08 24.3 7
38 Praha 2005-07-05 23.8 7
39 Praha 2007-06-21 22.5 6
40 Stavangeris 2005-11-14 58.3 11
41 Stavangeris 2009-07-18 44.3 7
42 Stavangeris 2018-10-14 41.8 10
43 Stavangeris 1995-10-22 38.1 10
44 Stavangeris 2010-10-06 36.6 10
45 Stavangeris 2007-09-16 36.2 9
46 Stavangeris 2011-06-28 36.1 6
47 Stavangeris 2000-02-04 34.5 2
48 Stavangeris 2018-01-15 34.0 1
49 Stavangeris 2023-07-03 33.8 7
50 Vilnius 2022-06-21 58.3 6
51 Vilnius 2018-08-11 47.2 8
52 Vilnius 1998-07-11 32.8 7
53 Vilnius 1994-05-27 30.2 5
54 Vilnius 2023-08-07 29.2 8
55 Vilnius 2005-08-09 28.4 8
56 Vilnius 2021-08-28 26.9 8
57 Vilnius 2021-08-17 26.6 8
58 Vilnius 2010-09-02 25.7 9
59 Vilnius 2012-06-01 25.7 6
In [1280]:
#Vidutinė maksimali kritulių kiekio reikšmė pagal 10 didžiausių reikšmių
max_precip_average = max_precip.groupby('miestas')['precipitation'].mean()
max_precip_average
Out[1280]:
miestas
Amsterdamas    28.22
Kreta          39.01
Maljorka       39.45
Praha          30.91
Stavangeris    39.37
Vilnius        33.10
Name: precipitation, dtype: float64
In [1282]:
max_precip_average.plot(kind="bar", color='deepskyblue')
plt.show()
No description has been provided for this image

3. Didižiausias vėjo greitis¶

In [1285]:
#Surasti vėjo greičio 10 didžiausių reikšmių datų
max_wind = vidutines_oru_salygos_diena.groupby('miestas').apply(lambda x: x.nlargest(10, 'wind_speed_10m')).reset_index(drop=True)
max_wind_date = max_wind[['miestas', 'date_ymd', 'wind_speed_10m']]
max_wind_date
Out[1285]:
miestas date_ymd wind_speed_10m
0 Amsterdamas 2007-01-18 14.892857
1 Amsterdamas 2002-10-27 14.814286
2 Amsterdamas 2020-02-09 13.521429
3 Amsterdamas 1999-12-03 12.507143
4 Amsterdamas 2002-01-28 12.271429
5 Amsterdamas 2007-01-11 12.271429
6 Amsterdamas 2023-11-02 12.271429
7 Amsterdamas 2001-12-28 12.264286
8 Amsterdamas 2022-02-18 12.264286
9 Amsterdamas 2004-03-20 12.250000
10 Kreta 2015-04-10 8.707143
11 Kreta 2013-12-11 7.950000
12 Kreta 1996-03-06 7.835714
13 Kreta 2008-01-29 7.771429
14 Kreta 2002-01-09 7.514286
15 Kreta 1994-11-20 7.435714
16 Kreta 1994-01-30 6.957143
17 Kreta 2004-02-04 6.814286
18 Kreta 2003-02-05 6.785714
19 Kreta 2003-03-24 6.757143
20 Maljorka 2009-01-24 12.971429
21 Maljorka 2001-11-10 12.807143
22 Maljorka 1997-11-06 11.178571
23 Maljorka 2005-12-02 11.078571
24 Maljorka 1994-01-06 10.950000
25 Maljorka 2015-02-24 10.857143
26 Maljorka 2004-11-13 10.850000
27 Maljorka 1996-02-06 10.750000
28 Maljorka 2009-10-22 10.714286
29 Maljorka 2008-04-18 10.692857
30 Praha 2007-01-18 11.528571
31 Praha 2020-02-23 10.471429
32 Praha 2008-03-01 10.450000
33 Praha 2022-02-17 10.171429
34 Praha 2017-10-29 10.157143
35 Praha 2005-12-16 9.692857
36 Praha 2015-01-10 9.642857
37 Praha 2023-12-21 9.578571
38 Praha 2021-10-21 9.542857
39 Praha 2020-02-10 9.450000
40 Stavangeris 2015-01-10 15.100000
41 Stavangeris 2005-01-12 14.485714
42 Stavangeris 2016-12-26 14.457143
43 Stavangeris 2013-12-05 13.778571
44 Stavangeris 2012-01-26 13.657143
45 Stavangeris 1999-02-04 13.628571
46 Stavangeris 2014-01-25 13.392857
47 Stavangeris 2012-12-23 13.385714
48 Stavangeris 2008-01-04 13.378571
49 Stavangeris 1995-01-05 13.264286
50 Vilnius 1999-12-04 11.635714
51 Vilnius 2002-01-29 10.814286
52 Vilnius 2011-02-08 10.557143
53 Vilnius 2015-01-11 10.078571
54 Vilnius 2005-01-09 10.042857
55 Vilnius 1999-12-01 9.814286
56 Vilnius 1997-03-03 9.771429
57 Vilnius 2000-03-03 9.578571
58 Vilnius 2012-02-23 9.564286
59 Vilnius 2012-12-15 9.507143
In [1287]:
#Vidutinė maksimali vėjo greičio reikšmė pagal 10 didžiausių reikšmių
max_wind_average = max_wind.groupby('miestas')['wind_speed_10m'].mean()
max_wind_average
Out[1287]:
miestas
Amsterdamas    12.932857
Kreta           7.452857
Maljorka       11.285000
Praha          10.068571
Stavangeris    13.852857
Vilnius        10.136429
Name: wind_speed_10m, dtype: float64
In [1289]:
max_wind_average.plot(kind="bar", color='orange')
plt.show()
No description has been provided for this image

Orų sąlygų nustatymas pagal nustatytus kriterijus

Paaiškinimas: Šioje sekcijoje priskiriame skirtingų sezonų orų sąlygoms įvertinimus ribines reikšmes, prie kokių orų sąlygų jaučiamės komfortiškai. Remiamasi paskutinių 15 metų duomenimis dėl sparčiai besikeičiančio klimato.

In [1562]:
#Išsifiltruojame paskutinių 15 metų duomenis dėl didesnio vertinimo tikslumo
start_date = pd.to_datetime("2009-01-01")

oru_salygos_15 = vidutines_oru_salygos_diena[vidutines_oru_salygos_diena['date_ymd'] >= start_date]

oru_salygos_15.head()
Out[1562]:
date_ymd miestas temperature_2m cloud_cover wind_speed_10m precipitation month day year salygu_vertinimas
32874 2009-01-01 Amsterdamas 0.785714 95.428571 2.007143 0.0 1 1 2009 geros
32875 2009-01-01 Kreta -0.164286 41.500000 2.450000 0.2 1 1 2009 labai geros
32876 2009-01-01 Maljorka 13.400000 99.928571 1.521429 0.0 1 1 2009 geros
32877 2009-01-01 Praha -3.385714 81.071429 2.364286 0.0 1 1 2009 geros
32878 2009-01-01 Stavangeris 0.250000 33.928571 2.392857 0.0 1 1 2009 labai geros
In [1564]:
# Funkcija oro sąlygų vertinimui pagal iš anskto numatytus kriterijus
def oru_salygu_vertinimas(row):
    conditions_met = 0

    # Žiemos mėnesiai
    if row['month'] in [12, 1, 2]:
        if row['temperature_2m'] > -5:
            conditions_met += 1
        if row['cloud_cover'] <= 60:
            conditions_met += 1
        if row['wind_speed_10m'] <= 4:
            conditions_met += 1
        if row['precipitation'] <= 1:
            conditions_met += 1

    # Pavasario mėnesiai
    elif row['month'] in [3, 4, 5]:
        if row['temperature_2m'] > 10:
            conditions_met += 1
        if row['cloud_cover'] <= 50:
            conditions_met += 1
        if row['wind_speed_10m'] <= 4:
            conditions_met += 1
        if row['precipitation'] <= 1:
            conditions_met += 1

    # Vasaros mėnesiai
    elif row['month'] in [6, 7, 8]:
        if 20 < row['temperature_2m'] < 27:
            conditions_met += 1
        if row['cloud_cover'] <= 50:
            conditions_met += 1
        if row['wind_speed_10m'] <= 4:
            conditions_met += 1
        if row['precipitation'] <= 1:
            conditions_met += 1

    # Rudens mėnesiai
    elif row['month'] in [9, 10, 11]:
        if row['temperature_2m'] > 10:
            conditions_met += 1
        if row['cloud_cover'] <= 50:
            conditions_met += 1
        if row['wind_speed_10m'] <= 4:
            conditions_met += 1
        if row['precipitation'] <= 1:
            conditions_met += 1

    # Nustatome vertinimą pagal sąlygų skaičių
    if conditions_met == 4:
        return "labai geros"
    elif conditions_met == 3:
        return "geros"
    elif conditions_met == 2:
        return "vidutines"
    elif conditions_met == 1:
        return "blogos"
    else:
        return "labai blogos"

# Taikome funkciją kiekvienai eilutei ir pridedame naują stulpelį
oru_salygos_15['salygu_vertinimas'] = oru_salygos_15.apply(oru_salygu_vertinimas, axis=1)

print(oru_salygos_15)
        date_ymd      miestas  temperature_2m  cloud_cover  wind_speed_10m  \
32874 2009-01-01  Amsterdamas        0.785714    95.428571        2.007143   
32875 2009-01-01        Kreta       -0.164286    41.500000        2.450000   
32876 2009-01-01     Maljorka       13.400000    99.928571        1.521429   
32877 2009-01-01        Praha       -3.385714    81.071429        2.364286   
32878 2009-01-01  Stavangeris        0.250000    33.928571        2.392857   
...          ...          ...             ...          ...             ...   
65737 2023-12-31        Kreta        4.350000    92.071429        0.628571   
65738 2023-12-31     Maljorka       14.514286    86.571429        4.592857   
65739 2023-12-31        Praha        4.885714    99.928571        2.278571   
65740 2023-12-31  Stavangeris        3.621429   100.000000        8.414286   
65741 2023-12-31      Vilnius        0.985714    99.071429        2.650000   

       precipitation  month  day  year salygu_vertinimas  
32874            0.0      1    1  2009             geros  
32875            0.2      1    1  2009       labai geros  
32876            0.0      1    1  2009             geros  
32877            0.0      1    1  2009             geros  
32878            0.0      1    1  2009       labai geros  
...              ...    ...  ...   ...               ...  
65737            0.2     12   31  2023             geros  
65738            0.0     12   31  2023         vidutines  
65739            0.1     12   31  2023             geros  
65740            1.4     12   31  2023            blogos  
65741            0.1     12   31  2023             geros  

[32868 rows x 10 columns]
C:\Users\IndrėGečaitė\AppData\Local\Temp\ipykernel_21256\3595241255.py:62: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  oru_salygos_15['salygu_vertinimas'] = oru_salygos_15.apply(oru_salygu_vertinimas, axis=1)
In [1566]:
#Išsifiltruojame reikiamus stulpelius
oru_kriterijai = oru_salygos_15[['date_ymd', 'miestas', 'month', 'day', 'year', 'salygu_vertinimas']]
oru_kriterijai
Out[1566]:
date_ymd miestas month day year salygu_vertinimas
32874 2009-01-01 Amsterdamas 1 1 2009 geros
32875 2009-01-01 Kreta 1 1 2009 labai geros
32876 2009-01-01 Maljorka 1 1 2009 geros
32877 2009-01-01 Praha 1 1 2009 geros
32878 2009-01-01 Stavangeris 1 1 2009 labai geros
... ... ... ... ... ... ...
65737 2023-12-31 Kreta 12 31 2023 geros
65738 2023-12-31 Maljorka 12 31 2023 vidutines
65739 2023-12-31 Praha 12 31 2023 geros
65740 2023-12-31 Stavangeris 12 31 2023 blogos
65741 2023-12-31 Vilnius 12 31 2023 geros

32868 rows × 6 columns

In [1568]:
#Nustatome dažniausiai pasikartojančią kiekvienos dienos orų sąlygų reikšmę (modą)
#Su agg (agregate) pritaikome kiekvienam stulpeliui, lambda funkcija priima x, pritaiko mode() ir grąžina pirmą reikšmę.
dazniausias_ivertinimas = oru_kriterijai.groupby(['month', 'day', 'miestas']).agg({
    'salygu_vertinimas': lambda x: x.mode()[0]
}).reset_index()

dazniausias_ivertinimas.head(10)
Out[1568]:
month day miestas salygu_vertinimas
0 1 1 Amsterdamas vidutines
1 1 1 Kreta geros
2 1 1 Maljorka geros
3 1 1 Praha geros
4 1 1 Stavangeris blogos
5 1 1 Vilnius vidutines
6 1 2 Amsterdamas geros
7 1 2 Kreta vidutines
8 1 2 Maljorka geros
9 1 2 Praha geros
In [1570]:
#Apibendriname rezultatus mėnesiams, nustatant kiek kokių orų sąlygų pasiartoja skirtingais mėnesiais
menesio_vertinimai = (
    dazniausias_ivertinimas
    .groupby(['month', 'salygu_vertinimas', 'miestas'])
    .size()
    .unstack(fill_value=0)
    .rename_axis(None, axis=1)
    .reset_index()
)
menesio_vertinimai
Out[1570]:
month salygu_vertinimas Amsterdamas Kreta Maljorka Praha Stavangeris Vilnius
0 1 blogos 8 0 0 3 20 11
1 1 geros 13 13 17 23 5 2
2 1 labai geros 1 8 13 0 1 0
3 1 vidutines 9 10 1 5 5 18
4 2 blogos 7 1 0 2 20 3
5 2 geros 14 10 15 25 5 15
6 2 labai geros 0 12 14 1 1 0
7 2 vidutines 8 6 0 1 3 11
8 3 blogos 14 5 0 9 10 12
9 3 geros 1 17 16 4 3 2
10 3 labai blogos 2 0 0 0 7 2
11 3 labai geros 0 0 11 1 0 0
12 3 vidutines 14 9 4 17 11 15
13 4 blogos 9 3 0 2 9 5
14 4 geros 11 21 17 16 3 14
15 4 labai blogos 0 0 0 0 3 0
16 4 labai geros 0 6 13 4 2 0
17 4 vidutines 10 0 0 8 13 11
18 5 blogos 1 0 0 0 8 2
19 5 geros 20 6 11 18 10 16
20 5 labai blogos 0 0 0 0 1 0
21 5 labai geros 1 25 20 1 0 2
22 5 vidutines 9 0 0 12 12 11
23 6 blogos 13 0 0 4 16 4
24 6 geros 4 30 19 10 1 10
25 6 labai blogos 1 0 0 0 3 1
26 6 labai geros 0 0 11 1 0 1
27 6 vidutines 12 0 0 15 10 14
28 7 blogos 8 0 0 1 16 6
29 7 geros 8 27 31 12 2 6
30 7 labai blogos 4 0 0 0 5 1
31 7 labai geros 0 4 0 5 0 4
32 7 vidutines 11 0 0 13 8 14
33 8 blogos 10 0 0 1 12 4
34 8 geros 5 27 31 23 2 13
35 8 labai blogos 3 0 0 0 11 0
36 8 labai geros 1 4 0 2 0 1
37 8 vidutines 12 0 0 5 6 13
38 9 blogos 4 0 0 0 16 2
39 9 geros 19 0 12 20 5 14
40 9 labai geros 2 30 15 9 1 2
41 9 vidutines 5 0 3 1 8 12
42 10 blogos 7 2 0 0 19 6
43 10 geros 7 9 10 23 4 5
44 10 labai blogos 0 0 0 0 1 0
45 10 labai geros 0 18 21 0 0 0
46 10 vidutines 17 2 0 8 7 20
47 11 blogos 12 4 0 2 15 13
48 11 geros 0 16 21 2 1 0
49 11 labai blogos 1 0 0 0 12 1
50 11 labai geros 0 0 9 0 0 0
51 11 vidutines 17 10 0 26 2 16
52 12 blogos 8 0 0 0 25 7
53 12 geros 11 17 15 21 3 6
54 12 labai geros 0 9 16 0 0 0
55 12 vidutines 12 5 0 10 3 18
In [1572]:
#Paverčiame duomenų lentelę vertikalia su melt unkcija 
menesio_vertinimai_vertikalus = pd.melt(menesio_vertinimai,
                    id_vars=['month', 'salygu_vertinimas'],
                    var_name='city',
                    value_name='value'
                   )

print(menesio_vertinimai_vertikalus)
     month salygu_vertinimas         city  value
0        1            blogos  Amsterdamas      8
1        1             geros  Amsterdamas     13
2        1       labai geros  Amsterdamas      1
3        1         vidutines  Amsterdamas      9
4        2            blogos  Amsterdamas      7
..     ...               ...          ...    ...
331     11         vidutines      Vilnius     16
332     12            blogos      Vilnius      7
333     12             geros      Vilnius      6
334     12       labai geros      Vilnius      0
335     12         vidutines      Vilnius     18

[336 rows x 4 columns]

Mėnesio orų sąlygų apžvaga

Čia pateikiami kiekvieno miesto skirtingų mėnesių "labai gerų" ir "blogų"/"labai blogų" orų sąlygų pasikartojimo tankio žemėlapiai (heatmaps). Jie parodo kaip dažnai metų eigoje pasitaiko labai geros ir blogos sąlygos orų sąlygos pasirinktuose miestuose ir leidžia atlikti palyginamąją analizę.

In [1574]:
#Išsifiltruojame sąlygas, kurios atitinka kriterijų "labai geros"
filtered_menesio_vertinimai_lg = menesio_vertinimai_vertikalus[menesio_vertinimai_vertikalus['salygu_vertinimas'] == 'labai geros']

# Transformuoti į pivot, kad toliau duomenis naudotume heatmap atvaizdavimui
pivot_df = filtered_menesio_vertinimai_lg.pivot(index="city", columns="month", values="value")

#susikurti savo spalvas heatmap atvaizdavimui
mano_cmap = LinearSegmentedColormap.from_list("custom_blue", ["deepskyblue", "yellow", "orange"])

heatmap_lg = plt.figure(figsize=(12, 8))
sns.heatmap(pivot_df, annot=True, fmt="d", cmap=mano_cmap, cbar_kws={'label': 'Dienų skaičius'})

plt.title("Oro sąlygų vertinimas (labai geros) pagal mėnesius ir miestus")
plt.xlabel("Mėnuo")
plt.ylabel("Miestas")

plt.show()
No description has been provided for this image
In [1387]:
heatmap_lg.savefig("heatmap_lg3.jpg")
In [1576]:
#Išsifiltruojame sąlygas, kurios atitinka kriterijų "blogos ir labai blogos"
filtered_menesio_vertinimai_b = menesio_vertinimai_vertikalus[menesio_vertinimai_vertikalus['salygu_vertinimas'].isin(['blogos', 'labai blogos'])]

pivot_df = filtered_menesio_vertinimai_b.pivot_table(index="city", columns="month", values="value", aggfunc="sum")

mano_cmap_r = LinearSegmentedColormap.from_list("custom_blue", ["yellow", "tan", "darkgrey"])

heatmap_b = plt.figure(figsize=(12, 8))
sns.heatmap(pivot_df, annot=True, fmt="d", cmap=mano_cmap_r, cbar_kws={'label': 'Dienų skaičius'})

plt.title("Blogos ir labai blogos oro sąlygos pagal mėnesius ir miestus")
plt.xlabel("Mėnuo")
plt.ylabel("Miestas")

plt.show()
No description has been provided for this image
In [1391]:
heatmap_b.savefig("heatmap_b3.jpg")

Miestų reitingavimas pagal orų sąlygas

Skirtingi miestai turi skirtingą "gerų" ir "labai gerų" orų sąygų dienų skaičių per metus. Pagal šį skaičių galime sureitinguoti miestus nuo labiausiai patrauklaus iki mažiausiai patrauklaus miesto kelionėms ar gyvenimui juose.

In [1579]:
#Apibendriname rezultatus, nustatant kiek kokių orų sąlygų pasiartoja skirtingiems miestams per metus ir priskiriame reitingą
metinis_vertinimas_salims = (
    dazniausias_ivertinimas
    .groupby(['miestas', 'salygu_vertinimas'])
    .size()
    .unstack(fill_value=0)
    .rename_axis(None, axis=1)  # pasalinti indeksu pavadinima stulpeliuose
    .reset_index()
)

metinis_vertinimas_salims = metinis_vertinimas_salims[['miestas', 'labai blogos', 'blogos', 'vidutines', 'geros', 'labai geros']]
metinis_vertinimas_salims['reitingas'] = metinis_vertinimas_salims['geros'] + metinis_vertinimas_salims['labai geros']

# rank() funkcija priskiria reitingą kiekvienai reikšmei stulpelyje, o dense metodas padeda išrikiuoti pasikartojančias reikšmes
metinis_vertinimas_salims['reitingas'] = metinis_vertinimas_salims['reitingas'].rank(method='dense', ascending=False).astype(int)
metinis_vertinimas_salims = metinis_vertinimas_salims.sort_values(by='reitingas').reset_index(drop=True)

metinis_vertinimas_salims
Out[1579]:
miestas labai blogos blogos vidutines geros labai geros reitingas
0 Maljorka 0 0 8 215 143 1
1 Kreta 0 15 42 193 116 2
2 Praha 0 24 121 197 24 3
3 Amsterdamas 11 101 136 113 5 4
4 Vilnius 5 75 173 103 10 5
5 Stavangeris 43 186 88 44 5 6
In [890]:
!pip install cartopy
Collecting cartopy
  Obtaining dependency information for cartopy from https://files.pythonhosted.org/packages/4f/ce/ba4baced164ecd78b4109cd611d7b64d256f012784e944c1b0f6f5dff5c1/Cartopy-0.24.1-cp311-cp311-win_amd64.whl.metadata
  Downloading Cartopy-0.24.1-cp311-cp311-win_amd64.whl.metadata (8.1 kB)
Requirement already satisfied: numpy>=1.23 in c:\swsetup\anaconda3\lib\site-packages (from cartopy) (1.24.3)
Requirement already satisfied: matplotlib>=3.6 in c:\swsetup\anaconda3\lib\site-packages (from cartopy) (3.7.2)
Requirement already satisfied: shapely>=1.8 in c:\swsetup\anaconda3\lib\site-packages (from cartopy) (2.0.6)
Requirement already satisfied: packaging>=21 in c:\swsetup\anaconda3\lib\site-packages (from cartopy) (23.1)
Collecting pyshp>=2.3 (from cartopy)
  Obtaining dependency information for pyshp>=2.3 from https://files.pythonhosted.org/packages/98/2f/68116db5b36b895c0450e3072b8cb6c2fac0359279b182ea97014d3c8ac0/pyshp-2.3.1-py2.py3-none-any.whl.metadata
  Downloading pyshp-2.3.1-py2.py3-none-any.whl.metadata (55 kB)
     ---------------------------------------- 0.0/56.0 kB ? eta -:--:--
     ------- -------------------------------- 10.2/56.0 kB ? eta -:--:--
     -------------------------------------- 56.0/56.0 kB 973.0 kB/s eta 0:00:00
Requirement already satisfied: pyproj>=3.3.1 in c:\swsetup\anaconda3\lib\site-packages (from cartopy) (3.7.0)
Requirement already satisfied: contourpy>=1.0.1 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (1.0.5)
Requirement already satisfied: cycler>=0.10 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (0.11.0)
Requirement already satisfied: fonttools>=4.22.0 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (4.25.0)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (1.4.4)
Requirement already satisfied: pillow>=6.2.0 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (10.0.1)
Requirement already satisfied: pyparsing<3.1,>=2.3.1 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (3.0.9)
Requirement already satisfied: python-dateutil>=2.7 in c:\swsetup\anaconda3\lib\site-packages (from matplotlib>=3.6->cartopy) (2.8.2)
Requirement already satisfied: certifi in c:\swsetup\anaconda3\lib\site-packages (from pyproj>=3.3.1->cartopy) (2024.8.30)
Requirement already satisfied: six>=1.5 in c:\swsetup\anaconda3\lib\site-packages (from python-dateutil>=2.7->matplotlib>=3.6->cartopy) (1.16.0)
Downloading Cartopy-0.24.1-cp311-cp311-win_amd64.whl (11.0 MB)
   ---------------------------------------- 0.0/11.0 MB ? eta -:--:--
    --------------------------------------- 0.2/11.0 MB 13.0 MB/s eta 0:00:01
   - -------------------------------------- 0.5/11.0 MB 6.2 MB/s eta 0:00:02
   --- ------------------------------------ 0.9/11.0 MB 7.1 MB/s eta 0:00:02
   --- ------------------------------------ 1.1/11.0 MB 6.2 MB/s eta 0:00:02
   ----- ---------------------------------- 1.6/11.0 MB 7.1 MB/s eta 0:00:02
   ------ --------------------------------- 1.8/11.0 MB 7.5 MB/s eta 0:00:02
   ------ --------------------------------- 1.9/11.0 MB 6.3 MB/s eta 0:00:02
   ------- -------------------------------- 2.2/11.0 MB 6.3 MB/s eta 0:00:02
   --------- ------------------------------ 2.5/11.0 MB 6.4 MB/s eta 0:00:02
   ---------- ----------------------------- 2.9/11.0 MB 6.7 MB/s eta 0:00:02
   ----------- ---------------------------- 3.3/11.0 MB 6.7 MB/s eta 0:00:02
   ------------- -------------------------- 3.8/11.0 MB 7.1 MB/s eta 0:00:02
   --------------- ------------------------ 4.2/11.0 MB 7.3 MB/s eta 0:00:01
   ----------------- ---------------------- 4.7/11.0 MB 7.5 MB/s eta 0:00:01
   ----------------- ---------------------- 4.8/11.0 MB 7.1 MB/s eta 0:00:01
   ------------------- -------------------- 5.3/11.0 MB 7.4 MB/s eta 0:00:01
   -------------------- ------------------- 5.6/11.0 MB 7.3 MB/s eta 0:00:01
   ---------------------- ----------------- 6.1/11.0 MB 7.5 MB/s eta 0:00:01
   ----------------------- ---------------- 6.6/11.0 MB 7.6 MB/s eta 0:00:01
   ------------------------- -------------- 6.9/11.0 MB 7.6 MB/s eta 0:00:01
   --------------------------- ------------ 7.5/11.0 MB 7.8 MB/s eta 0:00:01
   ---------------------------- ----------- 7.9/11.0 MB 7.9 MB/s eta 0:00:01
   ------------------------------ --------- 8.3/11.0 MB 7.9 MB/s eta 0:00:01
   ------------------------------- -------- 8.8/11.0 MB 8.0 MB/s eta 0:00:01
   ---------------------------------- ----- 9.3/11.0 MB 8.2 MB/s eta 0:00:01
   ---------------------------------- ----- 9.6/11.0 MB 8.1 MB/s eta 0:00:01
   ------------------------------------- -- 10.2/11.0 MB 8.2 MB/s eta 0:00:01
   -------------------------------------- - 10.6/11.0 MB 8.4 MB/s eta 0:00:01
   ---------------------------------------  11.0/11.0 MB 8.5 MB/s eta 0:00:01
   ---------------------------------------- 11.0/11.0 MB 8.3 MB/s eta 0:00:00
Downloading pyshp-2.3.1-py2.py3-none-any.whl (46 kB)
   ---------------------------------------- 0.0/46.5 kB ? eta -:--:--
   ----------------------------------- ---- 41.0/46.5 kB ? eta -:--:--
   ---------------------------------------- 46.5/46.5 kB 576.1 kB/s eta 0:00:00
Installing collected packages: pyshp, cartopy
Successfully installed cartopy-0.24.1 pyshp-2.3.1
In [1324]:
import cartopy.crs as ccrs
import cartopy.feature as cfeature
In [1630]:
#Piešiame reitingų žemėlapį su cartopy

# Miestų koordinačių nurodymas (rankiniu būdu)
miestu_kordinates = {
    'Amsterdamas': (4.89, 52.37),
    'Kreta': (25.13, 35.34),
    'Maljorka': (2.65, 39.57),
    'Praha': (14.44, 50.08),
    'Stavangeris': (5.73, 58.97),
    'Vilnius': (25.28, 54.69)
}

# Sukurti miestų koordinačių duomenų lentelę iš žodyno (from_dict funkcija)
kordinates_df = pd.DataFrame.from_dict(miestu_kordinates, orient='index', columns=['longitude', 'latitude']).reset_index()
kordinates_df = kordinates_df.rename(columns={'index': 'miestas'})

# Sujungti miestus su koordinatėmis naudojant merge ("on" - pasako pagal kuriuos stulpelius sujungti duomenų lenteles )
df = pd.merge(metinis_vertinimas_salims, kordinates_df, on='miestas')

# Sukurti Cartopy projekciją
fig, ax = plt.subplots(figsize=(12, 10), subplot_kw={'projection': ccrs.PlateCarree()})
ax.set_extent([-25, 45, 35, 72], crs=ccrs.PlateCarree())  # Iškirpti Europą

#Spalvos
ax.add_feature(cfeature.LAND, color='lightyellow')  # Šviesiai geltonas žemynų užpildymas
ax.set_facecolor("lightblue")  # Šviesiai mėlynas fonas

# Pakrantės ir šalių ribos
ax.add_feature(cfeature.COASTLINE, linestyle='-', alpha=0.7)
ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.7)

# Miestų atvaizdavimas su jų vietomis
for _, row in df.iterrows():
    x, y = row['longitude'], row['latitude']
    rank = row['reitingas']
    label = row['miestas']
    
    # Pažymime miestus su žymekliu
    ax.plot(x, y, marker='D', color='red', markersize=8, transform=ccrs.PlateCarree())
    
    # Pridedame miestų pavadinimus
    ax.text(x + 0.5, y, f"{label} ({rank})", transform=ccrs.PlateCarree(), fontsize=10, fontweight='bold', color='black')

plt.title("Miestų reitingas pagal orų sąlygas Europoje nuo 2009 m.", fontsize=14, fontweight='bold')
plt.savefig("miestureitingas.jpg", dpi=300, bbox_inches='tight')
plt.show()
No description has been provided for this image

Palankiausi atostogoms laikotarpiai

Paprastai žmonės nekeliauja tik vieną dieną, o geram poilsiui reikia bent penkių dienų. Šioje skiltyje kodas leidžia apskaičiuoti laikotarpius, kuomet skirtinguose miestuose orų sąlygos buvo geros ar labai geros 5 ar daugiau dienų ir pateikiamas šių laikotarpių datų sąrašas. Išimtis: Kretai ir Palmai, kuriose vertinamos tik labai geros orų sąlygos. Gautos datos parodo laikotarpius, kada mažiausiai tikėtina atšiauri temperatūra, lietingos dienos, vėjuoti ar debesuoti orai. Jei šie rezultatai būtų susieti su bilietų ar viešbučių kainomis, gautumėte geriausius laikotarpius orų sąlygų ir piniginės atžvilgiu.

In [1583]:
#Sudaryti sąrašą dienų su geromis ir labai geromis orų sąlygomis, kai jos tęsiaisi 5 ar ilgiau dienų skirtingiems miestams
maljorka_kreta = dazniausias_ivertinimas[
    (dazniausias_ivertinimas['miestas'].isin(['Maljorka', 'Kreta'])) &
    (dazniausias_ivertinimas['salygu_vertinimas'] == 'labai geros')
]

kiti_miestai = dazniausias_ivertinimas[
    (~dazniausias_ivertinimas['miestas'].isin(['Maljorka', 'Kreta'])) &
    (dazniausias_ivertinimas['salygu_vertinimas'].isin(['geros', 'labai geros']))
]

geros_salygos_keliauti = pd.concat([maljorka_kreta, kiti_miestai]).copy()

geros_salygos_keliauti['date'] = pd.to_datetime(geros_salygos_keliauti[['month', 'day']].assign(year=2024))
geros_salygos_keliauti = geros_salygos_keliauti.sort_values(by=['miestas', 'date'])

# shift() funkcija paslenka kiekvienos grupės datas per vieną eilutę žemyn, kad galėtume lyginti einamąją datą su ankstesne tos pačios grupės data
# dt.days funkcija paverčia kiekvieną laiko skirtumą tarp datų į dienas kaip sveikuosius skaičius, kad galima būtų sumuoti
# != 1 patikrina, ar skirtumas tarp einamosios datos ir ankstesnės datos nėra lygus vienai dienai
# cumsum() yra kaupiamoji suma prideda kiekvieną True kaip 1 prie ankstesnės reikšmės

geros_salygos_keliauti['group'] = (
    (geros_salygos_keliauti['date'] - geros_salygos_keliauti.groupby('miestas')['date'].shift()).dt.days != 1
).cumsum()


rezult = (
    geros_salygos_keliauti.groupby(['miestas', 'group'])
    .agg(start_date=('date', 'min'), end_date=('date', 'max'), days=('date', 'size'))
    .reset_index()
)

atostogos = rezult[rezult['days'] >= 5]

print(atostogos)
         miestas  group start_date   end_date  days
6    Amsterdamas      7 2024-01-21 2024-01-26     6
19   Amsterdamas     20 2024-04-17 2024-04-23     7
23   Amsterdamas     24 2024-05-10 2024-05-15     6
24   Amsterdamas     25 2024-05-17 2024-05-28    12
41   Amsterdamas     42 2024-09-06 2024-09-10     5
44   Amsterdamas     45 2024-09-18 2024-09-22     5
80         Kreta     81 2024-05-09 2024-05-20    12
81         Kreta     82 2024-05-23 2024-05-31     9
85         Kreta     86 2024-09-01 2024-09-30    30
86         Kreta     87 2024-10-02 2024-10-16    15
111     Maljorka    112 2024-02-18 2024-02-23     6
135     Maljorka    136 2024-05-22 2024-05-26     5
144     Maljorka    145 2024-09-07 2024-09-13     7
147     Maljorka    148 2024-09-30 2024-10-09    10
165     Maljorka    166 2024-12-18 2024-12-27    10
169        Praha    170 2024-01-10 2024-01-16     7
170        Praha    171 2024-01-18 2024-01-30    13
171        Praha    172 2024-02-02 2024-02-25    24
179        Praha    180 2024-04-04 2024-04-08     5
182        Praha    183 2024-04-18 2024-04-22     5
187        Praha    188 2024-05-05 2024-05-11     7
189        Praha    190 2024-05-18 2024-05-22     5
206        Praha    207 2024-08-05 2024-08-14    10
207        Praha    208 2024-08-17 2024-08-25     9
209        Praha    210 2024-09-02 2024-10-02    31
210        Praha    211 2024-10-04 2024-10-10     7
214        Praha    215 2024-10-18 2024-10-22     5
215        Praha    216 2024-10-24 2024-10-28     5
221        Praha    222 2024-12-11 2024-12-16     6
222        Praha    223 2024-12-18 2024-12-22     5
272      Vilnius    273 2024-04-20 2024-04-25     6
273      Vilnius    274 2024-04-27 2024-05-02     6
275      Vilnius    276 2024-05-08 2024-05-12     5
277      Vilnius    278 2024-05-21 2024-05-25     5
298      Vilnius    299 2024-08-16 2024-08-22     7
300      Vilnius    301 2024-09-03 2024-09-08     6
In [1587]:
#Reitinguojame mėnesius pagal palankių laikotarpių dienų skaičių

atostogos.loc[:, 'start_date'] = pd.to_datetime(atostogos['start_date'])

# pasiimame mėnesį ir metus
atostogos.loc[:, 'month'] = atostogos['start_date'].dt.month
atostogos.loc[:, 'year'] = atostogos['start_date'].dt.year

# sugrupuojame pagal mėnesį ir metus ir susumuojame dienas
dienu_sk = atostogos.groupby(['year', 'month'])['days'].sum().reset_index()

# išrykiuojame rezultatus
dienu_sk = dienu_sk.sort_values(by='days', ascending=False).reset_index(drop=True)

print(dienu_sk)
   year  month  days
0  2024      9    94
1  2024      5    66
2  2024     10    32
3  2024      2    30
4  2024      4    29
5  2024      1    26
6  2024      8    26
7  2024     12    21
In [1591]:
#Atvaizduojame rezultatus su dienu_sk
dienu_sk['month_name'] = pd.to_datetime(dienu_sk[['year', 'month']].assign(day=1)).dt.strftime('%B')

plt.figure(figsize=(10, 6))
plt.bar(dienu_sk['month_name'].astype(str),
        dienu_sk['days'])

plt.xlabel('Mėnesiai')
plt.ylabel('Iš viso dienų')
plt.title('Daugiausiai dienų (>5 iš eilės) palankių atostogoms')
plt.xticks(rotation=45)

plt.show()
No description has been provided for this image
In [1399]:
#Įrašome csv failą
atostogos.to_csv("atostogudatos.csv", sep=';', encoding='utf-16', index=False)
In [1595]:
#Filtruojame pagal pageidaujamą miestą
atostogos[atostogos["miestas"] == "Vilnius"]
Out[1595]:
miestas group start_date end_date days month year
272 Vilnius 273 2024-04-20 2024-04-25 6 4 2024
273 Vilnius 274 2024-04-27 2024-05-02 6 4 2024
275 Vilnius 276 2024-05-08 2024-05-12 5 5 2024
277 Vilnius 278 2024-05-21 2024-05-25 5 5 2024
298 Vilnius 299 2024-08-16 2024-08-22 7 8 2024
300 Vilnius 301 2024-09-03 2024-09-08 6 9 2024

Turite jums svarbią datą? Pasitikrinkite kur keliauti.

Jei turite svarbią jums datą, šioje programėlėje galite įvesti mėnesį ir dieną ir programa jums išmes sąlašą miestų kur tą dieną geriausia nuvykti, kad turėtumėte didžiausią gerų orų tikimybę. Jei orų sąlygos visusose pasirinktuose miestuose tą dieną yra vertinamos blogai, jūs gausite užrašą "Likite namuose".

In [1497]:
# Sukurkite įvesties laukelius mėnesio ir dienos pasirinkimui
month = int(input("Įveskite mėnesį (skaičiumi, pvz., 1 už sausį): "))
day = int(input("Įveskite dieną: "))

# Filtruojame pagal nurodytą mėnesį, dieną ir "labai geros" ar "geros" sąlygas
labai_geros_salygos = dazniausias_ivertinimas[
    (dazniausias_ivertinimas['month'] == month) &
    (dazniausias_ivertinimas['day'] == day) &
    (
         ((dazniausias_ivertinimas['miestas'] == "Kreta") & (dazniausias_ivertinimas['salygu_vertinimas'] == "labai geros")) |
        ((dazniausias_ivertinimas['miestas'] == "Maljorka") & (dazniausias_ivertinimas['salygu_vertinimas'] == "labai geros")) |
        (~dazniausias_ivertinimas['miestas'].isin(["Maljorka", "Kreta"])) & (dazniausias_ivertinimas['salygu_vertinimas'].isin(["labai geros", "geros"]))
    )
]

# Išrenkame šalių, palankių kelionėms, sąrašą 
salys = labai_geros_salygos['miestas'].unique()

# Patikriname, ar yra įrašų atitinkančių "labai geros" sąlygas, ir pateikiame jų sąrašą, priešingu atveju gauname užrašą "Likite namuose"
if len(salys) > 0:
    display(HTML(f"<b>Keliaukite į:</b> {', '.join(salys)}"))
else:
    display(HTML("<b>Likite namuose</b>"))
#pavyzdžiui kovo 4 d. (3) ir (4)
Keliaukite į: Amsterdamas, Kreta, Maljorka, Praha, Stavangeris, Vilnius

Kaip pasikeis oro temperatūra pasirinkytuose miestuose po 10 metų?

Klimato kaitos sąlygomis darosi akivaizdu, jog kai kuriuose pasaulio miestuose dėl pakilusios oro temperatūros gali ženkliai pasikeisti komforto sąlygos. Mašininio mokymosi būdu su tiesinės regresijos modelio pagalba įvertiname kaip pasikeis oro temperatūra pasirinktuose miestuose po 10 metų ir įvertiname modelio tikslumą.

In [1602]:
#Tiesinės regresijos modelis oro temperatūros prognozei

from sklearn.linear_model import LinearRegression

# Miestų sąrašas
cities = vidutines_oru_salygos_diena['miestas'].unique()

# Sukuriame grafiką su subplots
plt.figure(figsize=(18, 12))
for i, city in enumerate(cities, 1):
    # Filtruojame duomenis pagal miestą
    city_data = vidutines_oru_salygos_diena[vidutines_oru_salygos_diena['miestas'] == city]

    # Apskaičiuojame metinius temperatūros vidurkius
    city_data = city_data.copy()
    city_data.loc[:, 'metai'] = city_data['date_ymd'].dt.year
    annual_avg_temp = city_data.groupby('metai')['temperature_2m'].mean().reset_index()

    # Modelio duomenys
    X = annual_avg_temp[['metai']]
    y = annual_avg_temp['temperature_2m']

    model = LinearRegression()
    model.fit(X, y)

    # Prognozuojame temperatūrą po 10 metų
    future_year = pd.DataFrame([[X['metai'].max() + 10]], columns=['metai'])
    future_temperature = model.predict(future_year)

    annual_increase_rate = model.coef_[0]
    trendline = model.predict(X)
 
    plt.subplot(2, 3, i)
    plt.plot(annual_avg_temp['metai'], annual_avg_temp['temperature_2m'], 'o', label="Metinė vidutinė temperatūra")
    plt.plot(annual_avg_temp['metai'], trendline, label="Tendencijos linija", color='orange')
    plt.scatter(future_year, future_temperature, color='red', label="Prognozuota temperatūra po 10 metų")
    plt.xlabel("Metai")
    plt.ylabel("Vidutinė temperatūra (°C)")
    plt.title(f"{city}: Temperatūros pokytis po 10 metų")
    plt.legend()

    print(f"{city}: Temperatūros pokytis per metus: {annual_increase_rate:.2f} °C")

plt.tight_layout()
plt.show()
Amsterdamas: Temperatūros pokytis per metus: 0.04 °C
Kreta: Temperatūros pokytis per metus: -0.05 °C
Maljorka: Temperatūros pokytis per metus: 0.02 °C
Praha: Temperatūros pokytis per metus: 0.07 °C
Stavangeris: Temperatūros pokytis per metus: 0.03 °C
Vilnius: Temperatūros pokytis per metus: 0.06 °C
No description has been provided for this image
In [1475]:
#Modelio tiklumo vertinimas
model.score(X,y)
Out[1475]:
0.3495263495938895
In [1606]:
# Išsamesnė modelio tikslumo analizė skirtingiems miestams
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

cities = vidutines_oru_salygos_diena['miestas'].unique()

rezultatas = []

for city in cities:
    city_data = vidutines_oru_salygos_diena[vidutines_oru_salygos_diena['miestas'] == city]
    city_data = city_data.copy()  # Sukuriame nepriklausomą kopiją
    city_data['metai'] = city_data['date_ymd'].dt.year
    
    annual_avg_temp = city_data.groupby('metai')['temperature_2m'].mean().reset_index()

    # Modelio duomenys
    X = annual_avg_temp[['metai']]
    y = annual_avg_temp['temperature_2m']

    # Padaliname duomenis į treniravimo ir testavimo dalis
    train_years = X['metai'] < X['metai'].max()
    X_train, X_test = X[train_years], X[~train_years]
    y_train, y_test = y[train_years], y[~train_years]

    # Modelio treniravimas
    model = LinearRegression()
    model.fit(X_train, y_train)

    # Modelio prognozės testavimas
    y_pred = model.predict(X_test)

    # Modelio tikslumo vertinimas
    mae = mean_absolute_error(y_test, y_pred)
    mse = mean_squared_error(y_test, y_pred)
    rmse = np.sqrt(mse)
   
    # Įrašome rezultatus į lentelę
    rezultatas.append({
        "Miestas": city,
        "MAE": mae,
        "MSE": mse,
        "RMSE": rmse,
            })

rezultatas_df = pd.DataFrame(rezultatas)

# Atvaizduojame rezultatus
print("Prognozės tikslumo rodikliai visiems miestams:")
print(rezultatas_df)
Prognozės tikslumo rodikliai visiems miestams:
       Miestas       MAE       MSE      RMSE
0  Amsterdamas  0.449238  0.201815  0.449238
1        Kreta  0.389593  0.151783  0.389593
2     Maljorka  0.249839  0.062420  0.249839
3        Praha  0.739016  0.546145  0.739016
4  Stavangeris  0.356111  0.126815  0.356111
5      Vilnius  0.766069  0.586861  0.766069

Patikriname paskutinių penkių metų skirtingų miestų orų sąlygų reitingus

Šiame skyriuje patikriname, ar yra pokyčių reitinguose per paskutinius 5 metus, palyginus su paskutinių 15 metų rezultatais.

In [1610]:
# Susikuriame naują oro sąlygų vertinimą, apimant laikotarpį nuo 2019 metų
oru_kriterijai_new = oru_kriterijai[oru_kriterijai["date_ymd"] > "2019-01-01"]
dazniausias_ivertinimas_new = oru_kriterijai_new.groupby(['month', 'day', 'miestas']).agg({
    'salygu_vertinimas': lambda x: x.mode()[0]
}).reset_index()

dazniausias_ivertinimas_new.head(10)
Out[1610]:
month day miestas salygu_vertinimas
0 1 1 Amsterdamas blogos
1 1 1 Kreta geros
2 1 1 Maljorka geros
3 1 1 Praha labai geros
4 1 1 Stavangeris blogos
5 1 1 Vilnius vidutines
6 1 2 Amsterdamas geros
7 1 2 Kreta vidutines
8 1 2 Maljorka geros
9 1 2 Praha geros
In [1612]:
#Apibendriname rezultatus mėnesiams, nustatant kiek kokių orų sąlygų pasiartoja skirtingais mėnesiais nuo 2019 m.
menesio_vertinimai_new = (
    dazniausias_ivertinimas_new
    .groupby(['month', 'salygu_vertinimas', 'miestas'])
    .size()
    .unstack(fill_value=0)
    .rename_axis(None, axis=1)
    .reset_index()
)
menesio_vertinimai_new
Out[1612]:
month salygu_vertinimas Amsterdamas Kreta Maljorka Praha Stavangeris Vilnius
0 1 blogos 9 6 0 7 18 9
1 1 geros 11 10 14 14 4 5
2 1 labai geros 3 5 16 5 0 0
3 1 vidutines 8 10 1 5 9 17
4 2 blogos 10 4 0 6 19 12
5 2 geros 12 7 5 12 9 8
6 2 labai geros 2 14 24 4 1 0
7 2 vidutines 5 4 0 7 0 9
8 3 blogos 11 14 2 12 11 14
9 3 geros 4 9 18 8 5 7
10 3 labai blogos 6 1 0 2 6 3
11 3 labai geros 1 0 10 2 0 0
12 3 vidutines 9 7 1 7 9 7
13 4 blogos 11 8 2 11 7 9
14 4 geros 10 17 20 12 9 8
15 4 labai blogos 1 0 0 0 1 5
16 4 labai geros 1 2 7 0 3 1
17 4 vidutines 7 3 1 7 10 7
18 5 blogos 4 4 1 2 11 4
19 5 geros 17 11 15 17 9 18
20 5 labai blogos 0 0 0 0 2 0
21 5 labai geros 1 15 12 0 2 0
22 5 vidutines 9 1 3 12 7 9
23 6 blogos 11 2 0 5 10 4
24 6 geros 6 28 19 13 7 14
25 6 labai blogos 3 0 0 0 2 0
26 6 labai geros 2 0 10 3 0 3
27 6 vidutines 8 0 1 9 11 9
28 7 blogos 11 0 0 6 16 7
29 7 geros 8 30 31 13 4 8
30 7 labai blogos 5 0 0 0 7 2
31 7 labai geros 1 1 0 4 0 5
32 7 vidutines 6 0 0 8 4 9
33 8 blogos 9 0 0 6 14 5
34 8 geros 8 28 28 18 4 10
35 8 labai blogos 3 0 0 0 6 2
36 8 labai geros 1 3 1 3 0 6
37 8 vidutines 10 0 2 4 7 8
38 9 blogos 7 0 1 3 11 3
39 9 geros 17 4 16 19 13 14
40 9 labai geros 4 26 12 6 0 8
41 9 vidutines 2 0 1 2 6 5
42 10 blogos 19 7 1 4 20 8
43 10 geros 5 7 13 18 1 9
44 10 labai blogos 0 0 0 0 2 1
45 10 labai geros 0 17 17 2 0 0
46 10 vidutines 7 0 0 7 8 13
47 11 blogos 12 11 1 8 17 17
48 11 geros 4 9 18 4 2 1
49 11 labai blogos 4 0 0 1 4 1
50 11 labai geros 0 0 7 0 0 0
51 11 vidutines 10 10 4 17 7 11
52 12 blogos 12 0 1 2 17 10
53 12 geros 9 16 16 21 9 9
54 12 labai geros 1 7 14 0 2 0
55 12 vidutines 9 8 0 8 3 12
In [1616]:
#Skaičiuojame skirtingų orų sąlygų skirtumą per paskutinius 15 ir 5 metus

# Pasirenkame tik skaitinius stulpelius
numerical_columns = menesio_vertinimai.select_dtypes(include='number').columns

# Atliekame skirtumą tik skaitiniams stulpeliams
skirtumas = menesio_vertinimai[numerical_columns] - menesio_vertinimai_new[numerical_columns]

# Sujungiame tekstinius stulpelius su skirtumų rezultatais
skirtumas_oru_salygoms = pd.concat([menesio_vertinimai[['month', 'salygu_vertinimas']], skirtumas], axis=1)

skirtumas_oru_salygoms
Out[1616]:
month salygu_vertinimas month Amsterdamas Kreta Maljorka Praha Stavangeris Vilnius
0 1 blogos 0 -1 -6 0 -4 2 2
1 1 geros 0 2 3 3 9 1 -3
2 1 labai geros 0 -2 3 -3 -5 1 0
3 1 vidutines 0 1 0 0 0 -4 1
4 2 blogos 0 -3 -3 0 -4 1 -9
5 2 geros 0 2 3 10 13 -4 7
6 2 labai geros 0 -2 -2 -10 -3 0 0
7 2 vidutines 0 3 2 0 -6 3 2
8 3 blogos 0 3 -9 -2 -3 -1 -2
9 3 geros 0 -3 8 -2 -4 -2 -5
10 3 labai blogos 0 -4 -1 0 -2 1 -1
11 3 labai geros 0 -1 0 1 -1 0 0
12 3 vidutines 0 5 2 3 10 2 8
13 4 blogos 0 -2 -5 -2 -9 2 -4
14 4 geros 0 1 4 -3 4 -6 6
15 4 labai blogos 0 -1 0 0 0 2 -5
16 4 labai geros 0 -1 4 6 4 -1 -1
17 4 vidutines 0 3 -3 -1 1 3 4
18 5 blogos 0 -3 -4 -1 -2 -3 -2
19 5 geros 0 3 -5 -4 1 1 -2
20 5 labai blogos 0 0 0 0 0 -1 0
21 5 labai geros 0 0 10 8 1 -2 2
22 5 vidutines 0 0 -1 -3 0 5 2
23 6 blogos 0 2 -2 0 -1 6 0
24 6 geros 0 -2 2 0 -3 -6 -4
25 6 labai blogos 0 -2 0 0 0 1 1
26 6 labai geros 0 -2 0 1 -2 0 -2
27 6 vidutines 0 4 0 -1 6 -1 5
28 7 blogos 0 -3 0 0 -5 0 -1
29 7 geros 0 0 -3 0 -1 -2 -2
30 7 labai blogos 0 -1 0 0 0 -2 -1
31 7 labai geros 0 -1 3 0 1 0 -1
32 7 vidutines 0 5 0 0 5 4 5
33 8 blogos 0 1 0 0 -5 -2 -1
34 8 geros 0 -3 -1 3 5 -2 3
35 8 labai blogos 0 0 0 0 0 5 -2
36 8 labai geros 0 0 1 -1 -1 0 -5
37 8 vidutines 0 2 0 -2 1 -1 5
38 9 blogos 0 -3 0 -1 -3 5 -1
39 9 geros 0 2 -4 -4 1 -8 0
40 9 labai geros 0 -2 4 3 3 1 -6
41 9 vidutines 0 3 0 2 -1 2 7
42 10 blogos 0 -12 -5 -1 -4 -1 -2
43 10 geros 0 2 2 -3 5 3 -4
44 10 labai blogos 0 0 0 0 0 -1 -1
45 10 labai geros 0 0 1 4 -2 0 0
46 10 vidutines 0 10 2 0 1 -1 7
47 11 blogos 0 0 -7 -1 -6 -2 -4
48 11 geros 0 -4 7 3 -2 -1 -1
49 11 labai blogos 0 -3 0 0 -1 8 0
50 11 labai geros 0 0 0 2 0 0 0
51 11 vidutines 0 7 0 -4 9 -5 5
52 12 blogos 0 -4 0 -1 -2 8 -3
53 12 geros 0 2 1 -1 0 -6 -3
54 12 labai geros 0 -1 2 2 0 -2 0
55 12 vidutines 0 3 -3 0 2 0 6
In [1634]:
#Išsifiltruojame teigiamus skirtumus tik labai gerų ir gerų oro sąlygų vienam miestui
apibendrinimas = skirtumas_oru_salygoms[
    (skirtumas_oru_salygoms['salygu_vertinimas'].isin(['geros', 'labai geros'])) &
    (skirtumas_oru_salygoms['Vilnius'] > 0)
]

print(apibendrinimas)
    month salygu_vertinimas  month  Amsterdamas  Kreta  Maljorka  Praha  \
5       2             geros      0            2      3        10     13   
14      4             geros      0            1      4        -3      4   
21      5       labai geros      0            0     10         8      1   
34      8             geros      0           -3     -1         3      5   

    Stavangeris  Vilnius  
5            -4        7  
14           -6        6  
21           -2        2  
34           -2        3  
In [1620]:
#Apibendriname rezultatus, nustatant kiek kokių orų sąlygų pasiartoja skirtingiems miestams per metus ir priskiriame reitingą nuo 2019 m.
metinis_vertinimas_salims_new = (
    dazniausias_ivertinimas_new
    .groupby(['miestas', 'salygu_vertinimas'])
    .size()
    .unstack(fill_value=0)
    .rename_axis(None, axis=1)  # pasalinti indeksu pavadinima stulpeliuose
    .reset_index()
)

metinis_vertinimas_salims_new = metinis_vertinimas_salims_new[['miestas', 'labai blogos', 'blogos', 'vidutines', 'geros', 'labai geros']]
metinis_vertinimas_salims_new['reitingas'] = metinis_vertinimas_salims_new['geros'] + metinis_vertinimas_salims_new['labai geros']

# rank() funkcija priskiria reitingą kiekvienai reikšmei stulpelyje, o dense metodas padeda išrikiuoti pasikartojančias reikšmes
metinis_vertinimas_salims_new['reitingas'] = metinis_vertinimas_salims_new['reitingas'].rank(method='dense', ascending=False).astype(int)
metinis_vertinimas_salims_new = metinis_vertinimas_salims_new.sort_values(by='reitingas').reset_index(drop=True)

metinis_vertinimas_salims_new
Out[1620]:
miestas labai blogos blogos vidutines geros labai geros reitingas
0 Maljorka 0 9 14 213 130 1
1 Kreta 1 56 43 176 90 2
2 Praha 3 72 93 169 29 3
3 Vilnius 14 102 116 111 23 4
4 Amsterdamas 22 126 90 111 17 5
5 Stavangeris 30 171 81 76 8 6
In [1628]:
#Piešiame reitingų žemėlapį su cartopy vertinimams nuo 2019 m.

# Miestų koordinačių nurodymas (rankiniu būdu)
miestu_kordinates = {
    'Amsterdamas': (4.89, 52.37),
    'Kreta': (25.13, 35.34),
    'Maljorka': (2.65, 39.57),
    'Praha': (14.44, 50.08),
    'Stavangeris': (5.73, 58.97),
    'Vilnius': (25.28, 54.69)
}

# Sukurti miestų koordinačių duomenų lentelę iš žodyno (from_dict funkcija)
kordinates_df = pd.DataFrame.from_dict(miestu_kordinates, orient='index', columns=['longitude', 'latitude']).reset_index()
kordinates_df = kordinates_df.rename(columns={'index': 'miestas'})

# Sujungti miestus su koordinatėmis naudojant merge ("on" - pasako pagal kuriuos stulpelius sujungti duomenų lenteles )
df_new = pd.merge(metinis_vertinimas_salims_new, kordinates_df, on='miestas')

# Sukurti Cartopy projekciją
fig, ax = plt.subplots(figsize=(12, 10), subplot_kw={'projection': ccrs.PlateCarree()})
ax.set_extent([-25, 45, 35, 72], crs=ccrs.PlateCarree())  # Iškirpti Europą

#Spalvos
ax.add_feature(cfeature.LAND, color='lightyellow')  # Šviesiai geltonas žemynų užpildymas
ax.set_facecolor("lightblue")  # Šviesiai mėlynas fonas

# Pakrantės ir šalių ribos
ax.add_feature(cfeature.COASTLINE, linestyle='-', alpha=0.7)
ax.add_feature(cfeature.BORDERS, linestyle='-', alpha=0.7)

# Miestų atvaizdavimas su jų vietomis
for _, row in df_new.iterrows():
    x, y = row['longitude'], row['latitude']
    rank = row['reitingas']
    label = row['miestas']
    
    # Pažymime miestus su žymekliu
    ax.plot(x, y, marker='D', color='red', markersize=8, transform=ccrs.PlateCarree())
    
    # Pridedame miestų pavadinimus
    ax.text(x + 0.5, y, f"{label} ({rank})", transform=ccrs.PlateCarree(), fontsize=10, fontweight='bold', color='black')

plt.title("Miestų reitingas pagal orų sąlygas Europoje nuo 2019 m.", fontsize=14, fontweight='bold')
plt.savefig("miestureitingas.jpg", dpi=300, bbox_inches='tight')
plt.show()
No description has been provided for this image

IŠVADOS

  1. Hipotezė patvirtinta. Pietiniai Europos miestai turi daugiau palankių dienų atostogoms per metus ir yra patrauklesni orų sąlygų atžvilgiu.
  2. Hipotezė paneigta. Pagal pasirinktus kriterijus vasaros mėnesiai nėra patys patraukliausi atostogoms. Palankiausi mėnesiai atostogoms penkias ar daugiau dienų iš eilės yra rugsėjis ir gegužė.
  3. Hipotezė patvirtinta. Pagal tiesinės regresijos modelį oro temperatūra ateityje didžiojoje daugumoje pasirinktų miestų ženkliai kils (išskyrs Kretą), labiausiai Vilniuje ir Prahoje. Tokiu būdu kai kurie miestai, tokie kaip Palmos Maljorka ir Praha gali pasidaryti per karšti atostogoms vasarą, o štai Vilnius gali tapti labiau maloniu aktyviai veiklai metų eigoje. Vertinant paskutinių 5 metų ir 15 metų orų sąlygas Vilnius pakilo iš 5 vietos į 4-tą ir aplenkė Amsterdamą. Išsiaiškinta, kad Vilniuje per paskutinius 5 metus padaugėjo gerų ir labai gerų sąlygų dienų vasario, balandžio, gegužės ir rugpjūčio mėnesiai.




Python projektą parengė: Indrė Gečaitė
Duomenys pasiekiami Open-Meteo svetainėje, nuoroda: https://open-meteo.com/en/docs