【问题标题】:Appending to a new column the differences of current row and previous row, for multiple columns将当前行和上一行的差异附加到新列,用于多列
【发布时间】:2018-08-06 12:28:27
【问题描述】:

对于我的 df 中的每一列,我想从前一行中减去当前行 (row[n+1]-row[n]),但是我遇到了困难。

我的代码如下:

#!/usr/bin/python3
from pandas_datareader import data
import pandas as pd
import fix_yahoo_finance as yf
yf.pdr_override()
import os


stock_list = ["BHP.AX", "CBA.AX", "RHC.AX", "TLS.AX", "WOW.AX", "^AORD"]

# Function to get the closing price of the individual stocks
# from the stock_list list
def get_closing_price(stock_name, specific_close):
    symbol = stock_name
    start_date = '2010-01-01'
    end_date = '2016-06-01'
    df = data.get_data_yahoo(symbol, start_date, end_date)
    sym = symbol + " "
    print(sym * 10)
    df = df.drop(['Open', 'High', 'Low', 'Adj Close', 'Volume'], axis=1)
    df = df.rename(columns={'Close': specific_close})
    # https://stackoverflow.com/questions/16729483/converting-strings-to-floats-in-a-dataframe
    # df[specific_close] = df[specific_close].astype('float64')
    print(type(df[specific_close]))
    return df

# Creates a big DataFrame with all the stock's Closing
# Price returns the DataFrame
def get_all_close_prices(directory):
    count = 0
    for stock_name in stock_list:
        specific_close = stock_name.replace(".AX", "") + "_Close"
        if not count:
            prev_df = get_closing_price(stock_name, specific_close)
        else:
            new_df = get_closing_price(stock_name, specific_close)
            # https://stackoverflow.com/questions/11637384/pandas-join-merge-concat-two-dataframes
            prev_df = prev_df.join(new_df)
        count += 1
    prev_df.to_csv(directory)
    return prev_df

# THIS IS THE FUNCTION I NEED HELP WITH
# AS DESCRIBED IN THE QUESTION
def calculate_return(df):
    count = 0
    # for index, row in df.iterrows():
    print(df.columns[0])
    for stock in stock_list:
        specific_close = stock.replace(".AX", "") + "_Close"
        print(specific_close)
        # https://stackoverflow.com/questions/15891038/change-data-type-of-columns-in-pandas
        pd.to_numeric(specific_close, errors='ignore')
        df.columns[count].diff()
        count += 1
     return df


def main():
    # FINDS THE CURRENT DIRECTORY AND CREATES THE CSV TO DUMP THE DF
    csv_in_current_directory = os.getcwd() + "/stk_output.csv"

    # FUNCTION THAT GETS ALL THE CLOSING PRICES OF THE STOCKS
    # AND RETURNS IT AS ONE COMPLETE DATAFRAME
    df = get_all_close_prices(csv_in_current_directory)

    # THIS PRINTS OUT WHAT IS IN "OUTPUT 1"
    print(df)

    # THIS FUNCTION IS WHERE I HAVE THE PROBLEM
    df = calculate_return(df)

    # THIS SHOULD PRINT OUT WHAT IS IN "EXPECTED OUTPUT"
    print(df)




# Main line of code
if __name__ == "__main__":
    main()

问题:

对于每一列,我想从前一行中减去当前行 (row[n+1]-row[n]) 并将这个值分配给数据框末尾的新列作为新列作为stock_name + "_Earning"。我的预期输出(请参阅:预期输出)是我仍然拥有原始的 df,如 Output 1 中所示,但有 6 个额外的列,带有一个 第一行,以及各列中各行的差异(row[n+1]-row[n])。

面临的问题:

使用当前代码 - 我收到以下错误,我试图摆脱它

AttributeError: 'str' 对象没有属性 'diff'

我尝试过的事情:

我尝试过的一些事情:

预期输出:

            BHP_Close  CBA_Close  RHC_Close  TLS_Close  WOW_Close        ^AORD  BHP_Earning  CBA_Earning  RHC_Earning  TLS_Earning  WOW_Earning  ^AORD_Earning
Date
2010-01-03  40.255699  54.574299  11.240000       3.45  27.847300  4889.799805
2010-01-04  40.442600  55.399799  11.030000       3.44  27.679100  4939.500000     0.186901       0.8255        -0.21        -0.01      -0.1682   49.70020000  

输出 1:

            BHP_Close  CBA_Close  RHC_Close  TLS_Close  WOW_Close  ^AORD_Close
Date
2010-01-03  40.255699  54.574299  11.240000       3.45  27.847300  4889.799805
2010-01-04  40.442600  55.399799  11.030000       3.44  27.679100  4939.500000
2010-01-05  40.947201  55.678299  11.180000       3.38  27.629601  4946.799805
...               ...        ...        ...        ...        ...          ...
2016-05-30  19.240000  78.180000  72.730003       5.67  22.389999  5473.600098
2016-05-31  19.080000  77.430000  72.750000       5.59  22.120001  5447.799805
2016-06-01  18.490000  76.500000  72.150002       5.52  21.799999  5395.200195

【问题讨论】:

  • 你的问题和代码不是很清楚。 print(df)的输出是什么,calculate_return(df);的输出是什么
  • @TonyTannous print(df)的输出是什么Output 1下; calculate_return(df) 的输出是什么 这是我遇到困难的地方,即我无法解决的AttributeError: 'str' object has no attribute 'diff' 错误:(。
  • 您的问题过于冗长。我会建议以下步骤。遍历列,访问每一列并在该列上应用numpy.diff()。该列应该是一个 numpy 数字数组(不是字符串)。可以这样做:for col in df.columns: myDiff = np.diff(df[col].as_matrix())。如果您的df[col] 包含格式化为字符串的数字,则应首先将其转换为floatint,无论适用什么。

标签: python pandas numpy dataframe


【解决方案1】:

这是一种简单快捷的方法来做你想做的事:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(25).reshape(5, 5), 
                  columns=['A', 'B', 'C', 'D', 'E'])
print(df)

结果:

    A   B   C   D   E
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14
3  15  16  17  18  19
4  20  21  22  23  24

我们可以使用 shift 成员函数向上(或向下)移动整个数据框。 然后我们只需要从原始数据中减去它,然后重命名列。

df2 = df - df.shift(1, axis=0) 
df2.columns = [col + '_earning' for col in df2.columns]
print(df2)

结果:

   A_earning  B_earning  C_earning  D_earning  E_earning
0        NaN        NaN        NaN        NaN        NaN
1        5.0        5.0        5.0        5.0        5.0
2        5.0        5.0        5.0        5.0        5.0
3        5.0        5.0        5.0        5.0        5.0
4        5.0        5.0        5.0        5.0        5.0

然后将结果与原始结果连接起来。

result = pd.concat([df, df2], axis=1)
print(result)

结果:

    A   B   C   D   E  A_earning  B_earning  C_earning  D_earning  E_earning
0   0   1   2   3   4        NaN        NaN        NaN        NaN        NaN
1   5   6   7   8   9        5.0        5.0        5.0        5.0        5.0
2  10  11  12  13  14        5.0        5.0        5.0        5.0        5.0
3  15  16  17  18  19        5.0        5.0        5.0        5.0        5.0
4  20  21  22  23  24        5.0        5.0        5.0        5.0        5.0

编辑:重新访问您的帖子后,您似乎尝试在某些包含字符串的列上执行此操作?将它们过滤掉或转换为支持“-”运算符的数据类型。

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多