For loop mit timestamps

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Johannes.Schwenzer
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 17:41

Hallo,

ich versuche leider schon seit Stunden einen einfachen loop zu bauen in dem eine Formel jeweils mit unterschiedlichen timestamps nacheinander rechnet.
der Code sieht folgendermaßen aus:

Code: Alles auswählen

import pvlib
from pvlib.location import Location
import numpy as np
import pandas as pd 
import matplotlib.pyplot as plt


timesteps = 9
df3=pd.read_csv('Strahlungsdaten.csv' )
y= df3['Messdatum'] 

for i in range(timesteps):
   
    times = pd.Timestamp(y[i])
    x[i] = pvlib.solarposition.get_solarposition(times, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12)
  
wenn ich x mit einem Timestamp berechne erhalte ich einen Dataframe mit 6 Spalten.
wenn ich x über den for loop berechne eine serie.
wenn ich zuerst einen leeren dataframe für x erstelle und dann über den loop füllen möchte kommt folgender Fehler:

Code: Alles auswählen

 ValueError: Wrong number of items passed 6, placement implies 1 
Ziel ist das x ein dataframe oder eine serie mit den 6 Ergebnissen der Berechnung wird.



Danke für eure Hilfe
Johannes.Schwenzer
User
Beiträge: 2
Registriert: Dienstag 16. April 2019, 17:41

Hallo,

Hier eine Lösung

Code: Alles auswählen

x= pd.DataFrame()
x2= pd.DataFrame()
for i in range(timesteps):
   
    times = pd.Timestamp(y[i])
    x = pvlib.solarposition.get_solarposition(times, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12)
   
    x2= x2.append(pd.DataFrame(x))
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Johannes.Schwenzer: Die erste Zuweisung an `x` macht keinen Sinn.

Das wiederholte `append()` in der Schleife ist potentiell ineffizient. Das mit dem `range()` und der Indirektion über einen Indexzugriff sieht „unpythonisch“ aus.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Da man pd.DataFrame auch ein Dict übergeben kann, bietet sich eine Dictionary Comprehension an,
mit dem Ergebnis, dass die Spalten jeweils auch ein Label haben.

Code: Alles auswählen

x = {str(i):pvlib.solarposition.get_solarposition(pd.Timestamp(y[i]), location.latitude, location.longitude, altitude=None, pressure=None, method='nrel_numpy', temperature=12) for i in range(timesteps)}
df = pd.DataFrame(x)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Johannes.Schwenzer: wenn man was mit den einzelnen Werten machen will, nimmt man `map`:

Code: Alles auswählen

df3 = pd.read_csv('Strahlungsdaten.csv' )
df3['solarposition'] = df3['Messdatum'].map(lambda date: pvlib.solarposition.get_solarposition(date, location.latitude, location.longitude, 
     altitude=None, pressure=None, method='nrel_numpy', temperature=12))
oder über partial:

Code: Alles auswählen

from functools import partial
df3 = pd.read_csv('Strahlungsdaten.csv' )

get_solarposition = partial(pvlib.solarposition.get_solarposition,
    latitude=location.latitude, longitude=location.longitude) # der Rest sind sowieso die Defaults.

df3['solarposition'] = df3['Messdatum'].map(get_solarposition)
Ich würde Dir empfehlen, ein Pandas-Tutorial durchzuarbeiten, um mal zu sehen welche "Tricks" es gibt.
Antworten