Pyspark:显示数据框列的直方图

mepcadol  于 2023-08-02  发布在  Spark
关注(0)|答案(7)|浏览(153)

在pandas数据框架中,我使用以下代码绘制列的直方图:

my_df.hist(column = 'field_1')

字符串
pyspark Dataframe 中有没有什么东西可以达到同样的目标?(我在Jupyter Notebook)谢谢!

bqjvbblv

bqjvbblv1#

不幸的是,我不认为PySpark Dataframes API中有一个干净的plot()hist()函数,但我希望事情最终会朝着这个方向发展。
目前,您可以在Spark中计算直方图,并将计算出的直方图绘制为条形图。示例如下:

import pandas as pd
import pyspark.sql as sparksql

# Let's use UCLA's college admission dataset
file_name = "https://stats.idre.ucla.edu/stat/data/binary.csv"

# Creating a pandas dataframe from Sample Data
df_pd = pd.read_csv(file_name)

sql_context = sparksql.SQLcontext(sc)

# Creating a Spark DataFrame from a pandas dataframe
df_spark = sql_context.createDataFrame(df_pd)

df_spark.show(5)

字符串
这是数据的样子:

Out[]:    +-----+---+----+----+
          |admit|gre| gpa|rank|
          +-----+---+----+----+
          |    0|380|3.61|   3|
          |    1|660|3.67|   3|
          |    1|800| 4.0|   1|
          |    1|640|3.19|   4|
          |    0|520|2.93|   4|
          +-----+---+----+----+
          only showing top 5 rows

# This is what we want
df_pandas.hist('gre');


Histogram when plotted in using df_pandas.hist()

# Doing the heavy lifting in Spark. We could leverage the `histogram` function from the RDD api

gre_histogram = df_spark.select('gre').rdd.flatMap(lambda x: x).histogram(11)

# Loading the Computed Histogram into a Pandas Dataframe for plotting
pd.DataFrame(
    list(zip(*gre_histogram)), 
    columns=['bin', 'frequency']
).set_index(
    'bin'
).plot(kind='bar');


Histogram computed by using RDD.histogram()

bnl4lu3b

bnl4lu3b2#

现在,您可以使用pyspark_dist_explore包来利用Spark DataFrames的matplotlib hist函数:

from pyspark_dist_explore import hist
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
hist(ax, my_df.select('field_1'), bins = 20, color=['red'])

字符串
此库使用rdd直方图函数来计算bin值。

sg3maiej

sg3maiej3#

另一种解决方案,不需要额外的进口,这也应该是有效的;首先,使用窗口分区:

import pyspark.sql.functions as F
import pyspark.sql as SQL
win = SQL.Window.partitionBy('column_of_values')

字符串
然后你需要它来使用 count 由窗口分区的聚合:
第一个月
聚合运算符发生在集群的每个分区上,并且不需要到主机的额外往返。

edqdpe6u

edqdpe6u4#

RDDs的histogram方法返回bin范围和bin计数。这里有一个函数,它接受这个直方图数据并将其绘制成直方图。

import numpy as np
import matplotlib.pyplot as mplt
import matplotlib.ticker as mtick

def plotHistogramData(data):
    binSides, binCounts = data

    N = len(binCounts)
    ind = np.arange(N)
    width = 1

    fig, ax = mplt.subplots()
    rects1 = ax.bar(ind+0.5, binCounts, width, color='b')

    ax.set_ylabel('Frequencies')
    ax.set_title('Histogram')
    ax.set_xticks(np.arange(N+1))
    ax.set_xticklabels(binSides)
    ax.xaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e'))
    ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e'))

    mplt.show()

字符串
(This代码假定bin具有相等的长度。)

jslywgbw

jslywgbw5#

这段代码简单地产生一个新的列,将数据划分为相等大小的仓,然后按该列对数据进行分组。这可以被绘制为条形图以查看直方图。

bins = 10
df.withColumn("factor", F.expr("round(field_1/bins)*bins")).groupBy("factor").count()

字符串

yptwkmov

yptwkmov6#

这很简单,效果很好。

df.groupby(
  '<group-index>'
).count().select(
  'count'
).rdd.flatMap(
  lambda x: x
).histogram(20)

字符串

piztneat

piztneat7#

这是我的方法:

import pyspark.sql.functions as f

def plotHist(df, variable, minValue, maxValue, bins = 10):
  factor = bins / (maxValue - minValue + 1)
  (
    df.withColumn('cappedValue', f.least(f.lit(maxValue), f.greatest(f.lit(minValue), variable)))
    .withColumn('buckets', f.round(((f.col('cappedValue')) - minValue)*factor)/factor + minValue)
    .groupBy('buckets').count().display()
  )

字符串
有没有人知道一个更优雅的方法来上限和下限的变量?

相关问题