【问题标题】:Using Formula on Time Series在时间序列上使用公式
【发布时间】:2019-06-02 02:21:39
【问题描述】:

我有一个时间序列的气候数据和一些恒定的大气值(气压等),我想在公式中使用它们来计算潜在蒸散量。公式写成如下:

LET_a= (delta * (Rnet + G) + pa * cp * (VPD/Ra)) / (delta + pc * (1 + rs/Ra))

cp 是一个常数值(整数) rs 是一个常数值(浮点数) 其余的都是具有 300000 加值的系列。

样本df。具有相似的值。

    df=pd.DataFrame([[0.078,-61.36,49.56,1.248,0.155,468.57],[0.077,-58.38,50.14,1.249,0.13,1968.02],[0.078,-54.44,50.36,1.249,0.12,3061.366]])

    df.columns=['delta', 'Rnet', 'G', 'pa', 'VPD', 'Ra',]

    cp=1005
    rs=79.36
    pc=0.0663

这三行的预期结果应如下所示: -3.25, -3.77, -1.83

下面的代码与上面的代码相同,只是手动输入(使用示例数据的第一行并产生正确的结果。

    LET_1 = (0.078 * (-61.36+49.56)+1.248*1005*(0.155/468.57)) /( 0.078 + 0.0663 * (1 + 79.37/468.57))

LET_1=-3.25

问题是当我运行这段代码时,数字发生了一些事情(我没有得到正确的结果),我不知道为什么。

是因为系列和花车的混合吗?它是否需要更多()或不同的写作方式?

理论上它应该将公式应用于系列中的每个值并产生一个新系列。

当我只对数字使用相同的公式时,我得到了正确的结果。所以它一定是代码的“拼写”中的东西。

非常感谢任何建议!

【问题讨论】:

  • 请提供您的数据集。
  • 您能否将此添加到您的问题而不是评论中?此外,请重写您的代码,以便可以使用 DataFrame 中给出的数据执行它。发布预期的输出也会很棒。使用您的样本数据,我的结果是[1811.175853, 1203.009187]。这是正确的/符合预期的吗?
  • 感谢您编辑您的问题并添加示例数据!您还可以添加预期的输出吗?

标签: python pandas time-series


【解决方案1】:

您可以使用以下行轻松计算您的数据:

LET_a = (df.delta * (df.Rnet + df.G) + df.pa * cp * (df.VPD / df.Ra)) / (df.delta + pc * (1 + rs / df.Ra))

如果要将结果作为列添加到 DataFrame 中,可以这样编写:

df['LET_a'] = (df.delta * (df.Rnet + df.G) + df.pa * cp * (df.VPD / df.Ra)) / (df.delta + pc * (1 + rs / df.Ra))

两者产生相同的结果:

# Out:    0    -3.250232
#         1    -3.778515
#         2    -1.842481
#      dtype: float64

您的代码存在一些问题:

  1. 变量命名约定:变量应以小写字母命名,可以使用下划线。对于数据框列,您还可以使用其他命名样式,但我仍然建议坚持使用小写样式,因为这将确保您始终可以使用“点”访问数据,而不必显式地编写 df['A BC'] 之类的内容。常量应该以大写命名,如果它们是全局的或模块级别的。 Here is the python styleguide on variable naming.
  2. 您是否检查了代码的括号?即使手动输入公式,我也无法计算出您的代码的正确结果。看起来你放错了一些括号。 python 中的括号规则与任何其他数学方程相同。

【讨论】:

  • 其实我的方式是所有不同的变量都是自己的系列。他们不在 1 df 中。这有关系吗?
  • 不,没关系。但是如果它们都在同一个 DataFrame 中,代码会更容易阅读,计算起来也更快。
  • 括号按照我使用的公式应该是这样的。
  • 但结果不匹配。
  • 是的,但那是因为您的方程式 LET_1 = (0.067873 * (-6.05+38.93)+1.25974*1005 etc... 有问题。您正在混淆您的值/变量。例如,0.067873 在您的数据框中无处RNet 例如在您发布的数据框中是 -61.36-58.38-54.44但是你用-6.05评估你的方程。这远不及 60 左右。大约是 10 倍。您确实应该检查您发布的示例值。
【解决方案2】:
df["LET_a"] = df.apply(lambda x: x.delta * (x.Rnet + x.G) + x.pa * cp * (x.VPD/x.Ra) / x.delta + pc * (1 + rs/x.Ra), axis=1)
df

    delta   Rnet      G      pa     VPD      Ra           LET_a
0   0.078   -61.36  49.56   1.248   0.155   468.570     5.174052
1   0.077   -58.38  50.14   1.249   0.130   1968.020    1.132096
2   0.078   -54.44  50.36   1.249   0.120   3061.366    0.992759

【讨论】:

  • 不!不要在 DataFrame 上使用 applylambda!这完全扼杀了性能,而且绝对是不符合标准的!
猜你喜欢
  • 2016-04-09
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-15
  • 2011-10-22
相关资源
最近更新 更多