私は、過去数年にわたる店舗のパネルデータと2.5年の期間にわたるパネルデータに基づいて、過去のカグルチャレンジのデータを使用します。各観測には、特定の店舗日付の顧客数が含まれます。各店舗日付について、私の目的は、過去60日間にこの店舗を訪れた平均顧客数を計算することです。パンダで過去60日間の平均をスピードアップ
以下は、まさに私が必要とするコードです。しかし、それは永遠に続く - それはc.800kの行を処理するために夜がかかるだろう。私は同じ目的をより速く達成するための巧妙な方法を探しています。
私は、店舗ID(店舗)、日付および顧客数(「得意先」)という関連変数を使用して、初期データセットの5つの観測を含めました。
注:反復の各行について
- 、Iは、例えば、の代わり.LOC使用して結果を書き込み終わりますrow ["Lagged No customers"] "行"はセルに何も書き込まないためです。私はなぜそれが事実であるのだろうか。
- 私は通常、 "apply、axis = 1"を使って新しい列を設定します。私は "適用"は、各行の計算が同じ行レベルの値を使用して列全体で行われるときにうまく機能することを発見しました。しかし、私は "適用"機能がどのようにこの問題に必要な行であるかを知ることができません。これまで私が見てきた唯一の例外は "diff"ですが、これはここでは有用ではありません。
ありがとうございます。
サンプルデータ:動作しますが、信じられないほど遅いです
pd.DataFrame({
'Store': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1},
'Customers': {0: 668, 1: 578, 2: 619, 3: 635, 4: 785},
'Date': {
0: pd.Timestamp('2013-01-02 00:00:00'),
1: pd.Timestamp('2013-01-03 00:00:00'),
2: pd.Timestamp('2013-01-04 00:00:00'),
3: pd.Timestamp('2013-01-05 00:00:00'),
4: pd.Timestamp('2013-01-07 00:00:00')
}
})
コード:あなたの小さなサンプルデータが与えられ
import pandas as pd
import numpy as np
data = pd.read_csv("Rossman - no of cust/dataset.csv")
data.Date = pd.to_datetime(data.Date)
data.Customers = data.Customers.astype(int)
for index, row in data.iterrows():
d = row["Date"]
store = row["Store"]
time_condition = (d - data["Date"]<np.timedelta64(60, 'D')) & (d > data["Date"])
sub_df = data.loc[ time_condition & (data["Store"] == store), :]
data.loc[ (data["Date"]==d) & (data["Store"] == store), "Lagged No customers"] = sub_df["Customers"].sum()
data.loc[ (data["Date"]==d) & (data["Store"] == store), "No of days"] = len(sub_df["Customers"])
if len(sub_df["Customers"]) > 0:
data.loc[ (data["Date"]==d) & (data["Store"] == store), "Av No of customers"] = int(sub_df["Customers"].sum()/len(sub_df["Customers"]))
は、なぜあなたは 'data'の最初の100行を取るか、次のよう
あなたはローリングデータのグラフを表示することができますか? ( 'data [:100]') –
@Alexander 'time_condition'は、適切な時間ウィンドウを選択するマスクに過ぎず、その後sub_dfを作成するために使用されます。 @David ZIは、出力を待って夜を過ごさないために100行を取るが、目的はデータセット全体の出力を持つことです –
その場合、コードサンプルの '[:100]'をあなたの質問。結局のところ、あなたのサンプルコードは、あなたが持っている問題を説明することになっています - この場合は、遅すぎます。大したことではありませんが、何か他の理由で再度編集してしまうと、それを取り除くことも考えられます。 –