【问题标题】:Python: add column to dataframe that relates to another columnPython:将列添加到与另一列相关的数据框
【发布时间】:2019-06-22 05:19:56
【问题描述】:

我已使用 pandas_datareader 将雅虎的股票数据导入数据框。 有 2 列:日期和股票的调整收盘价。

Date        Adj Close          
2017-08-31  168.851196
2017-09-01  169.867691
2017-09-05  165.333496
2017-09-06  165.233810
2017-09-07  166.001160
2017-09-08  163.121201
2017-09-11  168.412735
2017-09-12  169.020630
2017-09-13  169.777969
2017-09-14  168.811356
2017-09-15  179.484131
2017-09-18  186.898300
2017-09-19  186.698990
2017-09-20  185.194214
2017-09-21  180.131882
2017-09-22  178.377991
2017-09-25  170.405807
2017-09-26  171.362473
2017-09-27  175.119354
2017-09-28  175.069534
2017-09-29  178.148788
2017-10-02  178.377991
2017-10-03  178.746704
2017-10-04  180.241486
2017-10-05  180.141861
2017-10-06  180.670013
2017-10-09  184.745804
2017-10-10  188.273499
2017-10-11  190.276505
2017-10-12  190.366211

我希望能够插入另一个名为“日志返回”的列,它采用当天的调整收盘价(由于交易日,日期并非全部相隔 1 天)并将其除以前几天的调整收盘价然后取那个商的自然对数

即Ln(A(today)/A(yesterday)),其中 A 只是形容词收盘价。

顺便说一下,我的数据框变量叫做 df。

import pandas as pd
import pandas_datareader as web

#import datetime internal datetime module
#datetime is a Python module
import datetime

#datetime.datetime is a data type within the datetime module
start = datetime.datetime(2015, 9, 1)
end = datetime.datetime(2018, 12, 31)

#DataReader method name is case sensitive
df = web.DataReader("nvda", 'yahoo', start, end)

#invoke to_csv for df dataframe object from 
#DataReader method in the pandas_datareader library

#..\first_yahoo_prices_to_csv_demo.csv must not
#be open in another app, such as Excel

df = df.iloc[0:, 5:]  #Trims the set to Adj Close

这就是我目前在我的代码中的内容。 编辑我不想要 A(今天)/A(昨天)-1,我实际上需要 Ln(A(今天)/A(昨天))。 (自然对数)

【问题讨论】:

  • 所以您只是不想在前几行使用您的公式,而只在前一天使用?
  • 您想如何处理计算中缺失的天数?
  • 前 5 行的预期输出是什么?
  • 我不需要处理丢失的日子。交易日不是每周 7 天。
  • 所以你只想除以前一个最近的一天,如果昨天丢失了。

标签: python pandas dataframe


【解决方案1】:

你可以试试这个:

# First ensure dates are in order
df = df.sort_values('Date')
# Divide all rows by their previous and find log
diff = np.log(df[1:]['Adj Close'] / df[0:-1]['Adj Close'])
# Add new column, first row will be NaN as it has no previous day
df['Log Return'] = pd.concat(pd.Series([pd.nan]), diff)

【讨论】:

  • 可能令人困惑的是,np.log 是自然对数。 np.log10 是另一个。
  • 每次都能吸引我。谢谢。
【解决方案2】:

试试这个:

df['Adj Yesterday'] = df['Adj Close'].shift()
df['Log Return'] = df['Adj Close'] / df['Adj Yesterday'] - 1.

如果这不是您想要的,但很接近,here is the docs for shift

如果缺少时间数据,您还可以使用resample,或set_indexdate_range

【讨论】:

    【解决方案3】:

    你需要Series.pct_change:

    df['Log Return'] = df['Adj Close'].pct_change()
    

    如果需要ln:

    df['Log Return'] = np.log(df['Adj Close'].pct_change())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 2017-12-08
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2022-06-11
      相关资源
      最近更新 更多