以下是数据样本。
data['nxt'].head()
Out[47]:
market_cap_by_available_supply price_btc price_usd volume_usd
0 [1386136000000, 15091900] [1386136000000, 1.3982e-05] [1386136000000, 0.0150919] [1386136000000, 0.0]
1 [1386222394000, 14936300] [1386222394000, 1.31922e-05] [1386222394000, 0.0149363] [1386222394000, 0.0]
2 [1386308781000, 11237100] [1386308781000, 1.12001e-05] [1386308781000, 0.0112371] [1386308781000, 0.0]
3 [1386395502000, 7031430] [1386395502000, 9.6644e-06] [1386395502000, 0.00703143] [1386395502000, 0.0]
4 [1386481920000, 6292640] [1386481920000, 8.82299e-06] [1386481920000, 0.00629264] [1386481920000, 0.0]
我只对market_cap_by_available_supply
data['nxt'].market_cap_by_available_supply
0 [1386136000000, 15091900]
1 [1386222394000, 14936300]
2 [1386308781000, 11237100]
3 [1386395502000, 7031430]
4 [1386481920000, 6292640]
这篇文章的目的是:我们如何将这些分为两列:Timestamp和Marketcap?
但我的最终目标是(使用下面的代码)
为dashcoin创建一个包含市场开销和时间戳的新数据框,然后依次添加与DASH时间戳相对应的其他硬币市场开销,任何对此的帮助都会很棒。
import numpy as np
from pandas import Series, DataFrame
import pandas as pd
coins = ['dashcoin','litecoin','dogecoin','nxt']
API = 'https://api.coinmarketcap.com/v1/datapoints/'
data = {}
for coin in coins:
data[coin]=(pd.read_json(API + coin))
MC_data = pd.DataFrame(columns=[['Timestamp']+coins])
编辑:
我使用for循环,因为稍后我将添加许多硬币'。 @timmy,你提取时间戳和上限的方法效果很好,虽然我不能让合并方法起作用。
data2 = {}
for coin in coins:
#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
data2[coin] = df
for coin in coins:
data2['merged'] = data2['merged'].merge(data[coin], on='timestamp', how='outer')
KeyError: 'merged'
答案 0 :(得分:0)
关于第一个问题,您可以使用地图功能:
# Just renaming for readability
cap_by_supply = data['nxt']['market_cap_by_available_supply']
# Exploding the market_cap_by_available_supply array into 2 columns
data['nxt']['timestamp'] = cap_by_supply.map(lambda r: r[0])
data['nxt']['cap'] = cap_by_supply.map(lambda r: r[1])
关于你的第二个问题,如果我理解得很好:
您可以为每种硬币类型创建数据框。它们应采用相同的格式进行格式化,并使用timestamp
列和cap
列。然后使用merge function通过时间戳列合并它们。您肯定想要删除您不想要合并的所有列,例如:
# Drop unwanted columns, to repeat for each coin dataframe.
# Here we keep timestamp and cap only, for example.
data['nxt'] = data['nxt'].drop([
'market_cap_by_available_supply',
'price_btc',
'price_usd',
'volume_usd'
], axis=1)
# Merge all the coin frames into one
data['coins'] = data['dashcoin'].merge(data['litecoin'], on='timestamp', how='outer')
data['coins'] = data['coins'].merge(data['dogecoin'], on='timestamp', how='outer')
data['coins'] = data['coins'].merge(data['nxt'], on='timestamp', how='outer')
您想指定outer
加入,以便保留所有记录。
希望它有所帮助,如果有人理解得更好或有更好的解决方案,我会发表评论和建议。
关于OP编辑的编辑:
在循环的第一次迭代中,data2['merged']
中没有任何内容,您无法合并数据框。我们只需要说data2['merged']
首先只是第一个硬币数据帧的副本。然后我们从第二个数据帧开始循环coins
,因为第一个数据帧已经在data2['merged']
...
data2['merged'] = data2[coins[0]]
for coin in coins[1:]:
data2['merged'] = data2['merged'].merge(data2[coin], on='timestamp', how='outer')