2017-05-29 51 views
1

我想操縱用戶編寫的Python函數中的數據框。操作代碼在函數外運行時工作正常。但是,當我把它放入函數並運行函數時,它運行時沒有錯誤,但不返回任何數據幀。我的代碼看起來如下:Python:操縱用戶函數中的數據框

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") 

此代碼運行但不返回任何內容。我是否在def命令或通過調用函數時犯了錯誤?任何幫助是極大的讚賞。

+0

您應該上傳代碼,以便我們可以看到您對該數據幀所做的操作 – nacho

+0

好的,如果有幫助的話。我做到了。但是代碼本身在沒有函數包裝的情況下正常運行 –

+0

最後一行'reshape(「sample.xlsx」)'沒有縮進,還是隻是Stackoverflow的格式?如果是這樣,那麼你應該縮進它,所以它會被視爲功能的一部分。否則,'return'語句也不包括在內。 –

回答

1

我認爲這是與iPython或jupyter筆記本一起運行?它可能以前工作過,因爲內核記得某種狀態。做東西放到一個單獨的函數,而不是直劇本之前,我做了restart kernel & run All

代碼本身,我會分裂代碼的不同部分,因此它變得更容易的各個部分測試

進口

import pandas as pd 
import datetime 
import calendar 

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

讀 '工作表Sheet1'

得到第一個工作表中的數據和做的第一處理

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 

讀 'Sheet2的'

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 

讀 '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) 

綁一起

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 

調用一切

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) 

仍然令我奇怪的唯一事情是行merged["Rank"] = merged.groupby(["Date"])["Market_Cap"].rank(ascending=True)

read_excel sheetname

pandas.read_excel也有sheetname的說法,你可以用它來只打開excelfile一次。讀取excel文件有時可能會很慢,所以這可能會使速度更快