python - 调整 heikin ashi 代码错误:列表喜欢到 .loc 或 [] 与任何缺少的标签不再支持
问题描述
我正在尝试修改我在网上找到的一些用于 heikin ashi 蜡烛的代码
代码是:
def heikin_ashi(self, df):
heikin_ashi_df = pd.DataFrame(index=df.index.values, columns=['HE_Open', 'HE_High', 'HE_Low', 'HE_Close'])
heikin_ashi_df['HE_Close'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4
for i in range(len(df)):
if i == 0:
heikin_ashi_df.iat[0, 0] = df['Open'].iloc[0]
else:
heikin_ashi_df.iat[i, 0] = (heikin_ashi_df.iat[i - 1, 0] + heikin_ashi_df.iat[i - 1, 3]) / 2
heikin_ashi_df['HE_High'] = heikin_ashi_df.loc[:, ['HE_Open', 'HE_Close']].join(df['High']).max(axis=1)
heikin_ashi_df['HE_Low'] = heikin_ashi_df.loc[:, ['HE_Open', 'HE_Close']].join(df['Low']).min(axis=1)
return heikin_ashi_df
但是这个方法返回一个新的熊猫表,我只想将新行添加到我现有的表中
这是我的尝试:
def heikin_ashi_full(self, df):
df.append(pd.Series(name='HE_Open', dtype=float))
df.append(pd.Series(name='HE_High', dtype=float))
df.append(pd.Series(name='HE_Low', dtype=float))
df.append(pd.Series(name='HE_Close', dtype=float))
df['HE_Close'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4
for i in range(len(df)):
if i == 0:
df.iat[0, 0] = df['Open'].iloc[0]
else:
df.iat[i, 0] = (df.iat[i - 1, 0] + df.iat[i - 1, 3]) / 2
df['HE_High'] = df.loc[:, ['HE_Open', 'HE_Close', 'High']].max(axis=1)
df['HE_Low'] = df.loc[:, ['HE_Open', 'HE_Close', 'Low']].min(axis=1)
return df
不幸的是,该方法在该方法的第 15 行崩溃
df['HE_High'] = df.loc[:, ['HE_Open', 'HE_Close', 'High']].max(axis=1)
回溯显示在这里:
主表是从具有如下数据的文件中创建的:
Date,Open,High,Low,Close,Volume,OpenInterest
2020-08-25 06:00,15.12,15.25,14.82,15.05,3824776,0.0
2020-08-26 06:00,15.09,15.44,15.02,15.07,5933882,0.0
2020-08-27 06:00,15.22,15.33,14.672,14.84,5728962,0.0
2020-08-28 06:00,15.01,15.18,14.8605,15.12,5992532,0.0
2020-08-31 06:00,15.23,15.23,14.62,14.62,7000994,0.0
2020-09-01 06:00,14.64,15.18,14.24,15.08,7347598,0.0
有趣的是,我从互联网上获得的第一种方法似乎工作得很好而且很准确。我不熟悉熊猫,不知道我是怎么做错的,也找不到解决办法。非常感谢您的帮助,并提前感谢您的宝贵时间。
解决方案
我尝试了您的代码,我的第一个问题是我正在尝试添加列df.append()
,但我认为这是因为没有添加列。如果我在将开盘价、最高价和最低价添加为空后尝试运行您的代码,将显示结果。数据框的列结构发生了一些变化,因此我对其进行了相应的修改。另外,我认为关于 SO 上的“heikin-ashi”的这个答案会有所帮助。
import pandas as pd
import numpy as np
import io
data = '''
Date,Open,High,Low,Close,Volume,OpenInterest
2020-08-25 06:00,15.12,15.25,14.82,15.05,3824776,0.0
2020-08-26 06:00,15.09,15.44,15.02,15.07,5933882,0.0
2020-08-27 06:00,15.22,15.33,14.672,14.84,5728962,0.0
2020-08-28 06:00,15.01,15.18,14.8605,15.12,5992532,0.0
2020-08-31 06:00,15.23,15.23,14.62,14.62,7000994,0.0
2020-09-01 06:00,14.64,15.18,14.24,15.08,7347598,0.0
'''
df = pd.read_csv(io.StringIO(data), sep=',')
o = pd.Series([], index=[], name='HE_Open', dtype=float)
h = pd.Series([], index=[], name='HE_High', dtype=float)
l = pd.Series([], index=[], name='HE_Low', dtype=float)
df = pd.concat([df, o, h, l],axis=1)
df['HE_Close'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4
for i in range(len(df)):
if i == 0:
df.iat[0, 7] = df['Open'].iloc[0]
else:
df.iat[i, 7] = (df.iat[i - 1, 1] + df.iat[i - 1, 4]) / 2
df['HE_High'] = df.loc[:, ['HE_Open', 'HE_Close', 'High']].max(axis=1)
df['HE_Low'] = df.loc[:, ['HE_Open', 'HE_Close', 'Low']].min(axis=1)
df
Date Open High Low Close Volume OpenInterest HE_Open HE_High HE_Low HE_Close
0 2020-08-25 06:00 15.12 15.25 14.8200 15.05 3824776 0.0 15.120 15.25 14.8200 15.060000
1 2020-08-26 06:00 15.09 15.44 15.0200 15.07 5933882 0.0 15.085 15.44 15.0200 15.155000
2 2020-08-27 06:00 15.22 15.33 14.6720 14.84 5728962 0.0 15.080 15.33 14.6720 15.015500
3 2020-08-28 06:00 15.01 15.18 14.8605 15.12 5992532 0.0 15.030 15.18 14.8605 15.042625
4 2020-08-31 06:00 15.23 15.23 14.6200 14.62 7000994 0.0 15.065 15.23 14.6200 14.925000
5 2020-09-01 06:00 14.64 15.18 14.2400 15.08 7347598 0.0 14.925 15.18 14.2400 14.785000
推荐阅读
- sql-server - 从使用一个数据库切换到一个用于身份验证,一个用于其他所有数据库
- julia - 在 Julia 中调用父函子
- php - 如何在 PHP7 中连接到 MS Access 数据库?
- javascript - 响应子组件下拉列表的 onChange 事件以更新状态
- bash - Bash条件混合函数返回值和条件检查
- java - 信息:配置“编译”已过时,已替换为“实施”和“API”
- javascript - React:更改功能组件中的状态也更改功能组件的道具值及其父类状态
- javascript - 删除具有最高值的对象属性并将结果放入数组中
- php - 无法从 nodeMCU 发送 GET 请求
- docker - 构建 docker 映像时复制异常