0

In my code I iterate through dataframes of each year to calculate the number of wins (increase between numbers) and losses (decrease between numbers), and the ratio of wins to losses. The loop I run correctly displays the right number of wins and losses in the dataframe they are eventually pushed to. However, when calculating the win/loss ratio, the if statement isn't working for no real reason. Here is the loop:

trades = []
wins = []
losses = []
winloss = []
for df in df_years_grouped:
        total_trades = len(df)
        trades.append(total_trades)
        
        win = 0
        loss = 0
        for i, row in df.iterrows():
            if i == 0:
                continue
            elif (df[1][i] > df[1][i-1]):
                win += 1
            elif (df[1][i] < df[1][i-1]):
                loss += 1
        wins.append(win)
        losses.append(loss)
        
        if win == 0 & loss == 0:
            winloss.append(0)
        elif win > 0 & loss == 0:
            winloss.append('All Wins')
        elif win == 0 & loss > 0:
            winloss.append('All Losses')
        else:
            winloss.append(win/loss)

Here is the outcome in the Dataframe:

Trades Win  Lose W/L 
11     5    5    All Wins
42     21   20   All Wins
35     16   18   All Wins
14     9    4    All Wins
23     13   9    All Wins
12     7    4    All Wins
4      2    1    All Wins
4      2    1    All Wins
11     5    5    All Wins
6      3    2    All Wins
0      0    0    0
9      6    2    All Wins
2      0    1    0
16     6    9    All Wins
3      0    2    0
14     7    6    All Wins
206   106   99   1.070707

As you can see it works on one or two but fails on the most, making most of them wins?

boioboi
  • 45
  • 7

3 Answers3

2

I believe you should be using "and" instead of "&" in the if statements. You can read up on the differences here:

https://www.geeksforgeeks.org/difference-between-and-and-in-python/

  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jun 20 '22 at 17:18
0

I think the issue is between 'and' and '&'

Give the following a read: https://www.geeksforgeeks.org/difference-between-and-and-in-python/

'and' is the Locigal AND whereas '&' is the bit-and 'AND'

a = 14
b = 4
  
print(b and a) - 14
print(b & a) - 4

See here too: what is the difference between "&" and "and" in Python?

I would suggest changing you code to use the logical AND

or maybe the following if you do not mind more IF statements

if win == 0:
    if loss == 0
        winloss.append(0)
    elif loss > 0:
        winloss.append('All Losses')
elif win > 0:
    if loss == 0:
        winloss.append('All Wins')   
else:
    winloss.append(win/loss)

I personally would also find this easier to read as an external user

P.Dove
  • 89
  • 7
0

You should use and instead of &, their have different priority: win == 0 & loss == 0 is equivalent to win == (0 & loss) == 0:

import ast
assert ast.dump(ast.parse("win == 0 & loss == 0")) == ast.dump(ast.parse("win == (0 & loss) == 0"))
YouJiacheng
  • 449
  • 3
  • 11