Python循环加法

时间:2019-03-31 08:45:59

标签: 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/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()

2 个答案:

答案 0 :(得分:2)

一些注意事项:

  • 在接下来的两年中,请勿将关键字globals用于任何内容。
  • 将功能文档放入引号中的功能下
  • 使用请求库比urllib容易得多。但是...
  • pandas可以一步一步获取JSON并对其进行解析
  • 好的,它不必像这样拆分,我只是向您展示如何正确地传递变量而不是全局变量。
  • 我自己找不到“ ETH”。他们发送的数据中包含这3个['BTC_ETH','USDT_ETH','USDC_ETH']。所以我用了“ USDT_ETH”,希望可以替换。
  • calc_volumes似乎在进行计算,并且是某种过滤器(它对打印的内容很挑剔)。该功能需要分解为两个单独的作业。打印和计算。 (也许有一个过滤步骤,但我将其留给家庭作业)

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)

答案 1 :(得分:1)

此代码似乎有点奇怪和不一致……例如,您正在导入pandas并调用变量df,但实际上并没有使用数据框。如果您使用df = pd.read_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'参数告诉熊猫读取按行,然后是列而不是列,然后是行索引的JSON字典。)