なぜ人々はSQLよりもパンダを好むのですか?


69

1996年からSQLを使用しているので、偏見があるかもしれません。MySQLとSQLite 3を広範囲に使用しましたが、Microsoft SQL ServerとOracleも使用しました。

Pandasで行った操作の大部分は、SQLで簡単に実行できます。これには、データセットのフィルタリング、表示する特定の列の選択、値への関数の適用などが含まれます。

SQLには、オプティマイザーとデータ永続性があるという利点があります。SQLには、明確で理解可能なエラーメッセージもあります。パンダは、時にはそれが単一使用するのに適切なのですここでやや不可解なAPI、持っている[ stuff ]あなたが必要とする、他の回[[ stuff ]]、そして時にはあなたが必要です.loc。パンダの複雑さの一部は、非常に多くの過負荷が進行しているという事実から生じています。

だから、私はパンダがとても人気がある理由を理解しようとしています。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ショーンオーウェン

回答:


51

本当の最初の質問は、なぜ純粋なSQL抽象化よりもDataFrame抽象化の方が生産性が高いのかということです。

TLDR; SQLは(人間の)開発およびデバッグプロセスを対象としていませんが、DataFrameはそうです。

主な理由は、DataFrame抽象化により、冗長で判読できないネストを回避しながら、SQLステートメントを構築できるためです。ネストされたルーチンを記述し、それらをチェックアウトするためにコメントアウトし、コメントを外すパターンは、1行の変換に置き換えられます。replで(Sparkでも)行ごとに自然に物事を実行し、結果を表示できます。

テーブルに新しい変換(文字列の変形列)を追加し、それによってグループ化し、いくつかの集計を行う例を考えてみましょう。SQLはかなりいものになります。パンダはこれを解決できますが、真のビッグデータまたは特定のパーティションに関してはいくつかの点が欠けています(最近改善された可能性があります)。

DataFramesは、パンダを使用して一部のSQLプランナーにまったくレンダリングされない場合でも、SQLルーチンに対する高レベルAPIとして表示する必要があります。

-

おそらくこれについて多くの技術的な議論をすることができますが、以下のユーザーの視点を検討しています。

SQLとは異なり、Pandasのデータ操作に関してさらに多くの質問が表示される単純な理由の1つは、定義により、データベースを使用するという意味でSQLを使用することと、最近では非常に単純にデータのビットを必要とすることです1つのタスク(.csv、Web APIなどから)。これらの場合、データベースのロード、保存、操作、および抽出は実行できません。

ただし、ユースケースがPandasまたはSQLを使用することを正当化する場合を考えると、間違いではありません。多くの反復的なデータ操作タスクを実行し、出力を保持する場合は、最初にSQLを使用することをお勧めします。私が見てきた理由から、多くのユーザーがこれらの場合でもSQLを使用しない理由は2つあります。

まず、パンダがSQLより優れている主な利点は、それがより広いPythonユニバースの一部であるということです。つまり、一気にデータをロード、クリーン、操作、視覚化できることを意味します(パンダを介してSQLを実行することさえできます...)。もう1つは、非常に単純に、あまりにも多くのユーザーがSQLの機能の程度を知らないということです。すべての初心者は、データをDBから次の場所に移動する手段として、SQLの「抽出構文」(SELECT、FROM、WHEREなど)を学習します。いくつかは、より高度なグループ化と反復構文のいくつかを拾うかもしれません。しかし、その後は、専門家(DBA、データエンジニアなど)に連絡するまで、知識にかなりの大きな隔たりがある傾向があります。

tl; dr:多くの場合、ユースケース、利便性、またはSQLの機能の範囲に関する知識のギャップが原因です。


2
他の技術分野の多くの人々が行ごとにデータを処理することに慣れている場合、SQLが主に設定ベースになっていることが大きな役割を果たすと思います。また、そのデータがパンダに大部分がデータだけでなく、別のSQLエンジンは、あなたの勤務時間中に切ると変更している場合は、高速乱暴に迷惑得ることができる機能で構築されたさまざまなサポートを検討
デイブ・

