0

何千ものツイートを含むデータセットがあります。それらの一部には URL が含まれていますが、それらのほとんどは Twitter で使用されている従来の短縮形です。特定の Web サイトの存在を確認できるように、完全な URL を取得するものが必要です。次のようにPythonで問題を解決しました:

import urllib2
url_filename='C:\Users\Monica\Documents\Pythonfiles\urlstrial.txt'
url_filename2='C:\Users\Monica\Documents\Pythonfiles\output_file.txt'
url_file= open(url_filename, 'r')
out = open(url_filename2, 'w')
for line in url_file:
   tco_url = line.strip('\n')
   req = urllib2.urlopen(tco_url)
   print >>out, req.url
url_file.close()
out.close()

これは機能しますが、URL を Stata から .txt ファイルにエクスポートしてから、完全な URL を再インポートする必要があります。シェル コマンドを使用して Stata にタスクを統合できる Python スクリプトのバージョンはありますか? 非常に多くの異なる .dta ファイルがあり、理想的には、このタスクを実行するためだけにそれらをすべて追加することは避けたいと考えています。

ご回答ありがとうございます。

4

1 に答える 1

1

確かに、これは Stata を離れることなく可能です。OS X を実行している Mac を使用しています。詳細はオペレーティング システムによって異なる場合がありますが、これは Windows であると推測しています。

Python と Stata メソッド

と呼ばれる次の簡単な Python プログラムがあるとしhello.pyます。

#!/usr/bin/env python

import csv

data = [['name', 'message'], ['Monica', 'Hello World!']]
with open('data.csv', 'w') as wsock:
    wtr = csv.writer(wsock)
    for i in data:
        wtr.writerow(i)
    wsock.close()

この「プログラム」は、スクリプトの作業ディレクトリにある data.csv というファイルに偽のデータを書き込むだけです。スクリプトが実行可能であることを確認してください: chmod 755 hello.py.

Stata 内から、次のことができます。

! ./hello.py
* The above line called the Python program, which created a data.csv file.
insheet using data.csv, comma clear names case
list

     +-----------------------+
     |   name        message |
     |-----------------------|
  1. | Monica   Hello World! |
     +-----------------------+

これは簡単な例です。ケースの完全なプロセスは次のとおりです。

  1. outsheetまたはその他のコマンドを使用して、URL を使用してファイルをディスクに書き込みます。
  2. !Python スクリプトの呼び出しに使用
  3. insheetorinfileまたはその他のコマンドを使用して出力を Stata に読み込みます
  4. でファイルを削除してクリーンアップcapture erase my_file_on_disk.csv

それが明確でない場合はお知らせください。*nix で問題なく動作します。私が言ったように、Windows は少し違うかもしれません。Windowsボックスがあれば、それをテストします。

Pure Stata ソリューション (一種のハック)

また、達成したいことは完全にStataで実行できると思いますが、それはハックです。ここに2つのプログラムがあります。1 つ目は単純にログ ファイルを開き、URL (最初の引数) を要求します。2 つ目は、そのログ ファイルを読み取り、正規表現を使用して、Stata がリダイレクトされた URL を見つけます。

capture program drop geturl
program define geturl
    * pass short url as first argument (e.g. http://bit.ly/162VWRZ)
    capture erase temp_log.txt
    log using temp_log.txt
    copy `1' temp_web_file
end

copyコマンドが(意図的に)失敗するため、上記のプログラムは終了しません。また、それ自体は (意図的に) クリーンアップしません。そこで、何が起こったかを読み取る (そして URL リダイレクトを取得する) 次のプログラムを作成しました。

capture program drop longurl
program define longurl, rclass
    * find the url in the log file created by geturl
    capture log close
    loc long_url = ""
    file open urlfile using temp_log.txt , read
    file read urlfile line
    while r(eof) == 0 {
        if regexm("`line'", "server says file permanently redirected to (.+)") == 1 {
            loc long_url = regexs(1)
        }
        file read urlfile line
    }
    file close urlfile
    return local url "`long_url'"
end

次のように使用できます。

geturl  http://bit.ly/162VWRZ
longurl
di "The long url is:  `r(url)'"
* The long url is:  http://www.ciwati.it/2013/06/10/wdays/?utm_source=twitterfeed&
* > utm_medium=twitter

それらを次々に実行する必要があります。このソリューションを使用すると事態が悪化する可能性がありますが、探している URL は見つかります。別の方法として、短縮サービスに連絡して、データをうまく尋ねることを提案してもよろしいですか?

copyStata の誰かがこれを読んでいる場合、 HTTP 応答ヘッダー情報を返すとよいでしょう。これを完全に Stata で行うのは、少し特殊です。個人的には、この種のことには完全に Python を使用し、必要なものがすべて揃ったら、データの分析には Stata を使用します。

于 2013-07-06T19:45:54.923 に答える