且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在DataFrame中的每一行上运行一个函数,并将结果附加到一个新的DataFrame

更新时间:2023-08-28 15:04:28

问题是您并不总是在 trade ,这是令人困惑的熊猫。尝试这样:

The problem is that you are not always returning a value in trade, which is confusing Pandas. Try this:

import numpy as np
from pandas import Series, DataFrame
import pandas as pd

API = 'https://poloniex.com/public?command=returnChartData&currencyPair=BTC_FCT&start=1435699200&end=9999999999&period=86400'
data = pd.read_json(API)

df = pd.DataFrame(columns = {'date','close','MA'})

df.MA = pd.rolling_mean(data.close, 30)
df.close = data.close
df.date = data.date

df = df.truncate(before=29)

def print_full(x):
    pd.set_option('display.max_rows', len(x))
    print(x)
    pd.reset_option('display.max_rows')

log = pd.DataFrame(columns = ['Date', 'type', 'profit', 'port_value'])
port = {'coin': 0, 'BTC':1}

port = {'coin': 0, 'BTC':1}

def trade(date, close, MA):
    d = {'Date': date, 'type':'', 'coin_value': np.nan, 'btc_value': np.nan}

    if MA < close and port['coin'] == 0 :
        coins_bought = port['BTC']/MA
        port['BTC'] = 0
        port['coin'] = coins_bought
        d['type'] = 'buy'
        d['coin_value'] = port['coin']
        d['btc_value'] = port['BTC']

    elif MA > close and port['BTC'] == 0 :
        coins_sold = port['coin']*MA
        port['coin'] = 0
        port['BTC'] = coins_sold
        d['type'] = 'sell'
        d['coin_value'] = port['coin']
        d['btc_value'] = port['BTC']

    return pd.Series(d)

log = df.apply(lambda x: trade(x['date'], x['close'], x['MA']), axis=1)

log = log.dropna()

print_full(log)

但是,正如我在评论中提到的,将副作用的函数传递给应用不是一个好主意根据文档,并在事实上,我认为这可能不会在你的情况下产生正确的结果。

However, as I mentioned in the comment, passing a function with side-effects to apply is not a good idea according to the documentation, and in fact I think it may not produce the correct result in your case.