Google ColabでOpen Interpreterを試してみた
Open Interpreterは、ChatGPTのAdvanced Data Analysis(旧Code Interpreter)と同様の機能をローカル環境で動かせるオープンソースのツールです。
自然言語でのプログラミングを実現し、Python、Javascript、Shellなどの言語に対応しています。また、データ分析、ネットアクセス、テキスト、画像、動画などの編集ができます。
1.Google Colabでの利用法
以下のコードをColabノートにコピーして、GPUを設定し、セルを実行すると、チャットが開始します。
なお、事前に「sk-」で始まるOpenAIのAPIキーを取得して、「自分のOpenAIのAPIキー」のところに貼り付けてください。
!pip install open-interpreter
import interpreter
interpreter.api_key = "自分のOpenAIのAPIキー"
interpreter.auto_run = True
interpreter.chat()
2回目以降は、以下のコードを実行して、新しいチャットを開始してください。
interpreter.chat()
また、以下のデモサイトからも、Open Interpreterを利用することができます。
2.「Hello, World!」と表示させる
以下のセルを実行します。
interpreter.chat("Please print hello world.")
実行結果は以下の通りです。
"Please print hello world."の部分を書き換えて、Open Interpreterに指示を出すことができます。
print('Hello, World!')
Hello, World!
The code was executed successfully and it printed "Hello, World!".
また、以下のセルを実行すると、チャットモードになって、入力欄が開き、会話することができます。
interpreter.chat()
> Hello
Hello! How can I assist you today?
また、日本語で会話することもできます。
> こんにちは
こんにちは!どのようにお手伝いできるかお知らせください。
3.100までの素数を求める
Open Interpreterとのやり取りは以下の通りです。
numbers = list(range(2, 101))
numbers
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
primes = [n for n in numbers if is_prime(n)]
primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
正解です。
2から100までの整数をリストアップした後、素数を判定する関数is_prime()を定義して、100までの素数を求めることができました。
4.鶴亀算を解く
Open Interpreterとのやり取りは以下の通りです。
from sympy import symbols, Eq, solve
# Define the symbols
x, y = symbols('x y')
# Define the equations
eq1 = Eq(x + y, 5)
eq2 = Eq(2*x + 4*y, 14)
# Solve the equations
solution = solve((eq1,eq2), (x, y))
solution[y]
2
正解です。
鶴の数xと亀の数yを変数とする連立方程式を立てて、yを求めています。
5.ポケモンの強さを比較する
Open Interpreterとのやり取りは以下の通りです。
import matplotlib.pyplot as plt
labels=np.array(['Attack', 'Defense', 'HP', 'Speed', 'Special Attack', 'Special Defense'])
pikachu_stats=np.array([55, 40, 35, 90, 50, 50])
charmander_stats=np.array([52, 43, 39, 65, 60, 50])
squirtle_stats=np.array([48, 65, 44, 43, 50, 64])
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
pikachu_stats=np.concatenate((pikachu_stats,[pikachu_stats[0]]))
charmander_stats=np.concatenate((charmander_stats,[charmander_stats[0]]))
squirtle_stats=np.concatenate((squirtle_stats,[squirtle_stats[0]]))
angles+=angles[:1]
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.fill(angles, pikachu_stats, color='red', alpha=0.25)
ax.fill(angles, charmander_stats, color='blue', alpha=0.25)
ax.fill(angles, squirtle_stats, color='green', alpha=0.25)
ax.set_yticklabels([])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
ax.set_title('Pokemon Stats Comparison')
ax.legend(['Pikachu', 'Charmander', 'Squirtle'])
plt.show()
ここで出力されたPythonコードを別のセルにコピーして実行すると、エラーになったため、以下のとおり修正を求めました。
import matplotlib.pyplot as plt
import numpy as np
labels=np.array(['Attack', 'Defense', 'HP', 'Speed', 'Special Attack', 'Special Defense'])
pikachu_stats=np.array([55, 40, 35, 90, 50, 50])
charmander_stats=np.array([52, 43, 39, 65, 60, 50])
squirtle_stats=np.array([48, 65, 44, 43, 50, 64])
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
pikachu_stats=np.concatenate((pikachu_stats,[pikachu_stats[0]]))
charmander_stats=np.concatenate((charmander_stats,[charmander_stats[0]]))
squirtle_stats=np.concatenate((squirtle_stats,[squirtle_stats[0]]))
angles+=angles[:1]
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.fill(angles, pikachu_stats, color='red', alpha=0.25)
ax.fill(angles, charmander_stats, color='blue', alpha=0.25)
ax.fill(angles, squirtle_stats, color='green', alpha=0.25)
ax.set_yticklabels([])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
ax.set_title('Pokemon Stats Comparison')
ax.legend(['Pikachu', 'Charmander', 'Squirtle'])
plt.show()
再度、このコードを別のセルにコピーして実行すると、以下のレーダーチャートが表示されました。
設定された3匹のポケモンのステータスの数値を基にして、レーダーチャートを描くことができました。
6.最近のYahoo!ニュースを表示する
import pkg_resources
try:
pkg_resources.get_distribution('feedparser')
print('feedparser is installed')
except pkg_resources.DistributionNotFound:
print('feedparser is not installed')
feedparser is not installed
import os
os.system('pip install feedparser')
import feedparser
# Yahoo!Japanの国内ニュースRSSフィードのURL
url = 'https://news.yahoo.co.jp/rss/topics/top-picks.xml'
# フィードを取得
feed = feedparser.parse(url)
# 最新の8つの記事を取得
latest_articles = feed.entries[:8]
latest_articles
article_info = [{'title': article.title, 'link': article.link} for article in latest_articles]
article_info
[{'title': '九州北部再び大雨恐れ 残暑も続く', 'link': 'https://news.yahoo.co.jp/pickup/6475617?source=rss'},
{'title': 'ネットで自殺防げるか 研究の今', 'link': 'https://news.yahoo.co.jp/pickup/6475612?source=rss'},
{'title': '沈没の空母「赤城」81年ぶり撮影', 'link': 'https://news.yahoo.co.jp/pickup/6475623?source=rss'},
{'title': '米加州で車中生活者増加 住宅高騰', 'link': 'https://news.yahoo.co.jp/pickup/6475627?source=rss'},
{'title': 'シャインマスカット値ごろ 困惑も', 'link': 'https://news.yahoo.co.jp/pickup/6475621?source=rss'},
{'title': 'ハンバーグ入り薄皮パン なぜ販売', 'link': 'https://news.yahoo.co.jp/pickup/6475625?source=rss'},
{'title': '亀田和毅 井上尚弥に勝つ自信ある', 'link': 'https://news.yahoo.co.jp/pickup/6475630?source=rss'},
{'title': '大谷が今季終了か 背景を分析', 'link': 'https://news.yahoo.co.jp/pickup/6475624?source=rss'}]
以上のように、最新8本の記事の見出しとリンクを表示することができました。
7.グラフを描く
(1) y=sin(x)のグラフを描く
Open Interpreterとのやり取りは以下の通りです。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi, 2*np.pi, 1000)
y = np.sin(x)
plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.title('y = sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.grid(True)
plt.show()
ここで出力されたPythonコードを別のセルにコピーして実行すると、以下のグラフが表示されました。
(2) サインカーブが横に流れるGIF動画の作成
この後、以下のnote記事で実行したサインカーブが横に流れるGIF動画の作成を試してみましたが、沢山の画像を生成するために処理時間が長くなり、Google Colabに接続を切られてしまって、処理を完了することができませんでした。
なお、ChatGPTのAdvanced Data Analysisで作成したGIF画像は以下のとおりであり、これと同じものを作成しようとしていました。
8.英語論文を要約する
今回は、人気のオープンソースLLMのLlama 2の論文を要約してもらおうと思います。
(1) ネット上の論文PDFファイルの要約
Open Interpreterとのやり取りは以下の通りです。
import requests
from bs4 import BeautifulSoup
# Define the URL of the search engine
url = 'https://scholar.google.com/scholar?hl=en&as_sdt=0%2C5&q=Llama+2&btnG='
# Send a GET request
response = requests.get(url)
# Parse the HTML content of the page with BeautifulSoup
soup = BeautifulSoup(response.content, 'html.parser')
# Find all the links in the HTML
links = soup.find_all('a')
# Filter the links to get only those that point to a PDF
pdf_links = [link for link in links if '.pdf' in link.get('href', '')]
# If there are any PDF links, return the first one
if pdf_links:
pdf_link = pdf_links[0].get('href')
else:
pdf_link = None
pdf_link
'https://arxiv.org/pdf/2307.09288.pdf%C3%82%C2%A0'
import os
import PyPDF2
# Download the PDF
response = requests.get(pdf_link, stream=True)
with open('paper.pdf', 'wb') as out_file:
out_file.write(response.content)
# Open the PDF file in read-binary mode
pdf_file = open('paper.pdf', 'rb')
# Create a PDF file reader object
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
# Get the number of pages in the PDF
num_pages = pdf_reader.numPages
# Initialize a string to hold the text
text = ''
# Read the text from each page
for page in range(num_pages):
text += pdf_reader.getPage(page).extractText()
# Close the PDF file
pdf_file.close()
text
File "<stdin>", line 6, in <module>
ModuleNotFoundError: No module named 'PyPDF2'
pip install PyPDF2
import PyPDF2
# Download the PDF
response = requests.get(pdf_link, stream=True)
with open('paper.pdf', 'wb') as out_file:
out_file.write(response.content)
# Open the PDF file in read-binary mode
pdf_file = open('paper.pdf', 'rb')
# Create a PDF file reader object
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
# Get the number of pages in the PDF
num_pages = pdf_reader.numPages
# Initialize a string to hold the text
text = ''
# Read the text from each page
for page in range(num_pages):
text += pdf_reader.getPage(page).extractText()
# Close the PDF file
pdf_file.close()
text█
from PyPDF2 import PdfReader
# Open the PDF file
pdf = PdfReader('paper.pdf')
# Initialize a string to hold the text
text = ''
# Read the text from each page
for page in pdf.pages:
text += page.extract_text()
text
import googletrans
# Check the version of the library
googletrans.__version__
pip install googletrans==4.0.0-rc1
from googletrans import Translator
# Create a translator object
translator = Translator()
# Translate the text to Japanese
translation = translator.translate(text, dest='ja')
# Get the translated text
translated_text = translation.text
translated_text
import textwrap
# Split the text into chunks of 5000 characters each
chunks = textwrap.wrap(text, 5000)
# Initialize a string to hold the translated text
translated_text = ''
# Translate each chunk and add it to the translated text
for chunk in chunks:
translation = translator.translate(chunk, dest='ja')
translated_text += translation.text
translated_text
Output truncated. Showing the last 2000 characters.
efitformmlu-overforthe70bmodel(-0.9)に及ぼす影響の影響。他のデータセット(Lの選択肢)はデ
ータセット汚染の恩恵を受けているようには見えず、これらのデータセットの結果は簡潔になっています。76a.7モデル
カード表52は、モデルの詳細を要約するモデルカード(Mitchell et al。、2018; Anil et
al。、2023)を示しています。モデルの詳細モデル開発者メタAIバリエーションLlama
2には、パラメーターサイズの範囲-7b、13b、および70bがあります。入力モデル入力テキストのみ。出力モデルはテキスト
のみを生成します。モデルアーキテクチャllama 2 Isanauto-regressivelanguagemodelthatusEsanoptimized
Transformerアーキテクチャ。ThetunedversionsusususeSupervisedfine-tuning(SFT)Andreinforce-
Lectlearningは、人道的なフィードバック(RLHF)が有用性と安全性のために人道的な好みを調整します。モデル日付Llama
22023年1月から2023年7月の間に訓練されました。ステータスこれは、オフラインデータセットでトレーニングされた静的モ
ルです。チューニングモデルの将来のバージョンは、コミュニティのフィードバックを使用してモデルの安全性を向上させ
るため、リリースされます。ライセンスカスタム商用ライセンスは、ai.meta.com/ resources/ models-lamararies/
llama-downloads/
commentsintructionsを送信する場所です。、またはgithubリポジトリ(https://github.com/facebookresearc
h/llama/)で問題を開くことによって。意図された使用ユースケースLlama
2は、英語での商業および研究の使用を目的としています。調整されたモデルはアシスタントのようなチャットを目的として
ざまな自然言語生成タスクに適合させることができます。スコープ外では、適用される法律または規制(貿易コンプライア
ンセロウを含む)に違反するあらゆる方法で使用を使用します。useinlanguagestherthanengl
ish。Llama
2.の許容可能な使用ポリシーとライセンス契約によって禁止されている使用療法療法2.ハードウェアおよびソフトウェア(
客誘導ライブラリ、メタの研究者、およびプロデューションクラスターを使用しました。サードパーティのクラウドコンピ
ューティングで実行された微調整、注釈、およびvaluationwerealso。二酸化炭素排出前の事前削除は、タイプ
A100-80GB(350-400WのTDP)のハードウェアで累積33M
GPU時間の計算時間を使用しました。推定総排出量は539 TCO
2EQで、そのうち100%はメタの持続可能性プログラムによって相殺されました。トレーニングデータ(セクション2.1および
の概要Llama
2は、公的に利用可能なソースからの2兆トークのデータで事前に処理されました。微調整データには、公開されている命令
、およびwellasoveronemillionnewhuman-Annotatedexamplesが含まれています
。脱毛装置も微調整されたデータセットもメタユーザーデータを含まれません。データの新鮮さは、2022年9月のカットオフ
がありますが、一部のチューニングデータは2023年7月まで最近のものです。評価の結果は、事前トレーニングの評価を参照
クション3);安全性(セクション4)。倫理的な考慮事項と制限(セクション5.2)Llama
2は、使用するリスクを伴う新しいテクノロジーです。これまでに実施されたテストは英語で行われており、カバーされてお
ナリオを隠蔽することもできませんでした。これらの理由により、すべてのLLMS、Llama
2の潜在的な出力を事前に予測することはできず、モデルは場合によっては、場合によっては除外性を生成する場合がありま
したがって、llama
2の適切なアプリケーションを使用すると、開発者はモデルの特定のアプリケーションに合わせた安全性テストとチューニン
ta.com/llama/responsible-user-guideで入手可能な責任ある使用ガイドをご覧くだ
さい。表52:Llama 2のモデルカード。77'
上の日本語訳は、論文の最後のページを翻訳したもののようですが、あまり翻訳品質が良くありません。
この後、論文の要約を試みましたが、エラーが生じて、作業を完了することができませんでした。最後に以下の文章が表示されて、作業をストップしました。
かなり長い時間と手間をかけて作業を進めたのですが、結局、論文の要約は失敗に終わりました。
(2) 自分のパソコン内の論文PDFファイルの要約
次に、自分のパソコン内に保存した英語論文PDFファイルの要約を試してみます。
対象は上と同じLlama2の英語論文のPDFファイルです。
最初に、Google ColabにGoogleドライブをマウントし、このファイルをアップロードしておきます。
やり方は、以下のサイトを参考にしてください。ファイルパスをコピーする方法もこのサイトに書いてあります。
Open Interpreterとのやり取りは以下の通りです。
import pkg_resources
DESIRED_PACKAGES = ['PyPDF2', 'gensim']
missing_packages = []
for package in DESIRED_PACKAGES:
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))
missing_packages.append(package)
missing_packages
PyPDF2 is NOT installed
gensim (4.3.2) is installed
['PyPDF2']
pip install PyPDF2
from PyPDF2 import PdfFileReader
file_path = '/content/drive/MyDrive/llama2.pdf'
with open(file_path, 'rb') as file:
pdf = PdfFileReader(file)
text = ''
for page in range(pdf.getNumPages()):
text += pdf.getPage(page).extractText()
text
from PyPDF2 import PdfReader
file_path = '/content/drive/MyDrive/llama2.pdf'
with open(file_path, 'rb') as file:
pdf = PdfReader(file)
text = ''
for page in pdf.pages:
text += page.extract_text()
text
from gensim.summarize import summarize
summary = summarize(text)
summary
pip install bert-extractive-summarizer
from summarizer import Summarizer
model = Summarizer()
summary = model(text, min_length=60, max_length=500)
summary
Llama 2 is a language model that has been trained on a variety of data sources, including books, websites, an
other publicly available text. It is capable of generating human-like text based on the input it is given.
However, it is not perfect and can sometimes produce inaccurate or inappropriate responses. Therefore, it is
important for developers to thoroughly test Llama 2 before deploying it in any applications. The model has be
trained to avoid generating inappropriate content, but it is not 100% reliable in this regard. It is also
important to note that Llama 2 does not have the ability to access or retrieve personal data unless it has be
explicitly provided in the conversation. It is designed to respect user privacy and confidentiality. The mode
is also not capable of making decisions or taking actions in the real world. It can only provide information
and suggestions based on its training. Llama 2 is a powerful tool, but it is important to use it responsibly
and with understanding of its limitations.
Llama 2は、書籍、ウェブサイト、その他の公に利用可能なテキストなど、
さまざまなデータソースで訓練された言語モデルです
られた入力に基づいて人間のようなテキストを生成することができます。
しかし、完全ではなく、時には不正確または不 切な応答を生成することがあります。
したがって、開発者はアプリケーションにLlama 2をデプロイする前に、
十分にテストすることが重要です。
モデルは不適切なコンテンツを生成しないように訓練されてい の点で100%信頼性が
あるわけではありません。
また、Llama 2は、会話で明示的に提供された場合を除き、個人データにアクセス
したり取得したりする能力はありません。
ユーザーの バシーと機密性を尊重するように設計されています。
モデルはまた、現実世界での決定を下したり、行動を起こしたりす 能力はありません。
訓練に基づいて情報と提案を提供することしかできません。
Llama 2は強力なツールですが、その制限を理解し、責任を持って使用することが重要です。
一部抜けている文字もありますが、一応、英語論文を日本語で要約することができました。ただし、内容が機能制限に偏っており、要約としては、Llama 2の主要な機能や仕組み、性能評価などについても書いて欲しいところです。
9.日本地図を描く
(1) matplotlibとgeopandasで日本地図を描く
Open Interpreterとのやり取りは以下の通りです。
import pkg_resources
DESIRED_PACKAGES = ['matplotlib', 'geopandas']
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages])
not_installed = [pkg for pkg in DESIRED_PACKAGES if pkg not in installed_packages_list]
not_installed
['matplotlib', 'geopandas']
pip install matplotlib geopandas
import geopandas as gpd
# Load the world map data
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# Extract Japan map data
japan = world[world.name == 'Japan']
japan
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
japan.plot(ax=ax)
plt.show()
以上の結果を基に、以下のコードを別のセルに貼り付けて実行した結果、日本地図を描くことができました。
!pip install matplotlib geopandas
import geopandas as gpd
# Load the world map data
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# Extract Japan map data
japan = world[world.name == 'Japan']
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, 1)
japan.plot(ax=ax)
plt.show()
(2) japanmapを使用して日本地図を描く
次に、Pythonライブラリのjapanmapを使用して日本地図を描くことができるか試してみます。
DESIRED_PACKAGES = ['japanmap']
not_installed = [pkg for pkg in DESIRED_PACKAGES if pkg not in installed_packages_list]
not_installed
['japanmap']
pip install japanmap
from japanmap import picture
plt.imshow(picture())
plt.show()
以上の結果を基に、以下のコードを別のセルに貼り付けて実行した結果、japanmapパッケージを使用した日本地図を描くことができました。
!pip install japanmap
from japanmap import picture
plt.imshow(picture())
plt.show()
(3) 日本地図に政令指定都市をプロットする
Open Interpreterとのやり取りは以下の通りです。
pip install matplotlib geopandas japanize-matplotlib
import geopandas as gpd
# Load Japan map data
japan = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
japan = japan[japan.name == 'Japan']
japan
import pandas as pd
import requests
from bs4 import BeautifulSoup
# List of government-designated cities in Japan
cities = ['札幌市', '仙台市', '川崎市', '横浜市', '新潟市', '静岡市', '名古屋市', '京都市', '大阪市', '広島市'…
'北九州市', '福岡市', '熊本市', 'さいたま市', '千葉市', '神戸市', '直轄市', '浜松市', '堺市', '岡山市']
# Function to get latitude and longitude of a city
def get_lat_lon(city):
url = f'https://www.geocoding.jp/api/?v=1.1&q={city}'
res = requests.get(url)
soup = BeautifulSoup(res.content, 'html.parser')
lat = float(soup.find('lat').string)
lon = float(soup.find('lng').string)
return lat, lon
# Get latitude and longitude of each city
lat_lon = [get_lat_lon(city) for city in cities]
# Create a DataFrame
df = pd.DataFrame(lat_lon, columns=['Latitude', 'Longitude'])
df['City'] = cities
df█
cities = ['札幌市', '仙台市', '川崎市', '横浜市', '新潟市', '静岡市', '名古屋市', '京都市', '大阪市', '広島市'…
'北九州市', '福岡市', '熊本市', 'さいたま市', '千葉市', '神戸市', '浜松市', '堺市', '岡山市']
# Get latitude and longitude of each city
lat_lon = [get_lat_lon(city) for city in cities]
# Create a DataFrame
df = pd.DataFrame(lat_lon, columns=['Latitude', 'Longitude'])
df['City'] = cities
df
この後も色々と試みたようですが、結局、政令指定都市の緯度と経度を取得することはできませんでした。
ネットで検索すれば、簡単に入手できる情報ですが、無理にAPIを利用して情報を入手しようとして失敗したようです。
Open InterpreterがAPIを利用しようとするときは、情報の入手に失敗することが多いです。
Open Interpreterが政令都市の緯度と経度のデータを入手できなかったので、筆者がBingAIでこれらのデータを調べて、Open Interpreterに与えてみました。
# Import necessary libraries
import re
# Define the cities and their coordinates
cities = {
'横浜市': {'lat': '35°26′39″N', 'lon': '139°38′17″E'},
'大阪市': {'lat': '34°41′34″N', 'lon': '135°30′07″E'},
'名古屋市': {'lat': '35°10′48″N', 'lon': '136°54′18″E'},
'札幌市': {'lat': '43°03′51″N', 'lon': '141°20′49″E'},
'神戸市': {'lat': '34°41′04″N', 'lon': '135°10′25″E'},
'川崎市': {'lat': '35°31′48″N', 'lon': '139°41′55″E'},
'福岡市': {'lat': '33°35′21″N', 'lon': '130°24′01″E'},
'広島市': {'lat': '34°23′11″N', 'lon': '132°27′30″E'},
'京都市': {'lat': '35°00′41″N', 'lon': '135°45′06″E'},
'さいたま市': {'lat': '35°51′50″N', 'lon': '139°38′28″E'},
'千葉市': {'lat': '35°36′27″N', 'lon': '140°06′44″E'},
'新潟市': {'lat': '37°54′41″N', 'lon': '139°02′16″E'},
'浜松市': {'lat': '34°42′36″N', 'lon': '137°43′48″E'},
'堺市': {'lat': '34°34′26″N', 'lon': '135°28′21″E'},
'北九州市': {'lat': '33°52′12″N', 'lon': '130°49′27″E'},
'相模原市': {'lat': '35°33′46″N', 'lon': '139°22′29″E'},
'静岡市': {'lat': '34°58′38″N', 'lon': '138°23′11″E'},
'岡山市': {'lat': '34°39′57″N', 'lon': '133°55′21″E'},
'熊本市': {'lat': '32°47′20″N', 'lon': '130°44′29″E'},
'仙台市': {'lat': '38°15′50″N', 'lon': '140°52′12″E'}
}
# Function to convert DMS coordinates to decimal
def dms_to_decimal(dms):
degrees, minutes, seconds, direction = re.split('[°′″]', dms)
decimal = float(degrees) + float(minutes)/60 + float(seconds)/(60*60);
if direction in ('S','W'):
decimal *= -1
return decimal
# Convert the coordinates to decimal
for city, coords in cities.items():
coords['lat'] = dms_to_decimal(coords['lat'])
coords['lon'] = dms_to_decimal(coords['lon'])
cities
{'横浜市': {'lat': 35.44416666666666, 'lon': 139.63805555555555}, '大阪市': {'lat': 34.69277777777778, 'lon':
135.50194444444443}, '名古屋市': {'lat': 35.18, 'lon': 136.905},
※以下略
# Import necessary libraries
import pkg_resources
# Check if the necessary packages are installed
REQUIRED_PACKAGES = ['geopandas', 'matplotlib']
for package in REQUIRED_PACKAGES:
try:
dist = pkg_resources.get_distribution(package)
print('{} ({}) is installed'.format(dist.key, dist.version))
except pkg_resources.DistributionNotFound:
print('{} is NOT installed'.format(package))
geopandas (0.13.2) is installed
matplotlib (3.7.1) is installed
# Import necessary libraries
import geopandas as gpd
# Get the map of Japan
japan = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')).query('name == "Japan"')
japan
pop_est ... geometry
155 126264931.0 ... MULTIPOLYGON (((141.88460 39.18086, 140.95949 ...
[1 rows x 6 columns]
# Import necessary libraries
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# Check if Japanese font is available
fonts = [f.name for f in FontProperties().get_family()]
'IPAexGothic' in fonts
apt-get install -y fonts-ipafont-gothic
# Check if Japanese font is available
fonts = [f.name for f in FontProperties().get_family()]
'IPAexGothic' in fonts
# Import necessary libraries
import matplotlib.pyplot as plt
# Create a figure and a set of subplots
fig, ax = plt.subplots()
# Plot the map of Japan
japan.plot(ax=ax, color='white', edgecolor='black')
# Plot the cities
for city, data in cities.items():
ax.scatter(data['lon'], data['lat'], color='red')
ax.annotate(city, (data['lon'], data['lat']),
fontproperties=FontProperties(fname='/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf'))
# Show the plot
plt.show()
# Import necessary libraries
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# Get the map of Japan
japan = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')).query('name == \"Japan\"')
# Create a figure and a set of subplots
fig, ax = plt.subplots()
# Plot the map of Japan
japan.plot(ax=ax, color='white', edgecolor='black')
# Plot the cities
for city, data in cities.items():
ax.scatter(data['lon'], data['lat'], color='red')
ax.annotate(city, (data['lon'], data['lat']),
fontproperties=FontProperties(fname='/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf'))
# Show the plot
plt.show()
cities = {
'横浜市': {'lat': 35.44416666666666, 'lon': 139.63805555555555},
'大阪市': {'lat': 34.69277777777778, 'lon': 135.50194444444443},
'名古屋市': {'lat': 35.18, 'lon': 136.905},
'札幌市': {'lat': 43.064166666666665, 'lon': 141.34694444444446},
'神戸市': {'lat': 34.68444444444444, 'lon': 135.17361111111111},
'川崎市': {'lat': 35.53, 'lon': 139.69861111111112},
'福岡市': {'lat': 33.58916666666667, 'lon': 130.40027777777777},
'広島市': {'lat': 34.38638888888889, 'lon': 132.45833333333331},
'京都市': {'lat': 35.01138888888889, 'lon': 135.75166666666667},
'さいたま市': {'lat': 35.86388888888889, 'lon': 139.64111111111112},
'千葉市': {'lat': 35.6075, 'lon': 140.11222222222221},
'新潟市': {'lat': 37.91138888888889, 'lon': 139.03777777777776},
'浜松市': {'lat': 34.71, 'lon': 137.73},
'堺市': {'lat': 34.573888888888895, 'lon': 135.4725},
'北九州市': {'lat': 33.87, 'lon': 130.82416666666666},
'相模原市': {'lat': 35.562777777777775, 'lon': 139.37472222222223},
'静岡市': {'lat': 34.977222222222224, 'lon': 138.3863888888889},
'岡山市': {'lat': 34.66583333333333, 'lon': 133.92249999999999},
'熊本市': {'lat': 32.788888888888884, 'lon': 130.74138888888888},
'仙台市': {'lat': 38.263888888888886, 'lon': 140.87}
}
ここまでの情報を踏まえて、以下のコードを別のセルにコピーして実行したところ、政令指定都市をプロットした日本地図を表示することができました。
# Import necessary libraries
import geopandas as gpd
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
cities = {
'横浜市': {'lat': 35.44416666666666, 'lon': 139.63805555555555},
'大阪市': {'lat': 34.69277777777778, 'lon': 135.50194444444443},
'名古屋市': {'lat': 35.18, 'lon': 136.905},
'札幌市': {'lat': 43.064166666666665, 'lon': 141.34694444444446},
'神戸市': {'lat': 34.68444444444444, 'lon': 135.17361111111111},
'川崎市': {'lat': 35.53, 'lon': 139.69861111111112},
'福岡市': {'lat': 33.58916666666667, 'lon': 130.40027777777777},
'広島市': {'lat': 34.38638888888889, 'lon': 132.45833333333331},
'京都市': {'lat': 35.01138888888889, 'lon': 135.75166666666667},
'さいたま市': {'lat': 35.86388888888889, 'lon': 139.64111111111112},
'千葉市': {'lat': 35.6075, 'lon': 140.11222222222221},
'新潟市': {'lat': 37.91138888888889, 'lon': 139.03777777777776},
'浜松市': {'lat': 34.71, 'lon': 137.73},
'堺市': {'lat': 34.573888888888895, 'lon': 135.4725},
'北九州市': {'lat': 33.87, 'lon': 130.82416666666666},
'相模原市': {'lat': 35.562777777777775, 'lon': 139.37472222222223},
'静岡市': {'lat': 34.977222222222224, 'lon': 138.3863888888889},
'岡山市': {'lat': 34.66583333333333, 'lon': 133.92249999999999},
'熊本市': {'lat': 32.788888888888884, 'lon': 130.74138888888888},
'仙台市': {'lat': 38.263888888888886, 'lon': 140.87}
}
# Get the map of Japan
japan = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres')).query('name == \"Japan\"')
# Create a figure and a set of subplots
fig, ax = plt.subplots()
# Plot the map of Japan
japan.plot(ax=ax, color='white', edgecolor='black')
# Plot the cities
for city, data in cities.items():
ax.scatter(data['lon'], data['lat'], color='red')
ax.annotate(city, (data['lon'], data['lat']),
fontproperties=FontProperties(fname='/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf'))
# Show the plot
plt.show()
政令指定都市の名前が重なっていますが、一応、政令指定都市をプロットして、その名前を表示した日本地図を描くことができました。
10.ピカチュウの絵を描く
(1) PILでピカチュウを描く
Open Interpreterとのやり取りは以下の通りです。
from PIL import Image, ImageDraw
# Create a new image with white background
img = Image.new('RGB', (500, 500), 'white')
d = ImageDraw.Draw(img)
# Draw the body
body_ellipse = [(100, 200), (400, 400)]
d.ellipse(body_ellipse, fill='yellow')
# Draw the head
head_ellipse = [(200, 50), (300, 150)]
d.ellipse(head_ellipse, fill='yellow')
# Draw the eyes
eye_ellipse1 = [(220, 80), (240, 100)]
d.ellipse(eye_ellipse1, fill='black')
eye_ellipse2 = [(260, 80), (280, 100)]
d.ellipse(eye_ellipse2, fill='black')
# Draw the mouth
mouth_line = [(230, 120), (270, 120)]
d.line(mouth_line, fill='black', width=2)
# Draw the ears
ear_polygon1 = [(200, 50), (150, 10), (170, 70)]
d.polygon(ear_polygon1, fill='yellow')
ear_polygon2 = [(300, 50), (330, 10), (310, 70)]
d.polygon(ear_polygon2, fill='yellow')
# Draw the tail
tail_polygon = [(100, 300), (50, 250), (100, 200), (70, 200)]
d.polygon(tail_polygon, fill='yellow')
img.show()
このコードを別のセルにコピーして実行しても、何も表示されなかったので、以下のようにimg.show()をdisplay(img)に修正(ChatGPTにGoogle Colabで表示する方法を聞きました。)して、再度セルを実行したところ、ピカチュウの画像を表示することができました。
from PIL import Image, ImageDraw
# Create a new image with white background
img = Image.new('RGB', (500, 500), 'white')
d = ImageDraw.Draw(img)
# Draw the body
body_ellipse = [(100, 200), (400, 400)]
d.ellipse(body_ellipse, fill='yellow')
# Draw the head
head_ellipse = [(200, 50), (300, 150)]
d.ellipse(head_ellipse, fill='yellow')
# Draw the eyes
eye_ellipse1 = [(220, 80), (240, 100)]
d.ellipse(eye_ellipse1, fill='black')
eye_ellipse2 = [(260, 80), (280, 100)]
d.ellipse(eye_ellipse2, fill='black')
# Draw the mouth
mouth_line = [(230, 120), (270, 120)]
d.line(mouth_line, fill='black', width=2)
# Draw the ears
ear_polygon1 = [(200, 50), (150, 10), (170, 70)]
d.polygon(ear_polygon1, fill='yellow')
ear_polygon2 = [(300, 50), (330, 10), (310, 70)]
d.polygon(ear_polygon2, fill='yellow')
# Draw the tail
tail_polygon = [(100, 300), (50, 250), (100, 200), (70, 200)]
d.polygon(tail_polygon, fill='yellow')
display(img)
(2) ColabTurtleで円を描く
本当はピカチュウを描きたかったのですが、なかなか成功しないので、シンプルな円を描くことにしました。
import ColabTurtle.Turtle as turtle
# Initialize the drawing area
turtle.initializeTurtle(initial_speed=5)
# Set the color and shape of the turtle
turtle.color('black')
turtle.shape('turtle')
# Draw a circle by drawing many short lines
for _ in range(360):
turtle.forward(1)
turtle.right(1)
<IPython.core.display.HTML object>
このコードは上手く動作しなかったので、筆者が以下のように修正して、円を描くことに成功しました。
具体的には、色を黒から黄色に変え、多角形の辺の長さを1から10に変えました。
import ColabTurtle.Turtle as turtle
# Initialize the drawing area
turtle.initializeTurtle(initial_speed=5)
# Set the color and shape of the turtle
turtle.color('yellow')
turtle.shape('turtle')
# Draw a circle by drawing many short lines
for _ in range(36):
turtle.forward(10)
turtle.right(10)
11.大谷翔平選手の成績を分析する
import pandas as pd
# URL of Shohei Ohtani's stats
url = 'https://www.baseball-reference.com/players/o/ohtansh01.shtml'
# Read the stats into a DataFrame
ohtani_stats = pd.read_html(url, header=1)[0]
# Drop rows with NaN values
ohtani_stats = ohtani_stats.dropna()
# Display the stats
ohtani_stats
Empty DataFrame
Columns: [2023-09-03, LAA, @, OAK, L 6-10, DH, 3, 0, 0.1, 0.2, 0.3, 0.4, 0.5, 2, 2.1, 1, 0.6, 0.7, 0.8, 0.9,
0.10, 0.11, 2.2, -0.007, 0.56, 0.00%, 0.00, 0.064, Unnamed: 28, Unnamed: 29]
Index: []
url = 'https://www.baseball-reference.com/players/gl.fcgi?id=ohtansh01&t=b&year=0'
# Read the stats into a DataFrame
ohtani_stats = pd.read_html(url, header=1)[0]
# Drop rows with NaN values
ohtani_stats = ohtani_stats.dropna()
# Display the stats
ohtani_stats
Longest Hitting Streak 15 games
0 Longest On Base Streak 22 games
1 Most Games w/o HR 10 games
2 Most Games w/o RBI 5 games
3 Grand Slams 1 in 9 bases loaded PA and 8 AB
4 Go-Ahead Hits: 20
url = 'https://www.baseball-reference.com/players/gl.fcgi?id=ohtansh01&t=b&year=0'
# Read the stats into a DataFrame
ohtani_stats = pd.read_html(url, header=1)[0]
# Drop rows with NaN values
ohtani_stats = ohtani_stats.dropna()
# Display the stats
ohtani_stats
Longest Hitting Streak 15 games
0 Longest On Base Streak 22 games
1 Most Games w/o HR 10 games
2 Most Games w/o RBI 5 games
3 Grand Slams 1 in 9 bases loaded PA and 8 AB
4 Go-Ahead Hits: 20
同じコードの実行を何度も繰り返すループに陥ってしまったので、ここで処理を強制的にストップしました。
アクセスしているページは正しかったのですが、どこに必要なデータが掲載されているか認識できなかったようです。
また、この後、筆者がサイトから必要なデータの一覧表をExcelで取り出して与えてみましたが、やはり与えられた一覧表から必要な数値を上手く読み込むことはできませんでした。
なお、BingAIチャットに同じ質問をした回答を以下に掲載します。
具体的にグラフを表示してもらうことはできなかったのですが、BingAIチャットの回答は、かなり優秀だと思います。
12.まとめ
Open Interpreterは、ローカルでこそ本領を発揮できるのですが、勝手にシステムをいじられてしまう危険性があるため、パソコンに非常に詳しい人以外は、Google Colab又はDocker上で使用することをお勧めします。
ChatGPTのAdvanced Data Analysis(ADA)と比較してのOpen Interpreterのメリットとデメリットは以下の通りです。
〇 メリット
インターネットアクセスが可能
大容量のファイルを扱える(ADAは512MBまで)
pipコマンドで外部ライブラリを利用可能
〇 デメリット
作業品質がADAより劣る
Colab利用の場合、処理時間が長いと接続を切られる
GPT-4のAPIを利用する場合、コストが掛かる
インターネットアクセスが可能なのは便利ですが、データやAPIの場所を指定しても上手くデータを取得できない場合があり、自分で必要なデータを取得してアップロードする方が信頼性が高いです。
また、ネット上の情報収集は、BingAIが優秀です。筆者は、BingAIにネット上の情報をまとめさせて、その結果をChatGPTのADAにアップロードするという使い方をしています。
大容量のファイルを扱えるのも助かりますが、結局、APIのトークン数制限やColabの処理時間制限により、大きなファイルは扱いきれない場合が多いです。
ChatGPTは、外部ライブラリを使用する場合に規制がかかったり、pipコマンドが使えないためにインストールに手間が掛かったりするので、この点は、Open Interpreterの利用価値が大きいです。
作業品質は、全体的にADAの方が高いように感じます。Open Interpreterは、複雑な作業を依頼すると、延々と試行錯誤した上で失敗することが多いです。
(無料の)Google Colabを利用した場合、処理時間が長いと接続を切られるため、難しい作業はできません。
GPT-4のAPI利用で、複雑な作業を依頼すると、延々と試行錯誤するので、あっと言う間に大きなコストが掛かります。
本当は、Open Interpreterを利用して、もっと複雑なデータ分析をやってもらおうと思っていたのですが、試行錯誤を繰り返して、すぐに大きなコストが掛かってしまうので、怖くなってしまいました。
結論として、現時点では、ChatGPTのADAの方が信頼性が高く実用的なように感じます。ただし、pipコマンドで外部ライブラリが使用可能なのは魅力的で、この点を生かして、Open Interpreterにしかできない作業を見つけることが鍵だと思っています。