Как я могу заставить GHC выдавать предупреждение для данной функции?

Чтобы выбрать строки, значение столбца которых равно скаляру, some_value, используйте ==:

df.loc[df['column_name'] == some_value]

Чтобы выбрать строки, значение столбца которых в итерабельном, some_values, используйте isin:

df.loc[df['column_name'].isin(some_values)]

Объединить несколько условий с &:

df.loc[(df['column_name'] == some_value) & df['other_column'].isin(some_values)]

Выбрать строки, значение столбца не равно some_value, используйте !=:

df.loc[df['column_name'] != some_value]

isin возвращает булевскую серию, поэтому для выбора строк, значение которых не в some_values, отмените булевскую серию используя ~:

df.loc[~df['column_name'].isin(some_values)]

Например,

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
                   'B': 'one one two three two two one three'.split(),
                   'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
#      A      B  C   D
# 0  foo    one  0   0
# 1  bar    one  1   2
# 2  foo    two  2   4
# 3  bar  three  3   6
# 4  foo    two  4   8
# 5  bar    two  5  10
# 6  foo    one  6  12
# 7  foo  three  7  14

print(df.loc[df['A'] == 'foo'])

дает

     A      B  C   D
0  foo    one  0   0
2  foo    two  2   4
4  foo    two  4   8
6  foo    one  6  12
7  foo  three  7  14

Если у вас несколько значений вы хотите включить, поместить их в список (или, в более общем плане, любой итерабельный) и использовать isin:

print(df.loc[df['B'].isin(['one','three'])])

дает

     A      B  C   D
0  foo    one  0   0
1  bar    one  1   2
3  bar  three  3   6
6  foo    one  6  12
7  foo  three  7  14

Примечание, однако, если вы хотите сделать это много раз, более эффективно сначала сделать индекс, а затем использовать df.loc:

df = df.set_index(['B'])
print(df.loc['one'])

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
one  foo  6  12

или, чтобы включить несколько значений из использования индекса df.index.isin:

df.loc[df.index.isin(['one','two'])]

дает

       A  C   D
B              
one  foo  0   0
one  bar  1   2
two  foo  2   4
two  foo  4   8
two  bar  5  10
one  foo  6  12
3
задан Dan Burton 18 January 2019 в 16:22
поделиться

2 ответа

Это то, для чего нужны типы. Тип, который вы используете для времен, должен отражать ограничения, которые вы хотите наложить на значения, которые он представляет.

Например, вы можете обернуть UTCTime примерно так:

newtype UTCTimeMicroseconds = UTCTimeMicroseconds { picos :: UTCTime }

microsecondsFromPicos :: UTCTime -> UTCTimeMicroseconds
microsecondsFromPicos = ...

getCurrentTimeMilliseconds :: IO UTCTimeMicroseconds
getCurrentTimeMilliseconds = microsecondsFromPicos <[110]gt; getCurrentTime

И использовать новый тип везде в вашем пакете, чтобы вам понадобилось время, чтобы иметь это свойство.

Если вы хотите быть строгими в этом, не экспортируйте конструктор UTCTimeMicroseconds, поэтому единственный способ получить одно из этих значений - использовать microsecondsFromPicos, который реализует ваше требование.

Это делает любое неправильное использование ошибкой, а не предупреждением, но в большинстве случаев это именно то, что вам нужно.

Если вы хотите использовать UTCTime с полным разрешением, или вам просто все равно, вы можете просто использовать этот тип как обычно. Будет легко найти места в вашей кодовой базе, где это произойдет, потому что они будут только местами, где используется UTCTime.

0
ответ дан Moss Prescott 18 January 2019 в 16:22
поделиться

Я не могу придумать способ сделать это прямо сейчас, но я думаю, что ближайший вы можете получить что-то вроде:

  • создать новый пакет my-time, который зависит от [112 ]
  • реэкспорт ваших функций прокладок с комментариями, например

    import qualified Data.Time as Time
    {-# WARNING getCurrentTime "you should prefer getCurrentTimeMicroseconds" #-}
    getCurrentTime = Time.getCurrentTime
    
  • , зависит от my-time в ваших пакетах

очевидно, что это не дает вам способа принудительно импортировать Data.Time.getCurrentTime, а не , и еще менее удовлетворительно, когда код, который вы хотите подобрать, находится в Prelude или base. [ 1113]

0
ответ дан jberryman 18 January 2019 в 16:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: