为and或语句获取零

2024-06-25 06:10:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据

!pip install yfinance
import yfinance as yf
import numpy as np 
import pandas as pd 
from pandas_datareader import data

df=yf.download('BTC-USD',start='2017-01-01',end='2021-05-31',interval='1d')

#I calculated simple moving average as follow 
df['SlowSMA']=df['Close'].ewm(span=11).mean()
df['FastSMA']=df['Close'].ewm(span=5).mean()
df['Shares'] = [1 if df.loc[ei,'FastSMA']>df.loc[ei, 'SlowSMA'] else 0 for ei in df.index]
df['PrevShares']=df['Shares'].shift(1)

我想为交易成本创建一列。这意味着每当a股从1变为0或从0变为1时,我们都会产生成本。然而,如果股票长期保持0或1,我们没有进行交易,因此没有成本

我做了以下操作,但它总是给交易成本0

cost=8
df['TranCost'] = [df.loc[ei,'Shares']*cost if df.loc[ei,'prevshares'] == 0 & df.loc[ei,'Shares'] ==1 or df.loc[ei,'prevshares'] == 1 & df.loc[ei,'Shares'] == 0 else 0 for ei in df.index]  

Thanks


Tags: importpandasdfcloseasmeanlocspan
1条回答
网友
1楼 · 发布于 2024-06-25 06:10:32

看来你可以用更简单的方法来测试它

df.loc[ei,'prevshares'] + df.loc[ei,'Shares'] == 1

您还可以使用apply()而不是for ei in df.index

cost = 8

def process(row):
    if row['PrevShares'] + row['Shares'] == 1:
        return cost
    else:
        return 0
    
df['TranCost'] = df.apply(process, axis=1)

或者使用lambda

df['TranCost'] = df.apply(lambda row: cost if row['PrevShares'] + row['Shares'] == 1 else 0, axis=1)

您还可以使用int(True)给出1int(False)给出0
这一事实 并将其与int( .... == 1)一起使用

df['TranCost'] = df.apply(lambda row: cost * int(row['PrevShares'] + row['Shares'] == 1), axis=1)

最小工作代码

#!pip install yfinance
import yfinance as yf

df=yf.download('BTC-USD', start='2017-01-01', end='2021-05-31', interval='1d')

# I calculated simple moving average as follow 
df['SlowSMA'] = df['Close'].ewm(span=11).mean()
df['FastSMA'] = df['Close'].ewm(span=5).mean()
#df['Shares'] = [1 if df.loc[ei,'FastSMA'] > df.loc[ei, 'SlowSMA'] else 0 for ei in df.index]
#df['Shares'] = df.apply(lambda row: int(row['FastSMA'] > row['SlowSMA']), axis=1)
df['Shares'] = (df['FastSMA'] > df['SlowSMA']).astype(int)

df['PrevShares'] = df['Shares'].shift(1)

cost = 8

def process(row):
    if row['PrevShares'] + row['Shares'] == 1:
        return cost
    else:
        return 0
    
df['TranCost'] = df.apply(process, axis=1)
print(df[['PrevShares', 'Shares', 'TranCost']])

df['TranCost'] = df.apply(lambda row: cost if row['PrevShares'] + row['Shares'] == 1 else 0, axis=1)
print(df[['PrevShares', 'Shares', 'TranCost']])

df['TranCost'] = df.apply(lambda row: cost * int(row['PrevShares'] + row['Shares'] == 1), axis=1)
print(df[['PrevShares', 'Shares', 'TranCost']])

顺便说一句:

您可以使用int(True)给出1int(False)给出0的事实来计算Shares

apply()

df['Shares'] = df.apply(lambda row: int(row['FastSMA'] > row['SlowSMA']), axis=1)

没有apply()

df['Shares'] = (df['FastSMA'] > df['SlowSMA']).astype(int)

编辑:

使用row['Cost']而不是df['Cost']仅从当前行获取值Cost。若您使用df['Cost'],那个么您将从列中获取所有值,然后在单元格中获取许多值

顺便说一句:较短的df['Cost'] = 0.005 * df['Close']

df['Cost'] = 0.005 * df['Close']

df['TranCost'] = df.apply(lambda row: row['Cost'] if row['PrevShares'] + row['Shares'] == 1 else 0, axis=1)

您甚至可以一步完成,而无需创建列Cost

df['TranCost'] = df.apply(lambda row: 0.005*row['Close'] if row['PrevShares'] + row['Shares'] == 1 else 0, axis=1)

相关问题 更多 >