Python 教我怎么做?

Python 教我怎么做?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在努力使用Pandas数据帧将电子表格转换为Python 我有一些原始数据: Date Temperature 12/4/2003 100 12/5/2003 101 12/8/2003 100 12/9/2003 102 12/10/2003 101 12/11/2003 100 12/12/2003 99 12/15/2003 98 12/16/2003 97 12/17/2003 96 12/18/2003 95 12/19/2003 96

我正在努力使用Pandas数据帧将电子表格转换为Python

我有一些原始数据:

Date        Temperature
12/4/2003   100
12/5/2003   101
12/8/2003   100
12/9/2003   102
12/10/2003  101
12/11/2003  100
12/12/2003  99
12/15/2003  98
12/16/2003  97
12/17/2003  96
12/18/2003  95
12/19/2003  96
12/22/2003  97
12/23/2003  98
12/24/2003  99
12/26/2003  100
12/29/2003  101
在电子表格中,我正在跟踪基于%监视器的趋势。可以将其视为滚动平均值,但以%为基础

电子表格的输出:

date         temp   monitor   trend        change_in_trend
12/4/2003    100    97.00      warming      false
12/5/2003    101    97.97      warming      false
12/8/2003    100    97.97      warming      false
12/9/2003    102    98.94      warming      false
12/10/2003   101    98.94      warming      false
12/11/2003   100    98.94      warming      false
12/12/2003    99    98.94      warming      false
12/15/2003    98    98.94      cooling      true
12/16/2003    97    98.94      cooling      false
12/17/2003    96    98.88      cooling      false
12/18/2003    95    97.85      cooling      false
12/19/2003    96    97.85      cooling      false
12/22/2003    97    97.85      cooling      false
12/23/2003    98    97.85      warming      true
12/24/2003    99    97.85      warming      false
12/26/2003   100    97.85      warming      false
12/29/2003   101    97.97      warming      false
假设:

percent_monitor = .03
warming_factor = 1 - percent_monitor
cooling_factor = 1 + percent_monitor
在我的电子表格中,我将第一行中的列设置为:

monitor = temp * warming_factor
trending = warming
change_in_trend = false
所有剩余行都是基于当前行和上一行的列值派生的

监视器列逻辑:

if temp > prev_monitor:
    if temp > prev_temp:
        if temp * warming_factor > prev_monitor:
            monitor = temp*warming_factor
        else:
            monitor = prev_monitor
    else:
        monitor = prev_monitor
else:
    if temp < prev_monitor:
        if temp * cooling_factor < prev_monitor:
            monitor = temp * cooling_factor
        else:
            monitor = prev_monitor
    else:
        monitor = prev_monitor
if temp > prev_monitor:
    trending = warming
else:
    trending = cooling
if current_trend - previous_trend:
    change_in_trend = false
else:
    change in trend = true
趋势列逻辑的变化:

if temp > prev_monitor:
    if temp > prev_temp:
        if temp * warming_factor > prev_monitor:
            monitor = temp*warming_factor
        else:
            monitor = prev_monitor
    else:
        monitor = prev_monitor
else:
    if temp < prev_monitor:
        if temp * cooling_factor < prev_monitor:
            monitor = temp * cooling_factor
        else:
            monitor = prev_monitor
    else:
        monitor = prev_monitor
if temp > prev_monitor:
    trending = warming
else:
    trending = cooling
if current_trend - previous_trend:
    change_in_trend = false
else:
    change in trend = true
我能够遍历数据帧并毫无问题地应用逻辑。但是,数千行的性能非常糟糕

我一直试图用一种更像“熊猫”的方式来做这件事,但每次都失败了

在不让自己难堪的情况下粘贴我的代码尝试,有没有人可以提供一些帮助


提前谢谢

因为您希望将其转移到Python,而不是特别设置Pandas,所以我选择了非Pandas方法。我使用了您的示例行,并在
0.182
秒内完成了
47124

Pandas在某些用例中非常好而且直观,但在迭代中可能会变得非常缓慢。解释了熊猫的一些较慢的用法,其中一个主要是索引迭代。一种方法是利用
5。使用NumPy数组进行矢量化
,但是您的用例看起来非常简单,这可能是过分的,可能不值得(因为您的名字是PythonNoob)

为了清晰和快速起见,简单地使用更基本的python函数可以获得您想要的速度

首先,我设置常量

percent_monitor = .03
warming_factor = 1 - percent_monitor
cooling_factor = 1 + percent_monitor
然后(为了便于使用,有更简洁的方法可以做到这一点,但这一点非常清楚),我设置了与列值对应的列的名称:

DATE = 0
TEMP = 1
MONITOR = 2
TRENDING = 3
CHANGE_IN_TREND = 4
然后,我取出了自己函数中的监视器代码(并稍微清理了
if
-语句:

def calculate_monitor(prev_monitor, current_temp, prev_temp):
     if (current_temp > prev_monitor) and (current_temp > prev_temp) and (current_temp * warming_factor) > prev_monitor:
            return current_temp * warming_factor
        elif (current_temp < prev_monitor) and ((current_temp * cooling_factor) < prev_monitor):
            return current_temp * cooling_factor
        else:
            return prev_monitor
这将为您提供所需的速度。如果您希望在最后将其转换为数据帧,您可以执行以下操作:

df = pd.DataFrame(data, columns=['date', 'temp', 'monitor', 'current_trend', 'change_in_trend'])

这个问题很长,但读起来很好。请考虑一个新的标题,虽然它确实指出了你试图解决的问题。这样,它可能在将来对其他同一问题的人来说是可搜索的。你肯定你的监视器列是正确的吗?电子表格是正确的,是的。我的逻辑伪代码可能有缺陷。如果它是有帮助的,我可以粘贴实际的公式。是的,请给出公式:)
=IF(ISBLANK(B8),“”,IF(B8>C7,IF(B8>B7,IF(SUM(B8*$C$2)>C7,SUM(B8*$C$2),C7),IF(B8真是太棒了!处理了46620行时间(hh:mm:ss.ms)0:00:03.953717确实显示了我的迭代循环是多么低效。非常感谢!我将支票寄往何处?我很高兴这有帮助!如果您将此标记为您问题的正式答案,并给予此一票,以帮助其他可能与您有相同问题的人,将不胜感激。@PythonNoob您可能正在进行索引迭代o这是非常低效的,因为每个索引操作(意味着在整个数据帧上工作)都有很多开销。更糟糕的是,您可能无意中混合了迭代方法和矢量化方法,从而产生了两种最坏的结果。如果确保使用
itertuples
循环,则迭代数据帧时可以获得相当的性能。这将在数据帧行上返回一个迭代器,作为
集合。命名为tuple
对象。您可以n用这些术语实施此解决方案,并继续与您的df合作。我当时正在使用df.iterrows()中的idx行的
,然后尽我所知在我的决策树中穿行。我没有看到也没有考虑过Aur给我的方法。多亏了Aur!Aur,在您共享的链接中,他们“躲在引擎盖下偷看”,提供这些计时的是什么工具?我很想知道我的编码有多糟糕。