<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Diffusion de données Twitter dans une table de données JMP
Faites défiler jusqu'à la fin si vous ne voulez que la vidéo.
J'ai effectué quelques tests minimaux 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 est dans le fichier ZIP joint.
Ce post touche, à la légère, un tas de sujets.
- Compte Twitter
- données en continu
- manipulation de bits
- JSON
- Autorisation OAuth, signature
- boucle
- coordonnées cartographiques
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 devez 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 façon dont vous pouvez les utiliser.Je ne vous donnerai pas de conseils sur ce qui est OK 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 un téléphone portable.Il s'agit d'un ensemble de clés qui permet à 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, créez 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 il 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 voulez.

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é et du secret du consommateur.Allez-y et démarrez votre projet JMP ; il y aura plusieurs fichiers, alors créez un répertoire, décompressez les fichiers JSL, modifiez 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 a 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, elles peuvent donc toutes rester au même endroit.
Visite https://apps.twitter.com/ et assurez-vous que l'application existe, puis vous pouvez vous déconnecter de Twitter.
Diffusion Twitter
Twitter propose d'autres façons d'utiliser leur 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 les 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 a récupéré environ 3 tweets par seconde.Il n'est pas possible de limiter la recherche à Londres avec une zone de délimitation autour de Londres ; qui essaiera 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 combien de données Twitter diffusera ; à un moment donné, j'ai pensé que Twitter ralentirait, et à un autre moment, j'ai pensé que Twitter arrêterait le flux si je ne pouvais 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 une boîte englobante autour de Raleigh, NC.J'ai reçu des tweets sur des vélos Raleigh volés dans le monde entier.
Mise en garde
Vous devrez effectuer votre propre filtrage post-capture et vous voudrez peut-être créer votre propre liste de mots que vous n'aimez pas.Si vous présentez une liste de tweets non censurés en public, vous serez gêné, ou pire.Rappelez-vous également que Twitter a des règles sur la façon 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 :
inclure("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 y a peu de capacité « et » ; manger le déjeuner, manger le dîner, prendre le 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 de bits
include("AUTH.jsl"); // code pour oauth
include("SIGN.jsl"); // code pour la signature
include("PARM.jsl"); // code pour construire le parm http pour curl
Il s'agit notamment de charger un tas de JSL et de faire quelques petites vérifications d'intégrité et des auto-tests.BITS prend une minute pour initialiser certaines structures de données pour accélérer le code plus tard, soyez patient pendant que le +++ s'imprime dans la fenêtre du journal.JSON est extrait de travail que Xan a fait plus tôt ; le flux Twitter est envoyé au format JSON.AUTH et SIGN contiennent JSL qui utilise les EncryptedKeys pour s'authentifier (« connexion ») à Twitter.C'est compliqué et utilise un programme externe déjà installé sur votre ordinateur pour faire le hachage SHA1.Quand j'ai écrit les fonctions de bit, je pensais que je devrais implémenter le hachage SHA1, mais c'est aussi compliqué, et je suis content d'en utiliser un qui n'a pas besoin d'être débogué.Le dernier include, PARM, construit une chaîne pour cURL.
boucle
Vous aurez besoin d'une copie de cURL.Il existe déjà sur MAC.Les gens de Windows peuvent l'obtenir à partir de http://curl.haxx.se/ après avoir vérifié auprès de vos systèmes les gens d'abord.https://en.wikipedia.org/wiki/CURL est un point de départ pour vos questions cURL.j'ai téléchargé CAB Win64 x86_64 .(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:\Users\User\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 avec Twitter et renverra le flux de tweets à JMP.
RunProgram(exécutable( cURLlocation),options( cURLparms),
readFunction(Function( {this},
buftxt ||= this << read( blob );
traiter();
Si( this << isReadEOF,
Écrire( Droite( Char( buftxt ), 100 ) ) );))
Les fonctions cURLparms et process() (utilisées ci-dessus) sont tout ce qu'il reste à expliquer.
cURLparms vient de PARM:curlParm( PICK:trackParm, PICK:locationParm ); qui utilise PICK (chemin 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 (voir ci-dessus) pour effectuer la signature/autorisation pour les termes et emplacements spécifiques.
La fonction process prend les données de buftxt et les place dans une table de données.
Courir
Fait!Mettez les fichiers joints dans le même répertoire avec 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 de la JSL, vous verrez une boucle qui redémarre le RunProgram lorsqu'il s'arrête de manière inattendue.Il retarde de 60 secondes pour éviter d'abuser du site Twitter si quelque chose ne va pas 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 pour ne redémarrer qu'un petit nombre de fois.
Les scripts sont à peine testés ; demandez si ça ne marche pas, merci!
La deuxième table 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 y a du JSL codé en dur qui recherche les tweets du petit-déjeuner/déjeuner/dîner.Vous pouvez le retravailler ou le supprimer complètement.
Le bouton STOP en bas de la carte amènera (probablement) le script à un arrêt gracieux.J'ai corrigé un bogue qui pouvait empêcher JMP sur MAC de s'arrêter correctement pour une future version ; 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, il y a suffisamment de données pour faire une vidéo.En utilisant des idées de plusieurs publications récentes…Faute d'une meilleure norme de codage couleur, utilisez le vert pour commencer la journée et le rouge pour arrêter la journée et le bleu pour l'heure du déjeuner.Créez un sous-ensemble de lignes pour ne conserver que 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_boxCoordinates :

La formule définit la valeur sur missing si les coordonnées ne sont pas disponibles ; seulement environ 5% des tweets ont des coordonnées.
Cette formule de colonne fait 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 données du sous-ensemble dans des matrices :
dt = open("$desktop/sha1/TwitterFeed3.jmp");
xLonVec=dt:xLon<
yLatVec=dt:yLat<
kindVec = dt:kindCode<
timeVec = dt:dateUTC<
close(dt,nosave);
Créez un GraphBox pour produire les cadres :
Nouvelle fenêtre( "Meal Tweets", // la taille du marqueur du graphique est utilisée pour les emplacements des tweets rouge/vert/bleu
g = Graph Box( Frame Size( 1920, 900 ), <
);
Il n'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 à partir de la table de données :
g[framebox( 1 )] << addGraphicsScript(
transparence (.8);
for(idx=lowIndex,idx<=highIndex,idx++,
Marqueur( État de couleur( match(kindVec[idx],1,"vert",2,"bleu",3,"rouge") ),{xLonVec[idx], yLatVec[idx]} );
)
);
Et le code du pilote qui provoque le redessin de la carte avec des heures de début et de fin différentes et capture une image :
nframes = secondes*30 ;// secondes à 30 ips
start = min(timeVec);
fin = max(tempsVec);
durée = fin - début ;
delta = durée / nframes ;
For( iframe = 0, iframe < nframes, iframe++,
date d'esprit = début + (iframe - 0) * delta - 2*3600 ; // retour de 2 heures.
maxdate = start + (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 cadres pour produire une vidéo.J'ai utilisé Blender (longue courbe d'apprentissage, mais puissante) pour réaliser cette vidéo de cinq minutes, qui compte 377 765 tweets sur 16 jours qui incluent les vacances de Thanksgiving aux États-Unis.Il y avait 8 187 114 tweets en tout, mais la plupart n'incluaient pas de données de latitude et de longitude.Si je recommence, je créerai un sous-ensemble des données au fur et à mesure qu'elles sont collectées ; 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 poste.