3
私はそれが実行可能ではないとは言いません。パンダのデータフレームにデータを取得できる場合は、おそらくPostgreSQL DBに押し込むことができます。しかし、1つと完了した場合、おそらくあなたが節約するよりも多くの労力と時間です。
jpmc26

2
一部のETLアプローチはプログラマ中心の決定であると思われることに同意します。つまり、データを操作し、この「完全な」ペイロードをデータベースに提示することを好みます。ただし、ご指摘のとおり、複数のSQLクエリを介して実行できる場合は、追加のプログラムレイヤーは不要です。まさに私が最近直面したこと。OPとあなたの答えが示すように、「昔ながらの」またはDBA中心の人々がそれを見て、なぜSQLでそれをしないのかということかもしれません(いくつかの単純なクエリでさえ!)。とはいえ、パンダは非常に多様なデータセットに対して非常に強力であることがわかりました。
SaltySub2

1
@SaltySubプログラムレイヤーからSQLに物事をシフトすることのポイント:それは公正なポイントであり、完全に有効である可能性がありますが、アプリケーションロジックをSQLプロシージャに埋め込む限り、独自の頭痛の種をもたらす可能性があります。
電気ヘッド

1
@ElectricHead私は、正しいバランスが必要であることに同意します。一連のSQLクエリでタスクを適切に実行できれば、間違いなく簡単で効率的になります。逆に、あなたが示すように、SQLプロシージャなどに大量のロジックを配置する必要がある場合、パンダを強く考慮する必要があります。特に上記のように、異なるデータベースフレーバーを使用している場合-SQL構文の違いは非常に困難になります。
-SaltySub2

29

これら2つのことの適用に重複がある限り、これはリンゴとオレンジを比較しています。

pandasは、汎用プログラミング言語であるPythonで実装されたデータ分析ツールキットです。SQLは、リレーショナルデータをクエリするためのドメイン固有の言語です(通常は、SQLite、MySQL、Oracle、SQL Server、PostgreSQLなどが例になっているリレーショナルデータベース管理システムで使用されます)。

SQLの意味

  • ワークロードに適している場合とそうでない場合があるRDBMS *のデータを操作する(たとえ小さなSQLiteデータベースであっても)
  • データベースドメインの知識(エンドユーザー、開発者、および/または管理者として。私がよく見かける「SQLの方が速い」という提案は、大幅に単純化しすぎている)
  • SQLを効果的に使用する際に、特に単純なデータの単純なレポートを作成するのではなく、データ分析などの特殊なアプリケーションで重要でない学習曲線を克服する。

* SQLはドメイン固有であるため、NoSQLデータベースなどのリレーショナルデータベースに代わるますます一般的な選択肢との関連性が低下しているという事実を強調する価値があります。これは、データの保存および構造化方法の根本的な変化を表しており、実際に達成することを目的としたSQL標準化の開発のように、データにアクセスする一般的な一般的な方法はありません。

一方、Python(pandasはかなり「pythonic」なのでここでは当てはまります)は、さまざまなバックグラウンドの人々が柔軟にアクセスできます。これは、「スクリプト言語」として、機能言語として、および完全な機能を備えたOOP言語として使用できます。パンダには視覚化機能とデータソースの相互運用性が組み込まれていますが、ワークフローでPythonができることは何でも自由に組み込むことができます(ほとんどの場合)。科学的なPythonエコシステムは膨らみJupyter Notebookなどの優れたツールと、matplotlibnumpypandasが構築する)などの重要なscipyライブラリが含まれています。パンダのデータ分析の重要な要素はR-インスピレーションを受けており、一般的に、データベースにすべてを入れてSQLで分析を書くのにR(またはおそらくパンダが増えている!)

パンダはSQLより優れているとは言いませんが、SQLはドメイン固有のツールであり、パンダは巨大で柔軟でアクセス可能なエコシステムの一部です。私は地理空間データシステムを使用していますが、その中でリレーショナルデータベースは大きな部分を占めており、SQLは強力で不可欠なツールです。ただし、パンダは私の日常ツールキットの不可欠な部分ではありませんが、SQLはしばしばデータのフェッチに委ねられます-おそらくいくつかの前処理で-したがって、パンダでそれを行うことができます。


