Dataframe 根据PySpark数据帧的条件,在重复的N行中添加整数
我提供了以下数据框,其中包含日期、股票和每个股票的一些特征的面板数据Dataframe 根据PySpark数据帧的条件,在重复的N行中添加整数,dataframe,apache-spark,pyspark,apache-spark-sql,pyspark-dataframes,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Dataframes,我提供了以下数据框,其中包含日期、股票和每个股票的一些特征的面板数据 +----------+------+-------------------+--------------------+ | _c0|symbol| stockPrice| roic| +----------+------+-------------------+--------------------+ |2000-12-01| MTB|
+----------+------+-------------------+--------------------+
| _c0|symbol| stockPrice| roic|
+----------+------+-------------------+--------------------+
|2000-12-01| MTB| 0.0| 0.0|
|2000-12-01| XEL| 0.5599999999999987| 0.03831091180429823|
|2001-03-01| ADBE|-1.8799999999999968| 0.16664239102772385|
|2001-03-01| ALL| 3.020000000000003|0.015843499622776227|
|2001-03-01| XEL| 5.199999999999998| 0.01718300080156956|
|2001-03-01| BMY| -6.020000000000002| 0.1386651323360184|
|2001-03-01| CAT| 2.9000000000000017|-0.01871476386801...|
|2001-03-01| MRK| -5.030000000000001| 0.09202762084118016|
|2001-03-01| MTB| 21.55| 0.4299814503261493|
|2001-03-01| PVH| 2.1500000000000004|-0.08486335480927014|
|2001-03-01| BBY| 4.75| 0.27611001898177634|
|2001-06-01| ADBE| 17.610000000000007|-0.02235471561675301|
|2001-06-01| BMY| 0.0| 0.1386651323360184|
|2001-06-01| ALK| 7.65| 0.03139856533358338|
|2001-06-01| CAT| 1.6799999999999995|0.002447684500232757|
|2001-06-01| HUM| 0.25|-0.05092018990508895|
|2001-06-01| ALL| -7.170000000000003|-0.01125850244811...|
|2001-06-01| EXPD| 2.74| 0.09279634515913428|
|2001-06-01| IDXX| -0.92| 0.09939743655211153|
|2001-06-01| BBY| 13.420000000000002|-0.21821519283350074|
+----------+------+-------------------+--------------------+
我想创建一个新的PySpark数据帧,其中包含如下定义的信号:如果在2000-12-01中,XEL的股价>0,那么用1填充股票XEL的下N天,如果为负,则用-1填充,我希望它们是相加的(如果下一个交易日的价格为正,我希望在下N天添加信号1)。我想对所有列都这样做
如何使用PySpark数据帧实现这样的结果,而无需迭代行
输出示例如下所示:
+----------+------+-------------------+--------------------+
| _c0|symbol| stockPrice| roic|
+----------+------+-------------------+--------------------+
|2000-12-01| MTB| 0.0| 0.0|
|2000-12-01| XEL| 1| 1|
|2001-03-01| ADBE| -1| 1|
|2001-03-01| ALL| 1| 1|
|2001-03-01| XEL| 2| 2|
|2001-03-01| BMY| -1| 1|
|2001-03-01| CAT| 1| -1|
|2001-03-01| MRK| -1| 1|
|2001-03-01| MTB| 1| 1|
|2001-03-01| PVH| 1| -1|
|2001-03-01| BBY| 1| 1|
+----------+------+-------------------+--------------------+
您可以在前面行的符号上求和:
from pyspark.sql import functions as F, Window
w = Window.partitionBy('symbol').orderBy('_c0')
result = df.select(
'_c0',
'symbol',
F.sum(F.signum('stockPrice')).over(w).alias('stockPrice'),
F.sum(F.signum('roic')).over(w).alias('roic')
).orderBy('_c0', 'symbol')
result.show()
+----------+------+----------+----+
| _c0|symbol|stockPrice|roic|
+----------+------+----------+----+
|2000-12-01| MTB| 0.0| 0.0|
|2000-12-01| XEL| 1.0| 1.0|
|2001-03-01| ADBE| -1.0| 1.0|
|2001-03-01| ALL| 1.0| 1.0|
|2001-03-01| BBY| 1.0| 1.0|
|2001-03-01| BMY| -1.0| 1.0|
|2001-03-01| CAT| 1.0|-1.0|
|2001-03-01| MRK| -1.0| 1.0|
|2001-03-01| MTB| 1.0| 1.0|
|2001-03-01| PVH| 1.0|-1.0|
|2001-03-01| XEL| 2.0| 2.0|
|2001-06-01| ADBE| 0.0| 0.0|
|2001-06-01| ALK| 1.0| 1.0|
|2001-06-01| ALL| 0.0| 0.0|
|2001-06-01| BBY| 2.0| 0.0|
|2001-06-01| BMY| -1.0| 2.0|
|2001-06-01| CAT| 2.0| 0.0|
|2001-06-01| EXPD| 1.0| 1.0|
|2001-06-01| HUM| 1.0|-1.0|
|2001-06-01| IDXX| -1.0| 1.0|
+----------+------+----------+----+
是否可以在接下来的N天内添加信号?例如,设置N=60,信号(+1或-1)仅在特定股票的下60个日期添加。是的,如果日期连续,您可以指定
w=Window.partitionBy('symbol')。orderBy('u c0')。rowsBetween(-N,0)
。如果日期不是连续的,则需要一个介于(-N,0)
之间的窗口,并将day列转换为daydiff相对于最早日期的列。