0
votes

Générez des statistiques cumulatives par paire de lignes de Dataframe

J'ai une table avec 3 colonnes: une date, une carte d'identité et une clé. J'espère trouver un moyen efficace de résumer les instances paire-sage des touches dans un identifiant, puis combinez-vous avec des totaux entre autres ID. Essentiellement construire une liste de transitions temporelles. Par exemple:

entrée: xxx

sortie: xxx

IT serait trivialement simple à commander par ID , puis la date à travers et construire des comptes, mais j'espérais que l'un de vous que l'un de vous GURUS pourrait être capable de me résoudre à être plus parallélélisé / efficace.

Fondamentalement, depuis la commande par date, je J'essaie de capturer le nombre de transitions dans le temps entre les clés. Donc, pour id = a, nous avons xy, alors nous avons gt (donc incrément xy-> gt par 1). Ensuite, nous avons suivi de nous (donc incrément gt-> po avant 1).

Travailler sur Scala / Python.


2 commentaires

Pourquoi n'avez-vous besoin que 3 des 6 combinaisons possibles pour id = a?


@Vamsiprabhala je ne suis pas sûr de comprendre? J'aurais probablement pu mieux former. Fondamentalement, depuis ordonné par date, j'essaie de capturer le nombre de transitions à temps entre les clés. Donc, pour id = a, nous avons xy, alors nous avons gt (donc incrément xy-> gt par 1). Ensuite, nous avons suivi par nous (donc incrément gt-> po avant 1). Est-ce que cela clarifie?


3 Réponses :


0
votes

Voici une solution potentielle nécessitant seulement 3 lignes:

df['key_lag'] = df.Key.shift(-1)
df['key_pairs'] = df.Key + ' ' + df.key_lag
print(df.groupby('key_pairs').size())


key_pairs
GT WE    1
PO XY    1
WE PO    1
XY GT    2
dtype: int64


2 commentaires

Cette boucle semble être exactement ce que je pensais comme la solution "simple". Malheureusement, je pense que je ne serais pas vraiment parallèle dans un sens significatif, non?


Vous avez raison. Cependant, je pensais juste à un moyen de le faire. Je vais éditer ma réponse momentanément.



2
votes

Voici une solution dans Scala à l'aide de Lag (Clé, 1) Code> Pour associer les touches précédentes / actuelles pour le nombre de paires de clé:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
import spark.implicits._

val df = Seq(
  ("1/1/2018", "A", "XY"),
  ("1/2/2018", "A", "GT"),
  ("1/6/2018", "A", "WE"),
  ("1/9/2018", "A", "PO"),
  ("1/2/2018", "B", "XY"),
  ("1/4/2018", "B", "GT")
).toDF("Date", "ID", "Key")

val win = Window.partitionBy("ID").orderBy("Date", "Key")

df.
  withColumn("Date", to_date($"Date", "M/d/yyyy")).
  withColumn("FirstKey", lag($"Key", 1).over(win)).
  groupBy($"FirstKey", $"Key".as("SecondKey")).agg(count("*").as("Count")).
  where($"firstKey".isNotNull).
  show
// +--------+---------+-----+
// |FirstKey|SecondKey|Count|
// +--------+---------+-----+
// |      WE|       PO|    1|
// |      GT|       WE|    1|
// |      XY|       GT|    2|
// +--------+---------+-----+


0 commentaires

0
votes

Vous pouvez ajouter une nouvelle colonne indiquant la touche suivante pour chaque ID commandé par Date en utilisant pyspark.sql.function.lead . Ensuite, groupe par le premier et secondse et compte : xxx

Ceci suppose que la date Colonne est un DateType de sorte qu'il puisse être commandé de manière appropriée. Si c'est une chaîne, vous devrez le convertir en une date ou La commande se produira lexicographiquement.


0 commentaires