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
- Europos pietinės ir vakarinės šalys yra labiau tinkamos atostogoms.
- Geriausia keliauti vasaros mėnesiais.
- 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.
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))
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%
Duomenų įkėlimas ir apdorojimas
#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)
# Importuoti pandas ir numpy
import pandas as pd
import numpy as np
#Importuoti Vilniaus duomenis
vilnius = pd.read_csv("hourly_dataframe_vilnius2.csv", index_col=None)
vilnius.head(10)
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 |
#Importuoti Amsterdamo duomenis
amsterdam = pd.read_csv("hourly_dataframe_amsterdam2.csv", index_col=None)
amsterdam.head(10)
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 |
#Importuoti Maljorkos Palmos duomenis
maljorka = pd.read_csv("hourly_dataframe_palma2.csv", index_col=None)
maljorka.head(10)
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 |
#Importuoti Prahos duomenis
praha = pd.read_csv("hourly_dataframe_praha2.csv", index_col=None)
praha.head(10)
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 |
#Importuoti Stavangerio duomenis
stavanger = pd.read_csv("hourly_dataframe_stavangeris2.csv", index_col=None)
stavanger.head(10)
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 |
#Importuoti Kretos duomenis
kreta = pd.read_csv("hourly_dataframe_kreta2.csv", index_col=None)
kreta.head(10)
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 |
#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"
stavanger
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
# 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)
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 |
#Patikrinti ar duomenų lentelėje oru_salygos yra NaN reikšmių
oru_salygos.isna().any().any()
False
#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]
#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
#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
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
#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
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.
#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
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
#Patikrinti datos duomenų tipą
vidutines_oru_salygos_diena["date_ymd"].dtype
dtype('O')
#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
dtype('<M8[ns]')
#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
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
#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)
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 |
#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)
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 |
import matplotlib.pyplot as plt
import seaborn as sns
#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()
#Išsaugome paveikslus
fig.savefig("heatmaps4.jpg", dpi=300)
# 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)
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 |
# 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()
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¶
#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
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 |
#Vidutinė maksimali temperatūra pagal 10 aukščausių reikšmių
max_temperature_average = max_temperature.groupby('miestas')['temperature_2m'].mean()
max_temperature_average
miestas Amsterdamas 29.757143 Kreta 27.733571 Maljorka 33.926429 Praha 33.157143 Stavangeris 25.012857 Vilnius 29.472857 Name: temperature_2m, dtype: float64
max_temperature_average.plot(kind="bar", color='indianred')
plt.show()
#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
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 |
#Vidutinė minimali temperatūra pagal 10 žemiausių reikšmių
min_temperature_average = min_temperature.groupby('miestas')['temperature_2m'].mean()
min_temperature_average
miestas Amsterdamas -7.760000 Kreta -8.455714 Maljorka 5.022857 Praha -14.622143 Stavangeris -9.585000 Vilnius -23.788571 Name: temperature_2m, dtype: float64
min_temperature_average.plot(kind="bar", color='skyblue')
plt.axhline(0, color='black', linewidth=0.5)
plt.show()
2. Didžiausias dienos kritulių kiekis¶
#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
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 |
#Vidutinė maksimali kritulių kiekio reikšmė pagal 10 didžiausių reikšmių
max_precip_average = max_precip.groupby('miestas')['precipitation'].mean()
max_precip_average
miestas Amsterdamas 28.22 Kreta 39.01 Maljorka 39.45 Praha 30.91 Stavangeris 39.37 Vilnius 33.10 Name: precipitation, dtype: float64
max_precip_average.plot(kind="bar", color='deepskyblue')
plt.show()
3. Didižiausias vėjo greitis¶
#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
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 |
#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
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
max_wind_average.plot(kind="bar", color='orange')
plt.show()
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.
#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()
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 |
# 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)
#Išsifiltruojame reikiamus stulpelius
oru_kriterijai = oru_salygos_15[['date_ymd', 'miestas', 'month', 'day', 'year', 'salygu_vertinimas']]
oru_kriterijai
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
#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)
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 |
#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
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 |
#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ę.
#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()
heatmap_lg.savefig("heatmap_lg3.jpg")
#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()
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.
#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
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 |
!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
import cartopy.crs as ccrs
import cartopy.feature as cfeature
#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()
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.
#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
#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
#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()
#Įrašome csv failą
atostogos.to_csv("atostogudatos.csv", sep=';', encoding='utf-16', index=False)
#Filtruojame pagal pageidaujamą miestą
atostogos[atostogos["miestas"] == "Vilnius"]
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".
# 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)
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ą.
#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
#Modelio tiklumo vertinimas
model.score(X,y)
0.3495263495938895
# 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.
# 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)
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 |
#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
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 |
#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
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 |
#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
#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
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 |
#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()
IŠVADOS
- Hipotezė patvirtinta. Pietiniai Europos miestai turi daugiau palankių dienų atostogoms per metus ir yra patrauklesni orų sąlygų atžvilgiu.
- 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žė.
- 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