2

我是 pandas 和 python 的新手,我正在努力在我的代码中实现循环。我希望有人能帮助我。

我有以下数据框:

import pandas as pd
from pandas import Timestamp

pd.DataFrame({'DateTime': {0: Timestamp('2021-06-13 00:00:00'),
  1: Timestamp('2021-06-13 02:00:00'),
  2: Timestamp('2021-06-13 05:00:00'),
  3: Timestamp('2021-06-13 07:00:00'),
  4: Timestamp('2021-06-13 10:00:00')},
 'actual_value': {0: 180.0949105082311,
  1: 183.93185469787613,
  2: 191.48399886639095,
  3: 188.31358023933768,
  4: 159.32768035801615},
 'forecast_0': {0: nan,
  1: 185.0,
  2: 206.0,
  3: 193.0,
  4: 130.0},
 'forecast_1': {0: 187.0,
  1: 185.0,
  2: 206.0,
  3: 192.0,
  4: 130.0},
 'forecast_2': {0: 186.0,
  1: nan,
  2: 200.0,
  3: 192.0,
  4: nan},
 'forecast_3': {0: 186.0,
  1: 185.0,
  2: 200.0,
  3: 192.0,
  4: 130.0},
 'forecast_4': {0: 186.0,
  1: 183.0,
  2: 200.0,
  3: 188.0,
  4: 130.0}})

             DateTime  actual_value  forecast_0  forecast_1  forecast_2  \
0 2021-06-13 00:00:00    180.094911         NaN       187.0       186.0   
1 2021-06-13 02:00:00    183.931855       185.0       185.0         NaN   
2 2021-06-13 05:00:00    191.483999       206.0       206.0       200.0   
3 2021-06-13 07:00:00    188.313580       193.0       192.0       192.0   
4 2021-06-13 10:00:00    159.327680       130.0       130.0         NaN   

   forecast_3  forecast_4  
0       186.0       186.0  
1       185.0       183.0  
2       200.0       200.0  
3       192.0       188.0  
4       130.0       130.0  

我想创建一个新的数据框或用简单的计算替换现有数据框中的数字。我想确定第二列中所有预测值相对于实际值的偏差。由于有超过 40 个这样的预测列,因此写下每一列的计算实在是太费时了。这就是为什么我想实现一个循环。我尝试了以下代码,但没有成功:

for i, col in enumerate(df.columns, -2):
    df[col] = (df[col]-df['actual_value'])/df['actual_value']

我收到错误消息,“减法”不能使用类型为 dtype('<M8[ns]') 和 dtype('float64') 的操作数。有谁知道如何解决这个问题?我感谢每一条消息。

4

3 回答 3

1

您可以使用 str.contains 选择包含“预测”的变量,然后应用:

df.loc[:,df.columns.str.contains('forecast')].apply(lambda x: (x-df['actual_value'])/df['actual_value'])
Out[0]: 
   forecast_0  forecast_1  forecast_2  forecast_3  forecast_4
0         NaN    0.038341    0.032789    0.032789    0.032789
1    0.005807    0.005807         NaN    0.005807   -0.005066
2    0.075808    0.075808    0.044474    0.044474    0.044474
3    0.024886    0.019576    0.019576    0.019576   -0.001665
4   -0.184071   -0.184071         NaN   -0.184071   -0.184071
于 2022-01-18T15:41:43.880 回答
1

您正在寻找pd.DataFrame.subpd.DataFrame.div

>>> df.iloc[:, 2:].sub(df["actual_value"], axis=0).div(df["actual_value"], axis=0)
   forecast_0  forecast_1  forecast_2  forecast_3  forecast_4
0         NaN    0.038341    0.032789    0.032789    0.032789
1    0.005807    0.005807         NaN    0.005807   -0.005066
2    0.075808    0.075808    0.044474    0.044474    0.044474
3    0.024886    0.019576    0.019576    0.019576   -0.001665
4   -0.184071   -0.184071         NaN   -0.184071   -0.184071

经验法则:如果您希望使用循环对 DataFrame 进行操作,那么您做错了什么。

于 2022-01-18T15:38:36.833 回答
1

错误 'subtract' 不能使用类型为 dtype('<M8[ns]') 和 dtype('float64') 的操作数是因为您的循环试图减去第一列,即 datetime 和 actual_value 列中的浮点数。

要正确执行此操作,您可以将循环更改为for col in df.columns[2:]:

即使我同意此处发布的其他解决方案 - 不使用循环更优雅。

于 2022-01-18T16:01:17.453 回答