2016-12-11 17 views
1

私は初心者でPythonを学んでいます。私は非常に大規模なデータセットを持っています - これをより速く実行するためにコードを最適化するのに問題があります。大規模なデータフレームでの日付減算の最適化 - パンダ

私の目標は、(私の現在のコードはなく、遅い動作します)、このすべてを最適化することである。その減算の結果と新しい列を作成します

  1. 減算2つの日付の列

  2. 元の2列を削除する

  3. すべてを高速で実行します

ランダム見つかっ: はメソッド読み込む初期ファイルを変更することを考える... https://softwarerecs.stackexchange.com/questions/7463/fastest-python-library-to-read-a-csv-file

私が持っているparse_dates = CSVファイルを読み込むときに真 - そう、これは減速だろうか?私は50以上の列を持っていますが、1つのタイムスタンプ列と1年間の列しかありません。

このコラム:

(これは1996年1月1日のような形式に変換する必要があります?)を差し引い
  saledate 
1   3/26/2004 0:00 
2   2/26/2004 0:00 
3   5/19/2011 0:00 
4   7/23/2009 0:00 
5   12/18/2008 0:00 

  YearMade 
1   1996 
2   2001 
3   2001 
4   2007 
5   2004 

現在のコード:

mean_YearMade = dfx[dfx['YearMade'] > 1000]['YearMade'].mean() 

def age_at_sale(df, mean_YearMade): 
    ''' 
    INPUT: Dateframe 
    OUTPUT: Dataframe 
    Add a column called AgeSale 
    ''' 
    df.loc[:, 'YearMade'][df['YearMade'] == 1000] = mean_YearMade 
    # Column has tons of erroneous years with 1000 
    df['saledate'] = pd.to_datetime(df['saledate']) 
    df['saleyear'] = df['saledate'].dt.year 
    df['Age_at_Sale'] = df['saleyear'] - df['YearMade'] 
    df = df.drop('saledate', axis=1) 
    df = df.drop('YearMade', axis=1) 
    df = df.drop('saleyear', axis=1) 
    return df 

どんな最適化のトリックも大いに評価されるでしょう...

+0

あなただけの一年と最大効率を気にしている場合、年に読むために速くなり作られ、今年は整数として販売して日時を避けるため、一般的にはそれが適切なパンダの日付時刻と日付時刻を運ぶために良いでしょう話します。しかし、ここで効率をあまりにも一般化するのは、テストするサンプルデータなしでは難しいです。 – JohnE

+0

saledateとYearMadeは実際のデータです - それを考えると500,000行になります。年間で作られた年と年が整数で売られていることはどういう意味ですか?私はsaledateを最初に文字列として変換し、各ラフをループし、年を除いてすべてを切り取り、次にintに変換しなければならないと言っていますか?次に、通常の年形式(1995年)の他の列等。)? – jhub1

+0

基本的にええ。理想的には4年間の列を整数として読み込み、すべての日時オーバーヘッドを保存します。しかし、それはあなたがこのCSVを何度も読んでいるということです。一度に読み込んでHDFなどで保存しているのであれば、おそらくdatetimeとして保存するのが理にかなっています(ただし、年自体を整数として保存すると速度は向上するかもしれませんが、どれくらいの頻度であるかわかりません)。これはすべて実際にあなたの特定のケースに依存し、あなただけが最良の方法を決めることができます。 – JohnE

答えて

1

subを減算に使用し、条件で使用するとlocmaskとし、dfx['YearMade'] > 1000を使用してみることができます。列saleyearも作成する必要はありません。

dfx['saledate'] = pd.to_datetime(dfx['saledate']) 
mean_YearMade = dfx.loc[dfx['YearMade'] > 1000, 'YearMade'].mean() 

def age_at_sale(df, mean_YearMade): 
    ''' 
    INPUT: Dateframe 
    OUTPUT: Dataframe 
    Add a column called AgeSale 
    ''' 
    df.loc[df['YearMade'] == 1000, 'YearMade'] = mean_YearMade 
    df['Age_at_Sale'] = df['saledate'].dt.year.sub(df['YearMade']) 
    df = df.drop(['saledate', 'YearMade'], axis=1) 
    return df 
+0

解析日をオンまたはオフにする必要がありますか? – jhub1

+0

'parse_dates = True'を使用している場合は、datetimeindexが必要です。ですから、 'parse_dates = [position_of_column_with_dates]'に変更してみてください。 'parse_dates = [3]'(4列目。なぜなら、Pythonは '0'から数えているからです)。しかし、 'pd.to_datetime'や' parse_dates'がもっと速いのかどうかは分かりません。 – jezrael

+0

parse_dates = [6,9]でテストされています。これは製造年月日と販売日です。これは純粋に日付を解析する時間であり、それ以外は何もありません。 [111.0sで完了] 今すぐpd.to_datetimeを試してみましょう... – jhub1

関連する問題