因此,我试图为一个数据帧创建一个新的列,当mfi超过70时,该列本质上有一个1,当mfi超过70时,它有一个0。到目前为止,守则是:
import pandas as pd
import numpy as np
#get stock prices
d = pd.read_csv(r"C:\Users\B1880\Downloads\AMD_stock_data\AMD_2020_2020.txt")
d.columns = ['Dates', 'Open', 'High', 'Low', 'Close', 'Volume']
d.set_index(d['Dates'], inplace=True)
d.drop(['Dates'], axis=1, inplace=True)
#MONEY FLOW INDEX
d['typical_price'] = (d['High'] + d['Low'] + d['Close'])/3
d['raw_money_flow'] = d['typical_price']*d['Volume']
mf = d.raw_money_flow.diff(1)
p = mf.copy()
n = mf.copy()
p[p<=0] = 0
n[n>0] = 0
pmf = p.rolling(window=14).mean()
nmf = abs(n.rolling(window=14).mean())
mfr = pmf / nmf
d['mfi'] = 100 - (100 / (mfr +1))
d['mfi'].dropna(inplace=True)
# # #mfi location
d['mfi_70_overbought'] = np.where(d['mfi'] > 70, 1, 0)
d['mfi_70_overbought']
当我像这样运行代码时,我得到了错误ValueError: Length of values does not match length of index
,为了解决这个问题,我做了d['mfi_70_overbought'] = pd.Series(np.where(d['mfi'] > 70, 1, 0))
。虽然现在当我打印d['mfi_70_overbought']
列时,整个列都被NAN值填充。鉴于mfi的值肯定超过70,我遗漏了什么?谢谢大家!
编辑:这是d['mfi']打印输出的内容:
Dates
2010-01-04 07:18:00 NaN
2010-01-04 07:23:00 NaN
2010-01-04 07:29:00 NaN
2010-01-04 07:38:00 NaN
2010-01-04 07:44:00 NaN
...
2019-12-31 19:55:00 54.775561
2019-12-31 19:56:00 49.240351
2019-12-31 19:57:00 54.346136
2019-12-31 19:58:00 86.883785
2019-12-31 19:59:00 50.210623
Name: mfi, Length: 1293557, dtype: float64
数据的URL为:https://docs.google.com/spreadsheets/d/1uxVjEJkEmDZwu44pNxsg5ZBonqbTFak8HoESbxo0AM0/edit?usp=sharing
设置
试图重现你所做的
模拟数据:
名称列,设置索引:
计算:
问题
现在如果我运行
df['mfi_70_overbought'] = np.where(df['mfi'] > 70, 1, 0)
,我会得到相同的错误:ValueError: Length of values does not match length of index
解决方案
如果您只想在mfi超过70时拥有一个1的新列,而不是时拥有一个0的新列,那么您可以避免
numpy
并使用pandas
工具定义一个函数,如果其输入大于
70
,则返回1
,否则应返回0
:Apply这对
df[mfi]
来说:在我的示例中,此新列将如下所示:
附带问题
这个新列比原始数据帧的列短(差异为} 和^{} 。如果要将此列附加到数据帧,请填充此列,或者不执行缩短此列的步骤
windowsize
),因为之前我们应用了^{相关问题 更多 >
编程相关推荐