1
これが唯一の真の答えであり、選ばれたものでなければなりません。SQLとPandaは2つの異なるものであり、人々がどのような比較をしようとしているのか理解できません。
18

どこかからデータを取得してマッサージし、いくつかの数字を吐き出すコードのような何かを書くというエンドユーザーの視点だと思います。私はまったく驚いていません。私は、データアナリストが古いものの、さもなければ目立たないOracleデータベースをどのように提示したか、それ何であるか、そしてデータを取り出すことはもちろん、それへの接続方法についての最初のアイデアすら持っていなかった経験ありました。これは技術に対する基本的な理解の欠如を裏付けていると思います。実際に、SQLのスコープがどれだけ早く誤解されるかを強調するために、実際に少し追加しました。
電気ヘッド

NoSQLの状況とは無関係であることについて、少しお尋ねします。たとえば、PostgreSQLがJSONストレージで行った進歩を考えてみましょう。
jpmc26

私は言葉を慎重に選択しようとしました。多くのことをうまく行っているにもかかわらず、PostgreSQLは依然としてRDBMSです(SQL Serverはグラフをサポートしているにもかかわらず)。しかし、私はまだ良い点であるため、タッチの言葉遣いを緩和しました。いくつかのクロスオーバーがあり、重要なことに、一部のNoSQLシステムにはSQL APIが存在します。それはあるけれども、SQLは普遍的な言語ではありませんし、すべてのデータがリレーショナルに構成されていないクロスオーバー。
電気ヘッド

パンダで可能なSQLのすべてを実行できると思います。SQLは柔軟ではありませんが、非常に最適化されています。
メディア

22

まず、パンダはそれほど人気が​​ありません。パンダとSQLの両方を使用します。最初に、タスクを理解しようとします。SQLで実行できる場合、パンダよりも効率的であるため、SQLを好みます。大きなデータ(10,000,000 x 50)で作業してみてください。SQLとパンダの両方でいくつかのgroupby操作を実行してみてください。理解できます。

パンダを使用すると便利です。列の値を配列に分割し、その上で何かを行う(その配列から一部の値のみを選択するなど)現在、この種のタスクはSQLでコーディングするのが比較的困難ですが、パンダはタスクを容易にします。


この非効率性はパンダ特有のものですか?私はC#でかなりのメモリ内データ操作を行いましたが、メモリに適合し、ワンショット(つまり、データの変更に応じてインデックスをインクリメンタルに更新する必要がない)であれば、非常に簡単で効率的です。
CodesInChaos

パンダは高速よりも便利であることを意図していますが、それを正しく使用すると高速になれないというわけではありません。最終的に、データベース内のデータでSQLクエリを実行することは魔法ではありません-それは何かのようなリソースを必要とします、それは(あなたが正しくやれば!) 。パンダなどでパイプラインを正しく取得する(たとえば、データをすべてメモリにロードするのではなくストリーミングデータを送信する)ことで、いくつかの取り組みがどれだけ成功するかが決まります。
電気ヘッド

@CodesInChaos SQL VSパンダのこの答えはあり- qr.ae/TUIpzE。そこでは、パンダを使用する利点と欠点が説明されています。
アンキットセス

12

私は、私のSQLを知っていても、すべての場合に(私の場合は)Rのdplyr(言語、必ずしもツールではない)を使用する人の1人です。

Pandas / dplyr / data.tableパイプラインで見られる主な利点は、操作がアトミックであり、上から下まで読むことができることです。

SQLでは、何が起こっているかを完全に把握するために、ジャンプ(何が要約され、何が結合され、どのように左、内部、右、フィルターが適用されますか)全体を解析する必要があります。

Pandas et alでは、パイプラインの各ステップは自己完結型であり、入力データで何かを実行し、出力データを返します。この順次プロセスにより、各操作の状態が明確に定義されているため、クエリレベル。

そして、はい、あなたはWITHステートメントなどを行うことができますが、それははるかに多くのコードを必要とし、パイプに比べてどのオブジェクトが使用されているか明確ではありません。


6

私はPandas / Pythonにはかなり慣れていませんが、SQLServer DBA、アーキテクト、管理者などとして20年以上の経験があります。私はPandasが大好きです。居心地の良いSQLの世界。

