PySpark Pivoting, вывод в виде столбца - PullRequest
0 голосов
/ 25 октября 2019

У меня есть PySpark с данными о биржевых торгах в течение одного 24-часового периода. Столбцы включают в себя: ДАТА, ИМЯ ВРЕМЕНИ, VOL, СТОИМОСТЬ. (Опять же, дата несколько избыточна, так как все транзакции произошли в один и тот же день.

Мне нужны следующие столбцы: NAME, DATE, HOUR, VOL, где каждая строка представляет биржевой тикер, такой как AAPL, иVOL представляет количество сделок этой акции в течение этого ЧАСА.

В Excel, я думаю, это было бы легче всего решить, используя сводную таблицу. Что такое эквивалент PySpark?

ВотПример из моего кадра данных, чтобы проиллюстрировать мои данные:

+--------+--------+--------+----+------+
|    DATE|  TIME  |  NAME  |VOL | COST |
+--------+--------+--------+----+------+
|20120103|09:04:08|    AAPL| 500|409.21|
|20120103|09:06:49|    AAPL| 100|409.41|
|20120103|09:21:10|    AAPL| 100|409.49|
|20120103|09:26:28|    AAPL| 100|409.04|
|20120103|09:29:55|    AAPL| 100| 410.3|
|20120103|09:30:00|    AAPL| 200|409.91|
|20120103|09:30:04|    AAPL| 100|410.11|
+--------+--------+--------+----+------+

Следующие шаги привели меня в порядок, но не с желаемыми столбцами.


from pyspark.sql.types import IntegerType
from pyspark.sql.functions import udf

def fix_time(time):
  return time[:2]

udf_myFunction = udf(fix_time)
df1 = df.withColumn("TIME_H", udf_myFunction("TIME")) 

import pyspark.sql.functions as psf
df1.groupBy("NAME").pivot("TIME_H").agg(psf.max("VOL")).show()

>>>>

+--------+---+---+---+---+---+---+---+
|  NAME  | 09| 10| 11| 12| 13| 14| 15|
+--------+---+---+---+---+---+---+---+
|    AAPL|800|437|800|400|808|800|700|
|    GOOG|300|400|527|200|450|300|700|
|     IBM|910|992|800|500|300|500|900|
|    MSFT|900|900|900|900|794|800|800|
+--------+---+---+---+---+---+---+---+

Опять же, мне бы очень хотелосьэта же информация, однако, с колонками: NAME, DATE, HOUR, VOL.

Достаточно ли просто взять то, что у меня есть, и преобразовать его в то, что я хочу, или есть более эффективный способполучить желаемый результат?

1 Ответ

0 голосов
/ 25 октября 2019

IIUC, вы хотите агрегировать все тикеры по часам, чтобы получить общее количество зарегистрированных сделок. Если это так, то ниже может помочь, и это выводится для вашего образца тикера AAPL.

import pyspark.sql.functions as f

df.groupBy('NAME','DATE', df.TIME.substr(1,2).alias('HOUR')).agg(f.sum('VOL').alias('VOL')).show()
+----+--------+----+----+
|NAME|    DATE|HOUR| VOL|
+----+--------+----+----+
|AAPL|20120103|  09|1200|
+----+--------+----+----+

Рад изменить решение, если ваше требование другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...