2016-02-07 46 views
-3

這一直使我堅持了整週的週末。我正在嘗試合併常見時間戳的不同資產的數據。每個資產的數據都是字典中的一個值。感興趣的數據存儲在一列中的列表中,因此需要先分開。這裏是未處理DF的樣本:函數應該清理數據的一半大小,而不是將其擴大一個數量級

data['Dogecoin'].head() 

    market_cap_by_available_supply price_btc price_usd volume_usd 
0 [1387118554000, 3488670] [1387118554000, 6.58771e-07] [1387118554000, 0.000558776] [1387118554000, 0.0] 
1 [1387243928000, 1619159] [1387243928000, 3.18752e-07] [1387243928000, 0.000218176] [1387243928000, 0.0] 
2 [1387336027000, 2191987] [1387336027000, 4.10802e-07] [1387336027000, 0.000267749] [1387336027000, 0.0] 

然後我將此功能market_cap_by_available_supply分開,節約它的成分爲對那些資產了新的數據幀:

data2 = {} 
#sorting function 
for coin in data: 
    #seperates timestamp and marketcap from their respective list inside each element 
    TS = data[coin].market_cap_by_available_supply.map(lambda r: r[0]) 
    cap = data[coin].market_cap_by_available_supply.map(lambda r: r[1]) 
    #Creates DataFrame and stores timestamp and marketcap data into dictionairy 
    df = DataFrame(columns=['timestamp','cap']) 
    df.timestamp = TS 
    df.cap = cap 
    df.columns = ['timestamp',str(coin)+'_cap'] 
    data2[coin] = df 
    #converts timestamp into datetime 'yyy-mm-dd' 
    data2[coin]['timestamp'] = pd.to_datetime(data2[coin]['timestamp'], unit='ms').dt.date 

它似乎很好地工作,產生正確的數據,樣本:

data2['Namecoin'].head() 
timestamp Namecoin_cap 
0 2013-04-28 5969081 
1 2013-04-29 7006114 
2 2013-04-30 7049003 
3 2013-05-01 6366350 
4 2013-05-02 5848626 

然而,當我試圖合併所有dataframes,我得到了一個內存錯誤,我已經花了幾個小時試圖找出ŧ他的根,似乎上面的「排序功能」正在將數據幀的大小從12Mb增加到131Mb!它應該做相反的事情。有任何想法嗎 ?

在一個側面說明這裏是數據 https://www.mediafire.com/?9pcwroe1x35nnwl

我打開它這個泡菜funtion

with open("CMC_no_tuple_data.pickle", "rb") as myFile: 
    data = pickle.load(myFile) 

編輯:對不起,在泡菜文件名的拼寫錯誤。 @Goyo通過pickle.dump計算出我簡單保存的數據和數據2的大小,並查看了它們各自的大小 @ Padraic Cunningham您使用了我提供的排序功能,它生成了一個較小的文件?這不是我的情況,當我嘗試合併數據幀時出現內存錯誤

+0

你最近怎麼合併? –

+0

「看起來上面的'排序函數'正在將數據幀的大小從12Mb增加到131Mb」你在說什麼排序函數?如果您的意思是您編寫的for循環,data2中的數據框比數據中的數據框小,所以如果每個數據框都實際上減小了大小。 – Goyo

+0

這正是問題所在。數據幀較小,但所產生的字典(數據幀)的大小是13x的大小 –

回答

1

合併數據幀時,您正在對不是唯一的值進行連接。當你將所有這些數據框連接在一起時,你會得到很多匹配。當你添加越來越多的貨幣時,你會得到類似笛卡爾產品的東西,而不是聯結。在下面的代碼片段中,我添加了代碼對值進行排序,然後刪除重複項。

from pandas import Series, DataFrame 
import pandas as pd 

coins=''' 
Bitcoin 
Ripple 
Ethereum 
Litecoin 
Dogecoin 
Dash 
Peercoin 
MaidSafeCoin 
Stellar 
Factom 
Nxt 
BitShares 
''' 
coins = coins.split('\n') 
API = 'https://api.coinmarketcap.com/v1/datapoints/' 
data = {} 

for coin in coins: 
    print(coin) 
    try: 
     data[coin]=(pd.read_json(API + coin)) 
    except: pass 
data2 = {} 
for coin in data: 
    TS = data[coin].market_cap_by_available_supply.map(lambda r: r[0]) 
    TS = pd.to_datetime(TS,unit='ms').dt.date 
    cap = data[coin].market_cap_by_available_supply.map(lambda r: r[1]) 
    df = DataFrame(columns=['timestamp','cap']) 
    df.timestamp = TS 
    df.cap = cap 
    df.columns = ['timestamp',coin+'_cap'] 
    df.sort_values(by=['timestamp',coin+'_cap']) 
    df= df.drop_duplicates(subset='timestamp',keep='last') 
    data2[coin] = df 

df = data2['Bitcoin'] 
keys = data2.keys() 
keys.remove('Bitcoin') 
for coin in keys: 
    df = pd.merge(left=df,right=data2[coin],left_on='timestamp', right_on='timestamp', how='left') 
    print len(df),len(df.columns) 
df.to_csv('caps.csv') 

編輯:我添加了一個表belowing顯示錶的大小是如何生長的,你做你的加入操作。

此表顯示加入5,10,15,20,25和30種貨幣後的行數。

Rows,Columns 
1015 5 
1255 10 
5095 15 
132071 20 
4195303 25 
16778215 30 

下表顯示了刪除重複項如何使您的聯接只匹配單個行。

Rows,Columns 
1000 5 
1000 10 
1000 15 
1000 20 
1000 25 
1000 30 
+0

@DavidHancock請注意,我排序的值,並採取最大。 – goCards

+0

你會在一個數據框中丟棄一行(即Pebblecoin,2016-02-06)。此外,'drop_duplicates'不需要排序(無論如何,您並未使用排序值)。 – Goyo

+0

@Goyo如果你看一下原始問題的數據集,每種貨幣都有很多重複的時間戳。我正在刪除所有貨幣的重複項,然後您可以進行連接。 – goCards

相關問題