2017-05-29 5 views
1

Ich möchte einen Datenrahmen in einer benutzerdefinierten Funktion in Python zu manipulieren. Der Manipulationscode funktioniert einwandfrei, wenn ich ihn außerhalb der Funktion ausführe. Wenn ich es jedoch in die Funktion einfüge und die Funktion ausführe, läuft es ohne einen Fehler, gibt aber keinen Datenrahmen zurück. Mein Code sieht folgendermaßen aus:Python: Datenframe in Benutzerfunktion manipulieren

def reshape(file): 
    from IPython import get_ipython 
    get_ipython().magic('reset -sf') 

    #import packages 
    import pandas as pd 
    import datetime 
    import calendar 


    #define file path and import files 
    path="X:/TEMP/" 
    file_path =path+file 
    df = pd.read_excel(file_path, "Sheet1", parse_dates=["Date"]) 
    #reshape data to panel 
    melted = pd.melt(df,id_vars="Date", var_name="id", value_name="Market_Cap") 
    melted["id"] = melted["id"].str.replace("id", "") 
    melted.id = melted.id.astype(int) 
    melted.reset_index(inplace=True, drop=True) 

    id_to_string = pd.read_excel(file_path, "Sheet2") 
    id_to_string = id_to_string.transpose() 

    id_to_string.reset_index(level=0, inplace=True) 
    id_to_string.rename(columns = {0: 'id'}, inplace=True) 
    id_to_string.rename(columns = {"index": 'Ticker'}, inplace=True) 

    merged = pd.merge(melted, id_to_string, how="left", on="id") 
    merged = merged.sort(["Date","Market_Cap"], ascending=[1,0]) 

    merged["Rank"] = merged.groupby(["Date"])["Market_Cap"].rank(ascending=True) 

    df = pd.read_excel(file_path, "hardcopy_return", parse_dates=["Date"]) 
    df = df.sort("Date", ascending=1) 

    old = merged 
    merged = pd.merge(old,df, on=["Date", "id"]) 
    merged = merged.set_index("Date") 
    return merged 
reshape("sample.xlsx") 

Dieser Code läuft durch, gibt aber nichts zurück. Habe ich einen Fehler im Def-Befehl oder durch Aufruf der Funktion gemacht? Jede Hilfe wird sehr geschätzt.

+0

Sie sollten den Code hochladen, damit wir sehen können, was Sie mit diesem Datenrahmen tun – nacho

+0

Okay, wenn es hilft. Ich tat. Aber der Code selbst läuft ordnungsgemäß ohne die Funktion wrapper –

+0

Ist die letzte Zeile 'reshape (" sample.xlsx ")' nicht eingerückt, oder ist es nur Stackoverflow Formatierung? Wenn ja, sollten Sie es einrücken, damit es als Teil der Funktion betrachtet wird. Andernfalls ist die Anweisung 'return' ebenfalls nicht enthalten. –

Antwort

1

Ich nehme an, dass dies mit iPython oder einem Jupyter-Notebook ausgeführt wird? Es könnte zuvor funktioniert haben, weil der Kernel sich an einen Zustand erinnert. etwas in eine separate Funktion anstelle einer geraden Skript, bevor Sie, mache ich ein restart kernel & run All

Auf dem Code selbst, ich die verschiedenen Teile des Codes aufgeteilt würde, so wird es einfacher, die einzelnen Teile

Importe zu testen

import pandas as pd 
import datetime 
import calendar 

from IPython import get_ipython 
get_ipython().magic('reset -sf') 

Read 'Tabelle1'

die Daten aus dem ersten Arbeitsblatt erhalten und machen die ersten Verarbeitungs

def read_melted(file_path): 
    df1 = pd.read_excel(file_path, sheetname='Sheet1', parse_date["Date"]) 
    melted = pd.melt(df,id_vars="Date", var_name="id", value_name="Market_Cap") 
    melted.id = melted.id.astype(int) 
    melted.reset_index(inplace=True, drop=True) 
    return melted 

Read 'Tabelle2'

def read_id_to_spring(file_path): 
    df2 = pd.read_excel(file_path, sheetname='Sheet2') 
    id_to_string = id2.transpose() 
    id_to_string.reset_index(level=0, inplace=True) 
    id_to_string.rename(columns = {0: 'id'}, inplace=True) 
    id_to_string.rename(columns = {"index": 'Ticker'}, inplace=True) 
    return id_to_string 

Read 'hardcopy_return'

def read_hardcopy_return(file_path): 
    df = pd.read_excel(file_path, sheetname='hardcopy_return', parse_date["Date"]) 
    return df.sort("Date", ascending=1) 

es zusammen binden

def reshape(df1, df2, df_hardcopy_return): 
    merged = pd.merge(df1, df2, how="left", on="id").sort(["Date","Market_Cap"], ascending=[1,0]) 
    merged["Rank"] = merged.groupby(["Date"])["Market_Cap"].rank(ascending=True) # what does this line do? 
    merged_all = pd.merge(merged,df_hardcopy_return, on=["Date", "id"]).set_index("Date") 
    return merged_all 

Aufruf alles

path="X:/TEMP/" 
file_path =path+file 

df1 = read_melted(file_path) 
df2 = read_id_to_spring(file_path) 
df_hardcopy_return = read_hardcopy_return(file_path) 
reshape(df1, df2, df_hardcopy_return) 

Das einzige, was mir noch so seltsam auffällt, ist die Linie merged["Rank"] = merged.groupby(["Date"])["Market_Cap"].rank(ascending=True)

read_excel sheetname

pandas.read_excel auch ein sheetname Argument hat, mit dem Sie nur die Excelfile einmal öffnen können. Das Lesen von Excel-Dateien kann manchmal langsam sein, also könnte es auch schneller werden

Verwandte Themen