🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

3658閲覧

PythonのPandasで複雑な条件で抽出した後に計算して値を出す。

norimaro_python

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2019/11/15 14:50

編集2019/11/15 15:24

前提・実現したいこと

PythonでCSVのある値を条件で絞り込み計算したい。! イメージ説明

Pythonで企業の財務データーを分析したく、表を整理しています。

■■表の説明
・Excelには日本の3,000社程のデータが過去3年分の四半期ごとで売上、営業利益など入っています。

■■やりたい事
・Pythonのpandasを使いDataFrameを使い、各会社ごとの過去3年分の「売上高」年平均成長率(CAGR)を出したいです。

(例:添付写真)

[企業名]"極洋"の [期末]の最新の日付"2019/03/31"の [売上高] 256,151

[企業名]"極洋"の [期末]の最古の日付"2017/03/31"の [売上高] 236,561

計算し年平均成長率を算出したいです。

下記のようにPandasで出したいです。
極洋 4.06%
日本水産 5.82%
マルハ 2.78%

*注意: 各会社で決算期が違うので、[期末]の最新の日付と[期末]の最古の日付は、それぞれ各社違います。
*CAGRの計算方法
(N年度の売上 ÷ 初年度の売上) ^ {1 ÷ (N – 1)} – 1

例: 極洋のCAGR
(256151000000 / 236561000000 ) ^ {1 ÷ (3 – 1)}-1
=0.04058 (4.06%)

■■その他
こちらいろいろpandasのvalue.sort関数など試したのですが、わからず質問させて頂きました。
お手数おかけしますが、よろしくお願い致します。
Excelでやればできそうですが、pandasでマスターしたく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/11/15 14:59

極洋の例は間違っていませんか? 極洋の2017年から2019年のCAGRを計算するのであれば、sqrt2(256151/236561)でだいたい1.0415くらいになります。 特殊な定義を用いているのであれば、数式を記載して頂いた方が良いと思います。 また、初年度と最終年度の間だけ計算すれば良いのでしょうか?
norimaro_python

2019/11/15 15:26

申し訳ありません。こちら例の数字が間違っておりましたので、計算しました。また計算式も記載しました。 初年度と最終年度の間だけ計算すれば大丈夫なのですが、各社初年度と最終年度の日付がバラバラなので、どのようにpandasで表現していいかわからず悩んでおりました。お手数おかけします。
guest

回答1

0

ベストアンサー

こんな感じでしょうか。もう少し短い書き方はあるかもしれませんが、とりあえず定義通り素直に。

python

1import io 2import pandas as pd 3 4dummy_data = """ 5会社名,期末,売上高 6A,20190331,103 7A,20180331,102 8A,20170331,101 9B,20130331,15 10B,20110331,11 11B,20120331,12 12C,20150531,1000 13C,20140531,100 14C,20130531,10000 15C,20120531,10 16""" 17 18df = pd.read_csv(io.StringIO(dummy_data), parse_dates=["期末"]) 19group = df.groupby("会社名") 20min_idx = group["期末"].idxmin() 21max_idx = group["期末"].idxmax() 22min_data = df.iloc[min_idx].set_index("会社名") 23max_data = df.iloc[max_idx].set_index("会社名") 24ns = max_data["期末"].dt.year - min_data["期末"].dt.year 25result = (max_data["売上高"] / min_data["売上高"]) ** (1 / (ns - 1)) - 1 26print(result) 27""" => 28会社名 29A 0.019802 30B 0.363636 31C 9.000000 32dtype: float64 33"""

投稿2019/11/15 16:14

hayataka2049

総合スコア30935

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

norimaro_python

2019/11/16 12:40

こちら解説有難うございました。大変わかりやすく、有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問