python - Pandas 列没有值
问题描述
所以我正在尝试为一个数据框创建一个新列,当 mfi 超过 70 时,它本质上是 1,而不是 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
解决方案
# necessary imports
import pandas as pd
import numpy as np
设置
试图重现你所做的
模拟数据:
data = {'timestep1': [45,46,47,48,1000],
'timestep2': [46,47,48,49,2020],
'timestep3': [47,48,49,50,1002],
'timestep4': [50,49,48,47, 99],
'timestep5': [45,40,50,70,2500]}
命名列,设置索引:
df = pd.DataFrame.from_dict(data, orient='index')
df.columns = ['Open', 'High', 'Low', 'Close', 'Volume']
df.index.name = 'Dates'
进行计算:
df['typical_price'] = (df['High'] + df['Low'] + df['Close'])/3
df['raw_money_flow'] = df['typical_price']*df['Volume']
mf = df.raw_money_flow.diff(1)
p = mf.copy()
n = mf.copy()
p[p<=0] = 0
n[n>0] = 0
windowsize=2 # example value
pmf = p.rolling(window=windowsize).mean()
nmf = abs(n.rolling(window=windowsize).mean())
mfr = pmf/nmf
df['mfi'] = 100 - (100 / (mfr +1))
df['mfi'].dropna(inplace=True)
问题
现在如果我运行df['mfi_70_overbought'] = np.where(df['mfi'] > 70, 1, 0)
,我会得到同样的错误:ValueError: Length of values does not match length of index
解决方案
如果您只想拥有一个新列,当 mfi 超过 70 时为1,当 mfi 超过 70 时为 0,那么您可以避免numpy
并使用pandas
工具。
定义一个函数,1
如果输入大于70
则返回,否则返回0
:
def above70(num):
return int(num > 70)
将此应用于df[mfi]
:
df['mfi'].apply(above70)
在我的示例中,这个新列将如下所示:
Dates
timestep3 0
timestep4 0
timestep5 1
Name: mfi, dtype: int64
附带问题
这个新列比原始数据框的列短(差异为windowsize
),因为之前我们已经应用了rolling
和dropna
。如果要将其附加到数据框,请填充此列,或者不要执行缩短它的步骤。
推荐阅读
- emacs - Emacs 中有没有办法填充包含一些只读字符的段落?
- javascript - Ionic 2 karma-jasmine 单元测试
- python - 更改 python 二维数组中的值
- docker - 如何在 gitlab ci docker executor 中运行脚本?
- sql - 如何在 plsql-oracle 12c 中访问 json 数组元素
- laravel-5 - 在 Laravel 5.8 中验证输入
- kotlin - 了解“by”如何作为代表工作
- javascript - 致命:无法从远程存储库 npm install 读取
- javascript - 无法在时隙之间拖动事件
- python - 在本地运行 python 脚本与在 docker 中运行的区别