<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Streaming de données Twitter dans une table de données JMP
Faites défiler jusqu'à la fin si vous voulez juste la vidéo.
J'ai effectué quelques tests minimes de ce JSL sur Mac et Win, dans JMP 11 et 12.La vidéo tire parti des fonctionnalités d'une future version de JMP, mais ne vous laissez pas arrêter.Ajoutez ici un commentaire sur votre expérience.Le JSL se trouve dans le fichier ZIP ci-joint.
Cet article aborde, à la légère, un tas de sujets.
- Compte Twitter
- données en continu
- manipulation de bits
- JSON
- Autorisation OAuth, signature
- boucle
- coordonnées de la carte
Présentation : décompressez le JSL dans un répertoire.Créez une application Twitter, copiez les clés dans un fichier JSL.(Windows) obtenez une copie de cURL et remplissez le chemin dans MAIN.jsl.Exécutez le fichier MAIN.jsl.
Commencer
Vous aurez besoin d'un compte Twitter et vous devrez lire et comprendre les conditions d'utilisation de Twitter avant de commencer.(Les données que vous collectez dans un flux ne vous appartiennent pas et sont soumises à des restrictions sur la manière dont vous pouvez les utiliser.Je ne vous donnerai pas de conseils sur ce qui va ou non.)
À l'aide de votre compte Twitter, utilisez https://apps.twitter.com/ pour créer une nouvelle application.Ce n'est PAS une application comme celle d'un téléphone portable.Il s'agit d'un ensemble de clés qui permettent à un programme d'accéder au flux Twitter.Ce programme peut être une application sur un téléphone portable, ou il peut s'agir de JSL, ou d'un programme Python comme http://www.tweepy.org/ fournit.(J'ai commencé avec tweepy, puis j'ai suivi le chemin JSL.Tweepy ou une autre solution basée sur Python pourrait être meilleure que cette solution JSL.)
Cliquez sur Nouveau pour créer une nouvelle application, inventez un nom que personne d'autre n'a utilisé, ajoutez une description, remplissez le nom de votre site Web et laissez l'URL de rappel vide.Vous devez fournir un nom de site Web, mais, comme cela le suggère, vous pouvez utiliser un espace réservé.Lisez l'accord, puis cliquez sur Créer une application Twitter.

Vous avez atterri sur un écran avec des onglets ; le troisième onglet, Clés et jetons d'accès, est celui que vous souhaitez.

En haut, vous trouverez une partie de ce dont vous avez besoin, la clé du consommateur et le secret du consommateur.Vous aurez besoin de la clé du consommateur et du secret.Allez-y et démarrez votre projet JMP ; il y aura plusieurs fichiers, alors créez un répertoire, décompressez les fichiers JSL, éditez EncryptedKeys.JSL et commencez à le remplir :
// utilise apps.twitter.com pour créer une nouvelle application.Copiez les clés ici.
consumerKey = "Pnb…LAZ";
consommateurSecret = "AF4C…………………………qNvXp" ;
Cliquez sur le bouton Créer mon jeton d'accès en bas pour obtenir les deux dernières valeurs.

Copiez-les... Le jeton d'accès est sur une seule ligne avec un trait d'union...
accessToken = "3…………………………-………………………………………………am";
accessTokenSecret = "rc………………………HJ";
EncryptedKeys.JSL comporte cinq lignes, y compris le commentaire.Il sera inclus par un autre fichier ; la sécurité de l'ordinateur sur lequel vous stockez EncryptedKeys.JSL est quelque chose que vous devriez considérer.Deux des clés sont considérées comme publiques, mais deux sont des secrets que vous seul devriez connaître.Personne d’autre n’a besoin des clés publiques, ils peuvent donc tous rester au même endroit.
Visite https://apps.twitter.com/ et assurez-vous que l'application existe, vous pourrez ensuite vous déconnecter de Twitter.
Diffusion sur Twitter
Twitter propose d'autres façons d'utiliser son service https://dev.twitter.com/ qui permettent de récupérer des tweets spécifiques et de créer de nouveaux tweets, mais le streaming consiste à collecter des tweets en temps réel à l'aide d'un filtre.Le filtre que Twitter peut appliquer est conçu pour être efficace pour leurs ordinateurs et peut ne pas faire exactement ce que vous voulez (rappelez-vous combien vous leur payez).Les requêtes les plus intéressantes concernent les mots-clés et les zones géographiques ; le résultat sera l'union (et non l'intersection) de tous les termes de recherche.L'exemple de vidéo utilisait « petit-déjeuner », « déjeuner » et « dîner » sans cadre de délimitation géographique.Dans le monde entier, cela récupérait environ 3 tweets par seconde.Il n'est pas possible de limiter la recherche à Londres avec un cadre de délimitation autour de Londres ; qui tentera de renvoyer tous les tweets de Londres, ainsi que le petit-déjeuner, le déjeuner et le dîner du monde entier.Je ne sais toujours pas exactement quelle quantité de données Twitter diffusera ; à un moment donné, je pensais que Twitter ralentirait, et à un autre moment, je pensais que Twitter arrêterait le flux si je ne parvenais pas à traiter les données assez rapidement.Peut-être que les deux sont vrais.Dans une expérience précédente, j'ai sélectionné « Raleigh » et mis un cadre de délimitation autour de Raleigh, Caroline du Nord.J'ai reçu des tweets sur des vélos Raleigh volés dans le monde entier.
Prudence
Vous devrez effectuer votre propre filtrage post-capture et vous souhaiterez peut-être créer votre propre liste de mots que vous n'aimez pas.Si vous présentez en public une liste de tweets non censurés, vous serez gêné, voire pire.N'oubliez pas non plus que Twitter a des règles sur la manière dont vous pouvez présenter les données.
Sélection géographique
Cet extrait de JSL sélectionne les termes de requête et les emplacements géographiques.Parce que le code devenait compliqué, j'ai commencé à utiliser des espaces de noms :
include("PICK.jsl");
PICK:trackParm = "déjeuner, dîner, petit-déjeuner"; // requête par défaut
CHOISIR:choisir(); // GUI pour ajuster la requête

