Кто разобрался с датами?

13.11.2018, 22:03:19
GTPSE
Да и вообще подскажите как преобразовать в число значения начинающиеся с запятой (то есть когда ноль отброшен).

Привет.
Если ДатаФрейм был создан с использованием "pd.read_csv(…)", то в качестве одной из опций можно прописать " decimal=',' ", чтобы при чтении файла запятая воспринималась как знак десятичной дроби.

GTPSE
df[A].apply(lambda x: x.replace(',', '0.', inplace=True)).astype('float64')

df[A].replace(',', '0.', inplace=True)).astype('float64')
Плюс я не уверен в том, что этот код корректен.
Опция "inplace=True" заставляет метод ".replace(…)" (как и любой другой метод, впрочем) возвращать None, к которому метод ".astype(…)" явно неприменим (как во втором варианте), а в первом варианте "lambda x: …" всё время возвращает None.

Сам же метод ".astype(…)" не заменяет исходные данные и, насколько помню, даже не имеет своей inplace-опции.

GTPSE
df[A].replace(',', '0.' …
Здесь есть риск нарваться на случай, когда число в файле таки имеет не ноль перед запятой, можно вместо "5,233" нечаянно получить "50.233"…
Кое-где уже так попадался =)
Отредактировано 13.11.2018, 22:08:59
14.11.2018, 13:23:03
GTPSE
Друзья добрый день (коллегами назвать язык не поворачивается, до коллег мне ещё учиться и учиться), только скачал данные и сразу возник вопрос.
Подскажите, а кто с датами разобрался? В subs_csi только день и месяц, в subs_features почему то 2001 - 2002 года, а subs_bs_consumption снова только день и месяц. Может год вообще отбросить и работать только с месяцами? С другой стороны у нас нет гарантий, что данные идут с начала года, точнее я уверен что они идут не с начала года. Как тогда объединять данные?

В описании таблиц есть расшифровка:

В таблице содержится информация об объеме потребления сервисов (голос, данные на всех сотах) абонентами, прошедшими опрос CSI за последний год до опроса.
16.11.2018, 07:10:23
Mantrid
Если ДатаФрейм был создан с использованием "pd.read_csv(…)", то в качестве одной из опций можно прописать " decimal=',' ", чтобы при чтении файла запятая воспринималась как знак десятичной дроби.

Это сработало, быстро и элегантно, большое спасибо! Записал в свой блокнотик данную фишку.

Mantrid
Здесь есть риск нарваться на случай, когда число в файле таки имеет не ноль перед запятой, можно вместо "5,233" нечаянно получить "50.233"…
Кое-где уже так попадался =)

Я тоже этого боялся, поэтому на городил большую функцию с регулярками и проверками с соответствующей производительностью. Сейчас с радостью её удалил.
Отредактировано 16.11.2018, 07:10:48
16.11.2018, 12:45:53
Даты и время в 3-х форматах:

ДД.ММ
ДД.ММ.ГГ
ДД.ММ ЧЧ:ММ:СС

Т.к. мы отталкиваемся от проведенных опросов, а все опросы шли с 1 по 31 мая (судя по базе csi), то все остальные даты являются более ранними. Но более ранние даты ограничены 1-им годом. В формате ДД.ММ.ГГ есть всего два "года" — это 01-й и 02-й. Соответственно, опрос проводился в 02-м (возможно, он условный, но это не важно). Поэтому везде, где не указан год, все месяцы с января по май относятся к 02-у году, а с июня по декабрь к 01-у.
17.11.2018, 11:19:29
leoza
Даты и время в 3-х форматах:

ДД.ММ
ДД.ММ.ГГ
ДД.ММ ЧЧ:ММ:СС

Т.к. мы отталкиваемся от проведенных опросов, а все опросы шли с 1 по 31 мая (судя по базе csi), то все остальные даты являются более ранними. Но более ранние даты ограничены 1-им годом. В формате ДД.ММ.ГГ есть всего два "года" — это 01-й и 02-й. Соответственно, опрос проводился в 02-м (возможно, он условный, но это не важно). Поэтому везде, где не указан год, все месяцы с января по май относятся к 02-у году, а с июня по декабрь к 01-у.

