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