Использование pipe () в Pandas с методами класса? - PullRequest
1 голос
/ 10 июля 2020

Я создал класс ( хранится в dataanalysis.py ), в котором хранится большинство методов, которые я собираюсь использовать для анализа данных. Вот код, хранящийся в этом файле:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

class Trening:
    def __init__(self, Path):
        self.path = Path
        self.df = None

    def getDF(self):
        return self.df

    def loadData(self, fileName= "pilot1.csv"):
        filePath = str(self.path + fileName)
        df = pd.read_csv(filePath, skiprows=2, decimal=".")
        #return df
        self.df = df

    def dnfCountandReplace(self, Return=False):
        filt = self.df['FINISH'] == 'DNF'
        dnf = self.df[filt]

        dnf = dnf.replace('DNF', 1)
        dnf.to_csv('faenta.csv')
        self.df.replace('DNF', np.NaN, inplace=True)
        self.df.dropna(subset=['FINISH'], inplace=True)
        if Return:
            return dnf

    def changeDataType(self, Return=False):
        self.df["FINISH"] = self.df["FINISH"].str.replace(',', '.').astype(float)
        self.df["INTER 1"] = self.df["INTER 1"].str.replace(',', '.').astype(float)
        self.df["SECTION IM4-FINISH"] = self.df["SECTION IM4-FINISH"].str.replace(',', '.').astype(float)
        self.df["COMMENT"] = self.df['COMMENT'].astype(str)
        self.df["COMMENT"] = self.df['COMMENT'].str.replace('1', 'COURSE 1')
        self.df["COMMENT"] = self.df['COMMENT'].str.replace('2', 'COURSE 2')
        self.df["COMMENT"] = self.df['COMMENT'].str.replace('9', 'STRAIGHT-GLIDING')
        pd.to_numeric(self.df['FINISH'], downcast='float', errors='raise')
        pd.to_numeric(self.df['INTER 1'], downcast='float', errors='raise')
        pd.to_numeric(self.df['SECTION IM4-FINISH'], downcast='float', errors='raise')
        if Return:
            return self.df


    def renameCommentToCourse(self, Return=False):
        self.df.rename(columns={'COMMENT': 'COURSE'}, inplace=True)
        if Return:
            return self.df

    def groupData(self, Return=False):
        self.df.groupby(['BIB#', 'COURSE'])['FINISH']
        if Return:
            return self.df

    def findTwoFastestRunsbyGroup(self, Return=False):
        self.df['FINISH'].nsmallest(2)
        if Return:
            return self.df

    def parseToCSV(self):
        self.df.to_csv('cool.csv')

    def calculateSpeed(self, Return=False):
        # (x2 - x1) / (t2 - t1)
        x2 = 2
        x1 = 0
        t1 = 0
        for i in self.df['INTER 1']:
            self.df['ENTRANCESPEED'] = (x2 - x1) / (self.df['INTER 1'] - t1)
        if Return:
            return self.df

Во время моей докторской диссертации я, вероятно, собираюсь запускать эти методы класса> 300 раз, но иногда в разных порядках и комбинациях, в зависимости от того, какой результат я хочу получить. . Итак, мой вопрос: есть ли способ сгруппировать методы класса / цепочки вместе, чтобы я мог при необходимости вызывать соответствующие? Я знаю, что в Pandas есть интересная функция pipe (), но я не понимаю, как ее использовать. В файле main.py у меня есть следующий код:

from models import Trening
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt


pilot1 = Trening("/Users/cmagelssen/Desktop/DataAnalyse/data/pilot1/trening1/")
pilot1.loadData("PILOT1_SESSION2.csv")
pilot1.dnfCountandReplace(Return=True)
X = pilot1.changeDataType(Return=True)
pilot1.renameCommentToCourse(Return=True)
pilot1.groupData(Return=True)
pilot1.findTwoFastestRunsbyGroup(Return=True)
df = pilot1.calculateSpeed(Return=True)
plot = pilot1.getDF()

Кто-нибудь знает, как я могу связать / сгруппировать эти методы вместе с помощью pipe ()?

Best, Christian

1 Ответ

1 голос
/ 10 июля 2020

Вы можете попробовать следующий код. С любой комбинацией функций, которую вы предпочитаете. Убедитесь, что если вы используете GetDF в конце, все функции, вызываемые в конвейере, также редактируют self.df.

pilot1 = Trening("/Users/cmagelssen/Desktop/DataAnalyse/data/pilot1/trening1/")
df = pilot1.loadData("PILOT1_SESSION2.csv")



df =df.pipe(pilot1.dnfCountandReplace, Return =True)\
   .pipe(pilot1.changeDataType, Return =True)\
   .pipe(pilot1.renameCommentToCourse, Return =True)\
   .pipe(pilot1.groupData, Return =True)\
   .pipe(pilot1.findTwoFastestRunsbyGroup, Return =True)\
   .pipe(pilot1.findTwoFastestRunsbyGroup, Return =True)\
   .pipe(pilot1.calculateSpeed, Return =True)\
   .pipe(pilot1.getDF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...