Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Azure Databricks中范围内的按值分组_Python_Azure_Databricks_Azure Databricks - Fatal编程技术网

Python Azure Databricks中范围内的按值分组

Python Azure Databricks中范围内的按值分组,python,azure,databricks,azure-databricks,Python,Azure,Databricks,Azure Databricks,考虑以下数据: EventDate,Value 1.1.2019,11 1.2.2019,5 1.3.2019,6 1.4.2019,-15 1.5.2019,-20 1.6.2019,-30 1.7.2019,12 1.8.2019,20 当这些值在阈值范围内时,我要创建组: 1. > 10 2. <=10 >=-10 3. >-10 我相信答案在window函数中,但我对databricks还相当陌生,我还不知道如何使用它 这里是一个基于循环数据帧作为列表的

考虑以下数据:

EventDate,Value
1.1.2019,11
1.2.2019,5
1.3.2019,6
1.4.2019,-15
1.5.2019,-20
1.6.2019,-30
1.7.2019,12
1.8.2019,20
当这些值在阈值范围内时,我要创建组:

 1. > 10
 2. <=10 >=-10
 3. >-10
我相信答案在window函数中,但我对databricks还相当陌生,我还不知道如何使用它

这里是一个基于循环数据帧作为列表的工作(python)解决方案,但是为了提高性能,我更喜欢直接在数据帧上工作的解决方案

from pyspark.sql.functions import *
import pandas as pd
STATETHRESHOLDCHARGE = 10
list = [{"eventDateTime":x["EventDate"], "value":x["Value"]} for x in dataframe.sort(dfArrayOneCast.EventDate).rdd.collect()]
cycles = []
previous = None
for row in list:
  currentState = 'charge'
  if row["value"] < STATETHRESHOLDCHARGE and row["value"] > (STATETHRESHOLDCHARGE * -1):
    currentState = 'idle'
  if row["value"] <= (STATETHRESHOLDCHARGE * -1):
    currentState = 'discharge'

  eventDateTime = row["eventDateTime"]
  if previous is None or previous["state"] != currentState:
    previous = {"start":row["eventDateTime"], "end":row["eventDateTime"], "values":[row["value"]], "timestamps":[row["eventDateTime"]], "state":currentState}
    cycles.append(previous)
  else:
    previous["end"] = row["eventDateTime"]
    previous["values"].append(row["value"])
    previous["timestamps"].append(row["eventDateTime"])

display(cycles)
从pyspark.sql.functions导入*
作为pd进口熊猫
StateSThresholdCharge=10
在dataframe.sort(dfArrayOneCast.EventDate).rdd.collect()中,x的列表=[{“eventDateTime”:x[“EventDate”],“value”:x[“value”]}
周期=[]
先前=无
对于列表中的行:
当前状态='充电'
如果第[“值”](StateSthresholdCharge*-1)行:
当前状态='空闲'

如果第[“value”]行我创建了一个csv文件,用于在Python中使用Pandas测试示例代码,
test.csv
文件的内容如下所示

A,B
1.1.2019,11
1.2.2019,5
1.3.2019,6
1.4.2019,-15
1.5.2019,-20
1.6.2019,-30
1.7.2019,12
1.8.2019,20
    Your defined groups        |   The equivalent groups
 1. > 10       : (10,inf]      | >10       :  (10, inf]
 2. <=10 >=-10 : [-10,10]      | <=10 >-11 :  (-11,10]
 3. <-10       : (-inf,-10)    | <=-11     :  (-inf, -11]
               min_A     max_A               Bs
<-10        1.4.2019  1.6.2019  [-15, -20, -30]
>=-10 <=10  1.2.2019  1.3.2019           [5, 6]
>10         1.1.2019  1.8.2019     [11, 12, 20]
由于存在一个限制,无法使用不同的
关闭的
值来构建,例如
两者
两者都不
,因此我将您定义的具有阈值的组转换为具有
关闭的等效组,如下所示

A,B
1.1.2019,11
1.2.2019,5
1.3.2019,6
1.4.2019,-15
1.5.2019,-20
1.6.2019,-30
1.7.2019,12
1.8.2019,20
    Your defined groups        |   The equivalent groups
 1. > 10       : (10,inf]      | >10       :  (10, inf]
 2. <=10 >=-10 : [-10,10]      | <=10 >-11 :  (-11,10]
 3. <-10       : (-inf,-10)    | <=-11     :  (-inf, -11]
               min_A     max_A               Bs
<-10        1.4.2019  1.6.2019  [-15, -20, -30]
>=-10 <=10  1.2.2019  1.3.2019           [5, 6]
>10         1.1.2019  1.8.2019     [11, 12, 20]
您定义的组|等效组
1. > 10:(10,inf)|>10:(10,inf]
2. =-10 : [-10,10]      | -11 :  (-11,10]

3.假设您在df数据框中有上述数据,让我们一块一块地看一下

from pyspark.sql.functions import col, last, lag, udf, when, collect_list
from pyspark.sql.types import StringType
value = 'value'
date = 'EventDate'
valueBag = 'valueBag'

def bagTransform(v):
  if v > 10:
    return 'charging'
  elif v < -10:
    return 'discharging'
  else:
    return 'idle'

bagTransformUDF = udf(bagTransform, StringType())  

withBaggedValue = df.withColumn(valueBag, bagTransformUDF(col(value)))
现在有趣的部分开始了:我们检测更改点,并临时将当前事件日期或空值指定给它们:

withInitialBeginnings = withLag.withColumn(bagBeginning, when((col(prevValueBag) != col(valueBag)) | col(prevValueBag).isNull(), col(date)).otherwise(None))
并使用最后找到的值填充它们

withFilledBeginnings = (withInitialBeginnings.withColumn(bagBeginning, 
                 last(col(bagBeginning), ignorenulls=True)
                 .over(windowSpec)))
display(withFilledBeginnings)
有了这个集合,我们可以简单地在起点上进行聚合

aggregate = withFilledBeginnings.groupby(col(bagBeginning)).agg(collect_list(value))

display(aggregate)


如果您还需要结束日期,您可以使用
pyspark.sql.functions.lead
进行类似的预处理,它与
last
对称,但向前运行。

您是否可以发布您迄今为止尝试过的内容以及如何存储数据,或者您是否可以使用上面的数据集提供至少一个易于复制的设置n只需粘贴到笔记本并运行?它已关闭,但此解决方案的问题是我希望垃圾箱“关闭”一旦值进入新状态。如果-10为“负”-10到10为“中性”,10+为正。我需要能够得到一个容器列表,如负、中性、负、中性、正。这意味着在容器列表中,首先需要一个>10组,然后是=-10组。如果有意义,我现在已经解决了正在迭代列表,因此我将尽快发布此解决方案,但如果可能,我更喜欢数据帧解决方案。@ruffen
result
是熊猫数据帧。如果您更喜欢pyspark数据帧,只需通过
spark\u df=spark.createDataFrame(result)转换即可
。这的确是一个奇迹,性能也有了很大的提高。我还有一个要计算的周期阈值,我可以过滤掉超出该阈值的周期,现在我只能使用相邻的周期(如果充电周期之间有较短的空闲周期,我想合并这些周期)。如果行与前一行相同,是否有一种简单的方法可以合并行?我不确定我是否正确理解您的意思-您可以做一个示例数据和预期结果吗?通常,您可以对来自lead/last的数据进行大量处理,并进一步进行聚合或筛选。我将尝试尽快共享结果,但基本上逻辑是,如果end-start