簡體   English   中英

數據框字典中的Pandas面板返回NaN

[英]Pandas Panel from Dict of Dataframes Returns NaNs

我有一組要嘗試變成面板的DataFrame。 這是我的代碼:

# 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:

數據就是NaN

當我單獨查看數據幀時,它們看起來都很好。 這是導入到df中的csv文件之一: example_csv_file

需要注意的一件事可能(或可能不重要)是每個數據幀的dtype都不相同:

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

我究竟做錯了什么?

具有所有NaN的空白面板的原因是您的dates numpy數組當前存儲為datetime64類型。 顯然,pandas面板對象不能與基礎字典鍵配合使用。

只需刪除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攜帶last df的值,實際上是拉入last 組合對

考慮使用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)]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM