2017-04-16 39 views
0

对于我的硕士论文,我需要计算给定事件日期x个股票的预期回报。我写了下面的代码,这是我的意图(匹配法玛因子&事件日期样本)。但是,当我尝试将其导出为Excel时,我似乎无法获得正确的输出。即它不包含列标题,例如日期,法国因素的名称和相应的行。Python:将列表输出为excel

有没有人有这方面的解决方法?任何改进很乐意欣赏。这里是我的代码:

import pandas as pd 

# Data import 
ff_five = pd.read_excel('C:/Users/MBV/Desktop/cmon.xlsx', 
infer_datetime_format=True) 
df = pd.read_csv('C:/Users/MBV/Desktop/4.csv', parse_dates=True, 
infer_datetime_format=True) 

# Converting dates to datetime 
df['Date'] = pd.to_datetime(df['Date'], infer_datetime_format=True) 

# Creating an empty placeholder 
end_date = [] 

# Iterating over the event dates, creating a start and end date 60 months 
apart 
for index, row in df.iterrows(): 
    end_da = row['Date']-pd.DateOffset(months=60) 
    end_date.append(end_da) 

end_date_df = pd.DataFrame(data=end_date) 

m = pd.merge(end_date_df,df,left_index=True,right_index=True) 

m.columns = ['Start','End'] 

ff_factors = [] 

for index, row in m.iterrows(): 
    ff_five['Date'] = pd.to_datetime(ff_five['Date']) 
    time_range= (ff_five['Date'] > row['Start']) & (ff_five['Date'] <= 
    row['End']) 
    df = ff_five.loc[time_range] 
    ff_factors.append(df) 

编辑: 这是我从蟒蛇擅长获取数据的尝试。

ff_factors_df = pd.DataFrame(data=ff_factors) 

# Create a Pandas Excel writer using XlsxWriter as the engine. 
writer = pd.ExcelWriter('estimation_data.xlsx', engine='xlsxwriter') 

# Convert the dataframe to an XlsxWriter Excel object. 
ff_factors_df.to_csv(writer, sheet_name='Sheet1') 

# Close the Pandas Excel writer and output the Excel file. 
writer.save() 
+0

我认为你可以完全避免的合并,看看df.apply()它将函数应用于每一行/列。你可以使用它来避免df.iterrows()业务。 –

回答

1

为了输出数据帧到CSV或Excel中应该能够与

ff_five.to_excel('Filename.xls') 

更改Excel中进行到csv,如果你想让它为csv。

好吧,我试图解释你试图做什么,而不是很清楚。但是,如果我正确解释它,你正在尝试根据其他数据创建一些额外的列。除了创建单独的列表之外,您可以将它们放入新列中,然后只输出您想要的列。这样的事情,也许(不得不作出一些假设,并创建一些假的数据来看看这是在正确的轨道上):

import pandas as pd 

ff_five = pd.DataFrame() 

ff_five['Date'] = ["2012-11-01", "2012-11-30"] 

df = pd.DataFrame() 

df['Date'] = ["2012-12-01", "2012-12-30"] 

df['Date'] = pd.to_datetime(df['Date']) 

df['End'] = df['Date'] - pd.DateOffset(months=60) 

df.columns = ['Start', 'End'] 

ff_five['Date'] = pd.to_datetime(ff_five['Date']) 

df['ff_factor'] = (ff_five['Date'] > df['Start']) & (ff_five['Date'] <= df['End']) 

df.to_excel('estimation_data.xlsx', sheet_name='Sheet1') 
+0

然而,我使用它,输出没有像我在将ff_factors更改为数据框之前那样输出。 –

+0

我无法完全理解您的代码,您能否提供一些示例数据? 正如我在我的第一个评论中所说的,我认为你可以使用apply()来避免整个迭代bsuiness。合并可能会导致列名称头痛,所以我会建议。 –

+0

当然!我忙着看着apply()。最后一次迭代产生以下结果: Date Mkt-RF SMB HML RMW CMA RF 236 2010-03-01 6.43 -0.72 4.15 0.31 -0.29 0.01 237 2010-04-01 -1.92 3.35 -0.28 1.55 -1.30 0.01 238 2010-05-01 -12.05 -0.67 -3.65 0.34 -0.80 0.01 239 2010-06-01 -0.98 -0.17 -2.21 -1.17 -0.96 0.01 240 2010-07-01 11.85 -1.65 4.90 -2.84 1.00 0.01 ...] 当我将ff_factors转换为数据帧时,上面的数据结果如下:1629日期Mkt-RF SMB HML RMW CMA ... –