Pandas столбец не имеет значений - PullRequest
0 голосов
/ 03 августа 2020

Итак, я пытаюсь создать новый столбец для фрейма данных, который по сути имеет 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

1 Ответ

1 голос
/ 06 августа 2020
# 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

Решение

Если вы просто хотите иметь новый столбец, который равен 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. Заполните этот столбец, если вы хотите прикрепить его к фрейму данных, или не выполняйте шаги, которые делают его короче.

...