有没有更好的方法(最好是一个循环)
Posted
技术标签:
【中文标题】有没有更好的方法(最好是一个循环)【英文标题】:Is there a better way of doing this (ideally with a single loop) 【发布时间】:2020-06-21 18:23:46 【问题描述】:我正在尝试使用按日期索引的加密货币总市值创建一个 pandas 数据框。数据来自 Coingecko API。我可以通过以下方式实现:
import requests
import json
r = requests.get('https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=200')
response = json.loads(r.content)
#suppresses scientific notation
pd.set_option('display.float_format',':.2f'.format)
marketcapdf = df(columns=['dates', 'marketcap','volume'])
dates = []
for values in response['prices']:
dates.append(values[0])
totalmktcap = []
for values in response['market_caps']:
totalmktcap.append(values[1])
dailymktvolume = []
for values in response['total_volumes']:
dailymktvolume.append(values[1])
marketcapdf = df(dates, columns=['Dates'])
marketcapdf = marketcapdf.assign(Total_Marketcap=totalmktcap)
marketcapdf = marketcapdf.assign(Daily_volume=dailymktvolume)
print (marketcapdf)
这会产生正确的数据框:
Dates Total_Marketcap Daily_volume
0 1566518400000 181311699889.67 20144228964.47
1 1566604800000 187878412535.86 18313019852.75
2 1566691200000 181764456091.20 21187546608.00
3 1566777600000 180491202154.33 17899166778.01
4 1566864000000 184989701185.55 23392461462.61
.. ... ... ...
196 1583452800000 165070261612.79 38122635173.15
197 1583539200000 166791067805.43 41388087588.44
198 1583625600000 162543409238.00 36764763103.12
199 1583712000000 147076617271.69 39132209137.70
200 1583767255000 142178026150.74 50332115525.77
我想知道是否有更好的方法可以做到这一点,很确定可以通过列表元素访问在单个 for 循环中完成所有操作。但我需要你的帮助来解决这个问题。 如果你想查看 API 响应,就去https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=200
【问题讨论】:
你可以使用zip
,但是你拥有的很好。
【参考方案1】:
您可以使用list comprehensions
直接传递给DataFrame
构造函数:
import requests
import json
import pandas as pd
r = requests.get('https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=200')
response = json.loads(r.content)
marketcapdf = pd.DataFrame(
'Dates': [x[0] for x in response['prices']],
'Total_Marketcap': [x[1] for x in response['market_caps']],
'Daily_volume': [x[1] for x in response['total_volumes']])
或者,在单个理解中使用zip
marketcapdf = pd.DataFrame([(p[0], m[1], v[1])
for p, m, v in zip(*response.values())],
columns=['Dates', 'Total_Marketcap', 'Daily_volume'])
marketcapdf
[出]
Dates Total_Marketcap Daily_volume
0 1566518400000 181311699889.67 20144228964.47
1 1566604800000 187878412535.86 18313019852.75
2 1566691200000 181764456091.20 21187546608.00
3 1566777600000 180491202154.33 17899166778.01
4 1566864000000 184989701185.55 23392461462.61
.. ... ... ...
196 1583452800000 165070261612.79 38122635173.15
197 1583539200000 166791067805.43 41388087588.44
198 1583625600000 162543409238.00 36764763103.12
199 1583712000000 147076617271.69 39132209137.70
200 1583767255000 142178026150.74 50332115525.77
[201 rows x 3 columns]
【讨论】:
非常感谢,这正是我想要的。作为一个新手,我在编写代码时发现的最困难的事情是知道我写的内容是否有效。关于如何解决这个问题的任何一般提示? :) 养成将一些代码发布到codereview 的习惯。这是另一个 stackexchange 网站,您获得的任何反馈都将是建设性和友好的。 这不是一个循环。这是三个循环。 公平评论。添加了 1 个循环的替代方案以上是关于有没有更好的方法(最好是一个循环)的主要内容,如果未能解决你的问题,请参考以下文章