RのテーブルデータをPythonのpandasに書き換えたい
受付中
回答 0
投稿
- 評価
- クリップ 1
- VIEW 231
実現したいこと
- 下記に示すRのコードのコメントの行(addtionaltable)をPythonに書き換えたい
前提
- Python3を用いています。
- Rと変数の置き方が同じです。
- コードはレコメンドエンジンのコードです。
- for文を回すことだけはしたくないです。
書き換えたいRのコード
library(data.table)
submission = fread("data/sample_submission.csv", col.names=c("KaiinID", "AuctionID"))
submission = unique(submission[, .(KaiinID)], by = NULL)
auction = fread("data/auction.csv", col.names=c('AuctionID','ShouhinShubetsuID','ShouhinID', 'SaishuppinKaisuu','ConditionID', 'BrandID', 'GenreID','GenreGroupID', 'LineID','ColorID', 'DanjobetsuID', 'SankouKakaku', 'CreateDate'))
auction$'CreateDateOrder' = as.double(as.Date(substring(auction$CreateDate, 1, 10))-as.Date("2019-10-01"))
watchlist = fread("data/watchlist.csv", col.names=c('KaiinID', 'AuctionID','TourokuDate','SakujoFlag', ))
watchlist$TourokuDate = as.double(as.Date(substring(watchlist$TourokuDateOrder, 1, 10))-as.Date("2019-10-01"))
watchlist = merge(watchlist, auction, by = "AuctionID")
shudounyuusatsu = fread("data/shudounyuusatsu.csv", col.names=c('AuctionID','KaiinID','ShudouNyuusatsuDate', 'Kingaku', 'Suuryou','SokketsuFlag', 'SakujoFlag'))
shudounyuusatsu$ShudouNyuusatsuDateOrder = as.double(as.Date(substring(shudounyuusatsu$ShudouNyuusatsuDate, 1, 10))-as.Date("2019-10-01"))
shudounyuusatsu = merge(shudounyuusatsu, auction, by = 'AuctionID')
dateorder = -7
predict = rbind(
auction[, .(KaiinID, AuctionID, Point = 1 / (dateorder - CreateDateOrder) ** 0.5 / (dateorder - ShudouNyuusatsuDateOrder))]
, watchlist[SakujoFlag == 1, .(KaiinID, AuctionID, Point = 4 / (dateorder - CreateDateOrder) ** 0.5 / (dateorder - TourokuDateOrder))]
)
predict = merge(predict, submission, by = "KaiinID", all.y = T)
predict = predivt[, .(Point = max(Point)), .(KaiinID, AuctionID)]
predict = predict[order(-Point)]
addtionaltable = auction[CreateDateOrder == dateorder - 5, .(AuctionID = sample(AuctionID, 20))]
predict = predict[, .(Ranking = 1:20, AuctionID = c(AuctionID[!is.na(AuctionID)], addtionaltable$AuctionID)[1:20]), .(KaiinID)]
#additionaltableの箇所をpythonのpandasを用いて書き換えたい
書き換え後のPythonのコード例
import pandas as pd
from datetime import datetime
auction = pd.read_csv("data/auction.csv")
shudounyuusatsu = pd.read_csv("data/shudounyuusatsu.csv")
watchlist = pd.read_csv("data/watchlist.csv")
submission = pd.read_csv("data/sample_submission.csv")
submission = submission.KaiinID.unique()
submission = pd.DataFrame([list(submission)],index=["KaiinID"]).T
auction["CreateDateOrder"] = auction.CreateDate.map(lambda x: x[0:10]).map(
lambda x: datetime.strptime(x, '%Y-%m-%d'))-datetime.strptime('2019-10-01', '%Y-%m-%d')
watchlist["TourokuDateOrder"] = watchlist.TourokuDate.map(lambda x: x[0:10]).map(
lambda x: datetime.strptime(x, '%Y-%m-%d'))-datetime.strptime('2019-10-01', '%Y-%m-%d')
watchlist = pd.merge(watchlist, auction, on="AuctionID")
shudounyuusatsu["ShudouNyuusatsuDateOrder"] = shudounyuusatsu.ShudouNyuusatsuDate.map(lambda x: x[0:10]).map(
lambda x: datetime.strptime(x, '%Y-%m-%d'))-datetime.strptime('2019-10-01', '%Y-%m-%d')
shudounyuusatsu = pd.merge(shudounyuusatsu, auction, on='AuctionID')
order = -7
shudounyuusatsu["Point"] = 1/(order-shudounyuusatsu.CreateDateOrder.map(lambda x: x.days))**0.5/(
order-shudounyuusatsu.ShudouNyuusatsuDateOrder.map(lambda x: x.days))
watchlist["Point"] = 4/(order-watchlist.CreateDateOrder.map(lambda x: x.days)
)**0.5/(order-watchlist.TourokuDateOrder.map(lambda x: x.days))
predict = pd.concat([shudounyuusatsu[["KaiinID", "AuctionID", "Point"]],
watchlist[watchlist.SakujoFlag == 1][["KaiinID", "AuctionID", "Point"]]])
predict = predict.groupby(["KaiinID", "AuctionID"]).max()
predict = predict.reset_index()
predict = pd.merge(submission, predict, how="left")
predict = predict.sort_values(
["Point", "KaiinID", "AuctionID"], ascending=[False, True, True])
addtionaltable = auction[auction.CreateDateOrder.map(
lambda x:x.days) == order-5].sample(n=20, random_state=0)
addtionaltable = kari["AuctionID"]
#ここからの記述方法がわからない
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正の依頼
aokikenichi
2020/07/02 18:14
データも提示し、加工したい内容を端的に書いた方が回答確率が高まるかと思います。
途中経過を読み解くのが困難なため回答しにくいのかと。