[英]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:
當我單獨查看數據幀時,它們看起來都很好。 這是導入到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.