函数应将数据清理到大小的一半,而是将其放大一个数量级



这让我整个周末都发疯。我正在尝试围绕一个共同的时间戳合并不同资产的数据。每个资产的数据都是字典中的一个值。感兴趣的数据存储在一列的列表中,因此需要先将其分开。下面是未处理的 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 

但是,当我尝试合并所有数据帧时,出现内存错误,我花了几个小时试图找出根目录,似乎上面的"排序功能"正在将数据帧的大小从 12Mb 增加到 131Mb!它应该做相反的事情。有什么想法吗?

附带说明一下,这里是数据https://www.mediafire.com/?9pcwroe1x35nnwl

用这个泡菜功能打开它

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

编辑:很抱歉泡菜文件名中的拼写错误。@Goyo计算大小,我通过pickle.dump简单保存了数据和数据2,并查看了它们各自的大小@Padraic Cunningham您使用了我提供的排序功能,它生成了一个较小的文件?这不是我的情况,尝试合并数据帧时出现内存错误

合并数据帧时,正在对不唯一的值进行联接。将所有这些数据帧联接在一起时,将获得许多匹配项。随着您添加越来越多的货币,您将获得类似于笛卡尔产品而不是连接的东西。在下面的代码片段中,我添加了代码来对值进行排序,然后删除重复项。

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')

编辑:I在下面添加了一个表,显示随着您执行联接操作,表的大小如何增长。

此表显示连接 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

最新更新