Python Matplot:如果满足条件,则在图上用点表示
我的数据框如下所示:Python Matplot:如果满足条件,则在图上用点表示,python,pandas,matplotlib,Python,Pandas,Matplotlib,我的数据框如下所示: 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 Fals
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.绘图(y='price',x='time')
我现在需要的是当列高交叉
被设置为真
并且在同一行上列向上移动
等于移动
在价格上加一个点。当列事件
等于向下交叉
和向上触发
到是
时,也要执行同样的操作。最后,当事件
为向下交叉
且向上触发
等于否
。。。。我看了一下文档,但找不到关于如何使用多个条件的解释。。。有什么帮助吗?谢谢
这就是我试图找到符合条件的行的原因:
`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`
但是我一直在研究如何在图表上绘制这些价格。您可以使用
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\u yes
和crossing\u 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()