Здесь скорее 11 и 12 года )) Если судить по провалам трафика в выходные дни. Либо 17 и 18 года. Что тоже под провалы подходит. Данные свежие!
Отредактировано 17.11.2018, 11:22:28
17.11.2018, 16:08:31
С датами действительно мало что понятно, смотрим что имеем:

Дата опроса CSI абонента

subs_csi_train.CONTACT_DATE.value_counts()
12.05    241
8.05     195
13.05    191
17.05    165
9.05     164
11.05    161
4.05     158
14.05    157
2.05     155
3.05     150
5.05     150
10.05    144
22.05    143
30.05    141
1.05     141
28.05    141
7.05     141
21.05    140
27.05    138
16.05    136
6.05     134
24.05    132
29.05    123
25.05    120
26.05    110
19.05    100
18.05     98
23.05     79
31.05     79
20.05     68
15.05     27

Первое число точно не месяц (> 12) и не год (> current year), значит это день, значит вторая месяц. ок за какой тогда год эти данные?

Дата расчета абонентских показателей (за последний год до опроса)

subs_features_train.SNAP_DATE.value_counts()
01.05.02    4200
01.04.02    4172
01.03.02    4105
01.02.02    4044
01.01.02    4001
01.12.01    3968
01.11.01    3922
01.10.01    3891
01.09.01    3845
01.08.01    3797
01.07.01    3755
01.06.01    3711

Скорее всего день месяц год, ок значит речь где-то о 2001-2002 годах, данные на первое число месяца, в этом есть смысл (мне мтс всегда отчет за прошлый месяц присылает в начале следующего). И судя по комментариям год самого опроса 2002.

Месяц расчета показателей (за последние три месяца до опроса)

subs_bs_consumption_train.MON.value_counts()
01.05    381257
01.04    362017
01.03    349270

судя по всему это день и месяц, год такой же как в subs_csi_train.

Ну вот что-то и прорисовывается, я одного не пойму, это так организаторы осознанно сделали чтобы мы вместо того чтобы думать как решать задачу разбирались с тем как зашифрованы данные, или просто не подумали что это не очевидно :(
Можно же было по человечески отформатировать
Отредактировано 17.11.2018, 16:25:15
06.12.2018, 17:22:17
GTPSE
Да и вообще подскажите как преобразовать в число значения начинающиеся с запятой (то есть когда ноль отброшен). Пробовал так:

df[A].apply(lambda x: x.replace(',', '0.', inplace=True)).astype('float64')

и так:

df[A].replace(',', '0.', inplace=True)).astype('float64')

Оба варианта не работают.
Блин, я думаю это базовые знания Python'а ))))Прояви креативность)))
06.12.2018, 17:37:05
Alex Emelyanov
С датами действительно мало что понятно, смотрим что имеем:
Ну вот что-то и прорисовывается, я одного не пойму, это так организаторы осознанно сделали чтобы мы вместо того чтобы думать как решать задачу разбирались с тем как зашифрованы данные, или просто не подумали что это не очевидно :(
Можно же было по человечески отформатировать

Да, можно же просто забить на этот столбец?
06.12.2018, 18:16:56
Да уж куда человеческее. На самом деле данные вообще в идеальном виде: все отнормированно, не надо ничего парсить (ну кроме этих дат), а граали - это вообще рояли (из тех которые в кустах) )))
07.12.2018, 03:34:42
GTPSE
Игорь Чепелев
Меня можешь называть Коллегой :)
я тоже не очень

с датами вообще не заморачиваюсь

мб потом надо будет с ними что то делать (например брать только ближайшие значения к моменту опроса)
имхо для начала сторительства моделей даты ввобще ненужны :)

Добрый день, да я увидел что даты идут с 06.2001 по 05.2002 и месяца не пересекаются.
В данный момент я не могу решить другую задачу, я хотел посчитать количество потребленных услуг каждым абонентом в месяц (трафик и голос). Но я не смог преобразовать строку ',000155737994479018044122229174329417025' в float, и соответственно просуммировать данные значения.

Как вы вышли из этой ситуации? Просто откинули лишние знаки? Сразу хочу сказать что я здесь только ради опыта и на ваши деньги не претендую :)
Всё проще:
pd.read_table('../dataset/train/subs_csi_train.csv',sep=';', decimal=",")


Зарегистрируйтесь или войдите, чтобы оставить сообщение.