{"id":5561,"date":"2018-07-04T12:46:43","date_gmt":"2018-07-04T10:46:43","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=5561"},"modified":"2023-09-11T15:05:51","modified_gmt":"2023-09-11T13:05:51","slug":"python-w-sluzbie-analizy-danych-o-ktorym-polskim-pilkarzu-polscy-twitterowicze-pisali-najczesciej-z-okazji-meczu-polska-kolumbia","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/python-w-sluzbie-analizy-danych-o-ktorym-polskim-pilkarzu-polscy-twitterowicze-pisali-najczesciej-z-okazji-meczu-polska-kolumbia\/","title":{"rendered":"Python w s\u0142u\u017cbie analizy danych"},"content":{"rendered":"\n<p>Trwaj\u0105ce Mistrzostwa \u015bwiata w pi\u0142ce no\u017cnej wzbudzaj\u0105 wiele emocji. Warto sprawdzi\u0107 co do powiedzenia o grze pi\u0142karzy maj\u0105 znawcy futbolu i kibice. Jednak scrollowanie twitterowego feedu i przegl\u0105danie wpisu po wpisie okazuje si\u0119 bardzo czasoch\u0142onnym i monotonnym zaj\u0119ciem. Aby dowiedzie\u0107 si\u0119, o kt\u00f3rym z pi\u0142karzy internauci m\u00f3wili najcz\u0119\u015bciej, bez konieczno\u015bci inwestowania w narz\u0119dzia komercyjne, mo\u017cna pos\u0142u\u017cy\u0107 si\u0119 j\u0119zykiem programowania Python.<\/p>\n\n\n\n<p>Czas po\u015bwi\u0119cony na r\u0119czne przegl\u0105danie opinii u\u017cytkownik\u00f3w Twittera jest niewsp\u00f3\u0142mierny z korzy\u015bciami p\u0142yn\u0105cymi z&nbsp;analizy danych&nbsp;w ten w\u0142a\u015bnie spos\u00f3b. Oczywi\u015bcie, na rynku us\u0142ug dost\u0119pnych jest wiele komercyjnych narz\u0119dzi, kt\u00f3re zagreguj\u0105 dane za nas, jednak co w wypadku kiedy mamy ograniczony bud\u017cet lub po prostu nie chcemy wydawa\u0107 na to pieni\u0119dzy?<\/p>\n\n\n\n<p>Proponuj\u0119 rozwi\u0105zanie nie tylko prostsze i szybsze, ni\u017c manualne sprawdzanie medi\u00f3w spo\u0142eczno\u015bciowych, ale te\u017c pozwalaj\u0105ce analizowa\u0107 dane dla interesuj\u0105cych nas wydarze\u0144, jak chocia\u017cby nowe wzmianki o produkcie, marce czy te\u017c popularno\u015bci kandydat\u00f3w w wyborach prezydenckich w Warszawie. Jedyny koszt, jaki trzeba b\u0119dzie ponie\u015b\u0107 to czas na przygotowanie kodu w j\u0119zyku programowania&nbsp;<strong>Python<\/strong>&nbsp;oraz zarejestrowanie konta w serwisie Twitter, z kt\u00f3rego zbierzemy interesuj\u0105ce nas informacje.<\/p>\n\n\n\n<p>Na potrzeby swojej analizy pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem komentarzy, kt\u00f3re pojawi\u0142y si\u0119 na Twitterze po naszym mundialowym meczu o wszystko z Kolumbi\u0105. Warto podkre\u015bli\u0107, \u017ce tak\u0105 analiz\u0119 mo\u017cna przeprowadzi\u0107 za pomoc\u0105 Pythona nie tylko w odniesieniu do komentarzy o wyczynach sportowych, ale tak\u017ce wy\u0142oni\u0107 najlepiej oceniony zesp\u00f3\u0142 na Openerze czy najbardziej popularn\u0105 pla\u017c\u0119 nad Ba\u0142tykiem oraz stwierdzi\u0107, kt\u00f3ry kandydat w wyborach samorz\u0105dowych by\u0142 najcz\u0119\u015bciej wymieniany.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Przewodnik krok po kroku<\/h2>\n\n\n\n<p>Na pocz\u0105tek potrzebne nam b\u0119dzie \u015brodowisko do pracy. Instalacja wszystkiego, co b\u0119dzie potrzebne nam poni\u017cej jest stosunkowo prosta, dlatego nie b\u0119d\u0119 opisywa\u0107 po kolei instrukcji instalacji. Niezb\u0119dne nam b\u0119d\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Python 3.6<\/li>\n\n\n\n<li>Biblioteka tweepy (<em>pip install tweepy<\/em>)<\/li>\n\n\n\n<li>Biblioteka pandas (<em>pip install pandas<\/em>)<\/li>\n\n\n\n<li>Edytor kodu (np. PyCharm)<\/li>\n<\/ul>\n\n\n\n<p>Dodatkowo do zbierania wpis\u00f3w z serwisu Twitter niezb\u0119dne b\u0119dzie nam zarejestrowane tam konto.<\/p>\n\n\n\n<p>Zanim zaczniemy pisa\u0107 pierwsze linijki kodu, przejdziemy do wygenerowania danych, kt\u00f3re uwierzytelni\u0105 nas i pozwol\u0105 korzysta\u0107 z twitterowego API.&nbsp;Jako zalogowany u\u017cytkownik Twittera przechodz\u0119 zatem do strony:&nbsp;<a href=\"https:\/\/apps.twitter.com\/\" target=\"_blank\" rel=\"noopener\" rel=\"nofollow\" >https:\/\/apps.twitter.com<\/a><\/p>\n\n\n\n<p>Rozpoczynam proces tworzenia nowej aplikacji:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app.png\"><img decoding=\"async\" width=\"1024\" height=\"511\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app-1024x511.png\" alt=\"Widok Twitter Apps - Create New App\" class=\"wp-image-5553\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app-1024x511.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app-300x150.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app.png 1919w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>W kolejnym kroku wype\u0142niam wszystkie niezb\u0119dne pola, zaznaczam checkbox z potwierdzeniem zapoznania si\u0119 z regulaminem i klikam na przycisk&nbsp;<strong>Create your Twitter application<\/strong>, \u017ceby przej\u015b\u0107 dalej.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step2.png\"><img decoding=\"async\" width=\"1024\" height=\"793\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step2-1024x793.png\" alt=\"Create an application\" class=\"wp-image-5554\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step2-1024x793.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step2-300x232.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step2.png 1902w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Je\u015bli wszystkie wymagane pola zosta\u0142y wype\u0142nione prawid\u0142owo, to pojawi si\u0119 nast\u0119pny ekran \u2013 aplikacji, z kt\u00f3rego b\u0119dzie nas interesowa\u0107 przede wszystkim API key:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step3.png\"><img decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step3-1024x545.png\" alt=\"Application Settings - API Key\" class=\"wp-image-5555\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step3-1024x545.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step3-300x160.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step3.png 1758w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>kt\u00f3rego jeszcze nie kopiuj\u0119, bo musz\u0119 przej\u015b\u0107 do ekranu docelowego przez klikni\u0119cie na niebieski link&nbsp;<strong>manage keys and access tokens<\/strong>.<\/p>\n\n\n\n<p>Po klikni\u0119ciu na niego pojawia si\u0119 ostatni ekran, kt\u00f3ry b\u0119dzie potrzebny do zbudowania prostej aplikacji agreguj\u0105cej tweety.<\/p>\n\n\n\n<p>Teraz nadszed\u0142 moment, w kt\u00f3rym kopiuj\u0119 do notatnika dwie warto\u015bci:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consumer Key<\/li>\n\n\n\n<li>Consumer Secret<\/li>\n<\/ul>\n\n\n\n<p>zaznaczone na screenie poni\u017cej.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step4.png\"><img decoding=\"async\" width=\"1024\" height=\"539\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step4-1024x539.png\" alt=\"Application Settings - Consumer Key oraz Consumer Secret\" class=\"wp-image-5556\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step4-1024x539.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step4-300x158.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step4.png 1371w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Z tego samego ekranu potrzebne b\u0119d\u0105 mi jeszcze 2 warto\u015bci, kt\u00f3re musz\u0119 wygenerowa\u0107 sobie samodzielnie. \u017beby to zrobi\u0107, scrolluj\u0119 na koniec strony i klikam na&nbsp;<strong>Create my access token<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step5.png\"><img decoding=\"async\" width=\"1024\" height=\"342\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step5-1024x342.png\" alt=\"Create my access token\" class=\"wp-image-5557\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step5-1024x342.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step5-300x100.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step5.png 1281w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Po klikni\u0119ciu pojawi\u0105 mi si\u0119 w tym samym miejscu na stronie ostatnie ju\u017c dane, kt\u00f3re musz\u0119 skopiowa\u0107 do notatnika (zaznaczone na screenie poni\u017cej):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step6.png\"><img decoding=\"async\" width=\"1024\" height=\"359\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step6-1024x359.png\" alt=\"Your Acces Token - pola Access Token oraz Access Token Secret\" class=\"wp-image-5558\" title=\"Python w s\u0142u\u017cbie analizy danych. O kt\u00f3rym polskim pi\u0142karzu polscy Twitterowicze pisali najcz\u0119\u015bciej z okazji meczu Polska \u2013 Kolumbia?\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step6-1024x359.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step6-300x105.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/apps_twitter_com_create_new_app_step6.png 1297w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Czas na kodowanie!<\/h2>\n\n\n\n<p>Dane skompletowane. Nadszed\u0142 czas, aby przej\u015b\u0107 w ko\u0144cu do cz\u0119\u015bci pythonowej.<br>To r\u00f3wnie\u017c dobry moment na zadanie sobie pytania \u2013 \u201e<em>Co musz\u0119 zrobi\u0107, \u017ceby otrzyma\u0107 oczekiwany efekt?<\/em>\u201d.<\/p>\n\n\n\n<p>Po pierwsze m\u00f3j program musi&nbsp;<strong>uwierzytelni\u0107 si\u0119<\/strong>&nbsp;w aplikacji twitterowej za pomoc\u0105 danych, kt\u00f3re mam zapisane w notatniku.<br>Po drugie, dobrze by\u0142oby narzuci\u0107 odg\u00f3rny&nbsp;<strong>limit<\/strong>&nbsp;na zaci\u0105gni\u0119te tweety, aby pobieranie nowych tweet\u00f3w nie trwa\u0142o w niesko\u0144czono\u015b\u0107.<br>Po trzecie, potrzebna mi jest&nbsp;<strong>klasa<\/strong>, kt\u00f3ra zagreguje tweety.<br>Na koniec warto by\u0142oby doda\u0107 filtr, kt\u00f3ry zbierze mi tweety z hashtagami, po kt\u00f3rych chc\u0119 odszuka\u0107 wpisy ze streamu, w przypadku meczu Polska \u2013 Kolumbia b\u0119d\u0105 to<strong>&nbsp;<a href=\"https:\/\/twitter.com\/search?q=%23POL-COL&amp;src=typd\" rel=\"nofollow\" >#POL-COL<\/a><\/strong>&nbsp;i&nbsp;<a href=\"https:\/\/twitter.com\/search?q=%23POLCOL&amp;src=typd\" rel=\"nofollow\" ><strong>#POLCOL<\/strong><\/a>.<\/p>\n\n\n\n<p>Zatem, do dzie\u0142a!<\/p>\n\n\n\n<p>W pierwszej kolejno\u015bci dokonuj\u0119 niezb\u0119dnych import\u00f3w z biblioteki tweepy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nfrom tweepy import OAuthHandler, Stream\nfrom tweepy.streaming import StreamListener\n<\/pre><\/div>\n\n\n<p>W kolejnym kroku podaje\u0328 dane z notatnika, kto\u0301rymi be\u0328de\u0328 si\u0119 uwierzytelniac\u0301:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nCONSUMER_KEY = &quot;TU_WKLEJ_SWOJE_DANE&quot; \nCONSUMER_SECRET = &quot;TU_WKLEJ_SWOJE_DANE&quot; \nACCESS_TOKEN = &quot;TU_WKLEJ_SWOJE_DANE&quot; \nACCESS_TOKEN_SECRET = &quot;TU_WKLEJ_SWOJE_DANE&quot;\n<\/pre><\/div>\n\n\n<p>Narzucam odg\u00f3rny limit, po kt\u00f3rym program przestanie zbiera\u0107 tweety:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nLIMIT = 50\n<\/pre><\/div>\n\n\n<p>Jak wida\u0107, limit to zaledwie 50 tweet\u00f3w, ale chodzi o to, \u017ceby przetestowa\u0107 wykonywanie kodu na mniejszej pr\u00f3bie, co znacznie oszcz\u0119dzi czas. Oczywi\u015bcie narzucony limit mo\u017cna p\u00f3\u017aniej zwi\u0119kszy\u0107 i nic nie stoi na przeszkodzie, aby poda\u0107 tam np. 50000.<\/p>\n\n\n\n<p>Czas przej\u015b\u0107 do\u00a0<em>clou<\/em>\u00a0programu. Definiuj\u0119 klas\u0119\u00a0<strong>Listener<\/strong>, kt\u00f3ra dziedziczy z klasy\u00a0<em>StreamListener<\/em>\u00a0z biblioteki\u00a0<em>tweepy<\/em>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nclass Listener(StreamListener):\n<\/pre><\/div>\n\n\n<p>Nast\u0119pnie definiuj\u0119 sobie atrybut klasy niezb\u0119dny w dalszej cz\u0119\u015bci programu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ncount = 0\n<\/pre><\/div>\n\n\n<p>Teraz kolej na funkcj\u0119, kt\u00f3ra b\u0119dzie agregowa\u0107 \u201esp\u0142ywaj\u0105ce\u201d dane:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ndef on_data(self, data):\n    self.count += 1\n    print(data)\n    if self.count &gt; LIMIT:\n        return False\n    return True\n<\/pre><\/div>\n\n\n<p>a w razie b\u0142\u0119du, np. przy uwierzytelnianiu wy\u015bwietl\u0119 b\u0142\u0105d i jego numer:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ndef on_error(self, status):\n    print(status)\n<\/pre><\/div>\n\n\n<p>Agregowane dane dobrze by\u0142oby zapisac\u0301 do pliku, kto\u0301ry pos\u0142u\u017cy mi do dalszego przetworzenia s\u0301cia\u0328gnie\u0328tych danych. Rozszerzam wie\u0328c funkcje\u0328 <strong>def on_data<\/strong> o zapis do pliku:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ndef on_data(self, data):\n    self.count += 1\n    print(data)\n\n    with open(POLCOL.txt&#039;, &#039;a&#039;, encoding=&#039;utf-8&#039;) as ts:\n        for text in data:\n            ts.write(text)\n\n    if self.count &gt; LIMIT: \n            return False \n    return True\n<\/pre><\/div>\n\n\n<p>Ostatnia cz\u0119\u015b\u0107 programu to instrukcja specjalna, kt\u00f3ra przed wykonaniem cz\u0119\u015bci zbieraj\u0105cej dane uwierzytelni nas za pomoc\u0105 kluczy z pocz\u0105tku kodu w serwisie Twitter:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nif __name__ == &#039;__main__&#039;:\n<\/pre><\/div>\n\n\n<p>Tworze\u0328 obiekty na podstawie klas doste\u0328pnych w bibliotece tweepy (OAuthHandler do autoryzacji i Stream do ustawienia klasy Listener dla streamu danych z Twittera):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nstart_stream = Listener()\nauth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) \nauth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) \nstream = Stream(auth, start_stream)\n<\/pre><\/div>\n\n\n<p>Na koniec pozostaje mi do ustawienia filtr z j\u0119zykiem dla kt\u00f3rego chc\u0119 zebra\u0107 wpisy oraz hashtagami dla pobieranych danych:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nstream.filter(languages=&#x5B;&quot;pl&quot;], track=&#x5B;&#039;#POLCOL&#039;,&#039;#POL-COL&#039;])\n<\/pre><\/div>\n\n\n<p>Najwy\u017csza pora na przetestowanie dzia\u0142ania programu:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/pycharm_screenshot_test-1024x123-1.png\"><img decoding=\"async\" width=\"1024\" height=\"123\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/pycharm_screenshot_test-1024x123-1.png\" alt=\"przetestowanie dzia\u0142ania programu\" class=\"wp-image-24043\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/pycharm_screenshot_test-1024x123-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/pycharm_screenshot_test-1024x123-1-300x36.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/pycharm_screenshot_test-1024x123-1-768x92.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Dzia\u0142a! Dla stuprocentowej pewnos\u0301ci sprawdzam jeszcze plik \u2019twitter_dane.txt\u2019 do kto\u0301rego zapisywane s\u0105 agregowane dane. UWAGA! Twitter API zwraca dane w formacie JSON i tak te\u017c zapisze je w naszym pliku txt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co dalej?<\/h2>\n\n\n\n<p>Chc\u0119 odczyta\u0107 interesuj\u0105ce mnie dane z zebranych tweet\u00f3w. Tworz\u0119 zatem drugi pythonowy plik, ja nada\u0142em mu nazw\u0119&nbsp;<em>counter.py<\/em>&nbsp;i planuj\u0119, co policz\u0119 oraz jakie kroki b\u0119d\u0105 do tego potrzebne.<\/p>\n\n\n\n<p>Po pierwsze musz\u0119&nbsp;<strong>otworzy\u0107 plik z danymi<\/strong>, a same dane sprowadzi\u0107 do formy, z kt\u00f3rej \u0142atwiej i szybciej b\u0119dzie mi je odczyta\u0107. Po drugie potrzebuj\u0119 te&nbsp;<strong>dane przeszuka\u0107 i obliczy\u0107<\/strong>&nbsp;np. liczb\u0119 wyst\u0105pie\u0144 szukanego przeze mnie s\u0142owa.<\/p>\n\n\n\n<p>Do obr\u00f3bki danych niezb\u0119dne s\u0105 mi biblioteki:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nimport json\nimport re\nimport pandas as pd\n<\/pre><\/div>\n\n\n<p>Tworze\u0328 pusta\u0328 liste\u0328, do kto\u0301rej przy pomocy pe\u0328tli for dodam dane z pliku:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ntweets_data = &#x5B;]\ntweets_file = open(&#039;POLCOL.txt&#039;, &#039;r&#039;) for line in tweets_file:\n    try:\n        tweet = json.loads(line)\n        tweets_data.append(tweet)\n\n    except:\n        continue\n<\/pre><\/div>\n\n\n<p>Sprawdz\u0119 jeszcze, czy kod wykonywany jest poprawnie za pomoca\u0328 \u2026 funkcji print, kto\u0301ra wys\u0301wietli mi policzona\u0328 liczbe\u0328 s\u0301cia\u0328gnie\u0328tych wpiso\u0301w:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\nprint(&#039;\\n Total scraped tweets count: {}&#039; .format(len(tweets_data)))\n<\/pre><\/div>\n\n\n<p>W moim kodzie wszystko dzia\u0142a jak powinno, dlatego nadszed\u0142 moment na skorzystanie z biblioteki\u00a0<em>pandas<\/em>\u00a0i utworzenie\u00a0<em>DataFrame<\/em>\u00a0(w du\u017cym skr\u00f3cie \u2013 to taka struktura danych), kt\u00f3ry pos\u0142u\u017cy mi dalej np. do przeszukiwania tekstu i liczenia wyst\u0105pie\u0144 wg narzuconych przeze mnie kryteri\u00f3w.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ntweets = pd.DataFrame()\ntweets&#x5B;&#039;text&#039;] = &#x5B;*map(lambda tweet:tweet&#x5B;&#039;text&#039;] if &#039;text&#039; in tweet else &#039; &#039;, tweets_data)]\n<\/pre><\/div>\n\n\n<p>Ja dla przyk\u0142adu na potrzeby tego artyku\u0142u \u201ezmierz\u0119 popularnos\u0301c\u0301\u201d odwo\u0142an\u0301 do nazwiska naszego selekcjonera i kapitana naszej reprezentacji w konteks\u0301cie w\u0142as\u0301nie meczu z Kolumbia\u0328 ?<\/p>\n\n\n\n<p>Aby to zrobic\u0301, tworze\u0328 prosta\u0328 funkcj\u0119, kto\u0301ra\u0328 wywo\u0142am przy licznikach do nazwisk (funkcja policzy mi liczbe\u0328 wysta\u0328pien\u0301 s\u0142owa w teks\u0301cie przy okazji ujednolicaja\u0328c je) i narzucam w kodzie kryteria wyszukiwania:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ndef word_in_text(word, text):\n    word = word.lower()\n    text = text.lower()\n    match = re.search(word, text)\n    if match:\n\n         return True\n    return False\n\ntweets&#x5B;&#039;Nawa\u0142ka&#039;] = tweets&#x5B;&#039;text&#039;].apply(lambda tweet: word_in_text(&#039;Nawa\u0142ka&#039;, tweet)) \ntweets&#x5B;&#039;Lewandowski&#039;] = tweets&#x5B;&#039;text&#039;].apply(lambda tweet: word_in_text(&#039;Lewandowski&#039;, tweet))\n<\/pre><\/div>\n\n\n<p>Teraz pozostaje ju\u017c tylko liczyc\u0301?<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkeywords = &#x5B;&#039;Nawa\u0142ka&#039;, &#039;Lewandowski&#039;]\ntweets_by_keywords = &#x5B;tweets&#x5B;&#039;Nawa\u0142ka&#039;].value_counts()&#x5B;True], tweets&#x5B;&#039;Lewandowski&#039;].value_counts()&#x5B;True]]\n<\/pre><\/div>\n\n\n<p>I sprawdzic\u0301 dzia\u0142anie kodu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nfor i in range(0, len(keywords)):\n    try:\n        print(keywords&#x5B;i] + &quot;: &quot; + str(tweets_by_keywords&#x5B;i]))\n    except:\n        continue\n<\/pre><\/div>\n\n\n<p>Prezentacj\u0119 danych w wygodnym dla siebie formacie pozostawiam jako zadanie do samodzielnej realizacji wszystkim \u015bmia\u0142kom, kt\u00f3rzy dotarli do ko\u0144ca tego wpisu. Poka\u017c\u0119 te\u017c przyk\u0142ad i zarazem odpowied\u017a na tytu\u0142owe pytanie:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/najwiecej_wzmianek_o_pilkarzu.png\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/najwiecej_wzmianek_o_pilkarzu.png\" alt=\"Wykres - liczba wzmianek o poszczeg\u00f3lnych osobach\" class=\"wp-image-24045\" width=\"670\" height=\"510\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/najwiecej_wzmianek_o_pilkarzu.png 670w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/09\/najwiecej_wzmianek_o_pilkarzu-300x228.png 300w\" sizes=\"(max-width: 670px) 100vw, 670px\" \/><\/a><\/figure>\n\n\n\n<p>Na koniec dodam tylko, \u017ce zaprezentowane tutaj obliczenie jest najprostszym jakie przysz\u0142o mi do g\u0142owy, ale nic nie stoi na przeszkodzie, \u017ceby z zebranych tweet\u00f3w zebra\u0107 np. informacje o geolokalizacji wpis\u00f3w, urz\u0105dzeniach z kt\u00f3rych Twitterowicze publikowali swoje wpisy, najpopularniejszych wpisach i wielu, wielu innych, na kt\u00f3re pozwala nam API serwisu Twitter.<\/p>\n\n\n\n<p>Wszystko zale\u017cy od Twojej fantazji?<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;5561&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;47&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.9&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.9\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Python w s\u0142u\u017cbie analizy danych&quot;,&quot;width&quot;:&quot;155.8&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 155.8px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            4.9\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Trwaj\u0105ce Mistrzostwa \u015bwiata w pi\u0142ce no\u017cnej wzbudzaj\u0105 wiele emocji. Warto sprawdzi\u0107 co do powiedzenia o grze pi\u0142karzy maj\u0105 znawcy futbolu &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/python-w-sluzbie-analizy-danych-o-ktorym-polskim-pilkarzu-polscy-twitterowicze-pisali-najczesciej-z-okazji-meczu-polska-kolumbia\/\">Continued<\/a><\/p>\n","protected":false},"author":166,"featured_media":5551,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1318],"tags":[513,584,585],"class_list":["post-5561","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-zarzadzanie-projektami","tag-analiza-danych","tag-python","tag-twitter"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/07\/stadium-510203_1280.jpg","category_names":["Zarz\u0105dzanie projektami"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5561"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/166"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=5561"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5561\/revisions"}],"predecessor-version":[{"id":24047,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5561\/revisions\/24047"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/5551"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=5561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=5561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=5561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}