RDBMSの方が優れている理由: RDBMSの利点は、クエリ速度とデータ読み取り操作を最適化した長年の経験です。印象的なのは、書き込み速度の最適化と高度な同時アクセスの管理の必要性のバランスを取りながら、これを実行できることです。これらの追加のオーバーヘッドは、単純なシングルユーザーのユースケースに関しては、パンダにとって有利な場合があります。しかし、それでも、ベテランのDBAは、書き込み速度よりも読み取り速度について高度に最適化されるようにデータベースを調整できます。DBAは、データストレージの最適化、戦略的なディスクページサイズ設定、ページの充填/パディング、データコントローラーおよびディスクパーティション戦略、最適化されたI / Oプラン、メモリ内データのピン留め、事前定義された実行プラン、インデックス付け、データ圧縮などを活用できます、 などなど。多くのパンダ開発者から、彼らはそうではないという印象を受けます そこにある深さを理解する。私が通常思うのは、Pandas開発者がこれらの最適化を必要とするほど大きなデータを持っていない場合、どれだけの時間を節約できるかを評価しないということです。RDBMSの世界にはこれを最適化する30年の経験があるため、大規模なデータセットの生の速度が必要な場合、RDBMSに勝るものはありません。

Python / Pandasが優れている理由: とは言っても、速度がすべてではなく、多くのユースケースでは駆動要因ではありません。データをどのように使用しているか、データが共有されているかどうか、処理の速度に関心があるかどうかによって異なります。一般に、RDBMSはデータ構造がより厳格であり、データの形状をより決定的にするために開発者に負担をかけます。パンダを使用すると、ここでもっとゆったりできます。また、これが私のお気に入りの理由です。あなたは真のプログラミング言語を使用しています。プログラミング言語は、高度なロジックをデータに適用するための柔軟性を無限に提供します。もちろん、SQLには近づかない、モジュールとサードパーティフレームワークの豊富なエコシステムもあります。1つのコードベースで生データからWebプレゼンテーションまたはデータの視覚化に至るまでのすべての方法を使用できることは非常に便利です。また、はるかにポータブルです。Pythonを実行できるのは、公共のノートブックを含め、ほぼすべての場所です。これにより、結果の範囲を広げて、より迅速に人々に到達できます。データベースはこれに優れていません。

私のアドバイス? ますます大きなデータセットに移行していることに気付いたら、思い切ってRDBMSがどのように役立つかを学ぶ必要があります。5分から2秒に調整された、100万行のマルチテーブル結合、合計集計クエリを確認しました。あなたのツールベルトでこの理解を持つことは、あなたをより良く丸みのあるデータサイエンティストにするだけです。あなたは今日パンダですべてを行うことができるかもしれませんが、いつかRDBMSが最良の選択である割り当てを持っているかもしれません。


5

パンダにできること、SQLにはできないこと

  1. df.describe()
  2. プロット、例えば df['population'].plot(kind='hist')
  3. 機械学習アルゴリズムのトレーニングにデータフレームを直接使用する

パンダができること、SQLもできることを知らなかった

  1. csvへのエクスポート:df.to_csv('foobar.sv')。これは、Excelで作業したいビジネスオーナーに何かを見せたい場合に重要です。そしてdf.to_excel、同様にあります。しかし、SQLでできることはSELECT a,b,a+b INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;(ありがとう、vy32!)

1
いいね これらのほとんどは、SQLで実装できる関数のように見えますが。(SQLには直接CSVエクスポートがあります。)
vy32

CSVにエクスポートするクエリを送信してください。(一部のSQLベースのデータベースでこれを行うツールしか知りませんが、クエリを見たことがないので、これがSQL仕様の一部であるとは思いません)
Martin Thoma

1
SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;dev.mysql.com/doc/refman/8.0/en/select-into.html-vy32 14
14:17

どうもありがとうございました!私は家にいるときに答えを調整すると思います:
マーティン・トーマ

確実なこと。ファイルはクライアントではなく、SQLサーバーに保存されることに注意してください。
vy32

3