Le bouton Ajouter un rectangle a ajouté deux rectangles.Les valeurs de l'espace de noms PICK seront utilisées ultérieurement pour créer la requête Twitter.Il existe une petite quantité de capacité « et » ; déjeuner, dîner, petit-déjeuner pourrait être utilisé pour sélectionner des tweets contenant à la fois « manger » et un repas.Mais la plupart du temps, tout est ORed (union).
Plus comprend
include("JSON.jsl"); // sous-ensemble de la bibliothèque JSON de Xan pour analyser un tweet
include("BITS.jsl"); // code pour la manipulation des bits
include("AUTH.jsl"); // code pour oauth
include("SIGN.jsl"); // code pour signer
include("PARM.jsl"); // code pour construire le paramètre http pour curl
Cela inclut le chargement d'un tas de JSL et la réalisation de petites vérifications d'intégrité et d'auto-tests.BITS prend une minute pour initialiser certaines structures de données afin de créer un code plus rapide plus tard, soyez patient pendant que le +++ s'imprime dans la fenêtre du journal.JSON est extrait de le travail que Xan a fait plus tôt ; le flux Twitter est envoyé au format JSON.AUTH et SIGN contiennent du JSL qui utilise les EncryptedKeys pour s'authentifier (« connexion ») sur Twitter.C'est compliqué et utilise un programme externe déjà installé sur votre ordinateur pour effectuer le hachage SHA1.Quand j'ai écrit les fonctions binaires, je pensais que je devrais implémenter le hachage SHA1, mais c'est aussi compliqué, et je suis heureux d'en utiliser un qui n'a pas besoin d'être débogué.La dernière inclusion, PARM, construit une chaîne pour cURL.
boucle
Vous aurez besoin d'une copie de cURL.Il existe déjà sur MAC.Les utilisateurs de Windows peuvent l'obtenir http://curl.haxx.se/ après avoir vérifié d'abord auprès des personnes chargées de vos systèmes.https://en.wikipedia.org/wiki/CURL est un point de départ pour vos questions cURL.j'ai téléchargé Win64 x86_64 CAB .(votre ordinateur est I386, pas IA64). Faites glisser et déposez curl.exe sur le bureau et assurez-vous que JMP sait où le trouver (RunProgram ne développera pas $DESKTOP, remplissez la réponse complète !) :
cURLlocation="C:\Utilisateurs\Utilisateur\Desktop\curl.exe";
cURL est un utilitaire de ligne de commande auquel JMP peut accéder via la fonction RunProgram.Le programme cURL établira la connexion à Twitter et renverra le flux de tweets à JMP.
RunProgram (exécutable (cURLlocation), options (cURLparms),
readFunction(Fonction( {this},
buftxt ||= this << read( blob );
processus();
Si( ceci << isReadEOF,
Écrire( Droite( Char( buftxt ), 100 ) ) );))
Les fonctions cURLparms et process() (utilisées ci-dessus) sont tout ce qui reste à expliquer.
cURLparms vient de PARM:curlParm( PICK:trackParm, PICK:locationParm ); qui utilise PICK (bien ci-dessus) pour déterminer quels termes suivre et quels emplacements suivre.La fonction curlParm dans l'espace de noms PARM utilise les variables consumerKey...applicationTokenSecret (bien ci-dessus) pour effectuer la signature/autorisation pour les termes et emplacements spécifiques.
La fonction de processus prend les données de buftxt et les place dans une table de données.
Courir
Fait!Placez les fichiers joints dans le même répertoire que EncryptedKeys.JSL, ouvrez le main.jsl et exécutez-le.La boîte de dialogue s'ouvrira ; (appuyez simplement sur OK la première fois... pour utiliser la recherche qui fait apparaître les points de la carte...) définissez quelques termes de recherche, ou un petit emplacement, ou peut-être les deux.
À la fin du JSL, vous verrez une boucle qui redémarre le RunProgram lorsqu'il s'arrête de manière inattendue.Il est retardé de 60 secondes pour éviter d'abuser du site Twitter en cas de problème dans le script.Les connexions Internet peuvent rester actives pendant des jours ou échouer plusieurs fois par heure.Il est également possible que Twitter interrompe la connexion pour diverses raisons.La boucle for est également limitée à un petit nombre de redémarrages.
Les scripts sont à peine testés ; demandez si ça ne marche pas, merci !
Le deuxième tableau de données et la carte dépendent des valeurs par défaut du petit-déjeuner/déjeuner/dîner dans la boîte de dialogue d'ouverture.Il existe du JSL codé en dur qui recherche les tweets du petit-déjeuner/déjeuner/dîner.Vous pouvez le retravailler ou le découper complètement.
Le bouton STOP en bas de la carte amènera (probablement) le script à un arrêt gracieux.J'ai corrigé un bug qui pouvait empêcher JMP sur MAC de s'arrêter correctement pour une version future ; vous devrez peut-être forcer la fermeture dans JMP 11 ou 12.
Présentation (réaliser une vidéo à partir du tableau de données)
Après avoir capturé les tweets du petit-déjeuner/déjeuner/dîner pendant un certain temps, vous disposez de suffisamment de données pour créer une vidéo.Utiliser les idées de plusieurs articles récents…Faute d’une meilleure norme de codage couleur, utilisez le vert pour commencer la journée, le rouge pour arrêter la journée et le bleu pour l’heure du déjeuner.Sous-ensemblez les lignes pour conserver uniquement celles contenant des données de localisation.J'ai utilisé une formule pour créer des colonnes xLon et yLat à partir des coordonnées ou du centre de placeBounding_boxCoordonnées :

La formule définit la valeur comme manquante si les coordonnées ne sont pas disponibles ; seulement 5 % environ des tweets ont des coordonnées.
Cette formule de colonne faisait une colonne pour catégoriser les tweets, mais toujours différente pour chaque langue :

Suivi de cette formule de colonne pour combiner les catégories :

Pour accélérer la génération des images vidéo, chargez les sous-ensembles de données dans des matrices :
dt = open("$desktop/sha1/TwitterFeed3.jmp");
xLonVec=dt:xLon<
yLatVec=dt:yLat<
kindVec = dt:kindCode<
timeVec = dt:dateUTC<
fermer(dt,nosave);
Créez une GraphBox pour produire les frames :
Nouvelle fenêtre( "Meal Tweets", // la taille du marqueur du graphique est utilisée pour les emplacements des tweets rouge/vert/bleu
g = Zone graphique (Taille du cadre (1920, 900), <
);
Il y a plus de JSL pour définir les axes, ajouter la carte.La majeure partie du travail est effectuée dans ce script graphique qui traite les matrices chargées depuis la table de données :
g[framebox( 1 )] << addGraphicsScript(
transparence (.8);
pour(idx=lowIndex,idx<=highIndex,idx++,
Marker( Color State( match(kindVec[idx],1,"green",2,"blue",3,"red") ),{xLonVec[idx], yLatVec[idx]} );
)
);
Et le code du pilote qui provoque le redessinage de la carte avec des heures de début et de fin différentes et capture une image :
nframes = secondes*30 ;// secondes à 30 ips
début = min(timeVec);
fin = max(timeVec);
durée = fin - début ;
delta = durée / nimages ;
Pour( iframe = 0, iframe < nframes, iframe++,
mindate = début + (iframe - 0) * delta - 2*3600 ; // retour 2 heures.
maxdate = début + (iframe + 1) * delta + 3600 ; // avance d'1 heure
lowIndex=floor(interpolate(mindate,timeVec,1::nrows(timeVec)));
highIndex=floor(interpolate(maxdate,timeVec,1::nrows(timeVec)));
g<
Attendez( 1 );
g[framebox(1)]<
);
Finalement, vous aurez les images nécessaires pour produire une vidéo.J'ai utilisé Blender (longue courbe d'apprentissage, mais puissant) pour réaliser cette vidéo de cinq minutes, qui compte 377 765 tweets sur 16 jours, y compris les vacances de Thanksgiving aux États-Unis.Il y a eu 8 187 114 tweets au total, mais la plupart n’incluaient pas de données de latitude et de longitude.Si je recommence, je diviserai les données au fur et à mesure de leur collecte ; la table complète de 2,5 Go est grande.
https://www.youtube.com/watch?v=N20KsrmdgOU Maximiser!
Pas d'attachement? Cliquez ici pour voir le post.