【问题标题】:Calculating a parameter based on values from the previous day根据前一天的值计算参数
【发布时间】:2022-01-04 10:54:11
【问题描述】:

我有一个 DataFrame,它是 Python 上更广泛脚本的一部分,具有以下特征:

  • 索引dtype='datetime64[ns]', length=365, freq='D'
  • 不同参数的每日值
  • DOY 1 的默认值
  • 我之前为某些特定日期计算的一对值。

迄今为止,数据框结构是这样的:

                 col1    col2      col3       col4       Condition   value to calculate
2018-01-01        5.0  0.853232  0.992774   0.65377        0.0       0.65429
2018-01-02        0.4  0.004652  0.992774   0.65377        0.0       NaN
2018-01-03        0.0  0.000000  0.992774   0.65377        0.0       NaN
2018-01-04        0.0  0.000000  0.992774   0.65377        1.0       0.33456
2018-01-05        0.4  0.004652  0.992774   0.65377        0.0       NaN
              ...       ...       ...       ...        ...       ...

“条件”列用于在最后一列中的特定时间属性值

最后一列中的缺失值应使用第 1 到第 4 列中的数据计算,使用第 1 到第 4 列中的前 DOY 值以及我必须计算的值的同一列中的值。

此外,如果特定 DOY 中已经存在值,则应重置公式以使用先前添加的值开始计算。

我不确定如何将其放入循环中以执行操作,或者是否有其他替代方法来解决我正在处理的这部分代码。

【问题讨论】:

  • 我不确定我是否完全理解了这个问题。了解最后一列计算所需的算法会很有帮助。看起来你需要这样的东西:对于索引,df.iterrows() 中的行: start_row = index - n end_row = inde - m other_rows = df.loc[start_row:end_row] compute_last_column(row, other_rows)
  • @Cr4zyTun4 这实际上不是一个算法,它只是一个评估土壤侵蚀(特别是土壤粗糙度)的公式。计算比较棘手,因为机械操作会影响每日值,这些值受前一天参数的影响,所以计算应该类似于value at day x = col1(x-1)*col2(x-1)-col3(x-1)*col4(x-1)
  • 好吧,你了解 iterrow() 方法还是需要我写一些代码?
  • 我会寻求您的帮助,因为我不完全确定我理解 iterrows() 的工作原理
  • 可能会正常计算每一天,然后使用shift() 将所有值向下移动一行以将结果放在下一个日期。

标签: python pandas dataframe loops pandas-loc


【解决方案1】:

您似乎需要这样的东西: def compute_value(previous_row, row):

for index, row in df.iterrows():
      if index>0:
           previous_row = df.iloc[index-1]
           row['value to calculate'] = previous_row['col1'] * previous_row['col2'] - previous_row['col3'] * previous_row['col4']

这是您迭代的方式,但不确定是否完全理解条件并且不确定您的意思,如果我可以扩展,请告诉我

此外,如果特定 DOY 中已经存在值,则应重置公式以使用先前添加的值开始计算。

【讨论】:

  • 很高兴这对您有所帮助!祝你工作顺利!
  • 非常感谢,我一直在进行一些调整以使其正常工作,例如将 DatetimeIndex 转换为 DOY 以避免 TypeError: Addition/subtraction of integers and integer-arrays with Timestamp is no longer supported. Instead of adding/subtracting 'n', use 'n * obj.freq' 我还要要求您做一件事(或其他人的阅读)帮助:我试图计算的结果是基于前一天第 1 到第 4 列的值,但也基于从我试图计算的相同结果的前一天获得的值。
猜你喜欢
  • 2022-07-08
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多