Trädvy Permalänk
Medlem
Registrerad
Sep 2016

Python, problem, felkod mm

Hej!

Är så mycket nybörjare som man kan bli både när det gäller programmering och python.

Sitter med en frivillig fördjupande uppgift där jag från ett csv-dokument ska plocka fram temperaturdata (dagsmedel) från en specifik månad (juni) under flera årtionden och skapa en graf. Jag får fram grafen ed dagsmedeltemp för samtliga månader, problemet är att sålla ut juni.

Lite trial by error just nu. Får allt som oftast fram felkoden "return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'Month'".
Jag ska filtrera genom att "filtrera på när månaden är lika med 6 (juni)". Måste jag först ange att juni ska vara månad 6? Vill minnas att veckodagar anges 0-6. Många frågetecken... tacksam för tips.

Trädvy Permalänk
Medlem
Plats
GBG
Registrerad
Jul 2003

Hej,

Nu har jag inte hjälpen åt dig, men vill ändå tipsa om att peta in din kod här för allra bästa hjälp.

Speldator : 3570K OC - mItx i ett Node- 16GB fläskig ram - MSI 750ti
HTPC : i5 3450S - 8GB G.Skill - Streacom F8

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

Hej,

Om du delar med dig av några exempelrader ur din CSV-fil, tillsammans med de viktigaste bitarna av koden du skrivit, så ska du nog se att det går att lösa :). Glöm inte använda forumets funktion för kod, särskilt viktigt då det är Python-kod som är beroende av indenteringen.

Spontant ser det ut som om du har använt Pandas för att läsa in din CSV-fil i en DataFrame. Det är inte klart i vilket format datuminformationen finns lagrad i din CSV-fil. Lösningen kommer beror på det. Av felmeddelandet att döma verkar det som om du försöker komma åt nån kolumn i din dataframe som heter "Month", som inte existerar.

Trädvy Permalänk
Medlem
Registrerad
Sep 2016

@Boulund: Tack för att du tar dig tid!

Ja! Det är pandas jag har använt mig av för att läsa in filen i en Data Frame.

Nu är jag ju väldigt nybörjare på detta som sagt... även ny på dettta forum. Så jag känner verkligen att jag inte kan nått.
När det kommer till csv-filen, ska jag ta direkt från excell eller när jag printat ut information i Python från csv:n?
Var hittar jag hur jag använder forumets funktion för kod?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002
Skrivet av hanna_84:

@Boulund: Tack för att du tar dig tid!

Ja! Det är pandas jag har använt mig av för att läsa in filen i en Data Frame.

Nu är jag ju väldigt nybörjare på detta som sagt... även ny på dettta forum. Så jag känner verkligen att jag inte kan nått.
När det kommer till csv-filen, ska jag ta direkt från excell eller när jag printat ut information i Python från csv:n?
Var hittar jag hur jag använder forumets funktion för kod?

Öppna CSV-filen i en vettig texteditor (typ Notepad++) och ta första två-tre raderna så vi ser några exempel på hur informationen ligger inlagd. Det kan gå fint även direkt ur Excel om du inte orkar fippla med det.

För att skriva in kod (och t.ex. CSV-rader) i forumet skriver man en kod-tagg: [code] som avslutas med en [ /code] tagg (ta bort mellanslaget efter första hakparantesen bara). Lägg dem på var sin rad, så blir det enklast. Sen klistrar du bara in din kod på raderna mellan taggarna.

import pandas as pd # Skapar en liten test-DataFrame här, för att illustrera. # Den har bara tre rader och två kolumner. df = pd.DataFrame([(20.0, "May"), (25.0, "June"), (30.0, "August")], columns=["Temperature", "Month"]) # Printa alla kolumner för rader där Month-kolumnen är lika med "June" print(df.loc[df.Month == "June", :])

Trädvy Permalänk
Medlem
Registrerad
Sep 2016

@Boulund:

Location;Altitude;Lat;Long;Date;Temperature
Östersund;376.0;63.1974;14.4863;1954-01-01;-2.5
Östersund;376.0;63.1974;14.4863;1954-01-02;4.5
Östersund;376.0;63.1974;14.4863;1954-01-03;-4.2

Här är min upprensade kod

import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.read_csv('K0001B_Python_Dataunderlag.csv', delimiter=';', encoding='utf-8', parse_dates=['Date'], index_col='Date') df_pitea = df[df.Location == 'Piteå'].copy() df_pitea['Year'] = df_pitea.index.year df_pitea['Month'] = df_pitea.index.month df_pitea['Day'] = df_pitea.index.day """ antar att det måste vara här jag ska definiera månaden juni, testat olika koder innehållande "month == 6" men med felkod eller graf på alla månader som resultat. """ df_pitea_day = df_pitea.groupby('Day') .Temperature.aggregate(np.mean) df_pitea_day.plot() plt.show()

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002
Skrivet av hanna_84:

