有没有更好的方法(最好是一个循环)

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 个循环的替代方案

以上是关于有没有更好的方法(最好是一个循环)的主要内容,如果未能解决你的问题,请参考以下文章

更好/更快地循环遍历集合或列表?

有没有比使用 Console.Clear() 更好的方法来制作控制台游戏?

C# 和 FFmpeg 最好没有 shell 命令?

中间件技术负责人郑嘉杰:没有最好只有更好

jq ~ 有没有更好的方法来折叠单个对象数组?

有没有更好的办法