これらの回答に記載されていない唯一のことは、SQLの使用方法にも依存するということです。たとえば、arcpyを取り上げます。なんらかの理由で、arcpy.da関数はどれも多数実行機能を備えていません。他のほとんどすべてのpython SQLライブラリが行うので、これは本当に奇妙です。arcpy.da関数のWhereステートメントも約120文字に制限されています。これは本質的に、データベースで比較的多くのことをしようとしている場合は、選択したarcpy.da関数を複数回呼び出し、そのたびにwhereステートメントを変更することです。このプロセスを高速化するために使用できるいくつかのトリックがあります-たとえば、データセットのチャンクを反復処理できます-しかし、文字通りこれらのトリックはすべて、1つのarcpy.daを使用するよりもはるかに遅くなります。searchcursorを使用してテーブル全体をpandasデータフレームにロードし、pandas、numpyを使用してテーブルを操作します。データが本当に巨大な場合は暗くします。ここで強調する必要があるのは、この場合、パンダが少し速くなるだけではないということです。うんざりするほど高速です。それは非常に速いので、私はそれを早くやらないことで文字通り自分自身を笑っていました。パンダを使用すると、1つのスクリプトの実行時間が1時間を大幅に短縮しました-これが3.5時間から1.5時間から文字通り12分へのジャンプであったかどうかは忘れています。とても速いので、早くやらないと文字通り自分を笑っていました。パンダを使用すると、1つのスクリプトの実行時間が1時間を大幅に短縮しました-これが3.5時間から1.5時間から文字通り12分へのジャンプであったかどうかは忘れています。とても速いので、早くやらないと文字通り自分を笑っていました。パンダを使用すると、1つのスクリプトの実行時間が1時間を大幅に短縮しました-これが3.5時間から1.5時間へのジャンプだったのを忘れてしまいました-文字通り12分に。

注意すべきことの1つは、SQLを使用してこれを実行できたとしても、学習するのにかなり時間がかかったことです。AccessのSQL専用の操作を習得する必要があります-このスクリプトのデータは最終的にここにあります-Accessのsqlは、実際にこれを実行しようとしていたときに必要なほど堅牢ではありませんでした-またはすべてのデータをsqlite3データベースに書き込み、そこで操作してからAccessに配置する必要がありました。これにより、同様のパフォーマンス結果が得られたかもしれませんが、将来、スクリプトを修正するのが難しくなります。

ええ、時にはパンダもあり、自由に使えるsqlオプションを使用するよりも厳密に優れています。私がSQLで行う必要があったすべては、パンダの関数で行われました。必要に応じて、PandaでSQL構文を使用することもできます。パンダとSQLを同時に使用しない理由はほとんどありません。

パンダとnumpyについてもう1つ言いたいのは、これらのライブラリはどちらも本質的にセットベースのアプローチであることです。これらのライブラリを使用してデータフレームとシリーズビルドをループできますが、そのような構造のデータを変更するのは非常に難しいので、純粋にこれらのライブラリの両方で、より効率的なコード-セットベース-を書くことになります行う。セットベースのアプローチの使用にレールロードされていない場合に「ガイド」されることは、SQLで経験したことではありません。

パンダで言及するのを忘れていたもう一つの大きなこと。お金。Pandasは、多くのデータサイエンスの仕事で使用方法を知ってほしいツールです。私が見てきたほとんどすべてのデータサイエンスの仕事は、データベース管理タイプの仕事以上のものを支払っています。私が気づいたこの唯一の例外はデータエンジニアリングです。パンダは一見してより多くのお金を稼ぐように見えます。


5
おそらく、現代の仕事に関しては、問題を解決するためのアプローチとは対照的に、履歴書に正しい流行語があるということです(言われた流行語を比較的早く学べると仮定すると)。これは、問題解決よりも流行語の方が重要だということです。Xの問題解決にテクノロジーA、B、Cの学習と使用が必要な場合、その逆ではありません。ほとんどの開発チームは今流行語の流行と流行のために物事を粉砕し、あなたが言った流行語を知らなかった/使用しなかったので問題解決を二次的な、または「古い学校」の事として考えます。
-SaltySub2

