web-dev-qa-db-ja.com

Pandasデータフレームで線形回帰のために日付を浮動小数点数に変換する

OLS線形回帰がパンダでうまく機能するためには、引数は浮動小数点でなければならないようです。次の形式のcsv(「gameAct.csv」と呼ばれます)から始めます。

date, city, players, sales

2014-04-28,London,111,1091.28

2014-04-29,London,100,1100.44

2014-04-28,Paris,87,1001.33

...

売上が日付にどのように依存するかについて線形回帰を実行したい(時間が進むにつれて、売上はどのように動くのか?)。以下の私のコードの問題は、日付が浮動小数点値ではないことにあるようです。パンダでこのインデックス作成の問題を解決する方法について助けていただければ幸いです。

私の現在の(機能していませんが、コードをコンパイルしています):

import pandas as pd

from pandas import DataFrame, Series

import statsmodels.formula.api as sm

df = pd.read_csv('gameAct.csv')

df.columns = ['date', 'city', 'players', 'sales']

city_data = df[df['city'] == 'London']

result = sm.ols(formula = 'sales ~ date', data = city_data).fit()

都市の値を変えると、R ^ 2 = 1の結果が得られますが、これは間違っています。また、index_col = 0, parse_dates == True'の定義でdataframe dfを試みましたが、成功しませんでした。

このようなcsvファイルを読み込んで、日付の基本的な回帰を実行したり、より一般的な時系列分析を行ったりするためのより良い方法があると思います。ヘルプ、例、およびリソースをいただければ幸いです。

上記のコードで、(特定の都市の)日付インデックスを配列に変換すると、この配列の値は次の形式になることに注意してください。

'\xef\xbb\xbf2014-04-28'

すべての非販売パラメータに対してAIC分析をどのように生成しますか? (たとえば、売上は日付と都市に最も直線的に依存する結果になる可能性があります)。

12
Quetzalcoatl

この種の回帰では、通常、日付またはタイムスタンプをデータの開始からの整数の日数に変換します。

これはうまくトリックを行います:

df = pd.read_csv('test.csv')
df['date'] = pd.to_datetime(df['date'])    
df['date_delta'] = (df['date'] - df['date'].min())  / np.timedelta64(1,'D')
city_data = df[df['city'] == 'London']
result = sm.ols(formula = 'sales ~ date_delta', data = city_data).fit()

この方法の利点は、回帰に関係する単位(日数)が確実であるのに対し、自動変換では暗黙的に他の単位が使用され、線形モデルに紛らわしい係数が作成される可能性があることです。また、異なる時間に開始された複数の販売キャンペーンのデータを組み合わせて回帰分析することもできます(キャンペーン開​​始日数の関数としてのキャンペーンの有効性に関心があるとします)。日の傾向を測定することに興味がある場合は、1月1日を0として選択することもできます。自分の0の日付を選択すると、すべてを制御できます。

Statsmodelsがパンダの時系列をサポートしているという証拠もあります。これを線形モデルにも適用できる場合があります: http://statsmodels.sourceforge.net/stable/examples/generated/ex_dates.html

また、簡単な注意:私が投稿したサンプルコードのように、csvから列名を直接自動的に読み取ることができるはずです。あなたの例では、csvファイルの最初の行のコンマの間にスペースがあり、「日付」のような列名になっていることがわかります。スペースを削除すると、csvヘッダーの自動読み取りが機能するはずです。

24
Tom Q.

Statsmodelsの詳細についてはわかりませんが、 この投稿 はPythonのすべての日付/時刻変換をリストしています。それらは常に1対1であるとは限らないので、私が頻繁に使用したリファレンスです;-)

0
Wyrmwood
_df.date.dt.total_seconds()
_

日付のデータ型が_datetime64[ns]_の場合、 dt.total_seconds() が機能するはずです。これは秒数(フロート)を返します。

0
dkorsakas