【问题标题】:Pandas Time Series - Add difference from previous column to New RowPandas 时间序列 - 将上一列的差异添加到新行
【发布时间】:2017-10-28 13:32:06
【问题描述】:

我有一个 DataFrame,DF:

    Ticker_x    Date    Close_x ES_difference
0   ES H7   10/18/2016 13:44    2128    
1   ES H7   10/18/2016 13:59    2128.75 0.75
2   ES H7   10/18/2016 14:14    2125.75 -3
3   ES H7   10/18/2016 14:29    2126.5  0.75
4   ES H7   10/18/2016 14:44    2126.5  0
5   ES H7   10/18/2016 16:14    2126    -0.5
6   ES H7   10/18/2016 16:44    2126.25 0.25
7   ES H7   10/18/2016 17:59    2126.5  0.25
8   ES H7   10/18/2016 18:14    2127    0.5
9   ES H7   10/18/2016 19:14    2127.75 0.75
10  ES H7   10/18/2016 19:44    2127.75 0
11  ES H7   10/18/2016 19:59    2127.75 0
12  ES H7   10/18/2016 20:44    2129    1.25
13  ES H7   10/18/2016 21:29    2128.75 -0.25
14  ES H7   10/18/2016 21:44    2129    0.25
15  ES H7   10/18/2016 22:14    2129.5  0.5
16  ES H7   10/18/2016 22:44    2129.5  0

我正在尝试创建一个新列 - ES_Inverse_price,它采用差异列并从 Close_x 列中减去它:

Df['ES_difference'] = Df['Close_x'].diff()

这就是我制作ES_difference 专栏的方式。现在我想要一个新列 ES_Inverse_priceClose_x 中获取先前的值并减去同一行的差异列值:

Df['ES_Inverse_price'] = ''
Df['ES_Inverse_price'][0] = Df['Close_x'][0]
Df['ES_Inverse_price'][1:] = Df['ES_Inverse_price'].shift(1)-Df['ES_difference']

...所以ES_Inverse_price 中的第一行将等于Close_x 中的第一行。这很好,但现在我想开始减去那个差异列,以获得我正在尝试创建的 ES_Inverse_price 列的新值。

不幸的是,我收到以下错误,指的是其中包含 shift(1) 的代码:

TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32') 

编辑:例如取第 1 行。不是 2128.75,而是 2127.25。我从前一行的值中减去“Close_x”(已经是一个既定值)的差值,而不是加上它(这将给我 2128.75)。

编辑:

因此,在下面另一张海报给出的示例中,这就是我要寻找的内容:

	close_p	ticker	difference	ES_Inverse Price
0	100	aapl	NaN	NaN
1	102	aapl	2.0	98.0
2	103.4	aapl	1.4	96.6
3	101.2	aapl	-2.2	98.8
4	106.2	aapl	5.0	93.8

【问题讨论】:

    标签: python pandas dataframe time series


    【解决方案1】:

    除非您提供您正在寻找的值,否则我不确定我是否完全理解,但也许就是这样?

    df['ES_Inverse_price'] = df['Close_x'].shift(1) - df['ES_difference']
    

    使用一些非常粗略的数据(我无法复制你的数据):

    df
       close_p ticker
    0    100.0   aapl
    1    102.0   aapl
    2    103.4   aapl
    3    101.2   aapl
    4    106.2   apple
    
    df['es_difference'] = df['close_p'].diff()
       close_p ticker  es_difference
    0    100.0   aapl            NaN
    1    102.0   aapl            2.0
    2    103.4   aapl            1.4
    3    101.2   aapl           -2.2
    4    106.2   apple            5.0
    
    df['es_inverse_price'] = df['close_p']-df['es_difference'].cumsum() - df['es_difference'].cumsum()
       close_p ticker  es_difference  es_inverse_price
    0    100.0   aapl            NaN               NaN
    1    102.0   aapl            2.0              98.0
    2    103.4   aapl            1.4              96.6
    3    101.2   aapl           -2.2              98.8
    4    106.2   aapl            5.0              93.8
    

    我不会考虑将所有内容都基于iloc[0,0] 以确保“安全”,但我不确定还能如何做到这一点。确保事先进行排序。

    【讨论】:

    • 所以我不想在你的情况下减去'Close_p'的差异。相反,我试图将差异添加到“ES_Inverse_price”列上。由于减去差异列,“ES_Inverse_price”列将与“Close_p”(或“Close_x”)列有更多不同.所以我认为当你在 shift(1) 代码中使用“Close_p”时,它会得到与我正在寻找的不同的结果。我在那里有差异列,我只想将它从新的“ES_Inverse_price”列中减去前一个值以得出新行的值。
    • 编辑:感谢您的评论,我在原始帖子的底部添加了一个我正在寻找的示例。
    • 好的,所以你要从 close_x 中减去 es_difference(下移)?见编辑
    • 不是从 close_x 中减去,而是从 'ES_Inverse_price' 的先前值中减去。所以当 close_x 上升时,ES_Inverse_price 会下降同样的数量
    • 我建议使用类似于我汇总的可重现虚拟数据并手动创建您要查找的列。这样我就可以弄清楚了。用我听不懂的语言。
    猜你喜欢
    • 1970-01-01
    • 2020-05-07
    • 2020-09-26
    • 2018-08-06
    • 2022-07-21
    • 2012-12-08
    • 2020-05-15
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多