使用PySpark基于年龄生成子样本

yxyvkwin  于 2023-02-03  发布在  Spark
关注(0)|答案(1)|浏览(149)

我想根据存在时间收集样本,并在“失败”状态中设置一个条件。我对存在3天的序列号感兴趣。但是,我不需要存在时间少于3天的正常序列号,但我想包括存在时间少于3天或正好存在时间为3天的所有失败序列号。例如,C在1月3日失败。因此,我需要将序列号C的1月1日和2日包含在新样本中。序列号D在1月4日失败,因此我需要序列号D的1月3日、2日和1日数据。对于序列号A和B,我需要序列号D的5日、4日和5日数据。和1月3日的数据,共3天。我没有E和F,因为它们比3天的健康观察结果更年轻。总之,我需要实际失效前3天的失效样本和最近3天的健康观察结果。

url="https://gist.githubusercontent.com/JishanAhmed2019/6625009b71ade22493c256e77e1fdaf3/raw/8b51625b76a06f7d5c76b81a116ded8f9f790820/FailureSample.csv"
from pyspark import SparkFiles
spark.sparkContext.addFile(url)
df=spark.read.csv(SparkFiles.get("FailureSample.csv"), header=True,sep='\t')

当前格式:

预期样品:

xbp102n0

xbp102n01#

对我来说,描述有点棘手,我不确定我是否理解正确
我试着用窗口函数来做,我能够得到类似的结果,但我不确定这段代码是否足够好

import pyspark.sql.functions as F
from pyspark.sql import Window

spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")

inputDf = spark.read.csv(
    "dbfs:/FileStore/shared_uploads/****.com/Observations_stackoverflow.txt",
    header=True,
    sep="\t",
).withColumn("date", F.to_date("date", "MM/dd/yyyy"))

window = Window.partitionBy("serial_number")
aggregatedDf = (
    inputDf.withColumn("max_date", F.max("date").over(window))
    .withColumn("min_date", F.min(F.col("date")).over(window))
    .withColumn("withFailure", F.max(F.col("Failure")).over(window))
)

# If failure get up to 4 last records (failure + 3 older records)
# If success skip codes with entries for less than 3 days and get up to 3 records
filteredDf = aggregatedDf.filter(
    ((F.col("withFailure") == "1") & (F.datediff(F.col("max_date"), F.col("date")) < 4))
    | (
        (F.col("withFailure") == "0")
        & (F.datediff(F.col("max_date"), F.col("min_date")) > 3)
        & (F.datediff(F.col("max_date"), F.col("date")) < 3)
    )
)

filteredDf.drop("max_date", "min_date", "withFailure").show()

输出为:

+----------+-------------+---------+---------+-------+
|      date|serial_number|Feature 1|Feature 2|Failure|
+----------+-------------+---------+---------+-------+
|2022-01-03|            A|      171|       76|      0|
|2022-01-04|            A|      241|      100|      0|
|2022-01-05|            A|      311|      124|      0|
|2022-01-03|            B|      188|       82|      0|
|2022-01-04|            B|      258|      106|      0|
|2022-01-05|            B|      328|      130|      0|
|2022-01-01|            C|       83|       10|      0|
|2022-01-02|            C|      136|       64|      0|
|2022-01-03|            C|      223|       94|      1|
|2022-01-01|            D|       80|       47|      0|
|2022-01-02|            D|      153|       70|      0|
|2022-01-03|            D|      206|       88|      0|
|2022-01-04|            D|      293|      118|      1|
+----------+-------------+---------+---------+-------+

在输出中,只有顺序不同,记录与示例输出中的记录相同

相关问题