2016-03-01 66 views
1

我有一组DataFrames的,我试图变成一个面板。 这里是我的代码:熊猫面板返回NaN的

# OPEN THE FILES INTO DATAFRAMES 
filenames = ['Yahoo_2016-01-17.csv', 'Yahoo_2016-01-18.csv', 
    'Yahoo_2016-01-19.csv','Yahoo_2016-01-23.csv','Yahoo_2016-01-27.csv',  
    'Yahoo_2016-02-05.csv', 'Yahoo_2016-02-06.csv', 'Yahoo_2016-02-09.csv',  
    'Yahoo_2016-02-11.csv', 'Yahoo_2016-02-13.csv', 'Yahoo_2016-02-15.csv', 
    'Yahoo_2016-02-16.csv', 'Yahoo_2016-02-29.csv'] 

dates = np.array(['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
    '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
    '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16', 
    '2016-02-29']).astype('datetime64[D]') 

filepath = '/Users/RickS/Documents/Investing/Stock_files/GENERAL/' 

dfs = [pd.read_csv(filepath+f) for f in filenames] 

# Panel not working... 
panel = pd.Panel(dict([(date, df) for date in dates for df in dfs])) 
panel.swapaxes('major','minor') 

然而,当我尝试读取面板,在每个数据帧中的所有值都变成了NaN的:

Data is NaNs

当我看dataframes单独他们一切看起来不错。 这里是被导入到DF的CSV文件之一: example_csv_file

有一点要注意,可能(也可能不会)是很重要的是,每个数据帧的dtypes都不尽相同:

In [24]: dfs[1].dtypes 
Out[24]: 
Name       object 
Symbol      object 
Previous_Close    float64 
Average_Daily_Volume   int64 
Change_&_Percent_Change  object 
Earnings/Share    float64 
EPS_Estimate_Current_Year float64 
EPS_Estimate_Next_Quarter float64 
EPS_Estimate_Next_Year  float64 
52-week_Low     float64 
52-week_High     float64 
EBITDA      object 
200-day_Moving_Average  float64 
P/E_Ratio     float64 
PEG_Ratio     float64 
Short_Ratio     float64 
1_yr_Target_Price   float64 
52-week_Range     object 
Date       object 
dtype: object 

我在做什么错?

+0

有趣!如果你的例子是自包含的 - 如果你提供了产生相同问题的样本数据,那么帮助你会更容易。本网站更好地解释:http://sscce.org/ – exp1orer

+0

没有实际数据,我们无法复制。你用'dict()'包装的列表理解存在一个问题,我几乎发布了一个答案,但在所有的试验中,我无法重新创建所有的NaN。你的“日期”和“文件名”长度是否相同?另外,把它保存到字典中,'dict([(date,df)为日期中df的日期]]并输出其内容。你看到NaN了吗? – Parfait

+0

我编辑的问题包括更多的细节,包括更完整的代码和作为数据框读取的csv文件之一。我测试了上面定义的字典--dict([(date,df)日期为df中df的日期]) - 并且结果很好(所有数据都在那里)。“日期”和“文件名”的长度都是13. – RSHAP

回答

1

原因与所有NaN的空面板是目前存储为datetime64类型的dates numpy的阵列。显然,熊猫面板对象不能很好地处理底层字典键。

只需删除该astype甚至使用列表或元组,这将显示日期为字符串键。但是由于字典键是通过几天来衡量的,所以每个字母键对于您的面板需求都是独特的

dates = np.array(['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
        '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
        '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16', 
        '2016-02-29']) 

dates = ['2016-01-17', '2016-01-18', '2016-01-19', '2016-01-23', 
     '2016-01-27', '2016-02-05', '2016-02-06','2016-02-09', 
     '2016-02-11', '2016-02-13', '2016-02-15', '2016-02-16', 
     '2016-02-29'] 

但是,这带来了我以前的发现。目前,dict()函数中列表解析会只返回最后数据帧的面板,重复13次。理由是以下列表理解返回总组合dfs列表和dates阵列之间设置有长度等于两个集合的乘积:13 X 13(即,交叉连接/笛卡尔加入)。以下输出看到:

[(date, df) for date in dates for df in dfs] 

一旦你申请dict()以上,会强制13独特dates进行的最后df价值,在过去组合配对本质拉动。

考虑使用zip()遍历两个集合的每个项目一起:

dfDict = {} 
for f,d in zip(filenames, dates):  
    dfDict[d] = pd.read_csv(filepath+f)  

panel = pd.Panel(dfDict) 

或者更短:

dfs = [pd.read_csv(filepath+f) for f in filenames] 
panel = pd.Panel(dict([i for i in zip(dates, dfs)]))