我的原始数据以表格格式显示.它包含来自不同变量的观察.每次观察时都有变量名,时间戳和当时的值.
变量[string],Time [datetime],Value [float]
数据作为Parquet存储在HDFS中并加载到Spark Dataframe(df)中.从该数据帧.
现在我想为每个变量计算默认统计数据,如均值,标准差等.之后,一旦检索到Mean,我想过滤/计算那些紧邻Mean的变量值.
因此,我需要先得到每个变量的均值.这就是我使用GroupBy获取每个变量(不是整个数据集)的统计信息的原因.
df_stats = df.groupBy(df.Variable).agg( \
count(df.Variable).alias("count"), \
mean(df.Value).alias("mean"), \
stddev(df.Value).alias("std_deviation"))
Run Code Online (Sandbox Code Playgroud)
通过每个变量的均值,我可以过滤那些围绕均值的特定变量的值(只是计数).因此,我需要该变量的所有观察值(值).这些值位于原始数据帧df中,而不是聚合/分组数据帧df_stats中.
最后,我想要一个像聚合/分组df_stats这样的数据帧,并使用新列"count_around_mean".
我在考虑使用df_stats.map(...)或df_stats.join(df,df.Variable).但我被困在红色箭头上:(
问题:你怎么会意识到这一点?
临时解决方案:同时我正在使用基于您的想法的解决方案.但是stddev范围2和3的范围函数不起作用.它总是产生一个
AttributeError表示NullType没有_jvm
from pyspark.sql.window import Window
from pyspark.sql.functions import *
from pyspark.sql.types import *
w1 = Window().partitionBy("Variable")
w2 = Window.partitionBy("Variable").orderBy("Time")
def stddev_pop_w(col, w):
#Built-in stddev doesn't support windowing
return sqrt(avg(col * col).over(w) - pow(avg(col).over(w), 2))
def isInRange(value, mean, stddev, radius):
try:
if (abs(value - mean) < radius * stddev): …Run Code Online (Sandbox Code Playgroud)