这是我以前在Excel中做过的事情,但现在在python中尝试,有点卡住了。找不到相应的库或本机函数。我想shift((会有所帮助,但我不知道在哪里可以使用它
没有必要把所有的股票行情都放在一个df中,它只是看起来比更好
我制作了一个由10个股票行情器组成的漂亮数据集,这里有一个示例:
symbol open
2020-05-03 00:28:00 BCH/BTC 0.0295400000
2020-05-03 00:35:00 BCH/BTC 0.0291680000
*******************
2020-05-03 18:05:00 BCH/BTC 0.0282650000
2020-05-03 00:28:00 BNB/BTC 0.0019586000
*******************
2020-05-03 17:58:00 XTZ/BTC 0.0003064000
2020-05-03 18:05:00 XTZ/BTC 0.0003065000
[1520 rows x 6 columns]
正如您所看到的,时间是一个指数,每个股票代码都是一样的
任务是再制作2个这样的列:
symbol open is_advancing ratio
2020-05-03 00:28:00 BCH/BTC 0.0295400000 Nan Nan
2020-05-03 00:35:00 BCH/BTC 0.0291680000 -1 0.9874069059
*******************
2020-05-03 18:05:00 BCH/BTC 0.0282650000 1 1.0028452501
2020-05-03 00:28:00 BNB/BTC 0.0019586000 Nan Nan
*******************
2020-05-03 17:58:00 XTZ/BTC 0.0003064000 0 1
2020-05-03 18:05:00 XTZ/BTC 0.0003065000 1 1.0003263707
[1520 rows x 6 columns]
is_advancing显示以前的值是更高、更小还是相同比率显示当前和以前之间的比率
我试着尽可能全面地解释它,但如果有任何其他问题,请随时询问
你的转变是正确的。您可以使用np.select((根据多个条件分配新值。
df = pd.read_clipboard(sep=r"[ ]{2,}")
print(df)
symbol open
2020-05-03 00:28:00 BCH/BTC 0.0295400000
2020-05-03 00:35:00 BCH/BTC 0.0291680000
df['shift'] = df['open'].astype(float).shift(1)
conditions = [ df['open'] > df['shift'], df['open'] == df['shift'], df['open'] < df['shift']]
choices = [ 1, 0, -1]
df["is_advancing"] = np.select(conditions, choices, default=np.nan)
df['ratio'] = df['open']/df['shift']
print(df)
symbol open shift is_advancing ratio
2020-05-03 00:28:00 BCH/BTC 0.029540 NaN NaN NaN
2020-05-03 00:35:00 BCH/BTC 0.029168 0.02954 -1.0 0.987407
如果你想在所有的股票行情中都这样做,你可以这样做。
print(df)
symbol open
2020-05-03 00:28:00 BCH/BTC 0.029540
2020-05-03 00:35:00 BCH/BTC 0.029168
2020-05-03 18:05:00 BCH/BTC 0.028265
2020-05-03 00:28:00 BNB/BTC 0.001959
2020-05-03 17:58:00 XTZ/BTC 0.000306
2020-05-03 18:05:00 XTZ/BTC 0.000307
symbols_list = df['symbol'].unique().tolist()
new_dfs_list = []
for s in symbols_list:
df_slice = df[df['symbol'] == s].copy()
df_slice['shift'] = df_slice['open'].astype(float).shift(1)
conditions = [ df_slice['open'] > df_slice['shift'], df_slice['open'] == df_slice['shift'], df_slice['open'] < df_slice['shift']]
choices = [ 1, 0, -1]
df_slice["is_advancing"] = np.select(conditions, choices, default=np.nan)
df_slice['ratio'] = df_slice['open']/df_slice['shift']
new_dfs_list.append(df_slice)
concat_df = pd.concat(new_dfs_list)
print(concat_df)
symbol open shift is_advancing ratio
2020-05-03 00:28:00 BCH/BTC 0.029540 NaN NaN NaN
2020-05-03 00:35:00 BCH/BTC 0.029168 0.029540 -1.0 0.987407
2020-05-03 18:05:00 BCH/BTC 0.028265 0.029168 -1.0 0.969041
2020-05-03 00:28:00 BNB/BTC 0.001959 NaN NaN NaN
2020-05-03 17:58:00 XTZ/BTC 0.000306 NaN NaN NaN
2020-05-03 18:05:00 XTZ/BTC 0.000307 0.000306 1.0 1.000326