Matplot: укажите точками на графике, если условия выполнены - PullRequest
0 голосов
/ 25 февраля 2019

Мой фрейм данных выглядит следующим образом:

                     time   price   direction   event   High_cross  movement_up triggered_up    
    26  2019-01-01 11:37:57.434 0.00224242  up   crossing up   True  False  
    27  2019-01-01 11:37:57.784 0.00224243  up     0         False  False           
    28  2019-01-01 11:38:38.575 0.00224171  up     0         False  False           
    29  2019-01-01 11:38:57.602 0.00224311  up     0         False  False       
    30  2019-01-01 11:39:21.907 0.00224473  up     0         True   movement        
    31  2019-01-01 11:39:40.320 0.00224422  up     0         True   True        
    32  2019-01-01 11:40:16.966 0.00224697  up     0         True   True    
    33  2019-01-01 11:41:16.966 0.00224694  down    0        True   Movement
    34  2019-01-01 11:42:16.966 0.00224674  down    0        false  false
    35  2019-01-01 11:43:16.966 0.00224672  down crossing down false    false Yes

Здравствуйте, мне нужно указать точечной точкой определенное значение на графике, когда оно удовлетворяет определенным условиям.Пока я строил график только по времени:

df['price'] = df.price.astype(float) df.plot(y='price', x='time')

Теперь мне нужно, чтобы столбец High_cross был установлен True в той же строкестолбец movement_up равен movement поставить точку по цене.Сделайте то же самое, когда столбец event равен crossing down и triggered up - Yes.И, наконец, то же самое, когда event равно crossing down, а triggered up равно No .... Я немного посмотрел в документации, но не смог найти объяснения о том, как использовать несколько условий ...любая помощь?Спасибо!

Вот то, что я пытался найти строки, которые соответствуют моим условиям:

`movement= df[(df.High_cross == True) & (df.movement_up == 'movement')]
price_movement = movement.price

crossing_yes = df[(df.event == 'crossing down') & (df.triggered_up == 'Yes')]
price_crossing_yes = crossing_yes.price

crossing_no = df[(df.event == 'crossing down') & (df.triggered_up == 'No')]
price_crossing_no = crossing_no.price`

Но я застрял на том, как построить эти цены на графике ..

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете построить извлеченные значения, используя

plt.scatter(movement['time'].tolist(), price_movement.tolist(), marker='o')
plt.scatter(crossing_yes['time'].tolist(), price_crossing_yes.tolist(), marker='.')
plt.scatter(crossing_no['time'].tolist(), price_crossing_no.tolist(), marker='+')

movement, crossing_yes и crossing_no, которые являются DataFrame объектами, поэтому необходимо указать столбец.Это эквивалентно, например,

time_movement = movement.time
plt.scatter(time_movement.tolist(), price_movement.tolist())

, но немного менее многословно.Конечно, вы можете сжать это дальше, выполнив внутреннюю фильтрацию

plt.scatter(df[(df.High_cross == True)&(df.movement_up == 'movement')]['time'].tolist(), 
            df[(df.High_cross == True)&(df.movement_up == 'movement')]['price'].tolist(),
            marker='o')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['time'].tolist(),
            df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['price'].tolist(),
            marker='.')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['time'].tolist(), 
            df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['price'].tolist(), 
            marker='+')

, которая немного более краткая и поддается циклу, но требует второго прохода, который в противном случае был бы менее интенсивным.

Вот полный пример с использованием предоставленных данных

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
     [['2019-01-01 11:37:57.434', 0.00224242, 'up', 'crossing up', True, False],
      ['2019-01-01 11:37:57.784', 0.00224243, 'up', 0, False, False],
      ['2019-01-01 11:38:38.575', 0.00224171, 'up', 0, False, False],
      ['2019-01-01 11:38:57.602', 0.00224311, 'up', 0, False, False],
      ['2019-01-01 11:39:21.907', 0.00224473, 'up', 0, True, 'movement'],
      ['2019-01-01 11:39:40.320', 0.00224422, 'up', 0, True, True],        
      ['2019-01-01 11:40:16.966', 0.00224697, 'up', 0, True, True],
      ['2019-01-01 11:41:16.966', 0.00224694, 'down', 0, True, 'Movement'],
      ['2019-01-01 11:42:16.966', 0.00224674, 'down', 0, False, False],
      ['2019-01-01 11:43:16.966', 0.00224672, 'down', 'crossing down', 
        False, False, 'Yes']])

df.columns = ['time', 'price', 'direction', 'event', 'High_cross', 
              'movement_up', 'triggered_up']

df['price'] = df.price.astype(float)
df['time'] = pd.to_datetime(df['time'])
df.plot(y='price', x='time', legend=False)
plt.scatter(df[(df.High_cross == True)&(df.movement_up == 'movement')]['time'].tolist(), 
            df[(df.High_cross == True)&(df.movement_up == 'movement')]['price'].tolist(),
            marker='o')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['time'].tolist(),
            df[(df.event == 'crossing down')&(df.triggered_up == 'Yes')]['price'].tolist(),
            marker='.')
plt.scatter(df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['time'].tolist(), 
            df[(df.event == 'crossing down')&(df.triggered_up == 'No')]['price'].tolist(), 
            marker='+')
plt.ylabel("Price")
plt.xlabel("Time")
plt.show()

Price over time

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...