Neue Spalte extrahieren aus 2 Spalten mit Numpy & Pandas gleichzeitig (Feature Extraktion für Maschinelles Lernen)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bayne
User
Beiträge: 40
Registriert: Freitag 31. Mai 2019, 16:28

Hey liebe Nutzer

Ich hänge seit geraumer Zeit an folgendem:

Gegeben : Gegebene spalten sind erstmal Börsenpreisdaten (als Timeseries) (öffnungs, höchst, tief und schlusskurse der jeweiligen Stunde)
UND Zeitdaten im Format "YYYY-mm-dd" und "HH:MM:SS" (Datum und uhrzeiten als getrennte spalten).

Ziel :Ich möchte zum Zweck des Maschinellen Lernens eine Klasse schreiben mit der ich bestimmte "Features" (Spalten) aus anderen Features (andere Spalten) extrahieren kann, aber auch bestimmte Spalten nicht extrahiere, sondern weglasse. Eine Art Optimierungstool. Nur der True/False flag müsse verändert werden.

Ich will aber NumPy dabei möglichst vermeiden, da es sich nicht mit Pandas verträgt. ( der dataframe ist im Pandas format)

Nun möchte ich aber jeweils den MonatsTag (1ster, 2ter,... 31ster etc) und den WochenTag (1-7) als Extrahierungsmöglichkeiten haben. (klappt mit .day & .weekday), aber auch spalten wie den Eröffnungskurs vom Schlusskurs subtrahiert als "Stundenbewegung" haben ( keine Ahnung wie ich das machen kann ohne Numpy) und eine Prozentveränderung der Werte von Std zu stunde( mitpandas.DataFrame.pct_change).


Ich kenne folgendes Beispiel (jedoch leider mit NumPy) welches mir die Möglichkeit bietet aus einem Immobielen DataFrame die Anzahl der Betten aus der Anzahl der Zimmer und der Schlafzimmer (abhängig vom flag true/false) zu extrahieren oder nicht zu extrahieren:

Code: Alles auswählen

#X = Dataframe wobei die NAN Werte durch den Medianwert ersetzt wurden (Data Clearning)
#df = dataframe = "Tabelle" mit Zeit & Preisen ( im pandas format ), wird am ende in die Methode eingesetzt.
''' sieht so aus:
       longitude  latitude  housing_median_age  total_rooms  total_bedrooms  \
0        -121.89     37.29                38.0       1568.0           351.0   
1        -121.93     37.05                14.0        679.0           108.0   
2        -117.20     32.77                31.0       1952.0           471.0   
3        -119.61     36.31                25.0       1847.0           371.0   
4        -118.59     34.23                17.0       6592.0          1525.0   
5        -120.97     37.66                24.0       2930.0           588.0 

       population  households  median_income  
0           710.0       339.0         2.7042  
1           306.0       113.0         6.4214  
2           936.0       462.0         2.8621  
3          1460.0       353.0         1.8839  
4          4459.0      1463.0         3.0347  
5          1448.0       570.0         3.5395    
'''


from sklearn.base import BaseEstimator, TransformerMixin
rooms_ix, bedrooms_ix, population_ix, households_ix = 3,4,5,6 # einfach nur die Position der Spalten

class CombinedAttributesAdder(BaseEstimator, TransformerMixin):

    def __init__ (self, add_bedrooms_per_room = True): # no *args or **kargs
        self.add_bedrooms_per_room = add_bedrooms_per_room
        
    def fit(self,X,y=None):
        return self # nothing else to do
        
    def transform (self, X, y =None):
        rooms_per_household = X[:,rooms_ix] / X[:,households_ix]
        population_per_household = X[:,population_ix] / X[:,households_ix]
        
        if self.add_bedrooms_per_room:
            bedrooms_per_room = X[:,bedrooms_ix] / X[:,rooms_ix]
            return np.c_[X, rooms_per_household, population_per_household, bedrooms_per_room]
            
        
        else:
            return np.c_[X, rooms_per_household, population_per_household]

attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False)
housing_extra_attribs = attr_adder.transform(df.values)

Der konkrete Fall: In meinem falle handelt es sich jedoch wie gesagt um Börsenpreise und deren Zeiten und die klasse soll die möglichkeit bieten (Monatstag, Wochentag, Prozentveränderung pro spalte und Differenz zwischen open & Close zu liefern)

Code: Alles auswählen

                      <OPEN>   <HIGH>    <LOW>  <CLOSE>  <TICKVOL>
<DATE>_<TIME>                                                     
2014-01-01 23:00:00  1.37550  1.37648  1.37372  1.37580       2671
2014-01-02 00:00:00  1.37581  1.37730  1.37578  1.37645       2914
2014-01-02 01:00:00  1.37645  1.37684  1.37581  1.37586       2182
2014-01-02 02:00:00  1.37585  1.37662  1.37504  1.37626       2535
2014-01-02 03:00:00  1.37624  1.37676  1.37596  1.37660       2250
2014-01-02 04:00:00  1.37659  1.37749  1.37633  1.37655       1925
2014-01-02 05:00:00  1.37656  1.37656  1.37441  1.37457       2400
2014-01-02 06:00:00  1.37457  1.37583  1.37442  1.37577       3185
2014-01-02 07:00:00  1.37574  1.37580  1.37468  1.37502       2168
Ich bin dankbar für alles was mir weiterhelfen kann
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Eventuell hilfreich könnte diese Playlist hier von sentdex sein
https://www.youtube.com/watch?v=2BrpKpW ... QksErCEBYZ
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
Antworten