-
Notifications
You must be signed in to change notification settings - Fork 0
/
Element2-Pandas 2.py
executable file
·246 lines (192 loc) · 7.99 KB
/
Element2-Pandas 2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 18 15:59:57 2020
@author: fredr
"""
#oppgaver:
import pandas as pd
import numpy as np
#%%
#1:
#importerer datafilen:
df_opg1 = pd.read_csv('Datasets/Weather/2342202.csv')
#%%
#2:
# ser at dataen er organisert i 92099 rader og fem kolonner: Station, Name, Date og TAVG
# Datasettet består av datatypene "object" og "float64".
head = df_opg1.head()
info = df_opg1.info()
#%%
#3:
#skal droppe duplikerte rader og rader med null-verdier, og etterpå fikse index-verdiene
def fix_index(df): #lager først en funksjon som fikser index-verdiene:
df.reset_index(inplace=True) # Lager en ny kolonne med indexer som stemmer
del df["index"] # Sletter kolonnen med indexer som ikke stemte
def trinn3(df): #lager så en funksjon som dropper duplikerte rader og rader med null-verdier:
df.drop_duplicates(inplace=True) # Dropper duplikerte rader
df.dropna(inplace=True) # Dropper rader med null-verdier
fix_index(df)
trinn3(df_opg1)
df_opg1.info()
# Ser at det nå kun er 7606 rader igjen i datasettet, til tross for at det var 92099 rader til å begynne med.
# Dette er fordi at en stor majoritet av radene til å begynne med inneholdt null-verdier.
#%%
#4:
def trinn4(df):
# Splitter "NAME" kolonnen med hensyn på komma.
# Det gir en "Series" med to kolonner, hvor første kolonne [0] er area, og andre kolonne [1] er country.
area = df["NAME"].str.split(',', expand=True)[0]
country_and_city = df["NAME"].str.split(',', expand=True)[1]
# Setter så inn kolonnene i dataframen:
df["AREA"] = area
df["COUNTRY"] = country_and_city
# Og sletter den originale kolonnen NAME
del df["NAME"]
trinn4(df_opg1)
#%%
#5:
def trinn5(df):
# Vi skal dele opp "COUNTRY"-kolonnen i to kolonner CITY og COUNTRY
# Vi splitter den kun en gang (n=1) fra høyre side (ergo "rsplit" istedet for "split") med hensyn på mellomrom.
# Vi splitter fra høyre slik at radene som kun inneholder "country" og ikke "city" kommer i riktig kolonne.
city = df["COUNTRY"].str.rsplit(' ', expand=True, n=1)[0] #alle byene
country = df["COUNTRY"].str.rsplit(' ', expand=True, n=1)[1] #alle landene
# Setter alle lands -og by-kodene inn i dataframen:
df["COUNTRY"] = country
df["CITY"] = city
trinn5(df_opg1)
#%%
#6:
def trinn6(df): #bruker COUNTRY-kolonnen fra opg 4.
df["COUNTRY"] = df["COUNTRY"].str.rsplit(' ', expand=True, n=1)[1] # Kun landskoder
def alternativ1(df):
for n in range(0, len(df)):
df["COUNTRY"][n] = df["COUNTRY"][n].split(" ")[-1]
def alternativ2(df):
n = 0
while n < len(df):
df["COUNTRY"][n] = df["COUNTRY"][n].split(" ")[-1]
n+=1
alternativ2(df_opg1)
print(df_opg1["COUNTRY"][0].split(" ")[-1])
#%%
#7:
#importerer en annen datafil
df_opg7 = pd.read_csv('Datasets/Weather/2342207.csv')
#7 trinn 3 (slette nan-kolonner og duplikerte rader):
trinn3(df_opg7)
#7 trinn 4:
trinn4(df_opg7)
#7 trinn 6:
trinn6(df_opg7)
#%%
#8:
# Slår sammen de to tidligere df-ene fra opg 1 og opg 7:
df_opg8 = pd.concat([df_opg1, df_opg7], axis = 0)
# Fikser index-verdiene:
fix_index(df_opg8)
#%%
#9:
# Skal kontrollere at df-en fra trinn 8 er riktig.
# For å gjøre dette kan vi sjekke at lengden på df-en fra trinn 8 er lik summen av lengdene til de to tidligere df-ene.
# Sammenligner lengden på df-ene:
# Om lengden på df_opg1 + df_opg7 == lengden til df_opg8 så settes variabelen "kontroll_opg9" til "Riktig lengde".
if (len(df_opg1.index)+len(df_opg7.index) == len(df_opg8.index)):
kontroll_opg9 = "Riktig lengde"
else:
kontroll_opg9 = "Feil lengde"
# Vi kjører koden og leser at lengden stemmer, og kan konkludere med at df_opg8 er riktig.
#%%
#11:
import glob
file_paths = glob.glob("Datasets/Weather/*.csv") # Lagrer stien til alle filene i mappen "weather".
all_dfs = [pd.read_csv(path) for path in file_paths] # Importerer alle csv-filene fra mappen "weather" og lagrer dem i listen "all_dfs".
for df in all_dfs: # Kjører koden under en gang for hver df i listen all_dfs.
# Trinn 3:
# Gjør trinn 3 for hver df:
trinn3(df)
# Trinn 4:
trinn4(df)
# Trinn 6:
trinn6(df)
#%%
#12:
df_trondheim = pd.read_csv('Datasets/Weather/extra/Trondheim.csv')
# Trinn 3:
trinn3(df_trondheim)
# Trinn 4:
trinn4(df_trondheim)
# Trinn 6:
trinn6(df_trondheim)
#%%
#13:
# Lager en ny kolonne TAVG som er gjennomsnittet av TMIN og TMAX:
df_trondheim["TAVG"] = (df_trondheim["TMIN"]+df_trondheim["TMAX"])/2
#%%
#14:
# Endrer df_trondheim slik at rekkefølgen er lik rekkefølgen til de andre df-ene, og slik at "TMIN" og "TMAX" ikke blir med.
df_trondheim = df_trondheim[["STATION", "DATE", "TAVG", "AREA", "COUNTRY"]]
#%%
#15:
# Skal kombinere alle df-ene til en supermega-df kalt df_complete
# Lager først en df_complete med alle df-ene untatt trondheim:
df_complete = pd.concat(all_dfs, axis = 0)
# Legger så trondheim df-en til i df_complete:
df_complete = pd.concat([df_complete, df_trondheim], axis = 0)
# Og fikser så index-verdiene:
fix_index(df_complete)
#%%
#16:
df_country_continent = pd.read_csv('Datasets/countryContinent.csv', encoding="iso_8859_1")
#%%
#17:
country_continent_head = df_country_continent.head(10)
# Ser at df_country_continent er strukturert i 9 kolonner.
# Kolonnene inneholder informasjon om land, som hvilke region de befinner seg i og regions-koden og lands-koden osv.
# Blant all denne informasjonen er det mye som kan være unyttig når vi skal se på temperaturdata
# Det som kan være nyttig å vite derimot er: land, lands-kode, kontinent og region. Fordi denne informasjonen er relevant til temperaturdataen.
#%%
#18:
# Bruker "merge" funksjonen til å slå sammen "df_complete" og "df_country_continent" til en df "df_complete_cont".
# Slår de sammen med hensyn på kolonnene "COUNTRY" (fra "df_complete") og "code_2" (fra "df_country_continent"), fordi disse kolonnene samsvarer.
df_complete_cont = pd.merge(df_complete, df_country_continent, left_on="COUNTRY", right_on="code_2")
#%%
#19:
# Dropper først "code_2" kolonnen:
del df_complete_cont["code_2"]
# Gir nye navn til de andre forespurte kolonnene:
df_complete_cont.rename(columns={"COUNTRY":"Country-code", "continent":"Continent", "country":"Country"}, inplace=True)
#%%
#21:
def column_values(df, column): # Returnerer alle unike verdier fra en spesifikk kolonne i en dataframe:
unique_values = list(df[column].sort_values().unique())
return unique_values
countries_in_df = column_values(df_complete_cont, "Country")
continents_in_df = column_values(df_complete_cont, "Continent")
#%%
#22:
def c_to_f(degrees_in_c):
degrees_in_f = degrees_in_c*(9/5)+32
return degrees_in_f
def f_to_c(degrees_in_f):
degrees_in_c = (degrees_in_f-32)*(5/9)
return round(degrees_in_c, 2)
#df_complete_cont["TAVG"] = c_to_f(df_complete_cont["TAVG"])
df_complete_cont["TAVG"] = f_to_c(df_complete_cont["TAVG"])
#%%
def plot_compare_w_oslo_2019(dataframe,legendnavn):
from datetime import datetime as dt
import matplotlib.pyplot as plt
df_complete_cont = pd.read_csv("completeCont.csv")
## Vi finner alle rader som er i Oslo, og har målinger fra 2019.
df_oslo = df_complete_cont.copy()[df_complete_cont["Area"].str.contains("OSLO") & df_complete_cont["DATE"].str.contains("2019")]
df_oslo = df_oslo.reset_index(drop=True) ## Reset indeksene.
## Vi omformaterer dato kolonnene i begge dataframes til datetime med bare datoen.
dataframe["DATE"] = pd.to_datetime(dataframe["DATE"], format="%d.%m.%Y").dt.date ## Vi har med format her pga den trodde default var mnd.dag.år
df_oslo["DATE"] = pd.to_datetime(df_oslo["DATE"]).dt.date
## Plotter inn begge dataframes, med y som temp, x som indeks.
dataframe.plot(ax=df_oslo.plot(), figsize=(20,5)).legend(["Oslo 2019",legendnavn])
## Plotter inn hver dataframe i sin egen subplot.
fig, ax = plt.subplots(2, 1, figsize=(20,10))
df_oslo.plot(x="DATE", y="TAVG", ax=ax[0]).legend(["Oslo 2019"])
dataframe.plot(x="DATE", y="TAVG", ax=ax[1], color="darkorange").legend([legendnavn])