import%20marimo%0A%0A__generated_with%20%3D%20%220.13.7%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Motivation%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20warnings%0A%0A%20%20%20%20warnings.filterwarnings(%22ignore%22%2C%20category%3DFutureWarning)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20pandas%20as%20pd%0A%0A%20%20%20%20pandas_df%20%3D%20pd.DataFrame(%7B%22value%22%3A%20%5B1%2C%202%2C%203%2C%204%2C%205%5D%7D)%0A%20%20%20%20print(pandas_df%5B%22value%22%5D.mean())%0A%20%20%20%20return%20pandas_df%2C%20pd%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20pyspark.sql%20import%20SparkSession%0A%20%20%20%20from%20pyspark.sql.functions%20import%20avg%0A%0A%20%20%20%20spark%20%3D%20SparkSession.builder.getOrCreate()%0A%0A%20%20%20%20spark_df%20%3D%20spark.createDataFrame(%5B(1%2C)%2C%20(2%2C)%2C%20(3%2C)%2C%20(4%2C)%2C%20(5%2C)%5D%2C%20%5B%22value%22%5D)%0A%20%20%20%20spark_df.select(avg(%22value%22)).show()%0A%20%20%20%20return%20(spark%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Basic%20Operations%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20pyspark.pandas%20as%20ps%0A%0A%20%20%20%20ps_s%20%3D%20ps.Series(%5B1%2C%203%2C%205%2C%206%2C%208%5D)%0A%20%20%20%20return%20(ps%2C)%0A%0A%0A%40app.cell%0Adef%20_(pd)%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20ps_df%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%22id%22%3A%20np.arange(1%2C%201_000_001)%2C%20%22value%22%3A%20np.random.randn(1_000_000)%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(ps_df%2C)%0A%0A%0A%40app.cell%0Adef%20_(pandas_df%2C%20ps)%3A%0A%20%20%20%20ps_df_from_pandas%20%3D%20ps.from_pandas(pandas_df)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Basic%20Operations%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20ps_df.describe()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20%23%20Display%20the%20summary%20of%20the%20DataFrame%0A%20%20%20%20ps_df.info()%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20ps_df.head()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20%23%20Filter%20rows%20and%20drop%20any%20NaN%20values%0A%20%20%20%20filtered_df%20%3D%20ps_df.where(ps_df.value%20%3E%200).dropna()%0A%20%20%20%20filtered_df.head()%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20GroupBy%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps)%3A%0A%20%20%20%20ps_df_2%20%3D%20ps.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%22category%22%3A%20%5B%22A%22%2C%20%22B%22%2C%20%22A%22%2C%20%22C%22%2C%20%22B%22%5D%2C%20%22value%22%3A%20%5B10%2C%2020%2C%2015%2C%2030%2C%2025%5D%7D%0A%20%20%20%20)%0A%20%20%20%20return%20(ps_df_2%2C)%0A%0A%0A%40app.cell%0Adef%20_(ps_df_2)%3A%0A%20%20%20%20ps_df_2.groupby(%22category%22).value.mean()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Plotting%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20ps_df%5B%22value%22%5D.plot.hist()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df_2)%3A%0A%20%20%20%20ps_df_2.plot.bar(x%3D%22category%22%2C%20y%3D%22value%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Reading%20And%20Writing%20Data%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps%2C%20ps_df)%3A%0A%20%20%20%20ps_df.to_csv(%22output_data.csv%22%2C%20index%3DFalse)%0A%20%20%20%20ps.read_csv(%22output_data.csv%22).head()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps%2C%20ps_df)%3A%0A%20%20%20%20ps_df.to_parquet(%22output_data.parquet%22)%0A%20%20%20%20ps.read_parquet(%22output_data.parquet%22).head()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Using%20Pandas%20API%20on%20Spark%20in%20Conjunction%20with%20Regular%20Pandas%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps)%3A%0A%20%20%20%20from%20sklearn.linear_model%20import%20LinearRegression%0A%0A%20%20%20%20%23%20Create%20a%20large%20Pandas%20API%20on%20Spark%20DataFrame%0A%20%20%20%20large_pdf_df%20%3D%20ps.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22feature1%22%3A%20range(1_000_000)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22feature2%22%3A%20range(1_000_000%2C%202_000_000)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22target%22%3A%20range(500_000%2C%201_500_000)%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20print(f%22Length%20of%20the%20original%20DataFrame%3A%20%7Blen(large_pdf_df)%3A%2C%7D%22)%0A%0A%20%20%20%20%23%20Aggregate%20the%20data%20to%20a%20smaller%20size%0A%20%20%20%20aggregated%20%3D%20large_pdf_df.groupby(large_pdf_df.feature1%20%2F%2F%2010000).mean()%0A%20%20%20%20print(f%22Length%20of%20the%20aggregated%20DataFrame%3A%20%7Blen(aggregated)%3A%2C%7D%22)%0A%0A%20%20%20%20%23%20Convert%20to%20pandas%20DataFrame%0A%20%20%20%20small_pdf%20%3D%20aggregated.to_pandas()%0A%0A%20%20%20%20%23%20Train%20a%20scikit-learn%20model%0A%20%20%20%20model%20%3D%20LinearRegression()%0A%20%20%20%20X%20%3D%20small_pdf%5B%5B%22feature1%22%2C%20%22feature2%22%5D%5D%0A%20%20%20%20y%20%3D%20small_pdf%5B%22target%22%5D%0A%20%20%20%20model.fit(X%2C%20y)%0A%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Pandas%20API%20on%20Spark%20Query%20Execution%20Model%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(pandas_df)%3A%0A%20%20%20%20pandas_df%5B%22value%22%5D%20%3D%20pandas_df%5B%22value%22%5D%20%2B%201%20%20%23%20Operation%20executes%20immediately%0A%20%20%20%20print(pandas_df)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ps_df)%3A%0A%20%20%20%20%23%20Using%20Pandas%20API%20on%20Spark%0A%20%20%20%20updated_psdf%20%3D%20ps_df.assign(a%3Dps_df%5B%22value%22%5D%20%2B%201)%20%20%23%20Lazy%20operation%0A%20%20%20%20print(updated_psdf.head())%20%20%23%20Triggers%20actual%20computation%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Pandas%20API%20on%20Spark%20vs%20PySpark%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(spark)%3A%0A%20%20%20%20from%20pyspark.sql.functions%20import%20col%0A%0A%20%20%20%20pyspark_df%20%3D%20spark.createDataFrame(%5B(1%2C%204)%2C%20(2%2C%205)%2C%20(3%2C%206)%5D%2C%20%5B%22col1%22%2C%20%22col2%22%5D)%0A%20%20%20%20pyspark_df.select((col(%22col1%22)%20%2B%20col(%22col2%22)).alias(%22sum%22)).show()%0A%20%20%20%20return%20(col%2C)%0A%0A%0A%40app.cell%0Adef%20_(ps)%3A%0A%20%20%20%20pandas_spark_df%20%3D%20ps.DataFrame(%7B%22col1%22%3A%20%5B1%2C%202%2C%203%5D%2C%20%22col2%22%3A%20%5B4%2C%205%2C%206%5D%7D)%0A%20%20%20%20(pandas_spark_df%5B%22col1%22%5D%20%2B%20pandas_spark_df%5B%22col2%22%5D).head()%0A%20%20%20%20return%20(pandas_spark_df%2C)%0A%0A%0A%40app.cell%0Adef%20_(col%2C%20pandas_spark_df)%3A%0A%20%20%20%20%23%20Convert%20Pandas%20API%20on%20Spark%20DataFrame%20to%20PySpark%20DataFrame%0A%20%20%20%20spark_native_df%20%3D%20pandas_spark_df.to_spark()%0A%0A%20%20%20%20%23%20Now%20you%20can%20use%20full%20PySpark%20functionality%0A%20%20%20%20spark_native_df.select((col(%22col1%22)%20%2B%20col(%22col2%22)).alias(%22sum%22)).show()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
7bbe0b58cb01c7d7f9ab5620c7ba7f186495fcdcd806742c466794fcad98e089