Python 除了最后一列,我的数据帧都有NaN
我尝试循环多个JSON数据,然后为列表中的每个值将其添加到数据帧中。对于每个JSON数据,我创建一个列标题。我似乎总是只获取最后一列的数据,所以我认为添加数据的方式显然有问题Python 除了最后一列,我的数据帧都有NaN,python,json,pandas,loops,Python,Json,Pandas,Loops,我尝试循环多个JSON数据,然后为列表中的每个值将其添加到数据帧中。对于每个JSON数据,我创建一个列标题。我似乎总是只获取最后一列的数据,所以我认为添加数据的方式显然有问题 from pycoingecko import CoinGeckoAPI cg = CoinGeckoAPI() df = pd.DataFrame() timePeriod = 120 for x in range(10): try: data = cg.get_coin_market_
from pycoingecko import CoinGeckoAPI
cg = CoinGeckoAPI()
df = pd.DataFrame()
timePeriod = 120
for x in range(10):
try:
data = cg.get_coin_market_chart_by_id(id=geckoList[x],
vs_currency ='btc', days = 'timePeriod')
for y in range(timePeriod):
df = df.append({geckoList[x]: data['prices'][y][1]},
ignore_index= True)
print(geckoList[x])
except:
pass
壁虎主义者的例子:
['bitcoin',
'ethereum',
'xrp',
'bitcoin-cash',
'litecoin',
'binance-coin']
其中一枚硬币的示例:
'prices': [[1565176840078, 0.029035263522626625],
[1565177102060, 0.029079747150763842],
[1565177434439, 0.029128983083947863],
[1565177700686, 0.029136960678700433],
[1565178005716, 0.0290826667213779],
[1565178303855, 0.029173025688296675],
[1565178602640, 0.029204331218623796],
[1565178911561, 0.029211943928343167],
预期结果将是一个数据帧,每个加密硬币都有列和行数据。现在只有最后一列显示数据
目前看起来是这样的:
bitcoin ethereum bitcoin-cash
0 NaN NaN 0.33
1 NaN NaN 0.32
2 NaN NaN 0.21
3 NaN NaN 0.22
4 NaN NaN 0.25
5 NaN NaN 0.26
6 NaN NaN 0.22
7 NaN NaN 0.22
好吧,我想我找到了问题所在 问题是您将只包含一列的数据结构逐行附加到框架中,因此所有其他列都用
NaN
填充。我认为您想要的是通过时间戳连接列。这就是我在下面的例子中所做的。如果这是您需要的,请告诉我:
from pycoingecko import CoinGeckoAPI
import pandas as pd
cg = CoinGeckoAPI()
timePeriod = 120
gecko_list = ['bitcoin',
'ethereum',
'xrp',
'bitcoin-cash',
'litecoin',
'binance-coin']
data = {}
for coin in gecko_list:
try:
nested_lists = cg.get_coin_market_chart_by_id(
id=coin, vs_currency='btc', days='timePeriod')['prices']
data[coin] = {}
data[coin]['timestamps'], data[coin]['values'] = zip(*nested_lists)
except Exception as e:
print(e)
print('coin: ' + coin)
frame_list = [pd.DataFrame(
data[coin]['values'],
index=data[coin]['timestamps'],
columns=[coin])
for coin in gecko_list
if coin in data]
df = pd.concat(frame_list, axis=1).sort_index()
df.index = pd.to_datetime(df.index, unit='ms')
print(df)
这就得到了输出
bitcoin ethereum bitcoin-cash litecoin
2019-08-07 12:20:14.490 NaN NaN 0.029068 NaN
2019-08-07 12:20:17.420 NaN NaN NaN 0.007890
2019-08-07 12:20:21.532 1.0 NaN NaN NaN
2019-08-07 12:20:27.730 NaN 0.019424 NaN NaN
2019-08-07 12:24:45.309 NaN NaN 0.029021 NaN
... ... ... ... ...
2019-08-08 12:15:47.548 NaN NaN NaN 0.007578
2019-08-08 12:18:41.000 NaN 0.018965 NaN NaN
2019-08-08 12:18:44.000 1.0 NaN NaN NaN
2019-08-08 12:18:54.000 NaN NaN NaN 0.007577
2019-08-08 12:18:59.000 NaN NaN 0.028144 NaN
[1153 rows x 4 columns]
这是我将days
切换到180时得到的数据
要获取每日数据,请使用groupby函数
:
df = df.groupby(pd.Grouper(freq='D')).mean()
在5天的数据框架中,这给了我:
bitcoin ethereum bitcoin-cash litecoin
2019-08-03 1.0 0.020525 0.031274 0.008765
2019-08-04 1.0 0.020395 0.031029 0.008583
2019-08-05 1.0 0.019792 0.029805 0.008360
2019-08-06 1.0 0.019511 0.029196 0.008082
2019-08-07 1.0 0.019319 0.028837 0.007854
2019-08-08 1.0 0.018949 0.028227 0.007593
你检查过数据的内容了吗?不幸的是,因为您的示例无法运行,所以很难帮助您。是的,数据看起来很好示例(添加了JSON示例)
NAN
表示不是数字
,因此,请仔细检查字母是否为数字字符。这很奇怪,因为如果我扩展列表,比特币现金显示NaN,而现在最后一列显示数据。谢谢!在“gecko_列表中的硬币”中,我得到了ValueError:DataFrame构造函数没有正确调用!问题:为什么最初使用时间段,然后使用时间戳?我并没有真正考虑API返回什么。参数days
控制什么?它指的是您想要的数据的天数(即,5天)表示dataOk的最后5天,但返回的数据是[时间戳,值]
对的列表,对吗?至少在我看来,上面的JSON示例就是这样的。是的,你是正确的。如果您请求最少120天的数据,那么它将每天返回1个数据点。如果少于每天多个数据点。这个问题仍然存在于我身上,如上面评论中所提到的,不断出现错误:(.我或多或少地复制粘贴了你的代码。