Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python循环加法_Python_Python 3.x_Pandas - Fatal编程技术网

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)