@Boulund:

Location;Altitude;Lat;Long;Date;Temperature
Östersund;376.0;63.1974;14.4863;1954-01-01;-2.5
Östersund;376.0;63.1974;14.4863;1954-01-02;4.5
Östersund;376.0;63.1974;14.4863;1954-01-03;-4.2

Här är min upprensade kod

import pandas as pd import matplotlib.pyplot as plt import numpy as np df = pd.read_csv('K0001B_Python_Dataunderlag.csv', delimiter=';', encoding='utf-8', parse_dates=['Date'], index_col='Date') df_pitea = df[df.Location == 'Piteå'].copy() df_pitea['Year'] = df_pitea.index.year df_pitea['Month'] = df_pitea.index.month df_pitea['Day'] = df_pitea.index.day """ antar att det måste vara här jag ska definiera månaden juni, testat olika koder innehållande "month == 6" men med felkod eller graf på alla månader som resultat. """ df_pitea_day = df_pitea.groupby('Day') .Temperature.aggregate(np.mean) df_pitea_day.plot() plt.show()

Hmm.. Det är inte så att du egentligen vill göra typ så här?

df_pitea.groupby("Month").mean().Temperature.plot()

Trädvy Permalänk
Medlem
Registrerad
Sep 2016

@Boulund:

Jag vill få fram dagsmedeltemperaturen för varje dag i juni under alla år i csv-dokumentet på en graf. Då måste jag väl ha med 'Day' 'groupby'. Annars får jag bara fram medeltemp för månaden under dessa år? "df_pitea.groupby("Month").mean().Temperature.plot()" ger inte heller specifik data endast för juni antar jag?

Som jag skrivit koden tidigare får jag fram dagsmedeltemperatur för alla månader så vitt jag kan förstå. Det jag vill tillägga i koden är att endast plocka ut data för juni-månaderna.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002
Skrivet av hanna_84:

@Boulund:

Jag vill få fram dagsmedeltemperaturen för varje dag i juni under alla år i csv-dokumentet på en graf. Då måste jag väl ha med 'Day' 'groupby'. Annars får jag bara fram medeltemp för månaden under dessa år? "df_pitea.groupby("Month").mean().Temperature.plot()" ger inte heller specifik data endast för juni antar jag?

Som jag skrivit koden tidigare får jag fram dagsmedeltemperatur för alla månader så vitt jag kan förstå. Det jag vill tillägga i koden är att endast plocka ut data för juni-månaderna.

Ah, sorry. Missförstod dig och trodde du ville ha månadsmedelvärden.

Det är inte så enkelt att du kan köra groupby endast på de rader där månaden är lika med juni då? Typ så här:

df_pitea[df_pitea.Month == 6].groupby("Day").mean().Temperature.plot()

Trädvy Permalänk
Medlem
Registrerad
Sep 2016

@Boulund:

Hej!
Tack, ja det verkar fungera, får fram en trovärdig graf. Får inte till så jag kan få ut det i text istället för en graf så jag kan kontrollera att grafen verkligen har med juni för alla åren.

Dock får jag inte till det genom att använda numpy och dess defenition för medelvärde...
denna funktion har jag använt i tidigare led. Ex:

df_pitea_year = df_pitea.groupby('Year') .Temperature.aggregate(np.mean)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Apr 2002

@hanna_84

Vill du få ut textvärdena som plottas, printa bara de berörda värdena utan .plot() på slutet:

# Det går att spara temperaturerna från GroupBy i egen variabel dygnsmedeltemperaturer_i_juni = df_pitea[df_pitea.Month == 6].groupby("Day").mean().Temperature print(dygnsmedeltemperaturer_i_juni) #den kan sen printas, för att se alla värden dygnsmedeltemperaturer_i_juni.plot() # eller plottas

Varför vill du absolut använda numpys mean tillsammans aggregate-funktionen från pandas? Du får samma resultat om du ropar på .mean() direkt på pandas GroupBy-objekt.

Om du absolut vill använda numpys mean borde du kunna göra nåt sånt här:

dygnsmedel_i_juni = df_pitea[df_pitea.Month == 6].groupby("Day").aggregate(np.mean).Temperature

Tar du bort ".Temperature" från slutet av raden får du np.mean applicerat på alla kolumner i din DataFrame, vilket kan vara användbart ibland. Det går även att applicera olika aggregeringsfunktioner på olika kolumner i din DataFrame, se Pandas dokumentation.

Trädvy Permalänk
Medlem
Registrerad
Sep 2016

@Boulund

Tack! Ska testa lite då.

Jag behöver inte nödvändigtvis använda np men vill gärna lösa problemet och kunna använda det också 😊

Skickades från m.sweclockers.com