簡體   English   中英

嘗試根據與if語句相關的數據框在熊貓中創建新的數據框列

[英]Trying to create a new dataframe column in pandas based on a dataframe related if statement

我正在學習Python和熊貓,並使用不同的股票計算進行練習。 我試圖在此方面尋求幫助,但只是沒有找到足夠類似的響應,或者不了解如何根據先前的響應推論出正確的方法。

我已使用datareader將給定時間范圍的庫存數據讀取到dataframe df中。 在df中,我要使用“日期量”和“調整結束”列,以根據給定的條件來創建新列“ OBV”。 OBV是一個累積值,根據調整后的收盤價,它在前幾天的OBV中增加或減去今天的交易量。

OBV的計算很簡單:

如果今天的收市價高於昨天的收市價,則將今天的交易量添加到昨天的(累計)交易量中。

如果今天的收市價低於昨天的收市價,則從昨天的(累積)量中減去今天的量。

在第1天,OBV = 0

然后沿着時間范圍重復此操作,並累積OBV。

這是基本的導入和開始

import numpy as np
import pandas as pd
import pandas_datareader

import datetime
from pandas_datareader import data, wb

start = datetime.date(2012, 4, 16)
end = datetime.date(2017, 4, 13)

# Reading in Yahoo Finance data with DataReader
df = data.DataReader('GOOG', 'yahoo', start, end)

import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

#This is what I cannot get to work, and I've tried two different ways.

#ATTEMPT1

def obv1(column):
    if column["Adj Close"] > column["Adj close"].shift(-1):
        val = column["Volume"].shift(-1) + column["Volume"]
    else:
        val = column["Volume"].shift(-1) - column["Volume"] 
    return val

df["OBV"] = df.apply(obv1, axis=1)

#ATTEMPT 2

def obv1(df):
    if df["Adj Close"] > df["Adj close"].shift(-1):
        val = df["Volume"].shift(-1) + df["Volume"]
    else:
        val = df["Volume"].shift(-1) - df["Volume"] 
    return val

df["OBV"] = df.apply(obv1, axis=1)

兩者都給我一個錯誤。

考慮數據幀df

np.random.seed([3,1415])
df = pd.DataFrame(dict(
        Volume=np.random.randint(100, 200, 10),
        AdjClose=np.random.rand(10)
    ))

print(df)

   AdjClose  Volume
0  0.951710     111
1  0.346711     198
2  0.289758     174
3  0.662151     190
4  0.171633     115
5  0.018571     155
6  0.182415     113
7  0.332961     111
8  0.150202     113
9  0.810506     126

AdjClose變化為負時,將Volume乘以-1。 然后cumsum

(df.Volume * (~df.AdjClose.diff().le(0) * 2 - 1)).cumsum()

0    111
1    -87
2   -261
3    -71
4   -186
5   -341
6   -228
7   -117
8   -230
9   -104
dtype: int64

df的其余部分中包括此內容

df.assign(new=(df.Volume * (~df.AdjClose.diff().le(0) * 2 - 1)).cumsum())

   AdjClose  Volume  new
0  0.951710     111  111
1  0.346711     198  -87
2  0.289758     174 -261
3  0.662151     190  -71
4  0.171633     115 -186
5  0.018571     155 -341
6  0.182415     113 -228
7  0.332961     111 -117
8  0.150202     113 -230
9  0.810506     126 -104

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM