Python - анализ данных с набором диафрагмы, поиск значений в двух параметрах [дубликат]

На этот вопрос уже много замечательных ответов, но с тех пор, как эти ответы были опубликованы, появилось много замечательных библиотек.

Я рассмотрю несколько вариантов использования сетевых операций и a решение или два для каждого.

ReST over HTTP

Обычно Json может быть XML или что-то еще

Полный доступ к API

Предположим, вы пишете приложение что позволяет пользователям отслеживать цены акций, процентные ставки и курсы обмена валют. Вы найдете Json API, который выглядит примерно так:

http://api.example.com/stocks                       //ResponseWrapper object containing a list of Srings with ticker symbols
http://api.example.com/stocks/$symbol               //Stock object
http://api.example.com/stocks/$symbol/prices        //PriceHistory object
http://api.example.com/currencies                   //ResponseWrapper object containing a list of currency abbreviation
http://api.example.com/currencies/$currency         //Currency object
http://api.example.com/currencies/$id1/values/$id2  //PriceHistory object comparing the prices of the first currency (id1) to the second (id2)

Retrofit from Square

Это отличный выбор для API с несколькими конечными точками и позволяет объявлять конечные точки REST вместо того, чтобы кодировать их отдельно, как с другими библиотеками, такими как ион или волейбол. (веб-сайт: http://square.github.io/retrofit/ )

Как вы используете его с API финансов?

build.gradle

Добавьте эти строки на уровень вашего модуля buid.gradle:

implementation 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit library, current as of September 21, 2017
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' //gson serialization and deserialization support for retrofit, version must match retrofit version

FinancesApi.java

public interface FinancesApi {
    @GET("stocks")
    Call> listStocks();
    @GET("stocks/{symbol}")
    Call getStock(@Path("symbol")String tickerSymbol);
    @GET("stocks/{symbol}/prices")
    Call> getPriceHistory(@Path("symbol")String tickerSymbol);

    @GET("currencies")
    Call> listCurrencies();
    @GET("currencies/{symbol}")
    Call getCurrency(@Path("symbol")String currencySymbol);
    @GET("currencies/{symbol}/values/{compare_symbol}")
    Call> getComparativeHistory(@Path("symbol")String currency, @Path("compare_symbol")String currencyToPriceAgainst);
}

FinancesApiBuilder

public class FinancesApiBuilder {
    public static FinancesApi build(String baseUrl){
        return new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()
                    .create(FinancesApi.class);
    }
}

FinancesFragment snippet

FinancesApi api = FinancesApiBuilder.build("http://api.example.com/"); //trailing '/' required for predictable behavior
api.getStock("INTC").enqueue(new Callback(){
    @Override
    public void onResponse(Call stockCall, Response stockResponse){
        Stock stock = stockCall.body();
        //do something with the stock
    }
    @Override
    public void onResponse(Call stockCall, Throwable t){
        //something bad happened
    }
}

Если ваш API требует, чтобы API-ключ или другой заголовок, такой как токен пользователя и т. д., отправлялся, Retrofit делает это проще (см. этот удивительный ответ для деталей: https://stackoverflow.com/a/42899766/1024412 ).

Один доступ к API-интерфейсу ReST

Предположим, вы создавая приложение «погода настроения», которое просматривает местоположение GPS-пользователей и проверяет текущую температуру в этой области и сообщает им настроение. Для этого типа приложения не требуется объявлять конечные точки API; он просто должен иметь доступ к одной конечной точке API.

Ion

Это отличная библиотека для этого типа доступа.

Пожалуйста, прочитайте отличный ответ msysmilu ( https://stackoverflow.com/a/28559884/1024412 )

Загружать изображения через HTTP

Волейбол

Volley также может использоваться для API-интерфейсов ReST, но из-за более сложной настройки я предпочитаю использовать Retrofit from Square, как указано выше ( http://square.github.io/retrofit/ )

Предположим, вы создаете приложение для социальных сетей и хотите загружать фотографии друзей друзей.

build.gradle

Добавьте эту строку в свой модуль level buid.gradle:

implementation 'com.android.volley:volley:1.0.0'

ImageFetch.java

Волейбол требует больше настроек, чем дооснащение. Вам нужно будет создать такой класс, чтобы настроить RequestQueue, ImageLoader и ImageCache, но это не так уж плохо:

public class ImageFetch {
    private static ImageLoader imageLoader = null;
    private static RequestQueue imageQueue = null;

    public static ImageLoader getImageLoader(Context ctx){
        if(imageLoader == null){
            if(imageQueue == null){
                imageQueue = Volley.newRequestQueue(ctx.getApplicationContext());
            }
            imageLoader = new ImageLoader(imageQueue, new ImageLoader.ImageCache() {
                Map cache = new HashMap();
                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }
                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url, bitmap);
                }
            });
        }
        return imageLoader;
    }
}

user_view_dialog.xml

Добавить следующее в ваш XML-файл макета для добавления изображения:


UserViewDialog.java

Добавьте следующий код в метод onCreate (Фрагмент, Активность) или конструктор (Диалог):

NetworkImageView profilePicture = view.findViewById(R.id.profile_picture);
profilePicture.setImageUrl("http://example.com/users/images/profile.jpg", ImageFetch.getImageLoader(getContext());

Picasso

Еще одна отличная библиотека с площади. Пожалуйста, посетите сайт для некоторых замечательных примеров: http://square.github.io/picasso/

47
задан Wojciech Walczak 23 March 2014 в 14:52
поделиться

2 ответа

Как вы можете видеть, оператор AND оставляет каждую строку, в которой по крайней мере одно значение равно -1. С другой стороны, оператор OR требует, чтобы оба значения были равны -1, чтобы отбросить их.

Правильно. Помните, что вы пишете условие с точки зрения того, что вы хотите сохранить , а не с точки зрения того, что вы хотите сбросить. Для df1:

df1 = df[(df.a != -1) & (df.b != -1)]

Вы говорите: «Сохраните строки, в которых df.a не является -1, а df.b не равно -1», что равнозначно удалению каждая строка, в которой хотя бы одно значение равно -1.

Для df2:

df2 = df[(df.a != -1) | (df.b != -1)]

Вы говорите: «Сохраните строки, в которых либо df.a, либо df.b не равно -1 ", что совпадает с удалением строк, где оба значения равны -1.

PS: скованный доступ, такой как df['a'][1] = -1, может вызвать у вас проблемы. Лучше привыкнуть к использованию .loc и .iloc.

87
ответ дан DSM 24 August 2018 в 02:42
поделиться

Вы можете использовать query () , т. е .:

df_filtered = df.query('a == 4 & b != 2')
24
ответ дан Pedro Lobito 24 August 2018 в 02:42
поделиться
Другие вопросы по тегам:

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