質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.52%

  • Python

    7953questions

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

  • pandas

    580questions

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

Pandasで関数を隔週で適用させる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 145

pinocookie

score 11

現在以下のようなデータフレームを持っています。

日付(DatatimeIndex) 商品名 売上数 月平均売上数
2017-01-01 ... 12 10.2
2017-01-02 ... 22 10.2
2017-01-03 ... 18 10.2
2017-01-04 ... 16 10.2
2017-01-05 ... 7 10.2
2017-01-06 ... 11 10.2

このデータフレームに売上数を引数に取った関数を適用させたいんですが、常に計算させるわけではなく、週に4回や6回など計算させたいと考えています。

もし日付が累積で計算されて行くのであれば、以下のように計算できると思うんですが、質問としては

if day_total % 7*4 == 0: 
    df.apply(...)
    ...

①DatetimeIndexのメソッドで累積の日にちを算出するような機能
②たとえば28日ごとに関数を適用させる方法

以上の2点に関してご意見をいただければと思っています。

宜しくお願いします。

追記:
例:28日ごとに関数を適用させたいイメージとしては以下になります。

def func(row):
    return row['売上数'] + row['月平均売上数']
日付(DatatimeIndex) 商品名 売上数 月平均売上数 28日ごとに関数適用
2017-01-01 ... 12 10.2 0
2017-01-02 ... 22 10.2 0
2017-01-03 ... 18 10.2 0
... ... ... ... 0
2017-01-27 ... 16 10.2 0
2017-01-28 ... 7 10.2 ここのみfuncを適用
2017-01-29 ... 11 10.2 0

上記のようなイメージです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

強引な手段ですが一応解決しました。

まず最初に日にちを累積で数えた列を作成しました。

df['day'] = np.arange(0, len(df.index), 1) + 1

その後に任意の日にち間隔(例:28日)で関数を適用させる為に、以下のような関数を作成しました。

def test(row):
    if row['day'] % 28 == 0:
        return test2(row)
    else:
        return 0

def test2(row):
    return row['売上数量'] - row['月平均売上数']

そしてこれらの関数をapplyメソッドを用いる事で、28日ごとに関数を適用させました。

df['apply_28d'] = df.apply(test, axis=1)

強引なやり方なので、さらにスマートな解放があれば教えていただきたいです。

宜しくお願いします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

resample()メソッドを使うといいかと思います。
コードイメージは以下です。

df.resample('28D')['売上数'].apply(func)


resampleメソッドは、対象のデータを引数を単位にまとめるものです。28Dは28日単位を意味します。10日単位であれば10D、月でまとめる場合はMを使うことになります。
28Dは暦日基準なので、営業日がよければ28Bになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/07 11:31

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

    resampleメソッドで任意の時間でグルーピングできんるんですね!
    ただこの方法だと28日でグルーピングしているので、28日ごとの計算にできるんでしょうか。自分でやったところ28日間まとめての計算になってしまいました。

    詳しくは追記しておきますね。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    SQLでの複合条件での集計について

    いま月ごとに3回以上エントリーしたユーザがどれほどいるか画面を作成してみようと思っているのですが、sqlのGROUP BYとHAVINGを使用したら複合条件なので月とユーザ2つで絞

  • 解決済

    同一のテーブル内で、異なるデータを抽出したい

    前提・実現したいこと 商品管理データベースのようなものを検討しています。 例として、ガンプラ屋さんのデータを作成してみました。 テーブルganpura ID,name,

  • 解決済

    データ取得ロジック周りを簡潔に書く方法

    変更履歴テーブルからデータを取得して表示するプログラムを書き、動作上は正常動作していますが、 より簡潔に書く方法があればご指導いただければ幸いです。 言語はsalesfor

  • 解決済

    mysql where句 複数テーブルで複数条件の摘出

    お世話になります。  mysqlを二日前から勉強し始めた超初心者です。  まったくの初心者なのですが、自力での解決が難しそうなので、教えて下さい。  <現状の問題点>

  • 解決済

    insert into でインサートできない

    df内のweekの後ろの1文字を除去して、dfのmonthにinsertしたいのですが、 エラーは出ないのにデータを確認するとインサートされていません。 --行追加 alter

  • 解決済

    PHPのforeach文について

    前提・実現したいこと echo $course_name_array[2]; の下のforeach文を正常に動作させたいです 発生している問題・エラーメッセージ Notice:

  • 解決済

    MySQLのカラムに収めるデータ形式について

    お世話になります。 勉強しながらPHPとMySQLの連携で小規模なウェブサイトを作ったりしている身ですが、新しくアプリを設計するとき、表題にある「カラムに収めるデータの形式」につい

  • 解決済

    SQLの結合について

    テーブルA |A1|A2| |1 |3| |2||4| テーブルB |B1||B2| |1||2| |3||NULL| 1.SQL SELECT A1,A2,B1,B2  FRO

同じタグがついた質問を見る

  • Python

    7953questions

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

  • pandas

    580questions

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