Python循环加法
无论我做什么,我似乎无法轻松地将所有基本卷和报价卷添加到一起!我希望最终得到数据框中所有数据的总基本卷和总报价卷。有人能帮我做这件事吗 我曾经尝试过先将数据求和并保存在字典中,然后再添加数据,但我似乎无法做到这一点Python循环加法,python,python-3.x,pandas,Python,Python 3.x,Pandas,无论我做什么,我似乎无法轻松地将所有基本卷和报价卷添加到一起!我希望最终得到数据框中所有数据的总基本卷和总报价卷。有人能帮我做这件事吗 我曾经尝试过先将数据求和并保存在字典中,然后再添加数据,但我似乎无法做到这一点 import urllib import pandas as pd import json def call_data(): # Call data from Poloniex global df datalink = 'https://poloniex.com/
import urllib
import pandas as pd
import json
def call_data(): # Call data from Poloniex
global df
datalink = 'https://poloniex.com/public?command=returnTicker'
df = urllib.request.urlopen(datalink)
df = df.read().decode('utf-8')
df = json.loads(df)
global current_eth_price
for k, v in df.items():
if 'ETH' in k:
if 'USDT_ETH' in k:
current_eth_price = round(float(v['last']),2)
print("Current ETH Price $:",current_eth_price)
def calc_volumes(): # Calculate the base & quote volumes
global volume_totals
for k, v in df.items():
if 'ETH' in k:
basevolume = float(v['baseVolume'])*current_eth_price
quotevolume = float(v['quoteVolume'])*float(v['last'])*current_eth_price
if quotevolume > 0:
percentages = (quotevolume - basevolume) / basevolume * 100
volume_totals = {'key':[k],
'basevolume':[basevolume],
'quotevolume':[quotevolume],
'percentages':[percentages]}
print("volume totals:",volume_totals)
print("#"*8)
call_data()
calc_volumes()
这段代码似乎有点奇怪和不一致。。。例如,您正在导入
pandas
并调用变量df
,但实际上并没有使用数据帧。如果使用df=pd.read\u json('https://poloniex.com/public?command=returnTicker“,”index“)
*为了获得数据帧,这里的大多数数据操作将变得更加容易,并且也不需要任何循环
例如,第一个函数的代码将变得非常简单,如current_eth_price=df.loc['USDT_eth','last']
第二个函数的代码基本上是
eth_rows = df[df.index.str.contains('ETH')]
total_base_volume = (eth_rows.baseVolume * current_eth_price).sum()
total_quote_volume = (eth_rows.quoteVolume * eth_rows['last'] * current_eth_price).sum()
(*参数'index'
告诉pandas先读取行,然后读取列,而不是先读取列,然后读取行的JSON字典。)一些注意事项:
- 在接下来的两年里,不要使用关键字
globals
- 将函数文档放在函数下面的引号中
- 使用请求库比使用urllib容易得多。然而
- pandas可以在一个步骤中获取JSON并解析所有内容
- 好的,它不必像这样分开,我只是告诉你如何正确地传递变量,而不是全局变量
- 我无法单独找到“ETH”。在他们发送的数据中,他们有3个['BTC_ETH'、'USDT_ETH'、'USDC_ETH']。所以我用了“USDT_ETH”我希望替换是可以的
- calc_volumes似乎在进行计算,并且是某种过滤器(它对打印内容很挑剔)。这个函数需要分解为两个独立的任务。打印和计算。(可能有一个过滤步骤,但我把它留给家庭作业)
一般提示:避免像瘟疫这样的全球变量。接受将参数传递给函数并让函数
返回结果的概念。如果我理解正确的话,它似乎只是在看“USDT_ETH”列的basevolume“Evolume”。我想将ETH交易货币下的所有基本交易量相加。如果是这样的话,我不知道该怎么做……这应该一次处理所有的值。我需要为此更改返回数据类型。非常感谢@Back2Basics,这正是我要找的!我在找这个小gem data=df[df.columns[df.columns.str.contains('ETH')].loc['baseVolume','quoteEvolume','last']还有什么方法可以从中排除某些内容吗?可能不包含?你可以从中学习使用&|和^e.g.(df.columns.str.contains('ETH'))和(df.columns.str.contains('USD'))来学习选择的可能性
import pandas as pd
eth_price_url = 'https://poloniex.com/public?command=returnTicker'
def get_data(url=''):
""" Call data from Poloniex and put it in a dataframe"""
data = pd.read_json(url)
return data
def get_current_eth_price(data = None):
""" grab the price out of the dataframe """
current_eth_price = data['USDT_ETH']['last'].round(2)
return current_eth_price
def calc_volumes(data=None, current_eth_price=None):
""" Calculate the base & quote volumes """
data = df[df.columns[df.columns.str.contains('ETH')]].loc[['baseVolume', 'quoteVolume', 'last']]
data = data.transpose()
data[['baseVolume','quoteVolume']]*= current_eth_price
data['quoteVolume']*=data['last']
data['percentages']=(data['quoteVolume'] - data['baseVolume']) / data['quoteVolume'] * 100
return data
df = get_data(url = eth_price_url)
the_price = get_current_eth_price(data = df)
print(f'the current eth price is: {the_price}')
volumes = calc_volumes(data=df, current_eth_price=the_price)
print(volumes)