1
私の経験では、@ ElectricHeadは、pythonでsqlを使用する独自の関数を作成している場合、pandas / numpyを使用するよりも、カーソルを誤って使用し、不適切なクエリを作成する方が簡単です。すべてのsqlモジュール/ライブラリが同じになっているわけではないことを忘れないでください。私の場合、arcpy.da.SearchCursorsなどでは、奇妙な制限のために、大量のレコードを効率的に処理する良い方法はありません。pandas / numpyを使用すると、物事を行うための1つの良い方法になります。それは、Pythonを使用するときに必要なことです。

1
ああ、[OK。python dbapi実装を介したホームスパンSQLパイプラインとnumpy / pandasの使用を意味しますか?その場合、ええ、そこから私からの議論はありません。注意が必要です!それはあなたが明らかにセット操作を理解する必要がある対単純なSQLとして私に読みましたが、データベースクライアントから愚かなクエリを実行すると非常に迅速にそれを見つけるでしょう。
電気ヘッド

1
@Steveはい、パンダなどのループ内の要素を動的に変更しようとする人を止めることはありません:)SQLを理解することは、パンダで効果的に作業するのに役立つと思います(ただし、いくつかの概念の類似性を隠しているわけではありません)。
電気ヘッド

1
@Steve Indeedパンダもパワフルです...私の不満の1つは、自分自身を含む開発者と管理の両方であり、ソリューションの評価と傾向の追跡に十分な時間を費やしていないことです(自己/会社を促進するためにお金が関係しています)。しかし、無駄のないプロトタイピング/ mvpであっても、スケーリングのための適切な基盤を築く必要があります。SQL、noSQL、およびPandas ...はすべて、さまざまな段階で適切なタスクおよびプロジェクトを実行する目的を持っています。過去1年間に加えて、無駄のないプロトタイプ/ mvp用のnoSQLは、1つ以上の点で確かに私を助けてくれました。SQLはそのために行き過ぎていたでしょう。
SaltySub2

3

私は多くの時系列ベースのデータ分析を行うと付け加えたいと思いましたが、これを行うにはパンダresamplereindexメソッドが非常に貴重です。はい、SQLでも同様のことができます(DateDimension日付関連のクエリを支援するためにテーブルを作成する傾向があります)が、パンダのメソッドがはるかに使いやすいと感じています。

また、他の人が言ったように、私のモデリングの残りはPythonで行われ、Web呼び出しまたはCSVファイルがよくあります。


2

私は自分の経験に基づいてこの質問に答えようとします。他の答えとは対照的に、私Sqlはディープラーニングとビッグデータ関連のものを好みます。それには多くの理由があります。ここに見られるよう

Pandasは、表形式データで直感的で強力かつ高速なデータ分析エクスペリエンスを提供します。ただし、Pandasは実行スレッドを1つしか使用せず、すべてのデータを一度にメモリ内に格納する必要があるため、ギガバイト規模をはるかに超えるデータセットに適切に拡張できません。

SQLエンジンは通常、CRUD操作を容易にするために、ツリーなどのデータ構造にキーまたは特別な列を保持します。このデータ構造は、データベース内のすべてのデータのステータスを保持します。すべてのデータに同時にアクセスできないため、これはパンダが行うことはできません。一方、read_csvで使用されるチャンクパラメーターを使用しても、一部の操作は実行できません。例として、メモリが対応できない大きなデータセットに対して直接バッチ操作を行うことはできません。データセット全体に依存する他のタスクには、追加のコーディングが必要です。これらはすべて、単純なクエリを使用するだけで、追加のコーディングなしでSqlで処理できます。単純なSql操作は、メモリを心配することなく使用されます。B+

もう1つの違いは、SQLのCRUD操作は、パンダでは不可能なさまざまな承認ポリシーを使用して分散して適用できることです。

どちらが良いかを言うことを意図したものではなく、すべてあなたのタスクに依存します。大規模な計算にはSqlが、小さな計算にはパンダが好きです。

パンダにはないものが他にもありますが、これは後で説明するデータ抽出の高速な経験にとって本当に重要です。今のところ、こちらをご覧ください


1

Ppyは、pypyterノートブック形式のpythonがニューラルネットワーク領域のデータサイエンティストが使用する最も人気のあるツールボックスであるため、より人気があります。Pythonは「the」言語になりつつあります。SQLバックエンドを使用することもできますが、パンダでのみSQLにバインドすることはできません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.